修改验证
parent
8dbaf7dade
commit
1b7f983e24
|
@ -170,7 +170,9 @@ namespace IRaCIS.Api.Controllers
|
||||||
}
|
}
|
||||||
|
|
||||||
var userId = returnModel.Data.BasicInfo.Id.ToString();
|
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;
|
return returnModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Filter;
|
using IRaCIS.Core.Application.Filter;
|
||||||
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Domain.Models;
|
using IRaCIS.Core.Domain.Models;
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
using IRaCIS.Core.Infra.EFCore;
|
using IRaCIS.Core.Infra.EFCore;
|
||||||
|
@ -205,10 +206,9 @@ namespace IRaCIS.Core.API.Controllers
|
||||||
if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath);
|
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}";
|
relativePath = $"/{StaticData.SystemDataFolder}/{StaticData.DataTemplate}/{trustedFileNameForFileStorage}";
|
||||||
|
|
||||||
|
@ -227,11 +227,9 @@ namespace IRaCIS.Core.API.Controllers
|
||||||
if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath);
|
if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath);
|
||||||
|
|
||||||
|
|
||||||
//var fileNameEX = Path.GetExtension(fileRealName);
|
var (trustedFileNameForFileStorage, fileName) = FileStoreHelper.GetStoreFileName(fileRealName);
|
||||||
//var fileName=Path.GetFileName(fileRealName);
|
|
||||||
//var trustedFileNameForFileStorage = fileName + Guid.NewGuid().ToString() + fileNameEX;
|
|
||||||
|
|
||||||
var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileRealName;
|
|
||||||
|
|
||||||
relativePath = $"/{StaticData.SystemDataFolder}/{StaticData.NoticeAttachment}/{trustedFileNameForFileStorage}";
|
relativePath = $"/{StaticData.SystemDataFolder}/{StaticData.NoticeAttachment}/{trustedFileNameForFileStorage}";
|
||||||
|
|
||||||
|
@ -271,11 +269,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||||
var uploadFolderPath = Path.Combine(_fileStorePath, trialId.ToString(), StaticData.SignDocumentFolder);
|
var uploadFolderPath = Path.Combine(_fileStorePath, trialId.ToString(), StaticData.SignDocumentFolder);
|
||||||
if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath);
|
if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath);
|
||||||
|
|
||||||
|
var (trustedFileNameForFileStorage, fileName) = FileStoreHelper.GetStoreFileName(fileRealName);
|
||||||
//var fileNameEX = Path.GetExtension(fileRealName);
|
|
||||||
//var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileNameEX;
|
|
||||||
|
|
||||||
var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileRealName;
|
|
||||||
|
|
||||||
relativePath = $"/{StaticData.TrialDataFolder}/{trialId}/{StaticData.SignDocumentFolder}/{trustedFileNameForFileStorage}";
|
relativePath = $"/{StaticData.TrialDataFolder}/{trialId}/{StaticData.SignDocumentFolder}/{trustedFileNameForFileStorage}";
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ namespace IRaCIS.Core.API
|
||||||
NewId.SetProcessIdProvider(new CurrentProcessIdProvider());
|
NewId.SetProcessIdProvider(new CurrentProcessIdProvider());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//// Serilog
|
//// Serilog
|
||||||
SerilogExtension.AddSerilogSetup(environment, host.Services);
|
SerilogExtension.AddSerilogSetup(environment, host.Services);
|
||||||
|
|
|
@ -75,6 +75,9 @@ namespace IRaCIS.Core.API
|
||||||
options.Filters.Add<ModelActionFilter>();
|
options.Filters.Add<ModelActionFilter>();
|
||||||
options.Filters.Add<ProjectExceptionFilter>();
|
options.Filters.Add<ProjectExceptionFilter>();
|
||||||
options.Filters.Add<UnitOfWorkFilter>();
|
options.Filters.Add<UnitOfWorkFilter>();
|
||||||
|
|
||||||
|
options.Filters.Add<LimitUserRequestAuthorization>();
|
||||||
|
|
||||||
})
|
})
|
||||||
.AddDataAnnotationsLocalization(options => {
|
.AddDataAnnotationsLocalization(options => {
|
||||||
options.DataAnnotationLocalizerProvider = (type, factory) =>
|
options.DataAnnotationLocalizerProvider = (type, factory) =>
|
||||||
|
|
|
@ -24,14 +24,14 @@ namespace IRaCIS.Core.API
|
||||||
{
|
{
|
||||||
Response.ContentType = "application/json";
|
Response.ContentType = "application/json";
|
||||||
Response.StatusCode = StatusCodes.Status401Unauthorized;
|
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)
|
protected override async Task HandleForbiddenAsync(AuthenticationProperties properties)
|
||||||
{
|
{
|
||||||
Response.ContentType = "application/json";
|
Response.ContentType = "application/json";
|
||||||
Response.StatusCode = StatusCodes.Status403Forbidden;
|
Response.StatusCode = StatusCodes.Status403Forbidden;
|
||||||
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("您的权限不允许进行该操作")));
|
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("您的权限不允许进行该操作",ApiResponseCodeEnum.HaveTokenNotAccess)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,9 @@
|
||||||
|
|
||||||
"OpenSignDocumentBeforeWork": false,
|
"OpenSignDocumentBeforeWork": false,
|
||||||
|
|
||||||
"OpenTrialRelationDelete": true
|
"OpenTrialRelationDelete": true,
|
||||||
|
|
||||||
|
"OpenLoginLimit": true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,9 @@
|
||||||
|
|
||||||
"OpenUserComplexPassword": true,
|
"OpenUserComplexPassword": true,
|
||||||
|
|
||||||
"OpenSignDocumentBeforeWork": true
|
"OpenSignDocumentBeforeWork": true,
|
||||||
|
|
||||||
|
"OpenLoginLimit": true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
using EasyCaching.Core;
|
using EasyCaching.Core;
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace IRaCIS.Core.Application.Filter;
|
||||||
namespace IRaCIS.Core.Application.BusinessFilter;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,66 +20,79 @@ public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter
|
||||||
|
|
||||||
private readonly IUserInfo _userInfo;
|
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;
|
_provider = provider;
|
||||||
_userInfo = userInfo;
|
_userInfo = userInfo;
|
||||||
|
_verifyConfig = verifyConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
|
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
|
||||||
{
|
{
|
||||||
if (context.ActionDescriptor.EndpointMetadata.Any(item => item is IAllowAnonymous))
|
if (_verifyConfig.CurrentValue.OpenLoginLimit)
|
||||||
{
|
{
|
||||||
//匿名访问的不处理
|
if (context.ActionDescriptor.EndpointMetadata.Any(item => item is IAllowAnonymous))
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//1、用户登陆的时候,设置缓存
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//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
|
else
|
||||||
{
|
{
|
||||||
context.Result = new StatusCodeResult(401);
|
//1、用户登陆的时候,设置缓存
|
||||||
}
|
|
||||||
|
|
||||||
var cacheHostToken = (await _provider.GetAsync<string>(_userInfo.IP.ToString()+_userInfo.LocalIp.ToString())).Value;
|
|
||||||
|
|
||||||
if (cacheHostToken == null)
|
|
||||||
{
|
//2、在这里取缓存 进行比较 看是否有其他人进行了登陆,如果其他人登陆了,就把之前用户挤掉
|
||||||
//设置当前主机最新Token
|
|
||||||
await _provider.SetAsync(_userInfo.IP.ToString() + _userInfo.LocalIp.ToString(), _userInfo.UserToken, TimeSpan.FromDays(7));
|
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)
|
// public UserTypeHandler(IUserInfo userInfo)
|
||||||
// {
|
// {
|
||||||
// _userInfo = 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)
|
// //if (context.User.Claims.Count() == 0)
|
||||||
// //{
|
// //{
|
||||||
// // return Task.CompletedTask;
|
// // return Task.CompletedTask;
|
||||||
// //}
|
// //}
|
||||||
|
|
||||||
// //string userId = context.User.Claims.First(c => c.Type == "Userid").Value;
|
// //string userId = context.User.Claims.First(c => c.Type == "Userid").Value;
|
||||||
// //string qq = context.User.Claims.First(c => c.Type == "QQ").Value;
|
// //string qq = context.User.Claims.First(c => c.Type == "QQ").Value;
|
||||||
|
|
||||||
// //if (_UserService.Validata(userId, qq))
|
// //if (_UserService.Validata(userId, qq))
|
||||||
// //{
|
// //{
|
||||||
// // context.Succeed(requirement); //验证通过了
|
// // context.Succeed(requirement); //验证通过了
|
||||||
// //}
|
// //}
|
||||||
// ////在这里就可以做验证
|
// ////在这里就可以做验证
|
||||||
|
|
||||||
// return Task.CompletedTask;
|
// return Task.CompletedTask;
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -519,7 +519,7 @@ namespace IRaCIS.Application.Services
|
||||||
}
|
}
|
||||||
var success = await _userRepository.SaveChangesAsync();
|
var success = await _userRepository.SaveChangesAsync();
|
||||||
|
|
||||||
return ResponseOutput.Result(success);
|
return ResponseOutput.Ok(success);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,9 @@ using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using IRaCIS.Core.Domain.Share;
|
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
|
namespace IRaCIS.Core.Application.Contracts
|
||||||
{
|
{
|
||||||
|
@ -20,21 +23,25 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
private readonly IRepository<PreviousHistory> _previousHistoryRepository;
|
private readonly IRepository<PreviousHistory> _previousHistoryRepository;
|
||||||
private readonly IRepository<PreviousSurgery> _previousSurgeryRepository;
|
private readonly IRepository<PreviousSurgery> _previousSurgeryRepository;
|
||||||
private readonly IRepository<PreviousPDF> _previousPdfRepository;
|
private readonly IRepository<PreviousPDF> _previousPdfRepository;
|
||||||
|
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
|
||||||
|
|
||||||
|
|
||||||
public ClinicalDataService(IRepository<PreviousHistory> previousHistoryRepository,
|
public ClinicalDataService(IRepository<PreviousHistory> previousHistoryRepository,
|
||||||
IRepository<PreviousOther> previousOtherRepository,
|
IRepository<PreviousOther> previousOtherRepository,
|
||||||
IRepository<PreviousSurgery> previousSurgeryRepository,
|
IRepository<PreviousSurgery> previousSurgeryRepository,
|
||||||
IRepository<PreviousPDF> previousPDFRepository)
|
IRepository<PreviousPDF> previousPDFRepository,
|
||||||
|
IRepository<SubjectVisit> subjectVisitRepository
|
||||||
|
)
|
||||||
{
|
{
|
||||||
_previousOtherRepository = previousOtherRepository;
|
_previousOtherRepository = previousOtherRepository;
|
||||||
_previousHistoryRepository = previousHistoryRepository;
|
_previousHistoryRepository = previousHistoryRepository;
|
||||||
_previousSurgeryRepository = previousSurgeryRepository;
|
_previousSurgeryRepository = previousSurgeryRepository;
|
||||||
_previousPdfRepository = previousPDFRepository;
|
_previousPdfRepository = previousPDFRepository;
|
||||||
|
_subjectVisitRepository = subjectVisitRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 上传临床数据
|
/// 上传临床数据
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -46,7 +53,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
[DisableRequestSizeLimit]
|
[DisableRequestSizeLimit]
|
||||||
public async Task<IResponseOutput> UploadVisitClinicalData(IFormCollection formCollection, Guid subjectVisitId, [FromServices] IWebHostEnvironment _hostEnvironment)
|
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;
|
var rootPath = Directory.GetParent(_hostEnvironment.ContentRootPath.TrimEnd('\\')).IfNullThrowException().FullName;
|
||||||
|
|
||||||
|
@ -65,9 +72,8 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
|
|
||||||
foreach (IFormFile file in formCollection.Files)
|
foreach (IFormFile file in formCollection.Files)
|
||||||
{
|
{
|
||||||
var realName = file.FileName;
|
|
||||||
var fileNameEX = Path.GetExtension(realName);
|
var (trustedFileNameForFileStorage, fileName) = FileStoreHelper.GetStoreFileName(file.FileName);
|
||||||
var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileNameEX;
|
|
||||||
|
|
||||||
var relativePath = $"/{StaticData.TrialDataFolder}/{sv.TrialId}/{sv.SiteId}/{sv.SubjectId}/{subjectVisitId}/{StaticData.TreatmenthistoryFolder}/{trustedFileNameForFileStorage}";
|
var relativePath = $"/{StaticData.TrialDataFolder}/{sv.TrialId}/{sv.SiteId}/{sv.SubjectId}/{subjectVisitId}/{StaticData.TreatmenthistoryFolder}/{trustedFileNameForFileStorage}";
|
||||||
|
|
||||||
|
@ -80,7 +86,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
}
|
}
|
||||||
|
|
||||||
//插入临床pdf 路径
|
//插入临床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();
|
||||||
|
|
||||||
//return ResponseOutput.Ok(new
|
|
||||||
//{
|
|
||||||
// FilePath = relativePath,
|
|
||||||
// FullFilePath = relativePath + "?access_token=" + _userInfo.UserToken
|
|
||||||
|
|
||||||
//});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -156,15 +157,17 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
[HttpPost("{trialId:guid}")]
|
[HttpPost("{trialId:guid}")]
|
||||||
public async Task<IResponseOutput<Guid>> AddOrUpdatePreviousHistory(PreviousHistoryAddOrEdit addOrEditPreviousHistory)
|
public async Task<IResponseOutput<Guid>> AddOrUpdatePreviousHistory(PreviousHistoryAddOrEdit addOrEditPreviousHistory)
|
||||||
{
|
{
|
||||||
|
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditPreviousHistory.SubjectVisitId);
|
||||||
|
|
||||||
var entity = await _previousHistoryRepository.InsertOrUpdateAsync(addOrEditPreviousHistory, true);
|
var entity = await _previousHistoryRepository.InsertOrUpdateAsync(addOrEditPreviousHistory, true);
|
||||||
return ResponseOutput.Ok(entity.Id);
|
return ResponseOutput.Ok(entity.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{previousHistoryId:guid}")]
|
[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);
|
await _previousHistoryRepository.DeleteFromQueryAsync(t => t.Id == previousHistoryId,true);
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
|
@ -180,7 +183,8 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
|
|
||||||
[HttpPost("{trialId:guid}")]
|
[HttpPost("{trialId:guid}")]
|
||||||
public async Task<IResponseOutput<Guid>> AddOrUpdatePreviousOther(PreviousOtherAddOrEdit addOrEditPreviousOther)
|
public async Task<IResponseOutput<Guid>> AddOrUpdatePreviousOther(PreviousOtherAddOrEdit addOrEditPreviousOther)
|
||||||
{
|
{
|
||||||
|
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditPreviousOther.SubjectVisitId);
|
||||||
var entity = await _previousOtherRepository.InsertOrUpdateAsync(addOrEditPreviousOther, true);
|
var entity = await _previousOtherRepository.InsertOrUpdateAsync(addOrEditPreviousOther, true);
|
||||||
return ResponseOutput.Ok(entity.Id);
|
return ResponseOutput.Ok(entity.Id);
|
||||||
|
|
||||||
|
@ -188,8 +192,10 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
|
|
||||||
|
|
||||||
[HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{previousOtherId:guid}")]
|
[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);
|
await _previousOtherRepository.DeleteFromQueryAsync(t => t.Id == previousOtherId,true);
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
|
@ -206,15 +212,16 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
[HttpPost("{trialId:guid}")]
|
[HttpPost("{trialId:guid}")]
|
||||||
public async Task<IResponseOutput<Guid>> AddOrUpdatePreviousSurgery(PreviousSurgeryAddOrEdit addOrEditPreviousSurgery)
|
public async Task<IResponseOutput<Guid>> AddOrUpdatePreviousSurgery(PreviousSurgeryAddOrEdit addOrEditPreviousSurgery)
|
||||||
{
|
{
|
||||||
|
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditPreviousSurgery.SubjectVisitId);
|
||||||
var entity = await _previousSurgeryRepository.InsertOrUpdateAsync(addOrEditPreviousSurgery, true);
|
var entity = await _previousSurgeryRepository.InsertOrUpdateAsync(addOrEditPreviousSurgery, true);
|
||||||
return ResponseOutput.Ok(entity.Id);
|
return ResponseOutput.Ok(entity.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{previousSurgeryId:guid}")]
|
[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);
|
var success = await _previousSurgeryRepository.DeleteFromQueryAsync(t => t.Id == previousSurgeryId,true);
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
|
@ -231,16 +238,17 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
|
|
||||||
public async Task<IResponseOutput> AddOrUpdatePreviousPDF(PreviousPDFAddOrEdit addOrEditPreviousPDF)
|
public async Task<IResponseOutput> AddOrUpdatePreviousPDF(PreviousPDFAddOrEdit addOrEditPreviousPDF)
|
||||||
{
|
{
|
||||||
|
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, addOrEditPreviousPDF.SubjectVisitId);
|
||||||
var entity = await _previousPdfRepository.InsertOrUpdateAsync(addOrEditPreviousPDF, true);
|
var entity = await _previousPdfRepository.InsertOrUpdateAsync(addOrEditPreviousPDF, true);
|
||||||
return ResponseOutput.Ok(entity.Id);
|
return ResponseOutput.Ok(entity.Id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{previousPDFId:guid}")]
|
[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);
|
await _previousPdfRepository.DeleteFromQueryAsync(t => t.Id == previousPDFId,true);
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,10 +16,10 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
Task<IResponseOutput<Guid>> AddOrUpdatePreviousOther(PreviousOtherAddOrEdit addOrEditPreviousOther);
|
Task<IResponseOutput<Guid>> AddOrUpdatePreviousOther(PreviousOtherAddOrEdit addOrEditPreviousOther);
|
||||||
Task<IResponseOutput> AddOrUpdatePreviousPDF(PreviousPDFAddOrEdit addOrEditPreviousPDF);
|
Task<IResponseOutput> AddOrUpdatePreviousPDF(PreviousPDFAddOrEdit addOrEditPreviousPDF);
|
||||||
Task<IResponseOutput<Guid>> AddOrUpdatePreviousSurgery(PreviousSurgeryAddOrEdit addOrEditPreviousSurgery);
|
Task<IResponseOutput<Guid>> AddOrUpdatePreviousSurgery(PreviousSurgeryAddOrEdit addOrEditPreviousSurgery);
|
||||||
Task<IResponseOutput> DeletePreviousHistory(Guid previousHistoryId);
|
Task<IResponseOutput> DeletePreviousHistory(Guid previousHistoryId, Guid subjectVisitId);
|
||||||
Task<IResponseOutput> DeletePreviousOther(Guid previousOtherId);
|
Task<IResponseOutput> DeletePreviousOther(Guid previousOtherId, Guid subjectVisitId);
|
||||||
Task<IResponseOutput> DeletePreviousPDF(Guid previousPDFId);
|
Task<IResponseOutput> DeletePreviousPDF(Guid previousPDFId, Guid subjectVisitId);
|
||||||
Task<IResponseOutput> DeletePreviousSurgery(Guid previousSurgeryId);
|
Task<IResponseOutput> DeletePreviousSurgery(Guid previousSurgeryId, Guid subjectVisitId);
|
||||||
Task<List<PreviousHistoryView>> GetPreviousHistoryList(PreviousHistoryQuery queryPreviousHistory);
|
Task<List<PreviousHistoryView>> GetPreviousHistoryList(PreviousHistoryQuery queryPreviousHistory);
|
||||||
Task<List<PreviousOtherView>> GetPreviousOtherList(PreviousOtherQuery queryPreviousOther);
|
Task<List<PreviousOtherView>> GetPreviousOtherList(PreviousOtherQuery queryPreviousOther);
|
||||||
Task<List<PreviousPDFView>> GetPreviousPDFList(Guid subjectVisitId);
|
Task<List<PreviousPDFView>> GetPreviousPDFList(Guid subjectVisitId);
|
||||||
|
|
|
@ -16,6 +16,8 @@ using IRaCIS.Application.Interfaces;
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using IRaCIS.Core.Application.Helper;
|
||||||
|
using IRaCIS.Core.Application.Service.Verify;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Contracts
|
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]
|
[HttpGet]
|
||||||
public async Task<List<NoneDicomStudyView>> GetNoneDicomStudyList( [FromQuery,NotDefault] Guid subjectVisitId,Guid? nonedicomStudyId)
|
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)
|
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC)
|
||||||
{
|
{
|
||||||
VerifyIsCanQC(null, addOrEditNoneDicomStudy.SubjectVisitId);
|
|
||||||
|
await QCCommonVerify.VerifyIsCanQCAsync(_repository, _userInfo, null, addOrEditNoneDicomStudy.SubjectVisitId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
optEntity = await _noneDicomStudyRepository.UpdateFromDTOAsync(addOrEditNoneDicomStudy);
|
optEntity = await _noneDicomStudyRepository.UpdateFromDTOAsync(addOrEditNoneDicomStudy);
|
||||||
|
@ -157,11 +150,9 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
public async Task<IResponseOutput> DeleteNoneDicomStudy(Guid noneDicomStudyId, Guid subjectVisitId)
|
public async Task<IResponseOutput> DeleteNoneDicomStudy(Guid noneDicomStudyId, Guid subjectVisitId)
|
||||||
{
|
{
|
||||||
//提交了 但是IQC同意的时候 是可以删除的 | 普通提交后也不能删除
|
//提交了 但是IQC同意的时候 是可以删除的 | 普通提交后也不能删除
|
||||||
if (await _subjectVisitRepository.AnyAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.Submitted &&
|
|
||||||
(!t.QCChallengeList.Any(u => u.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload))))
|
|
||||||
{
|
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository,_userInfo, subjectVisitId);
|
||||||
return ResponseOutput.NotOk("CRC Has Submited Image,can not delete");
|
|
||||||
}
|
|
||||||
|
|
||||||
await _noneDicomStudyRepository.DeleteFromQueryAsync(noneDicomStudyId);
|
await _noneDicomStudyRepository.DeleteFromQueryAsync(noneDicomStudyId);
|
||||||
|
|
||||||
|
@ -181,12 +172,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
public async Task<IResponseOutput> DeleteNoneDicomStudyFile(Guid noneDicomStudyFileId, Guid subjectVisitId)
|
public async Task<IResponseOutput> DeleteNoneDicomStudyFile(Guid noneDicomStudyFileId, Guid subjectVisitId)
|
||||||
{
|
{
|
||||||
//提交了 但是IQC同意的时候 是可以删除的 | 普通提交后也不能删除
|
//提交了 但是IQC同意的时候 是可以删除的 | 普通提交后也不能删除
|
||||||
if (await _subjectVisitRepository.AnyAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.Submitted &&
|
await QCCommonVerify.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId);
|
||||||
(!t.QCChallengeList.Any(u => u.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload))))
|
|
||||||
{
|
|
||||||
return ResponseOutput.NotOk("CRC Has Submited Image,can not delete");
|
|
||||||
}
|
|
||||||
//var subjectVisitId = await _noneDicomStudyFileRepository.Where(t => t.Id == noneDicomStudyFileId).Select(t => t.NoneDicomStudy.SubjectVisitId).FirstOrDefaultAsync();
|
|
||||||
|
|
||||||
var success = await _noneDicomStudyFileRepository.DeleteFromQueryAsync(t => t.Id == noneDicomStudyFileId, true);
|
var success = await _noneDicomStudyFileRepository.DeleteFromQueryAsync(t => t.Id == noneDicomStudyFileId, true);
|
||||||
|
|
||||||
|
@ -227,6 +213,8 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
[TypeFilter(typeof(TrialResourceFilter))]
|
[TypeFilter(typeof(TrialResourceFilter))]
|
||||||
public async Task<IResponseOutput> UploadNoneDicomFile(IFormCollection formCollection, Guid subjectVisitId, Guid noneDicomStudyId)
|
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;
|
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 relativePath = $"/{StaticData.TrialDataFolder}/{sv.TrialId}/{sv.SiteId}/{sv.SubjectId}/{subjectVisitId}/{StaticData.NoneDicomFolder}/{trustedFileNameForFileStorage}";
|
||||||
|
|
||||||
var filePath = Path.Combine(uploadFolderPath, trustedFileNameForFileStorage);
|
var filePath = Path.Combine(uploadFolderPath, trustedFileNameForFileStorage);
|
||||||
|
@ -305,36 +295,11 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
return ResponseOutput.Ok(/*list*/);
|
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)
|
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}";
|
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;
|
dbSubjectVisit.SubmitTime = DateTime.Now;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return ResponseOutput.NotOk("当前访视的影像数据,已经由其他CRC提交。");
|
||||||
|
}
|
||||||
//不审 直接QC通过 可能一致性核查 也可能不一致性核查
|
//不审 直接QC通过 可能一致性核查 也可能不一致性核查
|
||||||
if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit)
|
if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit)
|
||||||
{
|
{
|
||||||
|
@ -1373,8 +1376,6 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||||
else if (trialConfig.QCProcessEnum == TrialQCProcess.DoubleAudit)
|
else if (trialConfig.QCProcessEnum == TrialQCProcess.DoubleAudit)
|
||||||
{
|
{
|
||||||
dbSubjectVisit.AuditState = AuditStateEnum.ToAudit;
|
dbSubjectVisit.AuditState = AuditStateEnum.ToAudit;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1382,7 +1383,8 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||||
|
|
||||||
|
|
||||||
var success = await _repository.SaveChangesAsync();
|
var success = await _repository.SaveChangesAsync();
|
||||||
return ResponseOutput.Result(success);
|
|
||||||
|
return ResponseOutput.Ok(success);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,5 +13,7 @@ namespace IRaCIS.Core.Domain.Share
|
||||||
|
|
||||||
|
|
||||||
public bool OpenTrialRelationDelete { get; set; }
|
public bool OpenTrialRelationDelete { get; set; }
|
||||||
|
|
||||||
|
public bool OpenLoginLimit { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -24,7 +24,17 @@ namespace IRaCIS.Core.Infrastructure.Extention
|
||||||
ProgramException = 4,
|
ProgramException = 4,
|
||||||
|
|
||||||
//需要提示 ,需要提示 从Result 取数据
|
//需要提示 ,需要提示 从Result 取数据
|
||||||
NeedTips = 5
|
NeedTips = 5,
|
||||||
|
|
||||||
|
|
||||||
|
//在其他地方登陆,被迫下线
|
||||||
|
LoginInOtherPlace = -1,
|
||||||
|
|
||||||
|
//没有带token访问(未登陆)
|
||||||
|
NoToken=10,
|
||||||
|
|
||||||
|
//带了Token,但是没有相应权限(该用户类型不能做)
|
||||||
|
HaveTokenNotAccess=11
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue