diff --git a/IRaCIS.Core.Application/BusinessFilter/ProjectExceptionFilter.cs b/IRaCIS.Core.Application/BusinessFilter/ProjectExceptionFilter.cs
index 0a599c8f7..05836f59c 100644
--- a/IRaCIS.Core.Application/BusinessFilter/ProjectExceptionFilter.cs
+++ b/IRaCIS.Core.Application/BusinessFilter/ProjectExceptionFilter.cs
@@ -27,7 +27,7 @@ namespace IRaCIS.Core.Application.Filter
if (context.Exception.GetType() == typeof(BusinessValidationFailedException))
{
- context.Result = new JsonResult(ResponseOutput.NotOk("Verify error: " + context.Exception.Message));
+ context.Result = new JsonResult(ResponseOutput.NotOk(context.Exception.Message));
}
else if(context.Exception.GetType() == typeof(QueryBusinessObjectNotExistException))
{
diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index 79034df95..ce63ae54a 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -1514,8 +1514,6 @@
手动设置一致性核查通过
-
-
@@ -1579,6 +1577,9 @@
SeriesCount
+
+ 替换当前领取人
+
手动领取 或者取消 QC任务
@@ -1612,12 +1613,14 @@
+
+ 验证质疑对话页面 是否可以 跳转到重传页面 进行重传
+
- QA设置 需要重传
+ QA设置 同意重传
-
diff --git a/IRaCIS.Core.Application/Service/Management/UserTypeService.cs b/IRaCIS.Core.Application/Service/Management/UserTypeService.cs
index 3611fc917..dea977412 100644
--- a/IRaCIS.Core.Application/Service/Management/UserTypeService.cs
+++ b/IRaCIS.Core.Application/Service/Management/UserTypeService.cs
@@ -58,12 +58,12 @@ namespace IRaCIS.Core.Application.Contracts
if (addOrEditUserTypeRole.MenuIds.Count > 0)
{
- entity = userTypeServiceRepository.Where(t => t.Id == addOrEditUserTypeRole.Id, true).Include(t => t.UserTypeMenuList).Include(t=>t.UserTypeGroupList).FirstOrDefault();
+ entity = userTypeServiceRepository.Where(t => t.Id == addOrEditUserTypeRole.Id, true).Include(t => t.UserTypeMenuList).Include(t=>t.UserTypeGroupList).FirstOrDefault().IfNullThrowException();
}
else
{
- entity = userTypeServiceRepository.Where(t => t.Id == addOrEditUserTypeRole.Id, true).FirstOrDefault();
+ entity = userTypeServiceRepository.Where(t => t.Id == addOrEditUserTypeRole.Id, true).FirstOrDefault().IfNullThrowException();
}
_mapper.Map(addOrEditUserTypeRole, entity);
}
diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs
index 9cfb9ddff..2b2db37d7 100644
--- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs
+++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs
@@ -68,7 +68,6 @@ namespace IRaCIS.Core.Application.Contracts
public bool SetOrCancel { get; set; }
- public Guid? SignId { get; set; }
}
public class UploadSubjectAndVisitCommand
@@ -147,8 +146,6 @@ namespace IRaCIS.Core.Application.Contracts
public int? Age { get; set; }
public string Sex { get; set; } = string.Empty;
-
-
}
diff --git a/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs b/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs
index 4fb56ce88..024ac9d03 100644
--- a/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs
+++ b/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs
@@ -70,11 +70,6 @@ namespace IRaCIS.Core.Application.Contracts
subjectVisit = _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == sujectVisitId).Result.IfNullThrowException();
}
- if (subjectVisit.PreliminaryAuditUserId != null)
- {
- throw new BusinessValidationFailedException("当前访视已审核通过,不允许操作");
- }
-
if (subjectVisit.CurrentActionUserId != _userInfo.Id)
{
throw new BusinessValidationFailedException("您不是该质控任务当前领取人,没有操作权限!");
@@ -115,7 +110,6 @@ namespace IRaCIS.Core.Application.Contracts
}
-
NoneDicomStudyAddReturnDto noneDicom = new NoneDicomStudyAddReturnDto()
{
StudyCode = optEntity.StudyCode,
@@ -129,20 +123,14 @@ namespace IRaCIS.Core.Application.Contracts
[HttpDelete("{noneDicomStudyId:guid}/{trialId:guid}")]
public async Task DeleteNoneDicomStudy(Guid noneDicomStudyId)
{
- if (_noneDicomStudyRepository.Where(t => t.Id == noneDicomStudyId).SelectMany(t => t.NoneDicomFileList).Count() > 0)
- {
- return ResponseOutput.NotOk("先移除文件,才允许删除非Dicom");
- }
- var noneDicomStudy = await _noneDicomStudyRepository.FirstOrDefaultAsync(t => t.Id == noneDicomStudyId);
-
- if (noneDicomStudy == null) return Null404NotFound(noneDicomStudy);
+ var noneDicomStudy = (await _noneDicomStudyRepository.FirstOrDefaultAsync(t => t.Id == noneDicomStudyId)).IfNullThrowException();
await _noneDicomStudyRepository.DeleteAsync(noneDicomStudy);
await _noneDicomStudyFileRepository.BatchDeleteNoTrackingAsync(t => t.NoneDicomStudyId == noneDicomStudyId);
- await _repository.BatchDeleteAsync(t => t.StudyId == noneDicomStudyId);
+ await _studyMonitorRepository.BatchDeleteNoTrackingAsync(t => t.StudyId == noneDicomStudyId);
return ResponseOutput.Ok();
}
@@ -156,10 +144,6 @@ namespace IRaCIS.Core.Application.Contracts
var success = await _noneDicomStudyFileRepository.BatchDeleteNoTrackingAsync(t => t.Id == noneDicomStudyFileId);
- var subvisit = await _repository.GetQueryable().FirstOrDefaultAsync(x => x.Id == subjectVisitId);
-
-
-
return ResponseOutput.Ok();
}
diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs
index ae6382bd8..e7bfecb4f 100644
--- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs
+++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs
@@ -269,7 +269,7 @@ namespace IRaCIS.Core.Application.Image.QA
qaReply.UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt;
var dbQCChallenge = (await _repository.FirstOrDefaultAsync(t => t.Id == qaDialogCommand.QCChallengeId)).IfNullThrowException();
-
+
dbQCChallenge.LatestMsgTime = DateTime.Now;
@@ -359,8 +359,6 @@ namespace IRaCIS.Core.Application.Image.QA
///
/// 手动设置一致性核查通过
///
- ///
- ///
///
[HttpPut("{trialId:guid}/{signId:guid}/{subjectVisitId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))]
@@ -1100,6 +1098,24 @@ namespace IRaCIS.Core.Application.Image.QA
#region 临床数据签名 领取、 设置紧急、RequestToQC QC通过、不通过
+ /// 替换当前领取人
+ [HttpPut("{trialId:guid}/{subjectVisitId:guid}")]
+ public async Task 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);
+ }
+
+
///
/// 手动领取 或者取消 QC任务
///
@@ -1112,6 +1128,11 @@ namespace IRaCIS.Core.Application.Image.QA
public async Task 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();
+ 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();
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 重传、重传完设置
+ /// 验证质疑对话页面 是否可以 跳转到重传页面 进行重传
+ [HttpGet("{trialId:guid}/{qcChallengeId:guid}")]
+ public async Task 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();
+ }
+
+
///
- /// QA设置 需要重传
+ /// QA设置 同意重传
///
///
- ///
///
///
- [HttpPut("{trialId:guid}/{qcChallengeId:guid}/{signId:guid}")]
+ [HttpPut("{trialId:guid}/{qcChallengeId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task SetNeedReupload(Guid trialId, Guid qcChallengeId)
{
@@ -1718,14 +1752,21 @@ namespace IRaCIS.Core.Application.Image.QA
return ResponseOutput.NotOk("不审操作,不会有需要重传的操作!");
}
- var qcChallenge = await _repository.FirstOrDefaultAsync(t => t.Id == qcChallengeId);
- if (qcChallenge == null) return Null404NotFound(qcChallenge);
+ var qcChallenge = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId)).IfNullThrowException();
- if (await _repository.CountAsync(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(t => t.Id == signId, u => new TrialSign() { IsCompleted = true });
return ResponseOutput.Result(success);
}
-
-
-
///
/// CRC 设置已经重传完成
///
@@ -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(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(t => t.Id == cRCReuploadFinishedCommand.SignId, u => new TrialSign() { IsCompleted = true });
+ //var signSuccess = await _repository.BatchUpdateAsync(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 CRCRequestReUpload(Guid qcChallengeId)
{
- var qcChallenge = await _repository.FirstOrDefaultAsync(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 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("转发失败");
}
diff --git a/IRaCIS.Core.Domain/QC/QCChallenge.cs b/IRaCIS.Core.Domain/QC/QCChallenge.cs
index 5db073a84..4337919ab 100644
--- a/IRaCIS.Core.Domain/QC/QCChallenge.cs
+++ b/IRaCIS.Core.Domain/QC/QCChallenge.cs
@@ -32,6 +32,8 @@ namespace IRaCIS.Core.Domain.Models
public string ReUploader { get; set; } = string.Empty;
+ public Guid? ReUploadUserId { get; set; }
+
public TrialQCProcess QCProcessEnum { get; set; }
public CurrentQC CurrentQCEnum { get; set; }