修改领取逻辑

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

@ -100,8 +100,8 @@ namespace IRaCIS.Core.API.Controllers
[UnitOfWork] [UnitOfWork]
public async Task<IResponseOutput> AbandonTrial(DataInspectionDto<AbandonTrial> opt) public async Task<IResponseOutput> AbandonTrial(DataInspectionDto<AbandonTrial> opt)
{ {
var fun = await _trialConfigService.AbandonTrial(opt.OptCommand.trialId,opt.OptCommand.isAbandon); var fun = await _trialConfigService.AbandonTrial(opt.OptCommand.trialId, opt.OptCommand.isAbandon);
return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo,null, fun); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun);
} }
/// <summary> /// <summary>
@ -183,7 +183,7 @@ namespace IRaCIS.Core.API.Controllers
public async Task<IResponseOutput> AddOrUpdateQCQuestionAnswerList(DataInspectionDto<AddOrUpdateQCQuestionAnswerListDto> opt) public async Task<IResponseOutput> AddOrUpdateQCQuestionAnswerList(DataInspectionDto<AddOrUpdateQCQuestionAnswerListDto> opt)
{ {
var fun = await _qCOperationService.AddOrUpdateQCQuestionAnswerList(opt.OptCommand.qcQuestionAnswerCommands, opt.OptCommand.trialId, opt.OptCommand.subjectVisitId,opt.OptCommand.trialQCProcess,opt.OptCommand.currentQCType); var fun = await _qCOperationService.AddOrUpdateQCQuestionAnswerList(opt.OptCommand.qcQuestionAnswerCommands, opt.OptCommand.trialId, opt.OptCommand.subjectVisitId, opt.OptCommand.trialQCProcess, opt.OptCommand.currentQCType);
if (!fun.IsSuccess) if (!fun.IsSuccess)
{ {
return ResponseOutput.NotOk(fun.ErrorMessage); return ResponseOutput.NotOk(fun.ErrorMessage);
@ -204,7 +204,7 @@ namespace IRaCIS.Core.API.Controllers
var fun = await _qCOperationService.AddOrUpdateQCChallenge(opt.OptCommand.qaQuestionCommand, opt.OptCommand.trialId, opt.OptCommand.trialQCProcess, opt.OptCommand.currentQCType); var fun = await _qCOperationService.AddOrUpdateQCChallenge(opt.OptCommand.qaQuestionCommand, opt.OptCommand.trialId, opt.OptCommand.trialQCProcess, opt.OptCommand.currentQCType);
opt.AuditInfo.GeneralId = fun.Id; opt.AuditInfo.GeneralId = fun.Id;
Dictionary<string, object> keyValuePairs = new Dictionary<string, object>(); Dictionary<string, object> keyValuePairs = new Dictionary<string, object>();
keyValuePairs.Add("ChallengeCode", "Q" + fun.ChallengeCode.ToString("D5") ); keyValuePairs.Add("ChallengeCode", "Q" + fun.ChallengeCode.ToString("D5"));
opt.AuditInfo.JsonDetail = _inspectionService.AddJsonItem(opt.AuditInfo.JsonDetail, keyValuePairs); opt.AuditInfo.JsonDetail = _inspectionService.AddJsonItem(opt.AuditInfo.JsonDetail, keyValuePairs);
return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, ResponseOutput.Ok()); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, ResponseOutput.Ok());
} }
@ -327,8 +327,8 @@ 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);
} }
/// <summary> /// <summary>
@ -359,7 +359,7 @@ namespace IRaCIS.Core.API.Controllers
/// </summary> /// </summary>
[HttpPost, Route("Inspection/QCOperation/SetVisitUrgent")] [HttpPost, Route("Inspection/QCOperation/SetVisitUrgent")]
[UnitOfWork] [UnitOfWork]
public async Task<IResponseOutput> SetVisitUrgent(DataInspectionDto<SetVisitUrgentDto> opt ) public async Task<IResponseOutput> SetVisitUrgent(DataInspectionDto<SetVisitUrgentDto> opt)
{ {
var fun = await _qCOperationService.SetVisitUrgent(opt.OptCommand.trialId, opt.OptCommand.subjectVisitId, opt.OptCommand.setOrCancel); var fun = await _qCOperationService.SetVisitUrgent(opt.OptCommand.trialId, opt.OptCommand.subjectVisitId, opt.OptCommand.setOrCancel);
return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun);
@ -423,7 +423,7 @@ namespace IRaCIS.Core.API.Controllers
/// <returns></returns> /// <returns></returns>
[HttpPost, Route("Inspection/QCOperation/UploadVisitCheckExcel")] [HttpPost, Route("Inspection/QCOperation/UploadVisitCheckExcel")]
[UnitOfWork] [UnitOfWork]
public async Task<IResponseOutput> UploadVisitCheckExcel(IFormFile file, [FromForm]UploadVisitCheckExcelDto opt) public async Task<IResponseOutput> UploadVisitCheckExcel(IFormFile file, [FromForm] UploadVisitCheckExcelDto opt)
{ {
@ -466,7 +466,7 @@ namespace IRaCIS.Core.API.Controllers
return ResponseOutput.NotOk(fun.ErrorMessage); return ResponseOutput.NotOk(fun.ErrorMessage);
} }
opt.AuditInfo.NeedSava = false; opt.AuditInfo.NeedSava = false;
return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo,null, fun); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun);
} }
@ -507,7 +507,7 @@ namespace IRaCIS.Core.API.Controllers
} }
opt.AuditInfo.GeneralId = fun.Data.Id; opt.AuditInfo.GeneralId = fun.Data.Id;
return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo,null, fun); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun);
} }
@ -554,7 +554,7 @@ namespace IRaCIS.Core.API.Controllers
{ {
var fun = await _clinicalDataService.AddOrUpdatePreviousHistory(opt.OptCommand); var fun = await _clinicalDataService.AddOrUpdatePreviousHistory(opt.OptCommand);
opt.AuditInfo.GeneralId = fun.Data; opt.AuditInfo.GeneralId = fun.Data;
return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo,null, fun); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun);
} }
@ -586,7 +586,7 @@ namespace IRaCIS.Core.API.Controllers
{ {
var fun = await _clinicalDataService.AddOrUpdatePreviousSurgery(opt.OptCommand); var fun = await _clinicalDataService.AddOrUpdatePreviousSurgery(opt.OptCommand);
opt.AuditInfo.GeneralId = fun.Data; opt.AuditInfo.GeneralId = fun.Data;
return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo,null, fun); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun);
} }
@ -616,7 +616,7 @@ namespace IRaCIS.Core.API.Controllers
{ {
var fun = await _clinicalDataService.AddOrUpdatePreviousOther(opt.OptCommand); var fun = await _clinicalDataService.AddOrUpdatePreviousOther(opt.OptCommand);
opt.AuditInfo.GeneralId = fun.Data; opt.AuditInfo.GeneralId = fun.Data;
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,9 +825,10 @@ 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, {
SignCode=opt.OptCommand.SignCode TrialId = opt.OptCommand.TrialId,
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 })