修改领取逻辑

Uat_Study
hang 2022-04-28 16:52:17 +08:00
parent 89a96fd7d6
commit 963f093ce4
4 changed files with 66 additions and 49 deletions

View File

@ -327,7 +327,7 @@ namespace IRaCIS.Core.API.Controllers
[UnitOfWork] [UnitOfWork]
public async Task<IResponseOutput> UpdateModality(DataInspectionDto<UpdateModalityDto> opt) public async Task<IResponseOutput> UpdateModality(DataInspectionDto<UpdateModalityDto> opt)
{ {
var fun =await _qCOperationService.UpdateModality(opt.OptCommand.id, opt.OptCommand.type, opt.OptCommand.modality, opt.OptCommand.bodyPart); var fun = await _qCOperationService.UpdateModality(opt.OptCommand.id, (Guid)opt.AuditInfo.SubjectVisitId, opt.OptCommand.type, opt.OptCommand.modality, opt.OptCommand.bodyPart);
return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun);
} }
@ -825,7 +825,8 @@ namespace IRaCIS.Core.API.Controllers
return ResponseOutput.NotOk(data.ErrorMessage); return ResponseOutput.NotOk(data.ErrorMessage);
} }
var fun = _trialConfigService.TrialConfigSignatureConfirm; var fun = _trialConfigService.TrialConfigSignatureConfirm;
return await _inspectionService.Enforcement(new SignConfirmDTO() { return await _inspectionService.Enforcement(new SignConfirmDTO()
{
TrialId = opt.OptCommand.TrialId, TrialId = opt.OptCommand.TrialId,
SignCode = opt.OptCommand.SignCode SignCode = opt.OptCommand.SignCode
}, opt.AuditInfo, opt.SignInfo, fun); }, opt.AuditInfo, opt.SignInfo, fun);

View File

@ -1551,7 +1551,7 @@
<param name="state"></param> <param name="state"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Image.QA.QCOperationService.UpdateModality(System.Guid,System.Int32,System.String,System.String)"> <member name="M:IRaCIS.Core.Application.Image.QA.QCOperationService.UpdateModality(System.Guid,System.Guid,System.Int32,System.String,System.String)">
<summary> <summary>
type 1 :study 2: series 3:非dicom QC修改检查部位和 拍片类型 type 1 :study 2: series 3:非dicom QC修改检查部位和 拍片类型
</summary> </summary>

View File

@ -34,7 +34,7 @@ namespace IRaCIS.Core.Application.Image.QA
Task<IResponseOutput> SetReuploadFinished(CRCReuploadFinishedCommand cRCReuploadFinishedCommand); Task<IResponseOutput> SetReuploadFinished(CRCReuploadFinishedCommand cRCReuploadFinishedCommand);
Task<IResponseOutput> SetSeriesState(Guid subjectVisitId, Guid studyId, Guid seriesId, int state); Task<IResponseOutput> SetSeriesState(Guid subjectVisitId, Guid studyId, Guid seriesId, int state);
Task<IResponseOutput> SetVisitUrgent(Guid trialId, Guid subjectVisitId, bool setOrCancel); Task<IResponseOutput> SetVisitUrgent(Guid trialId, Guid subjectVisitId, bool setOrCancel);
Task<IResponseOutput> UpdateModality(Guid id, int type, [FromQuery] string modality, [FromQuery] string bodyPart); Task<IResponseOutput> UpdateModality(Guid id, Guid subjectVisitId, int type, [FromQuery] string modality, [FromQuery] string bodyPart);
Task<IResponseOutput> UpdateSubjectAndSVInfo(UploadSubjectAndVisitCommand command); Task<IResponseOutput> UpdateSubjectAndSVInfo(UploadSubjectAndVisitCommand command);
Task<IResponseOutput> UploadVisitCheckExcel(IFormFile file, Guid trialId); Task<IResponseOutput> UploadVisitCheckExcel(IFormFile file, Guid trialId);
Task<IResponseOutput> VerifyCanQCPassedOrFailed(Guid subjectVisitId); Task<IResponseOutput> VerifyCanQCPassedOrFailed(Guid subjectVisitId);

View File

