修改验证

This commit is contained in:
2022-05-26 11:56:02 +08:00
parent 8dbaf7dade
commit 1b7f983e24
17 changed files with 243 additions and 170 deletions
@@ -7,6 +7,9 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Hosting;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Application.Service.Verify;
namespace IRaCIS.Core.Application.Contracts
{
@@ -20,21 +23,25 @@ namespace IRaCIS.Core.Application.Contracts
private readonly IRepository<PreviousHistory> _previousHistoryRepository;
private readonly IRepository<PreviousSurgery> _previousSurgeryRepository;
private readonly IRepository<PreviousPDF> _previousPdfRepository;
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
public ClinicalDataService(IRepository<PreviousHistory> previousHistoryRepository,
IRepository<PreviousOther> previousOtherRepository,
IRepository<PreviousSurgery> previousSurgeryRepository,
IRepository<PreviousPDF> previousPDFRepository)
IRepository<PreviousPDF> previousPDFRepository,
IRepository<SubjectVisit> subjectVisitRepository
)
{
_previousOtherRepository = previousOtherRepository;
_previousHistoryRepository = previousHistoryRepository;
_previousSurgeryRepository = previousSurgeryRepository;
_previousPdfRepository = previousPDFRepository;
_subjectVisitRepository = subjectVisitRepository;
}
/// <summary>
/// 上传临床数据
/// </summary>
@@ -46,7 +53,7 @@ namespace IRaCIS.Core.Application.Contracts
[DisableRequestSizeLimit]
public async Task<IResponseOutput> UploadVisitClinicalData(IFormCollection formCollection, Guid subjectVisitId, [FromServices] IWebHostEnvironment _hostEnvironment)
{
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId);
var rootPath = Directory.GetParent(_hostEnvironment.ContentRootPath.TrimEnd('\\')).IfNullThrowException().FullName;
@@ -65,9 +72,8 @@ namespace IRaCIS.Core.Application.Contracts
foreach (IFormFile file in formCollection.Files)
{
var realName = file.FileName;
var fileNameEX = Path.GetExtension(realName);
var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileNameEX;
var (trustedFileNameForFileStorage, fileName) = FileStoreHelper.GetStoreFileName(file.FileName);
var relativePath = $"/{StaticData.TrialDataFolder}/{sv.TrialId}/{sv.SiteId}/{sv.SubjectId}/{subjectVisitId}/{StaticData.TreatmenthistoryFolder}/{trustedFileNameForFileStorage}";
@@ -80,7 +86,7 @@ namespace IRaCIS.Core.Application.Contracts
}
//插入临床pdf 路径
await _previousPdfRepository.AddAsync(new PreviousPDF() { SubjectVisitId = subjectVisitId, Path = relativePath, FileName = realName });
await _previousPdfRepository.AddAsync(new PreviousPDF() { SubjectVisitId = subjectVisitId, Path = relativePath, FileName = fileName });
}
@@ -88,12 +94,7 @@ namespace IRaCIS.Core.Application.Contracts
return ResponseOutput.Ok();
//return ResponseOutput.Ok(new
//{
// FilePath = relativePath,
// FullFilePath = relativePath + "?access_token=" + _userInfo.UserToken
//});
}
@@ -156,15 +157,17 @@ namespace IRaCIS.Core.Application.Contracts
[HttpPost("{trialId:guid}")]
public async Task<IResponseOutput<Guid>> AddOrUpdatePreviousHistory(PreviousHistoryAddOrEdit addOrEditPreviousHistory)
{
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditPreviousHistory.SubjectVisitId);
var entity = await _previousHistoryRepository.InsertOrUpdateAsync(addOrEditPreviousHistory, true);
return ResponseOutput.Ok(entity.Id);
}
[HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{previousHistoryId:guid}")]
public async Task<IResponseOutput> DeletePreviousHistory(Guid previousHistoryId)
{
public async Task<IResponseOutput> DeletePreviousHistory(Guid previousHistoryId,Guid subjectVisitId)
{
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId);
await _previousHistoryRepository.DeleteFromQueryAsync(t => t.Id == previousHistoryId,true);
return ResponseOutput.Ok();
}
@@ -180,7 +183,8 @@ namespace IRaCIS.Core.Application.Contracts
[HttpPost("{trialId:guid}")]
public async Task<IResponseOutput<Guid>> AddOrUpdatePreviousOther(PreviousOtherAddOrEdit addOrEditPreviousOther)
{
{
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditPreviousOther.SubjectVisitId);
var entity = await _previousOtherRepository.InsertOrUpdateAsync(addOrEditPreviousOther, true);
return ResponseOutput.Ok(entity.Id);
@@ -188,8 +192,10 @@ namespace IRaCIS.Core.Application.Contracts
[HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{previousOtherId:guid}")]
public async Task<IResponseOutput> DeletePreviousOther(Guid previousOtherId)
{
public async Task<IResponseOutput> DeletePreviousOther(Guid previousOtherId, Guid subjectVisitId)
{
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId);
await _previousOtherRepository.DeleteFromQueryAsync(t => t.Id == previousOtherId,true);
return ResponseOutput.Ok();
}
@@ -206,15 +212,16 @@ namespace IRaCIS.Core.Application.Contracts
[HttpPost("{trialId:guid}")]
public async Task<IResponseOutput<Guid>> AddOrUpdatePreviousSurgery(PreviousSurgeryAddOrEdit addOrEditPreviousSurgery)
{
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditPreviousSurgery.SubjectVisitId);
var entity = await _previousSurgeryRepository.InsertOrUpdateAsync(addOrEditPreviousSurgery, true);
return ResponseOutput.Ok(entity.Id);
}
[HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{previousSurgeryId:guid}")]
public async Task<IResponseOutput> DeletePreviousSurgery(Guid previousSurgeryId)
public async Task<IResponseOutput> DeletePreviousSurgery(Guid previousSurgeryId, Guid subjectVisitId)
{
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId);
var success = await _previousSurgeryRepository.DeleteFromQueryAsync(t => t.Id == previousSurgeryId,true);
return ResponseOutput.Ok();
}
@@ -231,16 +238,17 @@ namespace IRaCIS.Core.Application.Contracts
public async Task<IResponseOutput> AddOrUpdatePreviousPDF(PreviousPDFAddOrEdit addOrEditPreviousPDF)
{
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditPreviousPDF.SubjectVisitId);
var entity = await _previousPdfRepository.InsertOrUpdateAsync(addOrEditPreviousPDF, true);
return ResponseOutput.Ok(entity.Id);
}
[HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{previousPDFId:guid}")]
public async Task<IResponseOutput> DeletePreviousPDF(Guid previousPDFId)
public async Task<IResponseOutput> DeletePreviousPDF(Guid previousPDFId, Guid subjectVisitId)
{
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId);
await _previousPdfRepository.DeleteFromQueryAsync(t => t.Id == previousPDFId,true);
return ResponseOutput.Ok();
}
@@ -16,10 +16,10 @@ namespace IRaCIS.Core.Application.Contracts
Task<IResponseOutput<Guid>> AddOrUpdatePreviousOther(PreviousOtherAddOrEdit addOrEditPreviousOther);
Task<IResponseOutput> AddOrUpdatePreviousPDF(PreviousPDFAddOrEdit addOrEditPreviousPDF);
Task<IResponseOutput<Guid>> AddOrUpdatePreviousSurgery(PreviousSurgeryAddOrEdit addOrEditPreviousSurgery);
Task<IResponseOutput> DeletePreviousHistory(Guid previousHistoryId);
Task<IResponseOutput> DeletePreviousOther(Guid previousOtherId);
Task<IResponseOutput> DeletePreviousPDF(Guid previousPDFId);
Task<IResponseOutput> DeletePreviousSurgery(Guid previousSurgeryId);
Task<IResponseOutput> DeletePreviousHistory(Guid previousHistoryId, Guid subjectVisitId);
Task<IResponseOutput> DeletePreviousOther(Guid previousOtherId, Guid subjectVisitId);
Task<IResponseOutput> DeletePreviousPDF(Guid previousPDFId, Guid subjectVisitId);
Task<IResponseOutput> DeletePreviousSurgery(Guid previousSurgeryId, Guid subjectVisitId);
Task<List<PreviousHistoryView>> GetPreviousHistoryList(PreviousHistoryQuery queryPreviousHistory);
Task<List<PreviousOtherView>> GetPreviousOtherList(PreviousOtherQuery queryPreviousOther);
Task<List<PreviousPDFView>> GetPreviousPDFList(Guid subjectVisitId);
@@ -16,6 +16,8 @@ using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Infrastructure;
using Microsoft.Extensions.Logging;
using System.ComponentModel.DataAnnotations;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Service.Verify;
namespace IRaCIS.Core.Application.Contracts
{
@@ -57,18 +59,7 @@ namespace IRaCIS.Core.Application.Contracts
}
private void VerifyIsCanQC(SubjectVisit? subjectVisit, Guid? sujectVisitId = null)
{
if (sujectVisitId != null)
{
subjectVisit = _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == sujectVisitId).Result.IfNullThrowException();
}
if (subjectVisit!.CurrentActionUserId != _userInfo.Id)
{
throw new BusinessValidationFailedException("您不是该质控任务当前领取人,没有操作权限!");
}
}
[HttpGet]
public async Task<List<NoneDicomStudyView>> GetNoneDicomStudyList( [FromQuery,NotDefault] Guid subjectVisitId,Guid? nonedicomStudyId)
@@ -133,7 +124,9 @@ namespace IRaCIS.Core.Application.Contracts
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC)
{
VerifyIsCanQC(null, addOrEditNoneDicomStudy.SubjectVisitId);
await QCCommonVerify.VerifyIsCanQCAsync(_repository, _userInfo, null, addOrEditNoneDicomStudy.SubjectVisitId);
}
optEntity = await _noneDicomStudyRepository.UpdateFromDTOAsync(addOrEditNoneDicomStudy);
@@ -157,11 +150,9 @@ namespace IRaCIS.Core.Application.Contracts
public async Task<IResponseOutput> DeleteNoneDicomStudy(Guid noneDicomStudyId, Guid subjectVisitId)
{
//提交了 但是IQC同意的时候 是可以删除的 | 普通提交后也不能删除
if (await _subjectVisitRepository.AnyAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.Submitted &&
(!t.QCChallengeList.Any(u => u.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload))))
{
return ResponseOutput.NotOk("CRC Has Submited Imagecan not delete");
}
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository,_userInfo, subjectVisitId);
await _noneDicomStudyRepository.DeleteFromQueryAsync(noneDicomStudyId);
@@ -181,12 +172,7 @@ namespace IRaCIS.Core.Application.Contracts
public async Task<IResponseOutput> DeleteNoneDicomStudyFile(Guid noneDicomStudyFileId, Guid subjectVisitId)
{
//提交了 但是IQC同意的时候 是可以删除的 | 普通提交后也不能删除
if (await _subjectVisitRepository.AnyAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.Submitted &&
(!t.QCChallengeList.Any(u => u.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload))))
{
return ResponseOutput.NotOk("CRC Has Submited Imagecan not delete");
}
//var subjectVisitId = await _noneDicomStudyFileRepository.Where(t => t.Id == noneDicomStudyFileId).Select(t => t.NoneDicomStudy.SubjectVisitId).FirstOrDefaultAsync();
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId);
var success = await _noneDicomStudyFileRepository.DeleteFromQueryAsync(t => t.Id == noneDicomStudyFileId, true);
@@ -227,6 +213,8 @@ namespace IRaCIS.Core.Application.Contracts
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> UploadNoneDicomFile(IFormCollection formCollection, Guid subjectVisitId, Guid noneDicomStudyId)
{
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId);
var rootPath = Directory.GetParent(_hostEnvironment.ContentRootPath.TrimEnd('\\')).IfNullThrowException().FullName;
//上传根路径
@@ -262,7 +250,9 @@ namespace IRaCIS.Core.Application.Contracts
var( trustedFileNameForFileStorage, fileName) = GetStoreFileName(file.FileName);
var (trustedFileNameForFileStorage, fileName) = FileStoreHelper.GetStoreFileName(file.FileName);
var relativePath = $"/{StaticData.TrialDataFolder}/{sv.TrialId}/{sv.SiteId}/{sv.SubjectId}/{subjectVisitId}/{StaticData.NoneDicomFolder}/{trustedFileNameForFileStorage}";
var filePath = Path.Combine(uploadFolderPath, trustedFileNameForFileStorage);
@@ -305,36 +295,11 @@ namespace IRaCIS.Core.Application.Contracts
return ResponseOutput.Ok(/*list*/);
}
private (string TrustedFileNameForFileStorage,string RealName ) GetStoreFileName(string fileName)
{
//var realName = fileName;
//var fileNameEX = Path.GetExtension(realName);
//var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileNameEX;
//带目录层级,需要后端处理前端的路径
if (fileName.Contains("\\"))
{
fileName = fileName.Split("\\").Last();
}
if (fileName.Contains("/"))
{
fileName = fileName.Split("/").Last();
}
var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileName;
return (trustedFileNameForFileStorage, fileName);
}
private async void DealCompressFile(IArchiveEntry entry, dynamic sv, Guid subjectVisitId, Guid noneDicomStudyId, string uploadFolderPath)
{
var (trustedFileNameForFileStorage, fileName) = GetStoreFileName(entry.Key);
var (trustedFileNameForFileStorage, fileName) = FileStoreHelper.GetStoreFileName(entry.Key);
var relativePath = $"/{StaticData.TrialDataFolder}/{sv.TrialId}/{sv.SiteId}/{sv.SubjectId}/{subjectVisitId}/{StaticData.NoneDicomFolder}/{trustedFileNameForFileStorage}";
@@ -0,0 +1,39 @@
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
namespace IRaCIS.Core.Application.Service.Verify
{
public static class QCCommonVerify
{
public static async Task VerifyIsCRCSubmmitAsync(IRepository _repository, IUserInfo _userInfo, Guid? subjectVisitId=null)
{
//添加的时候不验证
if (subjectVisitId != null)
{
if (await _repository.AnyAsync<SubjectVisit>(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.Submitted &&
(!t.QCChallengeList.Any(u => u.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload))))
{
throw new BusinessValidationFailedException("CRC 已提交影像,不能进行操作。");
}
}
}
public static async Task VerifyIsCanQCAsync(IRepository _repository,IUserInfo _userInfo, SubjectVisit? subjectVisit=null, Guid? subjectVisitId=null)
{
if (subjectVisitId != null)
{
subjectVisit = (await _repository.FirstOrDefaultAsync<SubjectVisit>(t => t.Id == subjectVisitId)).IfNullThrowException();
}
if (subjectVisit!.CurrentActionUserId != _userInfo.Id)
{
throw new BusinessValidationFailedException("您不是该质控任务当前领取人,没有操作权限!");
}
}
}
}
@@ -1354,7 +1354,10 @@ namespace IRaCIS.Core.Application.Image.QA
dbSubjectVisit.SubmitTime = DateTime.Now;
}
else
{
return ResponseOutput.NotOk("当前访视的影像数据,已经由其他CRC提交。");
}
//不审 直接QC通过 可能一致性核查 也可能不一致性核查
if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit)
{
@@ -1373,8 +1376,6 @@ namespace IRaCIS.Core.Application.Image.QA
else if (trialConfig.QCProcessEnum == TrialQCProcess.DoubleAudit)
{
dbSubjectVisit.AuditState = AuditStateEnum.ToAudit;
}
@@ -1382,7 +1383,8 @@ namespace IRaCIS.Core.Application.Image.QA
var success = await _repository.SaveChangesAsync();
return ResponseOutput.Result(success);
return ResponseOutput.Ok(success);