修改验证

Uat_Study
hang 2022-05-26 11:56:02 +08:00
parent 8dbaf7dade
commit 1b7f983e24
17 changed files with 243 additions and 170 deletions

View File

@ -170,7 +170,9 @@ namespace IRaCIS.Api.Controllers
}
var userId = returnModel.Data.BasicInfo.Id.ToString();
provider.Set(userId, userId, TimeSpan.FromMinutes(AppSettings.LoginExpiredTimeSpan));
//provider.Set(userId, userId, TimeSpan.FromMinutes(AppSettings.LoginExpiredTimeSpan));
await provider.SetAsync(userId.ToString(), returnModel.Data.JWTStr, TimeSpan.FromDays(7));
return returnModel;
}

View File

@ -1,6 +1,7 @@
using AutoMapper;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore;
@ -205,10 +206,9 @@ namespace IRaCIS.Core.API.Controllers
if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath);
//var fileNameEX = Path.GetExtension(fileRealName);
//var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileNameEX;
var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileRealName;
var (trustedFileNameForFileStorage, fileName) = FileStoreHelper.GetStoreFileName(fileRealName);
relativePath = $"/{StaticData.SystemDataFolder}/{StaticData.DataTemplate}/{trustedFileNameForFileStorage}";
@ -227,11 +227,9 @@ namespace IRaCIS.Core.API.Controllers
if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath);
//var fileNameEX = Path.GetExtension(fileRealName);
//var fileName=Path.GetFileName(fileRealName);
//var trustedFileNameForFileStorage = fileName + Guid.NewGuid().ToString() + fileNameEX;
var (trustedFileNameForFileStorage, fileName) = FileStoreHelper.GetStoreFileName(fileRealName);
var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileRealName;
relativePath = $"/{StaticData.SystemDataFolder}/{StaticData.NoticeAttachment}/{trustedFileNameForFileStorage}";
@ -271,11 +269,7 @@ namespace IRaCIS.Core.API.Controllers
var uploadFolderPath = Path.Combine(_fileStorePath, trialId.ToString(), StaticData.SignDocumentFolder);
if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath);
//var fileNameEX = Path.GetExtension(fileRealName);
//var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileNameEX;
var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileRealName;
var (trustedFileNameForFileStorage, fileName) = FileStoreHelper.GetStoreFileName(fileRealName);
relativePath = $"/{StaticData.TrialDataFolder}/{trialId}/{StaticData.SignDocumentFolder}/{trustedFileNameForFileStorage}";

View File

@ -75,6 +75,9 @@ namespace IRaCIS.Core.API
options.Filters.Add<ModelActionFilter>();
options.Filters.Add<ProjectExceptionFilter>();
options.Filters.Add<UnitOfWorkFilter>();
options.Filters.Add<LimitUserRequestAuthorization>();
})
.AddDataAnnotationsLocalization(options => {
options.DataAnnotationLocalizerProvider = (type, factory) =>

View File

@ -24,14 +24,14 @@ namespace IRaCIS.Core.API
{
Response.ContentType = "application/json";
Response.StatusCode = StatusCodes.Status401Unauthorized;
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("您无权访问该接口")));
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("您无权访问该接口", ApiResponseCodeEnum.NoToken)));
}
protected override async Task HandleForbiddenAsync(AuthenticationProperties properties)
{
Response.ContentType = "application/json";
Response.StatusCode = StatusCodes.Status403Forbidden;
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("您的权限不允许进行该操作")));
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("您的权限不允许进行该操作",ApiResponseCodeEnum.HaveTokenNotAccess)));
}
}

View File

@ -16,7 +16,9 @@
"OpenSignDocumentBeforeWork": false,
"OpenTrialRelationDelete": true
"OpenTrialRelationDelete": true,
"OpenLoginLimit": true
}

View File

@ -14,7 +14,9 @@
"OpenUserComplexPassword": true,
"OpenSignDocumentBeforeWork": true
"OpenSignDocumentBeforeWork": true,
"OpenLoginLimit": true
}

View File