@ -70,6 +70,7 @@ namespace IRaCIS.Core.Application.Image.QA
[TypeFilter(typeof(TrialResourceFilter))] [TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> VerifyQCCanAddChallenge(Guid subjectVisitId, [FromRoute] CurrentQC currentQCType) public async Task<IResponseOutput> VerifyQCCanAddChallenge(Guid subjectVisitId, [FromRoute] CurrentQC currentQCType)
{ {
VerifyIsCanQC(null, subjectVisitId);
if (!await _repository.AnyAsync<TrialQCQuestionAnswer>(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == currentQCType)) if (!await _repository.AnyAsync<TrialQCQuestionAnswer>(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == currentQCType))
{ {
return ResponseOutput.NotOk("请先核查图像,保存审核问题后,再发质疑。"); return ResponseOutput.NotOk("请先核查图像,保存审核问题后,再发质疑。");
@ -91,6 +92,7 @@ namespace IRaCIS.Core.Application.Image.QA
[Authorize(Policy = "ImageQCPolicy")] [Authorize(Policy = "ImageQCPolicy")]
public async Task<QCChallenge> AddOrUpdateQCChallenge(QCChallengeCommand qaQuestionCommand, Guid trialId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType) public async Task<QCChallenge> AddOrUpdateQCChallenge(QCChallengeCommand qaQuestionCommand, Guid trialId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType)
{ {
VerifyIsCanQC(null, qaQuestionCommand.SubjectVisitId);
if (qaQuestionCommand.Id == null) if (qaQuestionCommand.Id == null)
{ {
@ -288,17 +290,20 @@ namespace IRaCIS.Core.Application.Image.QA
[Authorize(Policy = "ImageCheckPolicy")] [Authorize(Policy = "ImageCheckPolicy")]
public async Task<IResponseOutput<CheckChallengeDialog>> AddCheckChallengeReply(CheckChallengeDialogCommand checkDialogCommand) public async Task<IResponseOutput<CheckChallengeDialog>> AddCheckChallengeReply(CheckChallengeDialogCommand checkDialogCommand)
{ {
var qaReply = _mapper.Map<CheckChallengeDialog>(checkDialogCommand);
qaReply.UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt;
await _repository.AddAsync(qaReply);
//修改一致性核查 质疑状态 //修改一致性核查 质疑状态
var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == checkDialogCommand.SubjectVisitId); var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == checkDialogCommand.SubjectVisitId);
var qaReply = _mapper.Map<CheckChallengeDialog>(checkDialogCommand);
qaReply.UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt;
await _repository.AddAsync(qaReply);
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator) if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator)
{ {
sv.CheckChallengeState = CheckChanllengeTypeEnum.CRCWaitPMReply; sv.CheckChallengeState = CheckChanllengeTypeEnum.CRCWaitPMReply;
@ -327,9 +332,9 @@ namespace IRaCIS.Core.Application.Image.QA
public async Task<IResponseOutput> CloseCheckChallenge(CloseCheckChallengeDto input) public async Task<IResponseOutput> CloseCheckChallenge(CloseCheckChallengeDto input)
{ {
var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == input.subjectVisitId); var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == input.subjectVisitId)).IfNullThrowException();
if (sv == null) return Null404NotFound(sv);
if (sv.RequestBackState == RequestBackStateEnum.PM_AgressBack) if (sv.RequestBackState == RequestBackStateEnum.PM_AgressBack)
{ {
@ -689,12 +694,7 @@ namespace IRaCIS.Core.Application.Image.QA
public async Task<IResponseOutput> AddOrUpdateQCQuestionAnswerList(QCQuestionAnswerCommand[] qcQuestionAnswerCommands, Guid trialId, Guid subjectVisitId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType) public async Task<IResponseOutput> AddOrUpdateQCQuestionAnswerList(QCQuestionAnswerCommand[] qcQuestionAnswerCommands, Guid trialId, Guid subjectVisitId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType)
{ {
//验证是否能操作 //验证是否能操作
var verifyResult = await VerifyQCCanOpt(subjectVisitId); VerifyIsCanQC(null, subjectVisitId);
if (!verifyResult.IsSuccess)
{
return verifyResult;
}
//更新 //更新
if (qcQuestionAnswerCommands.Any(t => t.Id != null)) if (qcQuestionAnswerCommands.Any(t => t.Id != null))
@ -763,13 +763,9 @@ namespace IRaCIS.Core.Application.Image.QA
[TypeFilter(typeof(TrialResourceFilter))] [TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> SetSeriesState(Guid subjectVisitId, Guid studyId, Guid seriesId, int state) public async Task<IResponseOutput> SetSeriesState(Guid subjectVisitId, Guid studyId, Guid seriesId, int state)
{ {
//验证是否能操作
var verifyResult = await VerifyQCCanOpt(subjectVisitId);
if (!verifyResult.IsSuccess) VerifyIsCanQC(null, subjectVisitId);
{
return verifyResult;
}
var series = await _repository.Where<DicomSeries>(t => t.Id == seriesId, true).IgnoreQueryFilters().FirstOrDefaultAsync(); var series = await _repository.Where<DicomSeries>(t => t.Id == seriesId, true).IgnoreQueryFilters().FirstOrDefaultAsync();
@ -838,9 +834,9 @@ namespace IRaCIS.Core.Application.Image.QA
/// <param name="modality"></param> /// <param name="modality"></param>
/// <param name="bodyPart"></param> /// <param name="bodyPart"></param>
/// <returns></returns> /// <returns></returns>
[HttpPut("{trialId:guid}/{id:guid}/{type:int}")] [HttpPut("{trialId:guid}/{subjectVisitId:guid}/{id:guid}/{type:int}")]
[TypeFilter(typeof(TrialResourceFilter))] [TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> UpdateModality(Guid id, int type, [FromQuery] string modality, [FromQuery] string bodyPart) public async Task<IResponseOutput> UpdateModality(Guid id, Guid subjectVisitId, int type, [FromQuery] string modality, [FromQuery] string bodyPart)
{ {
var DicomSeriesdata = await _repository.GetQueryable<DicomSeries>().Where(x => x.StudyId == id).ToListAsync(); var DicomSeriesdata = await _repository.GetQueryable<DicomSeries>().Where(x => x.StudyId == id).ToListAsync();
@ -934,6 +930,7 @@ namespace IRaCIS.Core.Application.Image.QA
[HttpGet("{subjectVisitId:guid}")] [HttpGet("{subjectVisitId:guid}")]
public async Task<IResponseOutput> VerifyCanQCPassedOrFailed(Guid subjectVisitId) public async Task<IResponseOutput> VerifyCanQCPassedOrFailed(Guid subjectVisitId)
{ {
VerifyIsCanQC(null, subjectVisitId);
if (await _repository.AnyAsync<QCChallenge>(t => t.SubjectVisitId == subjectVisitId && t.IsClosed == false)) if (await _repository.AnyAsync<QCChallenge>(t => t.SubjectVisitId == subjectVisitId && t.IsClosed == false))
{ {
@ -957,6 +954,8 @@ namespace IRaCIS.Core.Application.Image.QA
[UnitOfWork] [UnitOfWork]
public async Task<IResponseOutput> DeleteStudyList(Guid[] ids, Guid subjectVisitId, Guid trialId) public async Task<IResponseOutput> DeleteStudyList(Guid[] ids, Guid subjectVisitId, Guid trialId)
{ {
//提交了 但是IQC同意的时候 是可以删除的 //提交了 但是IQC同意的时候 是可以删除的
if (await _subjectVisitRepository.AnyAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.Submitted && if (await _subjectVisitRepository.AnyAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.Submitted &&
(!t.QCChallengeList.Any(u => u.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload)))) (!t.QCChallengeList.Any(u => u.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload))))
@ -1078,6 +1077,23 @@ namespace IRaCIS.Core.Application.Image.QA
#endregion #endregion
public void VerifyIsCanQC(SubjectVisit? subjectVisit, Guid? sujectVisitId = null)
{
if (sujectVisitId != null)
{
subjectVisit = _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == sujectVisitId).Result.IfNullThrowException();
}
if (subjectVisit.PreliminaryAuditUserId != null)
{
throw new BusinessValidationFailedException("当前访视已审核通过,不允许操作");
}
if (subjectVisit.CurrentActionUserId != _userInfo.Id)
{
throw new BusinessValidationFailedException("当前领取人已不是自己,不允许操作");
}
}
#region 临床数据签名 领取、 设置紧急、RequestToQC QC通过、不通过 #region 临床数据签名 领取、 设置紧急、RequestToQC QC通过、不通过
@ -1094,9 +1110,9 @@ namespace IRaCIS.Core.Application.Image.QA
public async Task<IResponseOutput> ObtainOrCancelQCTask(Guid trialId, Guid subjectVisitId, bool obtaionOrCancel) public async Task<IResponseOutput> ObtainOrCancelQCTask(Guid trialId, Guid subjectVisitId, bool obtaionOrCancel)
{ {
var dbSubjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId); var dbSubjectVisit = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException();
if (dbSubjectVisit == null) return Null404NotFound(dbSubjectVisit); VerifyIsCanQC(dbSubjectVisit);
var trialConfig = await _trialRepository var trialConfig = await _trialRepository
.Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification }) .Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification })