|
|
|
@@ -269,7 +269,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
qaReply.UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt;
|
|
|
|
|
|
|
|
|
|
var dbQCChallenge = (await _repository.FirstOrDefaultAsync<QCChallenge>(t => t.Id == qaDialogCommand.QCChallengeId)).IfNullThrowException();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dbQCChallenge.LatestMsgTime = DateTime.Now;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -359,8 +359,6 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 手动设置一致性核查通过
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="subjectVisitId"></param>
|
|
|
|
|
/// <param name="signId"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
[HttpPut("{trialId:guid}/{signId:guid}/{subjectVisitId:guid}")]
|
|
|
|
|
[TypeFilter(typeof(TrialResourceFilter))]
|
|
|
|
@@ -1100,6 +1098,24 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
#region 临床数据签名 领取、 设置紧急、RequestToQC QC通过、不通过
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>替换当前领取人 </summary>
|
|
|
|
|
[HttpPut("{trialId:guid}/{subjectVisitId:guid}")]
|
|
|
|
|
public async Task<IResponseOutput> ReplaceQCTaskActionUser(Guid trialId, Guid subjectVisitId)
|
|
|
|
|
{
|
|
|
|
|
var dbSubjectVisit = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException();
|
|
|
|
|
|
|
|
|
|
dbSubjectVisit.IsTake = true;
|
|
|
|
|
|
|
|
|
|
dbSubjectVisit.CurrentActionUserId = _userInfo.Id;
|
|
|
|
|
|
|
|
|
|
dbSubjectVisit.CurrentActionUserExpireTime = DateTime.Now.AddHours(1);
|
|
|
|
|
|
|
|
|
|
var success = await _subjectVisitRepository.SaveChangesAsync();
|
|
|
|
|
|
|
|
|
|
return ResponseOutput.Result(success);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 手动领取 或者取消 QC任务
|
|
|
|
|
/// </summary>
|
|
|
|
@@ -1112,6 +1128,11 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
public async Task<IResponseOutput> ObtainOrCancelQCTask(Guid trialId, Guid subjectVisitId, bool obtaionOrCancel)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if (await _subjectVisitRepository.AnyAsync(t => t.CurrentActionUserId != null && t.IsTake && t.Id == subjectVisitId))
|
|
|
|
|
{
|
|
|
|
|
throw new BusinessValidationFailedException("当前访视已被领取,不允许领取");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var dbSubjectVisit = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1241,7 +1262,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return ResponseOutput.NotOk("项目配置为复审,不满足提交状态:已提交 或者 审核状态:InPrimaryQC/InSecondaryQC, 不允许领取");
|
|
|
|
|
return ResponseOutput.NotOk("项目配置为复审,不满足提交状态:已提交 或者 审核状态:InPrimaryQC/InSecondaryQC, 不允许释放");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -1268,14 +1289,14 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
{
|
|
|
|
|
var sv = dbSubjectVisitList[0];
|
|
|
|
|
|
|
|
|
|
var nameList = await _subjectVisitRepository.Where(t => t.SubjectId == sv.SubjectId && t.SubmitState != SubmitStateEnum.Submitted && t.VisitNum < sv.VisitNum).Select(t=>t.VisitName).ToListAsync()??new List<string>();
|
|
|
|
|
var nameList = await _subjectVisitRepository.Where(t => t.SubjectId == sv.SubjectId && t.SubmitState != SubmitStateEnum.Submitted && t.VisitNum < sv.VisitNum).Select(t => t.VisitName).ToListAsync() ?? new List<string>();
|
|
|
|
|
|
|
|
|
|
if (sv.PDState == PDStateEnum.PDProgress)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if (nameList.Count()>0)
|
|
|
|
|
if (nameList.Count() > 0)
|
|
|
|
|
{
|
|
|
|
|
return ResponseOutput.NotOk($"系统检测发现该受试者当前访视之前的访视:{string.Join('、',nameList)},未提交,疾病进展确认对阅片时限要求很高,请将上述访视提交或标记失访后,再提交当前访视!", 1,ApiResponseCodeEnum.NeedTips);
|
|
|
|
|
return ResponseOutput.NotOk($"系统检测发现该受试者当前访视之前的访视:{string.Join('、', nameList)},未提交,疾病进展确认对阅片时限要求很高,请将上述访视提交或标记失访后,再提交当前访视!", 1, ApiResponseCodeEnum.NeedTips);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@@ -1693,14 +1714,27 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
|
|
|
|
|
#region 重传、重传完设置
|
|
|
|
|
|
|
|
|
|
/// <summary>验证质疑对话页面 是否可以 跳转到重传页面 进行重传 </summary>
|
|
|
|
|
[HttpGet("{trialId:guid}/{qcChallengeId:guid}")]
|
|
|
|
|
public async Task<IResponseOutput> VerifyReuploadIsCanJump(Guid trialId, Guid qcChallengeId)
|
|
|
|
|
{
|
|
|
|
|
var qcChallenge = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId)).IfNullThrowException();
|
|
|
|
|
|
|
|
|
|
if (qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.QCAgreeUpload)
|
|
|
|
|
{
|
|
|
|
|
throw new BusinessValidationFailedException("当前重传状态不为QC同意重传,不允许重传");
|
|
|
|
|
}
|
|
|
|
|
return ResponseOutput.Ok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// QA设置 需要重传
|
|
|
|
|
/// QA设置 同意重传
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="trialId"></param>
|
|
|
|
|
/// <param name="signId"></param>
|
|
|
|
|
/// <param name="qcChallengeId"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
[HttpPut("{trialId:guid}/{qcChallengeId:guid}/{signId:guid}")]
|
|
|
|
|
[HttpPut("{trialId:guid}/{qcChallengeId:guid}")]
|
|
|
|
|
[TypeFilter(typeof(TrialResourceFilter))]
|
|
|
|
|
public async Task<IResponseOutput> SetNeedReupload(Guid trialId, Guid qcChallengeId)
|
|
|
|
|
{
|
|
|
|
@@ -1718,14 +1752,21 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
return ResponseOutput.NotOk("不审操作,不会有需要重传的操作!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var qcChallenge = await _repository.FirstOrDefaultAsync<QCChallenge>(t => t.Id == qcChallengeId);
|
|
|
|
|
if (qcChallenge == null) return Null404NotFound(qcChallenge);
|
|
|
|
|
var qcChallenge = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId)).IfNullThrowException();
|
|
|
|
|
|
|
|
|
|
if (await _repository.CountAsync<QCChallenge>(t => t.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload && t.SubjectVisitId == qcChallenge.SubjectVisitId && t.IsClosed == false) >= 1)
|
|
|
|
|
if (qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.CRCRequestReupload)
|
|
|
|
|
{
|
|
|
|
|
return ResponseOutput.NotOk("当前访视,有一个未关闭的质疑 QC设置了需要重传,CRC还未完成上传,当前不允许再次设置");
|
|
|
|
|
throw new BusinessValidationFailedException("当前重传状态不为CRC申请重传,不允许设置同意重传");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (await _qcChallengeRepository.CountAsync(t => t.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload && t.SubjectVisitId == qcChallenge.SubjectVisitId && t.IsClosed == false) >= 1)
|
|
|
|
|
{
|
|
|
|
|
return ResponseOutput.NotOk("当前访视,有一个未关闭的质疑 QC设置了同意重传,CRC还未完成上传,当前不允许再次设置");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
qcChallenge.ReuploadEnum = QCChanllengeReuploadEnum.QCAgreeUpload;
|
|
|
|
|
qcChallenge.LatestMsgTime = DateTime.Now;
|
|
|
|
|
qcChallenge.LatestReplyUserId = _userInfo.Id;
|
|
|
|
@@ -1777,15 +1818,11 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
|
|
|
|
|
var success = await _repository.SaveChangesAsync();
|
|
|
|
|
|
|
|
|
|
//var signSuccess = await _repository.UpdateFromQueryAsync<TrialSign>(t => t.Id == signId, u => new TrialSign() { IsCompleted = true });
|
|
|
|
|
|
|
|
|
|
return ResponseOutput.Result(success);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// CRC 设置已经重传完成
|
|
|
|
|
/// </summary>
|
|
|
|
@@ -1797,20 +1834,22 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
{
|
|
|
|
|
if (_userInfo.UserTypeEnumInt != (int)UserTypeEnum.ClinicalResearchCoordinator)
|
|
|
|
|
{
|
|
|
|
|
return ResponseOutput.NotOk("重传完成 只允许CRC 设置!");
|
|
|
|
|
throw new BusinessValidationFailedException("重传完成 只允许CRC 设置!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var qcChallenge = await _repository.FirstOrDefaultAsync<QCChallenge>(t => t.Id == cRCReuploadFinishedCommand.QCChallengeId);
|
|
|
|
|
var qcChallenge = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == cRCReuploadFinishedCommand.QCChallengeId)).IfNullThrowException();
|
|
|
|
|
|
|
|
|
|
if (qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.QCAgreeUpload)
|
|
|
|
|
{
|
|
|
|
|
throw new BusinessValidationFailedException("当前重传状态不为QC同意重传,不允许设置重传完成");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (qcChallenge == null) return Null404NotFound(qcChallenge);
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
throw new BusinessValidationFailedException("当前没有影像,不允许设置重传完成");
|
|
|
|
|
}
|
|
|
|
@@ -1821,11 +1860,12 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
qcChallenge.ReuploadEnum = QCChanllengeReuploadEnum.CRCReuploaded;
|
|
|
|
|
|
|
|
|
|
qcChallenge.ReUploadedTime = DateTime.Now;
|
|
|
|
|
|
|
|
|
|
qcChallenge.ReUploadUserId = _userInfo.Id;
|
|
|
|
|
|
|
|
|
|
qcChallenge.ReUploader = _userInfo.RealName;
|
|
|
|
|
|
|
|
|
|
qcChallenge.LatestMsgTime = DateTime.Now;
|
|
|
|
@@ -1855,13 +1895,13 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
//已确认临床数据完整性
|
|
|
|
|
dbSubjectVisit.IsConfirmedClinicalData = true;
|
|
|
|
|
|
|
|
|
|
var signSuccess = await _repository.BatchUpdateAsync<TrialSign>(t => t.Id == cRCReuploadFinishedCommand.SignId, u => new TrialSign() { IsCompleted = true });
|
|
|
|
|
//var signSuccess = await _repository.BatchUpdateAsync<TrialSign>(t => t.Id == cRCReuploadFinishedCommand.SignId, u => new TrialSign() { IsCompleted = true });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var success = await _repository.SaveChangesAsync();
|
|
|
|
|
var success = await _subjectVisitRepository.SaveChangesAsync();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ResponseOutput.Ok(success);
|
|
|
|
|
return ResponseOutput.Result(success);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -1871,9 +1911,14 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
[TypeFilter(typeof(TrialResourceFilter))]
|
|
|
|
|
public async Task<IResponseOutput> CRCRequestReUpload(Guid qcChallengeId)
|
|
|
|
|
{
|
|
|
|
|
var qcChallenge = await _repository.FirstOrDefaultAsync<QCChallenge>(t => t.Id == qcChallengeId);
|
|
|
|
|
var qcChallenge = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId)).IfNullThrowException();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.None || qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.CRCReuploaded)
|
|
|
|
|
{
|
|
|
|
|
throw new BusinessValidationFailedException("当前质疑重传状态不为初始状态|CRC重传完成状态状态,不允许申请重传");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (qcChallenge == null) return Null404NotFound(qcChallenge);
|
|
|
|
|
|
|
|
|
|
if (qcChallenge.ReuploadEnum == QCChanllengeReuploadEnum.CRCReuploaded)
|
|
|
|
|
{
|
|
|
|
@@ -1892,7 +1937,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
TalkContent = "CRC申请重传/上传影像"
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await _repository.SaveChangesAsync();
|
|
|
|
|
await _qcChallengeRepository.SaveChangesAsync();
|
|
|
|
|
|
|
|
|
|
return ResponseOutput.Ok();
|
|
|
|
|
}
|
|
|
|
@@ -1911,7 +1956,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
[TypeFilter(typeof(TrialResourceFilter))]
|
|
|
|
|
public async Task<IResponseOutput> UpdateSubjectAndSVInfo(UploadSubjectAndVisitCommand command)
|
|
|
|
|
{
|
|
|
|
|
var dbSubjectVisit = ( await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == command.SubjectVisitId)).IfNullThrowException();
|
|
|
|
|
var dbSubjectVisit = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == command.SubjectVisitId)).IfNullThrowException();
|
|
|
|
|
|
|
|
|
|
dbSubjectVisit.PDState = command.PDState;
|
|
|
|
|
|
|
|
|
@@ -1931,7 +1976,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
|
|
|
|
|
dbSubjectVisit.IsEnrollmentConfirm = command.IsEnrollmentConfirm.Value;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1964,7 +2009,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
await _inspectionService.AddListInspectionRecordAsync(datas);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await _subjectVisitRepository.SaveChangesAsync();
|
|
|
|
|
await _subjectVisitRepository.SaveChangesAsync();
|
|
|
|
|
|
|
|
|
|
return ResponseOutput.Ok();
|
|
|
|
|
}
|
|
|
|
@@ -2073,7 +2118,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
u => new SubjectVisit() { ForwardState = ForwardStateEnum.ForwardFailed });
|
|
|
|
|
keyValuePairs["ForwardState"] = ForwardStateEnum.ForwardFailed;
|
|
|
|
|
|
|
|
|
|
return ResponseOutput.NotOk("转发失败 "+e.Message);
|
|
|
|
|
return ResponseOutput.NotOk("转发失败 " + e.Message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -2087,7 +2132,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|
|
|
|
|
|
|
|
|
await _subjectVisitRepository.SaveChangesAsync();
|
|
|
|
|
|
|
|
|
|
return isSuccess?ResponseOutput.Ok():ResponseOutput.NotOk("转发失败");
|
|
|
|
|
return isSuccess ? ResponseOutput.Ok() : ResponseOutput.NotOk("转发失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|