@ -1,11 +1,13 @@
using EasyCaching.Core;
using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
namespace IRaCIS.Core.Application.BusinessFilter;
namespace IRaCIS.Core.Application.Filter;
@ -18,64 +20,77 @@ public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter
private readonly IUserInfo _userInfo;
public LimitUserRequestAuthorization(IEasyCachingProvider provider, IUserInfo userInfo)
private readonly IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig;
public LimitUserRequestAuthorization(IEasyCachingProvider provider, IUserInfo userInfo, IOptionsMonitor<ServiceVerifyConfigOption> verifyConfig)
{
_provider = provider;
_userInfo = userInfo;
_verifyConfig = verifyConfig;
}
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
if (context.ActionDescriptor.EndpointMetadata.Any(item => item is IAllowAnonymous))
if (_verifyConfig.CurrentValue.OpenLoginLimit)
{
//匿名访问的不处理
}
else
{
//1、用户登陆的时候设置缓存
//2、在这里取缓存 进行比较 看是否有其他人进行了登陆,如果其他人登陆了,就把之前用户挤掉
var cacheUserToken = (await _provider.GetAsync<string>(_userInfo.Id.ToString())).Value;
if (cacheUserToken == null)
if (context.ActionDescriptor.EndpointMetadata.Any(item => item is IAllowAnonymous))
{
//设置当前用户最新Token
await _provider.SetAsync(_userInfo.Id.ToString(), _userInfo.UserToken, TimeSpan.FromDays(7));
}
//是同一个人
else if(cacheUserToken == _userInfo.UserToken)
{
//匿名访问的不处理
}
else
{
context.Result = new StatusCodeResult(401);
}
//1、用户登陆的时候设置缓存
var cacheHostToken = (await _provider.GetAsync<string>(_userInfo.IP.ToString()+_userInfo.LocalIp.ToString())).Value;
if (cacheHostToken == null)
{
//设置当前主机最新Token
await _provider.SetAsync(_userInfo.IP.ToString() + _userInfo.LocalIp.ToString(), _userInfo.UserToken, TimeSpan.FromDays(7));
//2、在这里取缓存 进行比较 看是否有其他人进行了登陆,如果其他人登陆了,就把之前用户挤掉
var cacheUserToken = (await _provider.GetAsync<string>(_userInfo.Id.ToString())).Value;
if (cacheUserToken == null)
{
//设置当前用户最新Token
await _provider.SetAsync(_userInfo.Id.ToString(), _userInfo.UserToken, TimeSpan.FromDays(7));
}
//是同一个人
else if (cacheUserToken == _userInfo.UserToken)
{
}
else
{
context.HttpContext.Response.ContentType = "application/json";
context.HttpContext.Response.StatusCode = StatusCodes.Status403Forbidden;
await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("您的账户在其他地方已登陆,您被迫下线", ApiResponseCodeEnum.LoginInOtherPlace)));
//context.Result = new StatusCodeResult(401);
}
//var cacheHostToken = (await _provider.GetAsync<string>(_userInfo.IP.ToString()+_userInfo.LocalIp.ToString())).Value;
//if (cacheHostToken == null)
//{
// //设置当前主机最新Token
// await _provider.SetAsync(_userInfo.IP.ToString() + _userInfo.LocalIp.ToString(), _userInfo.UserToken, TimeSpan.FromDays(7));
//}
////是同主机
//else if (cacheHostToken == _userInfo.UserToken)
//{
//}
//else
//{
// context.Result = new StatusCodeResult(401);
//}
}
//是同主机
else if (cacheHostToken == _userInfo.UserToken)
{
}
else
{
context.Result = new StatusCodeResult(401);
}
}
}
}
@ -92,39 +107,39 @@ public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter
//public class UserTypeRequirement : IAuthorizationRequirement
//{
//}
//public class UserTypeRequirement : IAuthorizationRequirement
//{
//}
//public class UserTypeHandler : AuthorizationHandler<UserTypeRequirement>
//{
//public class UserTypeHandler : AuthorizationHandler<UserTypeRequirement>
//{
// private IUserInfo _userInfo;
// private IUserInfo _userInfo;
// public UserTypeHandler(IUserInfo userInfo)
// {
// _userInfo = userInfo;
// }
// public UserTypeHandler(IUserInfo userInfo)
// {
// _userInfo = userInfo;
// }
// protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserTypeRequirement requirement)
// {
// protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserTypeRequirement requirement)
// {
// //if (context.User.Claims.Count() == 0)
// //{
// // return Task.CompletedTask;
// //}
// //if (context.User.Claims.Count() == 0)
// //{
// // return Task.CompletedTask;
// //}
// //string userId = context.User.Claims.First(c => c.Type == "Userid").Value;
// //string qq = context.User.Claims.First(c => c.Type == "QQ").Value;
// //string userId = context.User.Claims.First(c => c.Type == "Userid").Value;
// //string qq = context.User.Claims.First(c => c.Type == "QQ").Value;
// //if (_UserService.Validata(userId, qq))
// //{
// // context.Succeed(requirement); //验证通过了
// //}
// ////在这里就可以做验证
// //if (_UserService.Validata(userId, qq))
// //{
// // context.Succeed(requirement); //验证通过了
// //}
// ////在这里就可以做验证
// return Task.CompletedTask;
// }
//}
// return Task.CompletedTask;
// }
//}

View File

@ -0,0 +1,29 @@

namespace IRaCIS.Core.Application.Helper;
public static class FileStoreHelper
{
public static (string TrustedFileNameForFileStorage, string RealName) GetStoreFileName(string fileName)
{
//带目录层级,需要后端处理前端的路径
if (fileName.Contains("\\"))
{
fileName = fileName.Split("\\").Last();
}
if (fileName.Contains("/"))
{
fileName = fileName.Split("/").Last();
}
var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileName;
return (trustedFileNameForFileStorage, fileName);
}
}

View File

@ -519,7 +519,7 @@ namespace IRaCIS.Application.Services
}
var success = await _userRepository.SaveChangesAsync();
return ResponseOutput.Result(success);
return ResponseOutput.Ok(success);
}

View File

@ -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,6 +157,7 @@ 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);
@ -163,8 +165,9 @@ namespace IRaCIS.Core.Application.Contracts
[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();
}
@ -181,6 +184,7 @@ 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,15 +238,16 @@ 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();

View File

@ -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);

View File

@ -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}";

View File

@ -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("您不是该质控任务当前领取人,没有操作权限!");
}
}
}
}

View File

@ -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);

View File

@ -13,5 +13,7 @@ namespace IRaCIS.Core.Domain.Share
public bool OpenTrialRelationDelete { get; set; }
public bool OpenLoginLimit { get; set; }
}
}

View File

@ -24,7 +24,17 @@ namespace IRaCIS.Core.Infrastructure.Extention
ProgramException = 4,
//需要提示 ,需要提示 从Result 取数据
NeedTips = 5
NeedTips = 5,
//在其他地方登陆,被迫下线
LoginInOtherPlace = -1,
//没有带token访问未登陆
NoToken=10,
//带了Token,但是没有相应权限(该用户类型不能做)
HaveTokenNotAccess=11
}