Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
commit
f6612286d9
|
@ -30,6 +30,8 @@ using IRaCIS.Core.Application.Helper;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using LoginReturnDTO = IRaCIS.Application.Contracts.LoginReturnDTO;
|
using LoginReturnDTO = IRaCIS.Application.Contracts.LoginReturnDTO;
|
||||||
|
using DocumentFormat.OpenXml.Spreadsheet;
|
||||||
|
using AutoMapper.QueryableExtensions;
|
||||||
|
|
||||||
namespace IRaCIS.Api.Controllers
|
namespace IRaCIS.Api.Controllers
|
||||||
{
|
{
|
||||||
|
@ -53,8 +55,8 @@ namespace IRaCIS.Api.Controllers
|
||||||
/// <param name="doctorId"></param>
|
/// <param name="doctorId"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet, Route("doctor/getDetail/{doctorId:guid}")]
|
[HttpGet, Route("doctor/getDetail/{doctorId:guid}")]
|
||||||
|
|
||||||
public async Task<IResponseOutput<DoctorDetailDTO>> GetDoctorDetail([FromServices] IAttachmentService attachmentService, [FromServices] IDoctorService _doctorService,
|
public async Task<IResponseOutput<DoctorDetailDTO>> GetDoctorDetail([FromServices] IAttachmentService attachmentService, [FromServices] IDoctorService _doctorService,
|
||||||
[FromServices] IEducationService _educationService, [FromServices] ITrialExperienceService _trialExperienceService,
|
[FromServices] IEducationService _educationService, [FromServices] ITrialExperienceService _trialExperienceService,
|
||||||
|
|
||||||
[FromServices] IResearchPublicationService _researchPublicationService, [FromServices] IVacationService _vacationService, Guid doctorId)
|
[FromServices] IResearchPublicationService _researchPublicationService, [FromServices] IVacationService _vacationService, Guid doctorId)
|
||||||
|
@ -66,7 +68,7 @@ namespace IRaCIS.Api.Controllers
|
||||||
|
|
||||||
var doctorDetail = new DoctorDetailDTO
|
var doctorDetail = new DoctorDetailDTO
|
||||||
{
|
{
|
||||||
AuditView =await _doctorService.GetAuditState(doctorId),
|
AuditView = await _doctorService.GetAuditState(doctorId),
|
||||||
BasicInfoView = await _doctorService.GetBasicInfo(doctorId),
|
BasicInfoView = await _doctorService.GetBasicInfo(doctorId),
|
||||||
EmploymentView = await _doctorService.GetEmploymentInfo(doctorId),
|
EmploymentView = await _doctorService.GetEmploymentInfo(doctorId),
|
||||||
AttachmentList = await attachmentService.GetAttachments(doctorId),
|
AttachmentList = await attachmentService.GetAttachments(doctorId),
|
||||||
|
@ -77,7 +79,7 @@ namespace IRaCIS.Api.Controllers
|
||||||
TrialExperienceView = await _trialExperienceService.GetTrialExperience(doctorId),
|
TrialExperienceView = await _trialExperienceService.GetTrialExperience(doctorId),
|
||||||
ResearchPublicationView = await _researchPublicationService.GetResearchPublication(doctorId),
|
ResearchPublicationView = await _researchPublicationService.GetResearchPublication(doctorId),
|
||||||
|
|
||||||
SpecialtyView =await _doctorService.GetSpecialtyInfo(doctorId),
|
SpecialtyView = await _doctorService.GetSpecialtyInfo(doctorId),
|
||||||
InHoliday = (await _vacationService.OnVacation(doctorId)).IsSuccess,
|
InHoliday = (await _vacationService.OnVacation(doctorId)).IsSuccess,
|
||||||
IntoGroupInfo = _doctorService.GetDoctorIntoGroupInfo(doctorId),
|
IntoGroupInfo = _doctorService.GetDoctorIntoGroupInfo(doctorId),
|
||||||
SowList = sowList,
|
SowList = sowList,
|
||||||
|
@ -96,80 +98,31 @@ namespace IRaCIS.Api.Controllers
|
||||||
/// <summary> 系统用户登录接口[New] </summary>
|
/// <summary> 系统用户登录接口[New] </summary>
|
||||||
[HttpPost, Route("user/login")]
|
[HttpPost, Route("user/login")]
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
public async Task<IResponseOutput<LoginReturnDTO>> Login(UserLoginDTO loginUser, [FromServices] IEasyCachingProvider provider, [FromServices] IUserService _userService,
|
public async Task<IResponseOutput> Login(UserLoginDTO loginUser,
|
||||||
[FromServices] ITokenService _tokenService,
|
[FromServices] IEasyCachingProvider provider,
|
||||||
|
[FromServices] IUserService _userService,
|
||||||
[FromServices] IReadingImageTaskService readingImageTaskService,
|
[FromServices] ITokenService _tokenService,
|
||||||
[FromServices] IConfiguration configuration)
|
[FromServices] IReadingImageTaskService readingImageTaskService,
|
||||||
|
IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig,
|
||||||
|
IMailVerificationService _mailVerificationService)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//MFA 邮箱验证 前端传递用户Id 和MFACode
|
||||||
var returnModel = await _userService.Login(loginUser.UserName, loginUser.Password);
|
if (loginUser.UserId != null && _verifyConfig.CurrentValue.OpenLoginMFA)
|
||||||
|
|
||||||
if (returnModel.IsSuccess)
|
|
||||||
{
|
{
|
||||||
#region GRPC 调用鉴权中心,因为服务器IIS问题 http/2 故而没法使用
|
Guid userId = (Guid)loginUser.UserId;
|
||||||
|
|
||||||
////重试策略
|
//验证MFA 编码是否有问题 ,前端要拆开,自己调用验证的逻辑
|
||||||
//var defaultMethodConfig = new MethodConfig
|
//await _userService.VerifyMFACodeAsync(userId, loginUser.MFACode);
|
||||||
//{
|
|
||||||
// Names = { MethodName.Default },
|
|
||||||
// RetryPolicy = new RetryPolicy
|
|
||||||
// {
|
|
||||||
// MaxAttempts = 3,
|
|
||||||
// InitialBackoff = TimeSpan.FromSeconds(1),
|
|
||||||
// MaxBackoff = TimeSpan.FromSeconds(5),
|
|
||||||
// BackoffMultiplier = 1.5,
|
|
||||||
// RetryableStatusCodes = { Grpc.Core.StatusCode.Unavailable }
|
|
||||||
// }
|
|
||||||
//};
|
|
||||||
|
|
||||||
//#region unable to trust the certificate then the gRPC client can be configured to ignore the invalid certificate
|
//var loginUser = await _userRepository.Where(u => u.UserName.Equals(userName) && u.Password == password).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
|
||||||
|
|
||||||
//var httpHandler = new HttpClientHandler();
|
var basicInfo = await _userService.GetUserBasicInfo(userId, loginUser.Password);
|
||||||
//// Return `true` to allow certificates that are untrusted/invalid
|
|
||||||
//httpHandler.ServerCertificateCustomValidationCallback =
|
|
||||||
// HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
|
|
||||||
|
|
||||||
|
var loginReturn = new LoginReturnDTO() { BasicInfo = basicInfo };
|
||||||
|
|
||||||
//////这一句是让grpc支持本地 http 如果本地访问部署在服务器上,那么是访问不成功的
|
loginReturn.JWTStr = _tokenService.GetToken(IRaCISClaims.Create(loginReturn.BasicInfo));
|
||||||
//AppContext.SetSwitch(
|
|
||||||
// "System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
|
|
||||||
|
|
||||||
//#endregion
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//var grpcAdress = configuration.GetValue<string>("GrpcAddress");
|
|
||||||
////var grpcAdress = "http://localhost:7200";
|
|
||||||
|
|
||||||
//var channel = GrpcChannel.ForAddress(grpcAdress, new GrpcChannelOptions
|
|
||||||
//{
|
|
||||||
// HttpHandler = httpHandler,
|
|
||||||
// ServiceConfig = new ServiceConfig { MethodConfigs = { defaultMethodConfig } }
|
|
||||||
|
|
||||||
//});
|
|
||||||
////var channel = GrpcChannel.ForAddress(grpcAdress);
|
|
||||||
//var grpcClient = new TokenGrpcService.TokenGrpcServiceClient(channel);
|
|
||||||
|
|
||||||
//var userInfo = returnModel.Data.BasicInfo;
|
|
||||||
|
|
||||||
//var tokenResponse = grpcClient.GetUserToken(new GetTokenReuqest()
|
|
||||||
//{
|
|
||||||
// Id = userInfo.Id.ToString(),
|
|
||||||
// ReviewerCode = userInfo.ReviewerCode,
|
|
||||||
// IsAdmin = userInfo.IsAdmin,
|
|
||||||
// RealName = userInfo.RealName,
|
|
||||||
// UserTypeEnumInt = (int)userInfo.UserTypeEnum,
|
|
||||||
// UserTypeShortName = userInfo.UserTypeShortName,
|
|
||||||
// UserName = userInfo.UserName
|
|
||||||
//});
|
|
||||||
|
|
||||||
//returnModel.Data.JWTStr = tokenResponse.Token;
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
returnModel.Data.JWTStr = _tokenService.GetToken(IRaCISClaims.Create(returnModel.Data.BasicInfo));
|
|
||||||
|
|
||||||
// 创建一个 CookieOptions 对象,用于设置 Cookie 的属性
|
// 创建一个 CookieOptions 对象,用于设置 Cookie 的属性
|
||||||
var option = new CookieOptions
|
var option = new CookieOptions
|
||||||
|
@ -180,20 +133,161 @@ namespace IRaCIS.Api.Controllers
|
||||||
Secure = false // 确保 cookie 只能通过 HTTPS 访问
|
Secure = false // 确保 cookie 只能通过 HTTPS 访问
|
||||||
};
|
};
|
||||||
|
|
||||||
HttpContext.Response.Cookies.Append("access_token", returnModel.Data.JWTStr, option);
|
HttpContext.Response.Cookies.Append("access_token", loginReturn.JWTStr, option);
|
||||||
|
|
||||||
|
// 验证阅片休息时间
|
||||||
|
await readingImageTaskService.ResetReadingRestTime(userId);
|
||||||
|
|
||||||
|
await provider.SetAsync(userId.ToString(), loginReturn.JWTStr, TimeSpan.FromDays(7));
|
||||||
|
|
||||||
|
await provider.SetAsync($"{userId.ToString()}_Online", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes));
|
||||||
|
|
||||||
|
return ResponseOutput.Ok(loginReturn);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var returnModel = await _userService.Login(loginUser.UserName, loginUser.Password);
|
||||||
|
|
||||||
|
if (returnModel.IsSuccess)
|
||||||
|
{
|
||||||
|
#region GRPC 调用鉴权中心,因为服务器IIS问题 http/2 故而没法使用
|
||||||
|
|
||||||
|
////重试策略
|
||||||
|
//var defaultMethodConfig = new MethodConfig
|
||||||
|
//{
|
||||||
|
// Names = { MethodName.Default },
|
||||||
|
// RetryPolicy = new RetryPolicy
|
||||||
|
// {
|
||||||
|
// MaxAttempts = 3,
|
||||||
|
// InitialBackoff = TimeSpan.FromSeconds(1),
|
||||||
|
// MaxBackoff = TimeSpan.FromSeconds(5),
|
||||||
|
// BackoffMultiplier = 1.5,
|
||||||
|
// RetryableStatusCodes = { Grpc.Core.StatusCode.Unavailable }
|
||||||
|
// }
|
||||||
|
//};
|
||||||
|
|
||||||
|
//#region unable to trust the certificate then the gRPC client can be configured to ignore the invalid certificate
|
||||||
|
|
||||||
|
//var httpHandler = new HttpClientHandler();
|
||||||
|
//// Return `true` to allow certificates that are untrusted/invalid
|
||||||
|
//httpHandler.ServerCertificateCustomValidationCallback =
|
||||||
|
// HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
|
||||||
|
|
||||||
|
|
||||||
|
//////这一句是让grpc支持本地 http 如果本地访问部署在服务器上,那么是访问不成功的
|
||||||
|
//AppContext.SetSwitch(
|
||||||
|
// "System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//var grpcAdress = configuration.GetValue<string>("GrpcAddress");
|
||||||
|
////var grpcAdress = "http://localhost:7200";
|
||||||
|
|
||||||
|
//var channel = GrpcChannel.ForAddress(grpcAdress, new GrpcChannelOptions
|
||||||
|
//{
|
||||||
|
// HttpHandler = httpHandler,
|
||||||
|
// ServiceConfig = new ServiceConfig { MethodConfigs = { defaultMethodConfig } }
|
||||||
|
|
||||||
|
//});
|
||||||
|
////var channel = GrpcChannel.ForAddress(grpcAdress);
|
||||||
|
//var grpcClient = new TokenGrpcService.TokenGrpcServiceClient(channel);
|
||||||
|
|
||||||
|
//var userInfo = returnModel.Data.BasicInfo;
|
||||||
|
|
||||||
|
//var tokenResponse = grpcClient.GetUserToken(new GetTokenReuqest()
|
||||||
|
//{
|
||||||
|
// Id = userInfo.Id.ToString(),
|
||||||
|
// ReviewerCode = userInfo.ReviewerCode,
|
||||||
|
// IsAdmin = userInfo.IsAdmin,
|
||||||
|
// RealName = userInfo.RealName,
|
||||||
|
// UserTypeEnumInt = (int)userInfo.UserTypeEnum,
|
||||||
|
// UserTypeShortName = userInfo.UserTypeShortName,
|
||||||
|
// UserName = userInfo.UserName
|
||||||
|
//});
|
||||||
|
|
||||||
|
//returnModel.Data.JWTStr = tokenResponse.Token;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
var userId = returnModel.Data.BasicInfo.Id;
|
||||||
|
|
||||||
|
if (_verifyConfig.CurrentValue.OpenLoginMFA)
|
||||||
|
{
|
||||||
|
//发版屏蔽
|
||||||
|
|
||||||
|
returnModel.Data.JWTStr = _tokenService.GetToken(IRaCISClaims.Create(returnModel.Data.BasicInfo));
|
||||||
|
|
||||||
|
//MFA 发送邮件
|
||||||
|
|
||||||
|
returnModel.Data.IsMFA = true;
|
||||||
|
|
||||||
|
var email = returnModel.Data.BasicInfo.EMail;
|
||||||
|
|
||||||
|
#region 隐藏Email
|
||||||
|
// 找到 "@" 符号的位置
|
||||||
|
int atIndex = email.IndexOf('@');
|
||||||
|
|
||||||
|
// 替换 "@" 符号前的中间两位为星号
|
||||||
|
string visiblePart = email.Substring(0, atIndex);
|
||||||
|
|
||||||
|
int startIndex = (visiblePart.Length - 2) / 2;
|
||||||
|
|
||||||
|
// 替换中间两位字符为星号
|
||||||
|
string hiddenPartBeforeAt = visiblePart.Substring(0, startIndex) + "**" + visiblePart.Substring(startIndex + 2);
|
||||||
|
|
||||||
|
string afterAt = email.Substring(atIndex + 1);
|
||||||
|
|
||||||
|
// 组合隐藏和可见部分
|
||||||
|
string hiddenEmail = hiddenPartBeforeAt + "@" + afterAt;
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
returnModel.Data.BasicInfo.EMail = hiddenEmail;
|
||||||
|
|
||||||
|
await _userService.SendMFAEmail(userId);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
returnModel.Data.JWTStr = _tokenService.GetToken(IRaCISClaims.Create(returnModel.Data.BasicInfo));
|
||||||
|
|
||||||
|
// 创建一个 CookieOptions 对象,用于设置 Cookie 的属性
|
||||||
|
var option = new CookieOptions
|
||||||
|
{
|
||||||
|
Expires = DateTime.Now.AddMonths(1), // 设置过期时间为 30 分钟之后
|
||||||
|
HttpOnly = false, // 确保 cookie 只能通过 HTTP 访问
|
||||||
|
SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None, // 设置 SameSite 属性
|
||||||
|
Secure = false // 确保 cookie 只能通过 HTTPS 访问
|
||||||
|
};
|
||||||
|
|
||||||
|
HttpContext.Response.Cookies.Append("access_token", returnModel.Data.JWTStr, option);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 验证阅片休息时间
|
||||||
|
await readingImageTaskService.ResetReadingRestTime(returnModel.Data.BasicInfo.Id);
|
||||||
|
|
||||||
|
await provider.SetAsync(userId.ToString(), returnModel.Data.JWTStr, TimeSpan.FromDays(7));
|
||||||
|
|
||||||
|
await provider.SetAsync($"{userId.ToString()}_Online", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return returnModel;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var userId = returnModel.Data.BasicInfo.Id.ToString();
|
|
||||||
//provider.Set(userId, userId, TimeSpan.FromMinutes(AppSettings.LoginExpiredTimeSpan));
|
|
||||||
// 验证阅片休息时间
|
|
||||||
await readingImageTaskService.ResetReadingRestTime(returnModel.Data.BasicInfo.Id);
|
|
||||||
await provider.SetAsync(userId.ToString(), returnModel.Data.JWTStr, TimeSpan.FromDays(7));
|
|
||||||
return returnModel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[HttpGet, Route("imageShare/ShareImage")]
|
[HttpGet, Route("imageShare/ShareImage")]
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
public IResponseOutput ShareImage([FromServices] ITokenService _tokenService)
|
public IResponseOutput ShareImage([FromServices] ITokenService _tokenService)
|
||||||
|
@ -223,7 +317,7 @@ namespace IRaCIS.Api.Controllers
|
||||||
|
|
||||||
var ossOptions = serviceOption.AliyunOSS;
|
var ossOptions = serviceOption.AliyunOSS;
|
||||||
|
|
||||||
return ResponseOutput.Ok(new ObjectStoreDTO() { ObjectStoreUse = serviceOption.ObjectStoreUse, MinIO = serviceOption.MinIO ,AliyunOSS= serviceOption.AliyunOSS,AWS=serviceOption.AWS });
|
return ResponseOutput.Ok(new ObjectStoreDTO() { ObjectStoreUse = serviceOption.ObjectStoreUse, MinIO = serviceOption.MinIO, AliyunOSS = serviceOption.AliyunOSS, AWS = serviceOption.AWS });
|
||||||
|
|
||||||
#region 临时token 屏蔽
|
#region 临时token 屏蔽
|
||||||
//IClientProfile profile = DefaultProfile.GetProfile(ossOptions.RegionId, ossOptions.AccessKeyId, ossOptions.AccessKeySecret);
|
//IClientProfile profile = DefaultProfile.GetProfile(ossOptions.RegionId, ossOptions.AccessKeyId, ossOptions.AccessKeySecret);
|
||||||
|
@ -264,19 +358,19 @@ namespace IRaCIS.Api.Controllers
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(Enum.TryParse<ObjectStoreUse>(serviceOption.ObjectStoreUse, out var parsedValue) && parsedValue == ObjectStoreUse.MinIO)
|
else if (Enum.TryParse<ObjectStoreUse>(serviceOption.ObjectStoreUse, out var parsedValue) && parsedValue == ObjectStoreUse.MinIO)
|
||||||
{
|
{
|
||||||
return ResponseOutput.Ok(new ObjectStoreDTO() { ObjectStoreUse=serviceOption.ObjectStoreUse,MinIO=serviceOption.MinIO, AWS = serviceOption.AWS });
|
return ResponseOutput.Ok(new ObjectStoreDTO() { ObjectStoreUse = serviceOption.ObjectStoreUse, MinIO = serviceOption.MinIO, AWS = serviceOption.AWS });
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return ResponseOutput.Ok(new ObjectStoreDTO() { ObjectStoreUse = serviceOption.ObjectStoreUse, MinIO = serviceOption.MinIO, AWS = serviceOption.AWS });
|
return ResponseOutput.Ok(new ObjectStoreDTO() { ObjectStoreUse = serviceOption.ObjectStoreUse, MinIO = serviceOption.MinIO, AWS = serviceOption.AWS });
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("user/GenerateSTS")]
|
[HttpGet("user/GenerateSTS")]
|
||||||
public IResponseOutput GenerateSTS([FromServices]IOptionsMonitor<AliyunOSSOptions> options )
|
public IResponseOutput GenerateSTS([FromServices] IOptionsMonitor<AliyunOSSOptions> options)
|
||||||
{
|
{
|
||||||
var ossOptions = options.CurrentValue;
|
var ossOptions = options.CurrentValue;
|
||||||
|
|
||||||
|
@ -304,9 +398,9 @@ namespace IRaCIS.Api.Controllers
|
||||||
SecurityToken = response.Credentials.SecurityToken,
|
SecurityToken = response.Credentials.SecurityToken,
|
||||||
Expiration = response.Credentials.Expiration,
|
Expiration = response.Credentials.Expiration,
|
||||||
|
|
||||||
Region = ossOptions.region ,
|
Region = ossOptions.region,
|
||||||
BucketName = ossOptions.bucketName ,
|
BucketName = ossOptions.bucketName,
|
||||||
ViewEndpoint = ossOptions.viewEndpoint ,
|
ViewEndpoint = ossOptions.viewEndpoint,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -318,12 +412,12 @@ namespace IRaCIS.Api.Controllers
|
||||||
|
|
||||||
[HttpGet("User/UserRedirect")]
|
[HttpGet("User/UserRedirect")]
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
public async Task<IActionResult> UserRedirect([FromServices] IRepository<User> _userRepository, string url ,[FromServices]ILogger<ExtraController> _logger)
|
public async Task<IActionResult> UserRedirect([FromServices] IRepository<User> _userRepository, string url, [FromServices] ILogger<ExtraController> _logger)
|
||||||
{
|
{
|
||||||
|
|
||||||
var decodeUrl = System.Web.HttpUtility.UrlDecode(url);
|
var decodeUrl = System.Web.HttpUtility.UrlDecode(url);
|
||||||
|
|
||||||
var userId = decodeUrl.Substring(decodeUrl.IndexOf("UserId=") + "UserId=".Length , 36) ;
|
var userId = decodeUrl.Substring(decodeUrl.IndexOf("UserId=") + "UserId=".Length, 36);
|
||||||
|
|
||||||
var token = decodeUrl.Substring(decodeUrl.IndexOf("access_token=") + "access_token=".Length);
|
var token = decodeUrl.Substring(decodeUrl.IndexOf("access_token=") + "access_token=".Length);
|
||||||
|
|
||||||
|
@ -331,12 +425,12 @@ namespace IRaCIS.Api.Controllers
|
||||||
|
|
||||||
var domainStrList = decodeUrl.Split("/").ToList().Take(3).ToList();
|
var domainStrList = decodeUrl.Split("/").ToList().Take(3).ToList();
|
||||||
|
|
||||||
var errorUrl = domainStrList[0]+"//"+ domainStrList[2]+ "/error";
|
var errorUrl = domainStrList[0] + "//" + domainStrList[2] + "/error";
|
||||||
|
|
||||||
|
|
||||||
if (!await _userRepository.AnyAsync(t => t.Id == Guid.Parse(userId) && t.EmailToken == token && t.IsFirstAdd))
|
if (!await _userRepository.AnyAsync(t => t.Id == Guid.Parse(userId) && t.EmailToken == token && t.IsFirstAdd))
|
||||||
{
|
{
|
||||||
decodeUrl = errorUrl+ $"?lang={lang}&ErrorMessage={System.Web.HttpUtility.UrlEncode(lang=="zh"? "您的初始化链接已过期": "Error!The initialization link has expired. Return")} ";
|
decodeUrl = errorUrl + $"?lang={lang}&ErrorMessage={System.Web.HttpUtility.UrlEncode(lang == "zh" ? "您的初始化链接已过期" : "Error!The initialization link has expired. Return")} ";
|
||||||
}
|
}
|
||||||
|
|
||||||
return Redirect(decodeUrl);
|
return Redirect(decodeUrl);
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
<param name="doctorId"></param>
|
<param name="doctorId"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Api.Controllers.ExtraController.Login(IRaCIS.Application.Contracts.UserLoginDTO,EasyCaching.Core.IEasyCachingProvider,IRaCIS.Application.Services.IUserService,IRaCIS.Core.Application.Auth.ITokenService,IRaCIS.Core.Application.Contracts.IReadingImageTaskService,Microsoft.Extensions.Configuration.IConfiguration)">
|
<member name="M:IRaCIS.Api.Controllers.ExtraController.Login(IRaCIS.Application.Contracts.UserLoginDTO,EasyCaching.Core.IEasyCachingProvider,IRaCIS.Application.Services.IUserService,IRaCIS.Core.Application.Auth.ITokenService,IRaCIS.Core.Application.Contracts.IReadingImageTaskService,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption},IRaCIS.Application.Services.IMailVerificationService)">
|
||||||
<summary> 系统用户登录接口[New] </summary>
|
<summary> 系统用户登录接口[New] </summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.AddOrUpdateTrialInspection(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Application.Contracts.TrialCommand})">
|
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.AddOrUpdateTrialInspection(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Application.Contracts.TrialCommand})">
|
||||||
|
|
|
@ -60,7 +60,10 @@
|
||||||
"LoginMaxFailCount": 5,
|
"LoginMaxFailCount": 5,
|
||||||
|
|
||||||
"LoginFailLockMinutes": 1,
|
"LoginFailLockMinutes": 1,
|
||||||
"AutoLoginOutMinutes": 1
|
|
||||||
|
"AutoLoginOutMinutes": 1,
|
||||||
|
|
||||||
|
"OpenLoginMFA": false
|
||||||
},
|
},
|
||||||
|
|
||||||
"SystemEmailSendConfig": {
|
"SystemEmailSendConfig": {
|
||||||
|
|
|
@ -853,11 +853,22 @@
|
||||||
后台托管服务的方式运行
|
后台托管服务的方式运行
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ImageAndDoc.DownloadAndUploadService.GetSubjectImageUploadList(System.Guid)">
|
<member name="M:IRaCIS.Core.Application.Service.ImageAndDoc.DownloadAndUploadService.SubejctRandomReadingTaskNameDeal(System.Guid,System.Guid)">
|
||||||
|
<summary>
|
||||||
|
受试者随机阅片,任务进行随机编号
|
||||||
|
进入阅片任务前,随机挑选出该受试者的一个任务,然后给该任务一个编号,编号给的逻辑是:TimePoint Ran+ 已阅任务数量+1
|
||||||
|
根据当前受试者该标准已阅任务数量(生效失效的任务都算,考虑重阅,最后编号不重复) 第一个就是TimePoint Ran1,后面依次随机挑选出来的阅片序号依次递增
|
||||||
|
</summary>
|
||||||
|
<param name="subjectId"></param>
|
||||||
|
<param name="trialReadingCriterionId"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.ImageAndDoc.DownloadAndUploadService.GetSubjectImageUploadList(System.Guid,System.Guid)">
|
||||||
<summary>
|
<summary>
|
||||||
获取该受试者任务上传列表(展示已上传情况)
|
获取该受试者任务上传列表(展示已上传情况)
|
||||||
</summary>
|
</summary>
|
||||||
<param name="subjectId"></param>
|
<param name="subjectId"></param>
|
||||||
|
<param name="trialReadingCriterionId"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ImageAndDoc.DownloadAndUploadService.RequestPackageAndAnonymizImage(System.Guid,System.Guid,System.Boolean)">
|
<member name="M:IRaCIS.Core.Application.Service.ImageAndDoc.DownloadAndUploadService.RequestPackageAndAnonymizImage(System.Guid,System.Guid,System.Boolean)">
|
||||||
|
@ -13254,6 +13265,22 @@
|
||||||
<param name="state"></param>
|
<param name="state"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Application.Services.UserService.SendMFAEmail(System.Guid)">
|
||||||
|
<summary>
|
||||||
|
发送MFA 验证邮件
|
||||||
|
</summary>
|
||||||
|
<param name="userId"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Application.Services.UserService.VerifyMFACodeAsync(System.Guid,System.String)">
|
||||||
|
<summary>
|
||||||
|
验证MFA 邮件
|
||||||
|
</summary>
|
||||||
|
<param name="userId"></param>
|
||||||
|
<param name="Code"></param>
|
||||||
|
<returns></returns>
|
||||||
|
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Application.Services.UserService.Login(System.String,System.String)">
|
<member name="M:IRaCIS.Application.Services.UserService.Login(System.String,System.String)">
|
||||||
<summary>
|
<summary>
|
||||||
用户登陆
|
用户登陆
|
||||||
|
|
|
@ -155,6 +155,8 @@ namespace IRaCIS.Core.Application.Service
|
||||||
await _visitTaskRepository.SaveChangesAsync();
|
await _visitTaskRepository.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//基于标准签名 产生任务 (或者手动选择某些访视生成该标准的任务)
|
//基于标准签名 产生任务 (或者手动选择某些访视生成该标准的任务)
|
||||||
public async Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId, bool? isManualSelectVisit = null, List<Guid>? subjectVisitIdList = null)
|
public async Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId, bool? isManualSelectVisit = null, List<Guid>? subjectVisitIdList = null)
|
||||||
{
|
{
|
||||||
|
@ -197,26 +199,29 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
foreach (var subjectVisit in subjectGroup.SubjectVisitList)
|
foreach (var subjectVisit in subjectGroup.SubjectVisitList)
|
||||||
{
|
{
|
||||||
var blindTaskName = string.Empty;
|
|
||||||
|
|
||||||
var isNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList);
|
var isNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList);
|
||||||
var isClinicalDataSign = IsClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList, subjectVisit.Id, trialId);
|
var isClinicalDataSign = IsClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList, subjectVisit.Id, trialId);
|
||||||
|
|
||||||
if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0)
|
var blindTaskName = string.Empty;
|
||||||
|
|
||||||
|
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.InOrder)
|
||||||
{
|
{
|
||||||
blindTaskName = visitBlindConfig.BlindBaseLineName;
|
if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0 && subjectVisit.VisitNum==0)
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.InOrder)
|
|
||||||
{
|
{
|
||||||
blindTaskName = visitBlindConfig.BlindFollowUpPrefix + " " + visitNumList.IndexOf(subjectVisit.VisitNum);
|
blindTaskName = visitBlindConfig.BlindBaseLineName;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
blindTaskName = visitBlindConfig.BlindFollowUpPrefix;
|
blindTaskName = visitBlindConfig.BlindFollowUpPrefix + " " + visitNumList.IndexOf(subjectVisit.VisitNum);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
blindTaskName ="Timepoint";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//每个访视 根据项目配置生成任务 双审生成两个
|
//每个访视 根据项目配置生成任务 双审生成两个
|
||||||
|
|
||||||
|
@ -661,17 +666,16 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
var assignConfigList = await _subjectUserRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.OrignalSubjectUserId == null && t.IsConfirmed).Select(u => new { u.DoctorUserId, u.ArmEnum }).ToListAsync();
|
var assignConfigList = await _subjectUserRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.OrignalSubjectUserId == null && t.IsConfirmed).Select(u => new { u.DoctorUserId, u.ArmEnum }).ToListAsync();
|
||||||
|
|
||||||
|
|
||||||
var blindTaskName = string.Empty;
|
|
||||||
|
|
||||||
var isNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList);
|
var isNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList);
|
||||||
var isClinicalDataSign = IsClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList, subjectVisit.Id, trialId);
|
var isClinicalDataSign = IsClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList, subjectVisit.Id, trialId);
|
||||||
|
|
||||||
var isFrontTaskNeedSignButNotSign = await _visitTaskRepository.AnyAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.TaskState == TaskState.Effect && t.VisitTaskNum < subjectVisit.VisitNum && t.IsNeedClinicalDataSign == true && t.IsClinicalDataSign == false);
|
var isFrontTaskNeedSignButNotSign = await _visitTaskRepository.AnyAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.TaskState == TaskState.Effect && t.VisitTaskNum < subjectVisit.VisitNum && t.IsNeedClinicalDataSign == true && t.IsClinicalDataSign == false);
|
||||||
|
|
||||||
|
var blindTaskName = string.Empty;
|
||||||
|
|
||||||
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.InOrder)
|
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.InOrder)
|
||||||
{
|
{
|
||||||
if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0)
|
if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0 && subjectVisit.VisitNum == 0)
|
||||||
{
|
{
|
||||||
blindTaskName = visitBlindConfig.BlindBaseLineName;
|
blindTaskName = visitBlindConfig.BlindBaseLineName;
|
||||||
}
|
}
|
||||||
|
@ -683,7 +687,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
blindTaskName = visitBlindConfig.BlindFollowUpPrefix;
|
blindTaskName = "Timepoint";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -105,21 +105,22 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
var list = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.TrialId == trialId && t.IsConfirm)
|
var list = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.TrialId == trialId && t.IsConfirm)
|
||||||
|
|
||||||
.OrderBy(t => t.ShowOrder)
|
.OrderBy(t => t.ShowOrder)
|
||||||
.Select(t => new TrialReadingCriterionDto() {
|
.Select(t => new TrialReadingCriterionDto()
|
||||||
TrialReadingCriterionId = t.Id,
|
{
|
||||||
|
TrialReadingCriterionId = t.Id,
|
||||||
IsAutoCreate = t.IsAutoCreate,
|
IsAutoCreate = t.IsAutoCreate,
|
||||||
IsAdditionalAssessment = t.IsAdditionalAssessment,
|
IsAdditionalAssessment = t.IsAdditionalAssessment,
|
||||||
TrialReadingCriterionName = t.CriterionName,
|
TrialReadingCriterionName = t.CriterionName,
|
||||||
CriterionType = t.CriterionType,
|
CriterionType = t.CriterionType,
|
||||||
ReadingType = t.ReadingType,
|
ReadingType = t.ReadingType,
|
||||||
ReadingInfoSignTime = t.ReadingInfoSignTime ,
|
ReadingInfoSignTime = t.ReadingInfoSignTime,
|
||||||
IsReadingPeriod= t.IsReadingPeriod,
|
IsReadingPeriod = t.IsReadingPeriod,
|
||||||
IsArbitrationReading=t.IsArbitrationReading,
|
IsArbitrationReading = t.IsArbitrationReading,
|
||||||
IsGlobalReading=t.IsGlobalReading,
|
IsGlobalReading = t.IsGlobalReading,
|
||||||
IsOncologyReading=t.IsOncologyReading,
|
IsOncologyReading = t.IsOncologyReading,
|
||||||
ImageDownloadEnum=t.ImageDownloadEnum,
|
ImageDownloadEnum = t.ImageDownloadEnum,
|
||||||
ImageUploadEnum=t.ImageUploadEnum,
|
ImageUploadEnum = t.ImageUploadEnum,
|
||||||
IsReadingTaskViewInOrder= t.IsReadingTaskViewInOrder
|
IsReadingTaskViewInOrder = t.IsReadingTaskViewInOrder
|
||||||
})
|
})
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
|
@ -154,12 +155,12 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
.WhereIf(querySubjectAssign.DoctorUserId != null, t => t.SubjectDoctorList.Any(t => t.DoctorUserId == querySubjectAssign.DoctorUserId && t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId))
|
.WhereIf(querySubjectAssign.DoctorUserId != null, t => t.SubjectDoctorList.Any(t => t.DoctorUserId == querySubjectAssign.DoctorUserId && t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId))
|
||||||
.WhereIf(!string.IsNullOrEmpty(querySubjectAssign.SubjectCode), t => t.Code.Contains(querySubjectAssign.SubjectCode))
|
.WhereIf(!string.IsNullOrEmpty(querySubjectAssign.SubjectCode), t => t.Code.Contains(querySubjectAssign.SubjectCode))
|
||||||
//未分配
|
//未分配
|
||||||
.WhereIf(querySubjectAssign.SubjectAllocateState == 0, t => !t.SubjectDoctorList.Any(t => t.AssignTime!=null && t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId))
|
.WhereIf(querySubjectAssign.SubjectAllocateState == 0, t => !t.SubjectDoctorList.Any(t => t.AssignTime != null && t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId))
|
||||||
//已分配
|
//已分配
|
||||||
.WhereIf(querySubjectAssign.SubjectAllocateState == 1, t => t.SubjectDoctorList.Any(t => t.AssignTime != null && t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId))
|
.WhereIf(querySubjectAssign.SubjectAllocateState == 1, t => t.SubjectDoctorList.Any(t => t.AssignTime != null && t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId))
|
||||||
|
|
||||||
.WhereIf(querySubjectAssign.ArmList.Count >0 , t => !querySubjectAssign.ArmList.Except(t.SubjectDoctorList.Where(t => t.AssignTime != null && t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId).Select(c => c.ArmEnum)).Any() )
|
.WhereIf(querySubjectAssign.ArmList.Count > 0, t => !querySubjectAssign.ArmList.Except(t.SubjectDoctorList.Where(t => t.AssignTime != null && t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId).Select(c => c.ArmEnum)).Any())
|
||||||
|
|
||||||
|
|
||||||
.WhereIf(isAddtinoarlCriterion, t => t.SubjectCriteriaEvaluationList.Where(t => t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId).Any(t => t.IsJoinEvaluation))
|
.WhereIf(isAddtinoarlCriterion, t => t.SubjectCriteriaEvaluationList.Where(t => t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId).Any(t => t.IsJoinEvaluation))
|
||||||
|
|
||||||
|
@ -173,7 +174,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
|
|
||||||
var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == querySubjectAssign.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder, x.ReadingType, x.IsArbitrationReading, x.IsOncologyReading, x.IsGlobalReading }).FirstOrDefaultAsync()).IfNullThrowException();
|
var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == querySubjectAssign.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder, x.ReadingType, x.IsArbitrationReading, x.IsOncologyReading, x.IsGlobalReading }).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
return ResponseOutput.Ok (pageList, criterionConfig);
|
return ResponseOutput.Ok(pageList, criterionConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -307,7 +308,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
|
|
||||||
var subjectId = cancelCommand.CancelList.First().SubjectId;
|
var subjectId = cancelCommand.CancelList.First().SubjectId;
|
||||||
|
|
||||||
await _repository.AddAsync(new SubjectCanceDoctor() { SubjectId = subjectId, Note = cancelCommand.Note,TrialReadingCriterionId=cancelCommand.TrialReadingCriterionId });
|
await _repository.AddAsync(new SubjectCanceDoctor() { SubjectId = subjectId, Note = cancelCommand.Note, TrialReadingCriterionId = cancelCommand.TrialReadingCriterionId });
|
||||||
|
|
||||||
await _visitTaskRepository.SaveChangesAsync();
|
await _visitTaskRepository.SaveChangesAsync();
|
||||||
|
|
||||||
|
@ -757,12 +758,12 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
/// <param name="queryVisitTask"></param>
|
/// <param name="queryVisitTask"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<IResponseOutput< PageOutput<ReadingTaskView>>> GetReadingTaskList(VisitTaskQuery queryVisitTask)
|
public async Task<IResponseOutput<PageOutput<ReadingTaskView>>> GetReadingTaskList(VisitTaskQuery queryVisitTask)
|
||||||
{
|
{
|
||||||
var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false)
|
var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false)
|
||||||
//.Where(t => t.IsAnalysisCreate == false && t.DoctorUserId != null)
|
//.Where(t => t.IsAnalysisCreate == false && t.DoctorUserId != null)
|
||||||
|
|
||||||
.WhereIf(queryVisitTask.IsEffect ==true, t => t.TaskState ==TaskState.Effect || t.TaskState == TaskState.Freeze)
|
.WhereIf(queryVisitTask.IsEffect == true, t => t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze)
|
||||||
.WhereIf(queryVisitTask.IsEffect == false, t => t.TaskState == TaskState.Adbandon || t.TaskState == TaskState.HaveReturned)
|
.WhereIf(queryVisitTask.IsEffect == false, t => t.TaskState == TaskState.Adbandon || t.TaskState == TaskState.HaveReturned)
|
||||||
|
|
||||||
.WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState)
|
.WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState)
|
||||||
|
@ -784,9 +785,9 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate))
|
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate))
|
||||||
.WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.AllocateTime > queryVisitTask.BeginAllocateDate)
|
.WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.AllocateTime > queryVisitTask.BeginAllocateDate)
|
||||||
.WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime < queryVisitTask.EndAllocateDate)
|
.WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime < queryVisitTask.EndAllocateDate)
|
||||||
.WhereIf(queryVisitTask.BeginSignTime != null, t => t.SignTime > queryVisitTask.BeginSignTime)
|
.WhereIf(queryVisitTask.BeginSignTime != null, t => t.SignTime > queryVisitTask.BeginSignTime)
|
||||||
.WhereIf(queryVisitTask.EndSignTime != null, t => t.SignTime < queryVisitTask.EndSignTime)
|
.WhereIf(queryVisitTask.EndSignTime != null, t => t.SignTime < queryVisitTask.EndSignTime)
|
||||||
.ProjectTo<ReadingTaskView>(_mapper.ConfigurationProvider);
|
.ProjectTo<ReadingTaskView>(_mapper.ConfigurationProvider);
|
||||||
|
|
||||||
var defalutSortArray = new string[] { nameof(VisitTask.IsUrgent) + " desc", nameof(VisitTask.SubjectId), nameof(VisitTask.VisitTaskNum) };
|
var defalutSortArray = new string[] { nameof(VisitTask.IsUrgent) + " desc", nameof(VisitTask.SubjectId), nameof(VisitTask.VisitTaskNum) };
|
||||||
|
|
||||||
|
@ -794,7 +795,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
|
|
||||||
var trialTaskConfig = _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).ProjectTo<TrialUrgentConfig>(_mapper.ConfigurationProvider).FirstOrDefault();
|
var trialTaskConfig = _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).ProjectTo<TrialUrgentConfig>(_mapper.ConfigurationProvider).FirstOrDefault();
|
||||||
|
|
||||||
return ResponseOutput.Ok (pageList, trialTaskConfig);
|
return ResponseOutput.Ok(pageList, trialTaskConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -826,13 +827,13 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
.WhereIf(queryVisitTask.ReadingCategory != null, t => t.OriginalReReadingTask.ReadingCategory == queryVisitTask.ReadingCategory)
|
.WhereIf(queryVisitTask.ReadingCategory != null, t => t.OriginalReReadingTask.ReadingCategory == queryVisitTask.ReadingCategory)
|
||||||
|
|
||||||
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.RequestReReadingReason), t => t.RequestReReadingReason.Contains(queryVisitTask.RequestReReadingReason))
|
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.RequestReReadingReason), t => t.RequestReReadingReason.Contains(queryVisitTask.RequestReReadingReason))
|
||||||
|
|
||||||
.WhereIf(queryVisitTask.RequestReReadingResultEnum != null, t => t.RequestReReadingResultEnum == queryVisitTask.RequestReReadingResultEnum)
|
.WhereIf(queryVisitTask.RequestReReadingResultEnum != null, t => t.RequestReReadingResultEnum == queryVisitTask.RequestReReadingResultEnum)
|
||||||
|
|
||||||
|
|
||||||
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.OriginalReReadingTask.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate) || (t.OriginalReReadingTask.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate == false))
|
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.OriginalReReadingTask.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate) || (t.OriginalReReadingTask.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate == false))
|
||||||
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.OriginalReReadingTask.TaskName.Contains(queryVisitTask.TaskName) || t.OriginalReReadingTask.TaskBlindName.Contains(queryVisitTask.TaskName))
|
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.OriginalReReadingTask.TaskName.Contains(queryVisitTask.TaskName) || t.OriginalReReadingTask.TaskBlindName.Contains(queryVisitTask.TaskName))
|
||||||
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => ((t.OriginalReReadingTask.Subject.Code.Contains(queryVisitTask.SubjectCode)|| t.OriginalReReadingTask.Subject.MedicalNo.Contains(queryVisitTask.SubjectCode)) && t.OriginalReReadingTask.IsAnalysisCreate == false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate))
|
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => ((t.OriginalReReadingTask.Subject.Code.Contains(queryVisitTask.SubjectCode) || t.OriginalReReadingTask.Subject.MedicalNo.Contains(queryVisitTask.SubjectCode)) && t.OriginalReReadingTask.IsAnalysisCreate == false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate))
|
||||||
.WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime > queryVisitTask.BeginAllocateDate)
|
.WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime > queryVisitTask.BeginAllocateDate)
|
||||||
.WhereIf(queryVisitTask.EndAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1))
|
.WhereIf(queryVisitTask.EndAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1))
|
||||||
|
|
||||||
|
@ -870,12 +871,12 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
.Where(t => t.RequestReReadingType == RequestReReadingType.DocotorApply)
|
.Where(t => t.RequestReReadingType == RequestReReadingType.DocotorApply)
|
||||||
.Where(t => t.OriginalReReadingTask.DoctorUserId == _userInfo.Id)
|
.Where(t => t.OriginalReReadingTask.DoctorUserId == _userInfo.Id)
|
||||||
.Where(t => t.OriginalReReadingTask.TrialId == queryVisitTask.TrialId)
|
.Where(t => t.OriginalReReadingTask.TrialId == queryVisitTask.TrialId)
|
||||||
.WhereIf(queryVisitTask.RequestReReadingResultEnum != null, t => t.RequestReReadingResultEnum == queryVisitTask.RequestReReadingResultEnum)
|
.WhereIf(queryVisitTask.RequestReReadingResultEnum != null, t => t.RequestReReadingResultEnum == queryVisitTask.RequestReReadingResultEnum)
|
||||||
.WhereIf(queryVisitTask.RootReReadingTaskId != null, t => t.RootReReadingTaskId == queryVisitTask.RootReReadingTaskId || t.OriginalReReadingTaskId == queryVisitTask.RootReReadingTaskId)
|
.WhereIf(queryVisitTask.RootReReadingTaskId != null, t => t.RootReReadingTaskId == queryVisitTask.RootReReadingTaskId || t.OriginalReReadingTaskId == queryVisitTask.RootReReadingTaskId)
|
||||||
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskCode), t => t.OriginalReReadingTask.TaskCode.Contains(queryVisitTask.TaskCode!) || t.RootReReadingTask.TaskCode.Contains(queryVisitTask.TaskCode!))
|
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskCode), t => t.OriginalReReadingTask.TaskCode.Contains(queryVisitTask.TaskCode!) || t.RootReReadingTask.TaskCode.Contains(queryVisitTask.TaskCode!))
|
||||||
.WhereIf(queryVisitTask.TaskState != null, t => t.OriginalReReadingTask.TaskState == queryVisitTask.TaskState)
|
.WhereIf(queryVisitTask.TaskState != null, t => t.OriginalReReadingTask.TaskState == queryVisitTask.TaskState)
|
||||||
.WhereIf(queryVisitTask.ReadingCategory != null, t => t.OriginalReReadingTask.ReadingCategory == queryVisitTask.ReadingCategory)
|
.WhereIf(queryVisitTask.ReadingCategory != null, t => t.OriginalReReadingTask.ReadingCategory == queryVisitTask.ReadingCategory)
|
||||||
.WhereIf(queryVisitTask.ReReadingApplyState != null, t => t.OriginalReReadingTask.ReReadingApplyState == queryVisitTask.ReReadingApplyState)
|
.WhereIf(queryVisitTask.ReReadingApplyState != null, t => t.OriginalReReadingTask.ReReadingApplyState == queryVisitTask.ReReadingApplyState)
|
||||||
.WhereIf(queryVisitTask.TrialSiteId != null, t => t.OriginalReReadingTask.Subject.TrialSiteId == queryVisitTask.TrialSiteId)
|
.WhereIf(queryVisitTask.TrialSiteId != null, t => t.OriginalReReadingTask.Subject.TrialSiteId == queryVisitTask.TrialSiteId)
|
||||||
.WhereIf(queryVisitTask.SubjectId != null, t => t.OriginalReReadingTask.SubjectId == queryVisitTask.SubjectId)
|
.WhereIf(queryVisitTask.SubjectId != null, t => t.OriginalReReadingTask.SubjectId == queryVisitTask.SubjectId)
|
||||||
.WhereIf(queryVisitTask.IsUrgent != null, t => t.OriginalReReadingTask.IsUrgent == queryVisitTask.IsUrgent)
|
.WhereIf(queryVisitTask.IsUrgent != null, t => t.OriginalReReadingTask.IsUrgent == queryVisitTask.IsUrgent)
|
||||||
|
@ -943,14 +944,15 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<(PageOutput<IRUnReadSubjectView>, object)> GetIRUnReadSubjectTaskList(IRUnReadSubjectQuery iRUnReadSubjectQuery)
|
public async Task<IResponseOutput<PageOutput<IRUnReadSubjectView>>> GetIRUnReadSubjectTaskList(IRUnReadSubjectQuery inQuery)
|
||||||
{
|
{
|
||||||
|
|
||||||
var trialId = iRUnReadSubjectQuery.TrialId;
|
var trialId = inQuery.TrialId;
|
||||||
|
var subjectCode = inQuery.SubjectCode;
|
||||||
|
|
||||||
var trialReadingCriterionId = iRUnReadSubjectQuery.TrialReadingCriterionId;
|
var trialReadingCriterionId = inQuery.TrialReadingCriterionId;
|
||||||
|
|
||||||
var criterionConfig = await _trialReadingCriterionRepository.Where(x => x.Id == iRUnReadSubjectQuery.TrialReadingCriterionId).FirstNotNullAsync();
|
var criterionConfig = await _trialReadingCriterionRepository.Where(x => x.Id == inQuery.TrialReadingCriterionId).FirstNotNullAsync();
|
||||||
|
|
||||||
var readingTool = criterionConfig.ReadingTool;
|
var readingTool = criterionConfig.ReadingTool;
|
||||||
var isReadingTaskViewInOrder = criterionConfig.IsReadingTaskViewInOrder;
|
var isReadingTaskViewInOrder = criterionConfig.IsReadingTaskViewInOrder;
|
||||||
|
@ -964,13 +966,13 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
{
|
{
|
||||||
TrialId = trialId,
|
TrialId = trialId,
|
||||||
TrialReadingCriterionId = trialReadingCriterionId,
|
TrialReadingCriterionId = trialReadingCriterionId,
|
||||||
SubjectCode = iRUnReadSubjectQuery.SubjectCode,
|
SubjectCode = inQuery.SubjectCode,
|
||||||
Page = new PageInput()
|
Page = new PageInput()
|
||||||
{
|
{
|
||||||
PageIndex = iRUnReadSubjectQuery.PageIndex,
|
PageIndex = inQuery.PageIndex,
|
||||||
PageSize = iRUnReadSubjectQuery.PageSize,
|
PageSize = inQuery.PageSize,
|
||||||
Asc = iRUnReadSubjectQuery.Asc,
|
Asc = inQuery.Asc,
|
||||||
SortField = iRUnReadSubjectQuery.SortField,
|
SortField = inQuery.SortField,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -984,15 +986,15 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
|
|
||||||
var result = new PageOutput<IRUnReadSubjectView>()
|
var result = new PageOutput<IRUnReadSubjectView>()
|
||||||
{
|
{
|
||||||
PageSize = iRUnReadSubjectQuery.PageSize,
|
PageSize = inQuery.PageSize,
|
||||||
PageIndex = iRUnReadSubjectQuery.PageIndex,
|
PageIndex = inQuery.PageIndex,
|
||||||
TotalCount = totalCount,
|
TotalCount = totalCount,
|
||||||
CurrentPageData = currentPageData,
|
CurrentPageData = currentPageData,
|
||||||
};
|
};
|
||||||
|
|
||||||
// 封装的方法有问题
|
// 封装的方法有问题
|
||||||
//var result = await visitQuery.ToPagedListAsync(iRUnReadSubjectQuery.PageIndex, iRUnReadSubjectQuery.PageSize, String.IsNullOrEmpty(iRUnReadSubjectQuery.SortField) ? nameof(IRUnReadSubjectView.SubjectId) : iRUnReadSubjectQuery.SortField, iRUnReadSubjectQuery.Asc);
|
//var result = await visitQuery.ToPagedListAsync(iRUnReadSubjectQuery.PageIndex, iRUnReadSubjectQuery.PageSize, String.IsNullOrEmpty(iRUnReadSubjectQuery.SortField) ? nameof(IRUnReadSubjectView.SubjectId) : iRUnReadSubjectQuery.SortField, iRUnReadSubjectQuery.Asc);
|
||||||
return (result, new
|
return ResponseOutput.Ok(result, new
|
||||||
{
|
{
|
||||||
RandomReadInfo = new IRUnReadOutDto(),
|
RandomReadInfo = new IRUnReadOutDto(),
|
||||||
IsReadingTaskViewInOrder = isReadingTaskViewInOrder,
|
IsReadingTaskViewInOrder = isReadingTaskViewInOrder,
|
||||||
|
@ -1004,26 +1006,15 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
CriterionType = criterionConfig.CriterionType,
|
CriterionType = criterionConfig.CriterionType,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else
|
else if(isReadingTaskViewInOrder == ReadingOrder.SubjectRandom)
|
||||||
{
|
{
|
||||||
var taskQuery = _visitTaskRepository.Where(x => x.TrialId == iRUnReadSubjectQuery.TrialId && x.DoctorUserId == _userInfo.Id && x.TaskState == TaskState.Effect && x.TrialReadingCriterionId == trialReadingCriterionId)
|
var critrion = await _trialReadingCriterionRepository.FindAsync(trialReadingCriterionId);
|
||||||
// .Where(x=>x.Subject.ClinicalDataList.Any(c => c.IsSign && (c.ReadingId == x.SouceReadModuleId || c.ReadingId == x.SourceSubjectVisitId)))
|
|
||||||
.Where(x => !x.Subject.IsDeleted).Where(x => (x.IsNeedClinicalDataSign && x.IsClinicalDataSign) || !x.IsNeedClinicalDataSign);
|
|
||||||
|
|
||||||
IRUnReadOutDto iRUnReadOut = new IRUnReadOutDto()
|
|
||||||
{
|
|
||||||
FinishJudgeTaskCount = await taskQuery.Where(x => x.ReadingCategory == ReadingCategory.Judge && x.ReadingTaskState == ReadingTaskState.HaveSigned).CountAsync(),
|
|
||||||
FinishTaskCount = await taskQuery.Where(x => x.ReadingCategory != ReadingCategory.Judge && x.ReadingTaskState == ReadingTaskState.HaveSigned).CountAsync(),
|
|
||||||
SuggesteFinishedTime = await taskQuery.Where(x => x.ReadingTaskState != ReadingTaskState.HaveSigned).MaxAsync(x => x.SuggesteFinishedTime),
|
|
||||||
UnReadJudgeTaskCount = await taskQuery.Where(x => x.ReadingCategory == ReadingCategory.Judge && x.ReadingTaskState != ReadingTaskState.HaveSigned).CountAsync(),
|
|
||||||
UnReadTaskCount = await taskQuery.Where(x => x.ReadingCategory != ReadingCategory.Judge && x.ReadingTaskState != ReadingTaskState.HaveSigned).CountAsync(),
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var visitGroupQuery = taskQuery.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode });
|
|
||||||
|
|
||||||
|
var visitQuery = _visitTaskRepository.Where(x => x.TrialId == trialId && x.DoctorUserId == _userInfo.Id && x.TaskState == TaskState.Effect)
|
||||||
|
|
||||||
|
.WhereIf(!string.IsNullOrEmpty(subjectCode), t => (t.Subject.Code.Contains(subjectCode!) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(subjectCode!) && t.IsAnalysisCreate));
|
||||||
|
|
||||||
|
var visitGroupQuery = visitQuery.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode });
|
||||||
|
|
||||||
var visitTaskQuery = visitGroupQuery.Select(x => new IRUnReadSubjectView()
|
var visitTaskQuery = visitGroupQuery.Select(x => new IRUnReadSubjectView()
|
||||||
{
|
{
|
||||||
|
@ -1033,22 +1024,17 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
SuggesteFinishedTime = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned).Min(x => x.SuggesteFinishedTime),
|
SuggesteFinishedTime = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned).Min(x => x.SuggesteFinishedTime),
|
||||||
|
|
||||||
//未读任务量
|
//未读任务量
|
||||||
UnReadTaskCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned).Count(),
|
UnReadCanReadTaskCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned).Count(),
|
||||||
|
|
||||||
//未读 里可读任务量
|
|
||||||
UnReadCanReadTaskCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned && y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true)
|
|
||||||
//不能对包含聚合或子查询的表达式执行聚合函数
|
|
||||||
//&& !x.Any(t => t.ReadingTaskState != ReadingTaskState.HaveSigned && t.IsNeedClinicalDataSign == true && t.IsClinicalDataSign == false && t.VisitTaskNum<y.VisitTaskNum )
|
|
||||||
).Count(),
|
|
||||||
|
|
||||||
|
UrgentCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned).Where(x => x.IsUrgent).Count(),
|
||||||
|
|
||||||
//已读任务量
|
//已读任务量
|
||||||
HaveReadTaskCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState == ReadingTaskState.HaveSigned).Count(),
|
HaveReadTaskCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState == ReadingTaskState.HaveSigned).Count(),
|
||||||
|
|
||||||
ExistReadingApply = x.Any(y => (y.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed && y.TrialReadingCriterionId == trialReadingCriterionId) || y.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed),
|
ExistReadingApply = x.Any(y => (y.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed && y.TrialReadingCriterionId == trialReadingCriterionId) || y.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed),
|
||||||
|
|
||||||
//查出所有未读的 未读的可读的 在这个列表基础上 过滤下 y.IsFrontTaskNeedSignButNotSign==false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true) 这样容易排错 确认这三个字段是否维护有误
|
UnReadCanReadTaskList = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned)
|
||||||
UnReadTaskList = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned).OrderBy(x => x.VisitTaskNum)
|
.OrderBy(x => x.VisitTaskNum)
|
||||||
.Select(u => new IRUnreadTaskView()
|
.Select(u => new IRUnreadTaskView()
|
||||||
{
|
{
|
||||||
Id = u.Id,
|
Id = u.Id,
|
||||||
|
@ -1065,22 +1051,48 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
IsClinicalDataSign = u.IsClinicalDataSign,
|
IsClinicalDataSign = u.IsClinicalDataSign,
|
||||||
IsFrontTaskNeedSignButNotSign = u.IsFrontTaskNeedSignButNotSign
|
IsFrontTaskNeedSignButNotSign = u.IsFrontTaskNeedSignButNotSign
|
||||||
})
|
})
|
||||||
.ToList(),
|
.ToList()
|
||||||
}).Where(x => x.UnReadCanReadTaskCount > 0);
|
}).Where(x => x.UnReadCanReadTaskCount > 0);
|
||||||
|
|
||||||
|
var pageList = await visitTaskQuery.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField)? nameof(IRUnReadSubjectView.UnReadCanReadTaskCount) : inQuery.SortField, inQuery.Asc );
|
||||||
|
|
||||||
var totalCount = await visitGroupQuery.CountAsync();
|
|
||||||
var currentPageData = await visitTaskQuery.ToListAsync();
|
return ResponseOutput.Ok(pageList, new
|
||||||
|
{
|
||||||
|
RandomReadInfo = new IRUnReadOutDto(),
|
||||||
|
IsReadingTaskViewInOrder = isReadingTaskViewInOrder,
|
||||||
|
ReadingTool = readingTool,
|
||||||
|
IseCRFShowInDicomReading = criterionConfig.IseCRFShowInDicomReading,
|
||||||
|
IsReadingShowSubjectInfo = criterionConfig.IsReadingShowSubjectInfo,
|
||||||
|
IsReadingShowPreviousResults = criterionConfig.IsReadingShowPreviousResults,
|
||||||
|
DigitPlaces = criterionConfig.DigitPlaces,
|
||||||
|
CriterionType = criterionConfig.CriterionType,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var taskQuery = _visitTaskRepository.Where(x => x.TrialId == inQuery.TrialId && x.DoctorUserId == _userInfo.Id && x.TaskState == TaskState.Effect && x.TrialReadingCriterionId == trialReadingCriterionId)
|
||||||
|
// .Where(x=>x.Subject.ClinicalDataList.Any(c => c.IsSign && (c.ReadingId == x.SouceReadModuleId || c.ReadingId == x.SourceSubjectVisitId)))
|
||||||
|
.Where(x => !x.Subject.IsDeleted).Where(x => (x.IsNeedClinicalDataSign && x.IsClinicalDataSign) || !x.IsNeedClinicalDataSign);
|
||||||
|
|
||||||
|
IRUnReadOutDto iRUnReadOut = new IRUnReadOutDto()
|
||||||
|
{
|
||||||
|
FinishJudgeTaskCount = await taskQuery.Where(x => x.ReadingCategory == ReadingCategory.Judge && x.ReadingTaskState == ReadingTaskState.HaveSigned).CountAsync(),
|
||||||
|
FinishTaskCount = await taskQuery.Where(x => x.ReadingCategory != ReadingCategory.Judge && x.ReadingTaskState == ReadingTaskState.HaveSigned).CountAsync(),
|
||||||
|
SuggesteFinishedTime = await taskQuery.Where(x => x.ReadingTaskState != ReadingTaskState.HaveSigned).MaxAsync(x => x.SuggesteFinishedTime),
|
||||||
|
UnReadJudgeTaskCount = await taskQuery.Where(x => x.ReadingCategory == ReadingCategory.Judge && x.ReadingTaskState != ReadingTaskState.HaveSigned).CountAsync(),
|
||||||
|
UnReadTaskCount = await taskQuery.Where(x => x.ReadingCategory != ReadingCategory.Judge && x.ReadingTaskState != ReadingTaskState.HaveSigned).CountAsync(),
|
||||||
|
};
|
||||||
|
|
||||||
var result = new PageOutput<IRUnReadSubjectView>()
|
var result = new PageOutput<IRUnReadSubjectView>()
|
||||||
{
|
{
|
||||||
PageSize = iRUnReadSubjectQuery.PageSize,
|
PageSize = inQuery.PageSize,
|
||||||
PageIndex = iRUnReadSubjectQuery.PageIndex,
|
PageIndex = inQuery.PageIndex,
|
||||||
TotalCount = totalCount,
|
TotalCount = 0,
|
||||||
CurrentPageData = currentPageData,
|
CurrentPageData = null,
|
||||||
};
|
};
|
||||||
|
|
||||||
return (result, new
|
return ResponseOutput.Ok(result, new
|
||||||
{
|
{
|
||||||
IsReadingTaskViewInOrder = isReadingTaskViewInOrder,
|
IsReadingTaskViewInOrder = isReadingTaskViewInOrder,
|
||||||
RandomReadInfo = iRUnReadOut,
|
RandomReadInfo = iRUnReadOut,
|
||||||
|
@ -1114,8 +1126,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
var critrion = await _trialReadingCriterionRepository.FindAsync(trialReadingCriterionId);
|
var critrion = await _trialReadingCriterionRepository.FindAsync(trialReadingCriterionId);
|
||||||
|
|
||||||
|
|
||||||
var visitQuery = _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.DoctorUserId == _userInfo.Id
|
var visitQuery = _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.DoctorUserId == _userInfo.Id && x.TaskState == TaskState.Effect)
|
||||||
&& x.TaskState == TaskState.Effect /*&& x.TrialReadingCriterionId== inDto.TrialReadingCriterionId*/)
|
|
||||||
|
|
||||||
.WhereIf(inDto.SubjectId!=null,x=>x.SubjectId==inDto.SubjectId)
|
.WhereIf(inDto.SubjectId!=null,x=>x.SubjectId==inDto.SubjectId)
|
||||||
//前序 不存在 未生成任务的访视
|
//前序 不存在 未生成任务的访视
|
||||||
|
@ -1151,34 +1162,34 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
).Count(),
|
).Count(),
|
||||||
|
|
||||||
|
|
||||||
UnReadCanReadTaskList= x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned)
|
UnReadCanReadTaskList = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned)
|
||||||
.Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true))
|
.Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true))
|
||||||
.OrderBy(x => x.VisitTaskNum)
|
.OrderBy(x => x.VisitTaskNum)
|
||||||
.Select(u => new IRUnreadTaskView()
|
.Select(u => new IRUnreadTaskView()
|
||||||
{
|
{
|
||||||
Id = u.Id,
|
Id = u.Id,
|
||||||
IsUrgent = u.IsUrgent,
|
IsUrgent = u.IsUrgent,
|
||||||
VisitNum = u.VisitTaskNum,
|
VisitNum = u.VisitTaskNum,
|
||||||
TaskBlindName = u.TaskBlindName,
|
TaskBlindName = u.TaskBlindName,
|
||||||
VisistId = u.SourceSubjectVisitId,
|
VisistId = u.SourceSubjectVisitId,
|
||||||
SuggesteFinishedTime = u.SuggesteFinishedTime,
|
SuggesteFinishedTime = u.SuggesteFinishedTime,
|
||||||
ReadingCategory = u.ReadingCategory,
|
ReadingCategory = u.ReadingCategory,
|
||||||
IsAnalysisCreate = u.IsAnalysisCreate,
|
IsAnalysisCreate = u.IsAnalysisCreate,
|
||||||
ArmEnum = u.ArmEnum,
|
ArmEnum = u.ArmEnum,
|
||||||
TrialReadingCriterionId = u.TrialReadingCriterionId,
|
TrialReadingCriterionId = u.TrialReadingCriterionId,
|
||||||
IsNeedClinicalDataSign = u.IsNeedClinicalDataSign,
|
IsNeedClinicalDataSign = u.IsNeedClinicalDataSign,
|
||||||
IsClinicalDataSign = u.IsClinicalDataSign,
|
IsClinicalDataSign = u.IsClinicalDataSign,
|
||||||
IsFrontTaskNeedSignButNotSign = u.IsFrontTaskNeedSignButNotSign
|
IsFrontTaskNeedSignButNotSign = u.IsFrontTaskNeedSignButNotSign
|
||||||
})
|
})
|
||||||
.ToList(),
|
.ToList(),
|
||||||
|
|
||||||
|
|
||||||
UrgentCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned)
|
UrgentCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned)
|
||||||
.Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true))
|
.Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true))
|
||||||
.Where(x=>x.IsUrgent).Count(),
|
.Where(x => x.IsUrgent).Count(),
|
||||||
|
|
||||||
//已读任务量
|
//已读任务量
|
||||||
HaveReadTaskCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState == ReadingTaskState.HaveSigned).Count(),
|
HaveReadTaskCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState == ReadingTaskState.HaveSigned).Count(),
|
||||||
|
|
||||||
ExistReadingApply = x.Any(y => (y.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed && y.TrialReadingCriterionId == trialReadingCriterionId) || y.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed),
|
ExistReadingApply = x.Any(y => (y.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed && y.TrialReadingCriterionId == trialReadingCriterionId) || y.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed),
|
||||||
|
|
||||||
|
@ -1211,7 +1222,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
|
|
||||||
var result = new List<IRUnReadSubjectView>();
|
var result = new List<IRUnReadSubjectView>();
|
||||||
|
|
||||||
var propName = string.IsNullOrWhiteSpace(inDto.Page!.SortField) ? "UnReadCanReadTaskCount" : inDto.Page.SortField;
|
var propName = string.IsNullOrWhiteSpace(inDto.Page!.SortField) ? nameof(IRUnReadSubjectView.UnReadCanReadTaskCount) : inDto.Page.SortField;
|
||||||
|
|
||||||
var visitTaskOrderQuery = inDto.Page.Asc ? visitTaskQuery.OrderBy(propName) : visitTaskQuery.OrderBy(propName + " desc");
|
var visitTaskOrderQuery = inDto.Page.Asc ? visitTaskQuery.OrderBy(propName) : visitTaskQuery.OrderBy(propName + " desc");
|
||||||
if (inDto.Page != null)
|
if (inDto.Page != null)
|
||||||
|
@ -1276,14 +1287,14 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
var baseLineTaskList = await _visitTaskRepository.Where(t => t.TrialId == command.TrialId && t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.DoctorUserId == _userInfo.Id
|
var baseLineTaskList = await _visitTaskRepository.Where(t => t.TrialId == command.TrialId && t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.DoctorUserId == _userInfo.Id
|
||||||
&& t.TaskState == TaskState.Effect && t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.SourceSubjectVisit.IsBaseLine == true).ToListAsync();
|
&& t.TaskState == TaskState.Effect && t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.SourceSubjectVisit.IsBaseLine == true).ToListAsync();
|
||||||
|
|
||||||
var judegeList= await _visitTaskRepository.Where(t => t.TrialId == command.TrialId && t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.DoctorUserId == _userInfo.Id
|
var judegeList = await _visitTaskRepository.Where(t => t.TrialId == command.TrialId && t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.DoctorUserId == _userInfo.Id
|
||||||
&& t.TaskState == TaskState.Effect && t.ReadingCategory == ReadingCategory.Judge && t.ReadingTaskState == ReadingTaskState.HaveSigned).ToListAsync();
|
&& t.TaskState == TaskState.Effect && t.ReadingCategory == ReadingCategory.Judge && t.ReadingTaskState == ReadingTaskState.HaveSigned).ToListAsync();
|
||||||
|
|
||||||
foreach (var item in judegeList)
|
foreach (var item in judegeList)
|
||||||
{
|
{
|
||||||
if (!baseLineTaskList.Any(t => t.SubjectId == item.SubjectId))
|
if (!baseLineTaskList.Any(t => t.SubjectId == item.SubjectId))
|
||||||
{
|
{
|
||||||
baseLineTaskList.Add(item);
|
baseLineTaskList.Add(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2191,8 +2202,8 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
foreach (var item in readingTableAnswerRowInfoList)
|
foreach (var item in readingTableAnswerRowInfoList)
|
||||||
{
|
{
|
||||||
|
|
||||||
var originalVisitTaskId= item.VisitTaskId;
|
var originalVisitTaskId = item.VisitTaskId;
|
||||||
var originalFristAddTaskId= item.FristAddTaskId;
|
var originalFristAddTaskId = item.FristAddTaskId;
|
||||||
|
|
||||||
item.Id = NewId.NextSequentialGuid();
|
item.Id = NewId.NextSequentialGuid();
|
||||||
item.VisitTaskId = newTask.Id;
|
item.VisitTaskId = newTask.Id;
|
||||||
|
|
|
@ -21,6 +21,8 @@ namespace IRaCIS.Application.Services
|
||||||
|
|
||||||
Task SiteSurveyRejectEmail(MimeMessage messageToSend);
|
Task SiteSurveyRejectEmail(MimeMessage messageToSend);
|
||||||
|
|
||||||
|
Task SenMFAVerifyEmail(Guid userId, string userName, string emailAddress, int verificationCode);
|
||||||
|
|
||||||
Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode);
|
Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode);
|
||||||
|
|
||||||
Task AnolymousSendEmailForResetAccount(string emailAddress, int verificationCode);
|
Task AnolymousSendEmailForResetAccount(string emailAddress, int verificationCode);
|
||||||
|
@ -91,6 +93,66 @@ namespace IRaCIS.Application.Services
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//MFA
|
||||||
|
public async Task SenMFAVerifyEmail(Guid userId, string userName, string emailAddress, int verificationCode)
|
||||||
|
{
|
||||||
|
var messageToSend = new MimeMessage();
|
||||||
|
//发件地址
|
||||||
|
messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
|
||||||
|
//收件地址
|
||||||
|
messageToSend.To.Add(new MailboxAddress(userName, emailAddress));
|
||||||
|
//主题
|
||||||
|
//---[来自{0}] 关于MFA邮箱验证的提醒
|
||||||
|
messageToSend.Subject = _localizer["Mail_EmailMFATopic", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN];
|
||||||
|
|
||||||
|
var builder = new BodyBuilder();
|
||||||
|
|
||||||
|
|
||||||
|
var pathToFile = _hostEnvironment.WebRootPath
|
||||||
|
+ Path.DirectorySeparatorChar.ToString()
|
||||||
|
+ "EmailTemplate"
|
||||||
|
+ Path.DirectorySeparatorChar.ToString()
|
||||||
|
//+ "UserOptCommon.html";
|
||||||
|
+ (_userInfo.IsEn_Us ? "UserOptCommon_US.html" : "UserOptCommon.html");
|
||||||
|
|
||||||
|
using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||||
|
{
|
||||||
|
var templateInfo = SourceReader.ReadToEnd();
|
||||||
|
|
||||||
|
|
||||||
|
builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo),
|
||||||
|
|
||||||
|
userName,
|
||||||
|
_localizer["Mail_MFAEmail"],
|
||||||
|
verificationCode
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
messageToSend.Body = builder.ToMessageBody();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EventHandler<MessageSentEventArgs> sucessHandle = (sender, args) =>
|
||||||
|
{
|
||||||
|
// args.Response
|
||||||
|
var code = verificationCode.ToString();
|
||||||
|
_ = _verificationCodeRepository.AddAsync(new VerificationCode()
|
||||||
|
{
|
||||||
|
CodeType = 0,
|
||||||
|
HasSend = true,
|
||||||
|
Code = code,
|
||||||
|
UserId = userId,
|
||||||
|
ExpirationTime = DateTime.Now.AddMinutes(3)
|
||||||
|
}).Result;
|
||||||
|
_ = _verificationCodeRepository.SaveChangesAsync().Result;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig, sucessHandle);
|
||||||
|
}
|
||||||
|
|
||||||
//重置邮箱
|
//重置邮箱
|
||||||
public async Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode)
|
public async Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode)
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,6 +21,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO
|
||||||
|
|
||||||
public string TaskName { get; set; }
|
public string TaskName { get; set; }
|
||||||
|
|
||||||
|
public bool IsImageFilter { get; set; }
|
||||||
public string CriterionModalitys { get; set; }
|
public string CriterionModalitys { get; set; }
|
||||||
|
|
||||||
public Guid? SourceSubjectVisitId { get; set; }
|
public Guid? SourceSubjectVisitId { get; set; }
|
||||||
|
|
|
@ -12,6 +12,7 @@ using Medallion.Threading;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Data;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
@ -28,12 +29,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
{
|
{
|
||||||
private readonly IEasyCachingProvider _provider;
|
private readonly IEasyCachingProvider _provider;
|
||||||
private readonly IRepository<SystemAnonymization> _systemAnonymizationRepository;
|
private readonly IRepository<SystemAnonymization> _systemAnonymizationRepository;
|
||||||
|
private readonly IRepository<VisitTask> _visitTaskRepository;
|
||||||
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
|
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
|
||||||
private readonly IOSSService _oSSService;
|
private readonly IOSSService _oSSService;
|
||||||
private readonly IRepository<StudyMonitor> _studyMonitorRepository;
|
private readonly IRepository<StudyMonitor> _studyMonitorRepository;
|
||||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||||
public DownloadAndUploadService(IEasyCachingProvider provider, IRepository<SystemAnonymization> systemAnonymizationRepository, IRepository<SubjectVisit> subjectVisitRepository, IOSSService oSSService,
|
public DownloadAndUploadService(IEasyCachingProvider provider, IRepository<SystemAnonymization> systemAnonymizationRepository, IRepository<SubjectVisit> subjectVisitRepository, IOSSService oSSService,
|
||||||
IRepository<StudyMonitor> studyMonitorRepository, IDistributedLockProvider distributedLockProvider)
|
IRepository<StudyMonitor> studyMonitorRepository, IDistributedLockProvider distributedLockProvider, IRepository<VisitTask> visitTaskRepository)
|
||||||
{
|
{
|
||||||
_systemAnonymizationRepository = systemAnonymizationRepository;
|
_systemAnonymizationRepository = systemAnonymizationRepository;
|
||||||
|
|
||||||
|
@ -43,16 +45,62 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
_studyMonitorRepository = studyMonitorRepository;
|
_studyMonitorRepository = studyMonitorRepository;
|
||||||
_distributedLockProvider = distributedLockProvider;
|
_distributedLockProvider = distributedLockProvider;
|
||||||
_provider = provider;
|
_provider = provider;
|
||||||
|
_visitTaskRepository = visitTaskRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 受试者随机阅片,任务进行随机编号
|
||||||
|
/// 进入阅片任务前,随机挑选出该受试者的一个任务,然后给该任务一个编号,编号给的逻辑是:TimePoint Ran+ 已阅任务数量+1
|
||||||
|
/// 根据当前受试者该标准已阅任务数量(生效失效的任务都算,考虑重阅,最后编号不重复) 第一个就是TimePoint Ran1,后面依次随机挑选出来的阅片序号依次递增
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="subjectId"></param>
|
||||||
|
/// <param name="trialReadingCriterionId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<IResponseOutput> SubejctRandomReadingTaskNameDeal(Guid subjectId, Guid trialReadingCriterionId)
|
||||||
|
{
|
||||||
|
//subject 随机阅片 才处理任务编号
|
||||||
|
if (_visitTaskRepository.Any(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.SubjectRandom))
|
||||||
|
{
|
||||||
|
//找到 非一致性分析,未签名,状态正常的 并且任务名称是TimePoint的 任务
|
||||||
|
var needDealTaskList = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.DoctorUserId==_userInfo.Id
|
||||||
|
&& t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskBlindName == "Timepoint" && t.ReadingCategory == ReadingCategory.Visit
|
||||||
|
&& (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze), true).ToListAsync();
|
||||||
|
|
||||||
|
if (needDealTaskList.Count>0)
|
||||||
|
{
|
||||||
|
//已完成的访视任务数量(包含重阅的)
|
||||||
|
var haveFinishedTaskCount = await _visitTaskRepository.CountAsync(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false
|
||||||
|
&& t.ReadingTaskState == ReadingTaskState.HaveSigned && t.ReadingCategory == ReadingCategory.Visit);
|
||||||
|
|
||||||
|
//随机赋值编号 比如要处理5个任务,实例化一个包含1-5的数组,每次随机取出一个
|
||||||
|
|
||||||
|
List<int> availableNumbers = Enumerable.Range(haveFinishedTaskCount + 1, needDealTaskList.Count).ToList();
|
||||||
|
Random rng = new Random();
|
||||||
|
foreach (var visitTask in needDealTaskList)
|
||||||
|
{
|
||||||
|
int randomIndex = rng.Next(availableNumbers.Count);
|
||||||
|
|
||||||
|
visitTask.TaskBlindName = $"Timepoint Ran {availableNumbers[randomIndex]}";
|
||||||
|
|
||||||
|
availableNumbers.RemoveAt(randomIndex);
|
||||||
|
}
|
||||||
|
await _visitTaskRepository.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取该受试者任务上传列表(展示已上传情况)
|
/// 获取该受试者任务上传列表(展示已上传情况)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="subjectId"></param>
|
/// <param name="subjectId"></param>
|
||||||
|
/// <param name="trialReadingCriterionId"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<IResponseOutput<List<SubjectImageUploadDTO>>> GetSubjectImageUploadList(Guid subjectId)
|
public async Task<IResponseOutput<List<SubjectImageUploadDTO>>> GetSubjectImageUploadList(Guid subjectId,Guid trialReadingCriterionId)
|
||||||
{
|
{
|
||||||
var query = _repository.Where<VisitTask>(t => t.SubjectId == subjectId && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id)
|
await SubejctRandomReadingTaskNameDeal(subjectId, trialReadingCriterionId);
|
||||||
|
|
||||||
|
var query = _repository.Where<VisitTask>(t => t.SubjectId == subjectId &&t.TrialReadingCriterionId== trialReadingCriterionId && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id)
|
||||||
.Select(u => new SubjectImageUploadDTO()
|
.Select(u => new SubjectImageUploadDTO()
|
||||||
{
|
{
|
||||||
VisitTaskId = u.Id,
|
VisitTaskId = u.Id,
|
||||||
|
@ -63,9 +111,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
TrialSiteId = u.Subject.TrialSiteId,
|
TrialSiteId = u.Subject.TrialSiteId,
|
||||||
|
|
||||||
CriterionModalitys= u.TrialReadingCriterion.CriterionModalitys,
|
IsImageFilter = u.TrialReadingCriterion.IsImageFilter,
|
||||||
|
|
||||||
SubjectCode = u.IsSelfAnalysis == true ? u.BlindSubjectCode : u.Subject.Code ,
|
CriterionModalitys = u.TrialReadingCriterion.CriterionModalitys,
|
||||||
|
|
||||||
|
SubjectCode = u.IsSelfAnalysis == true ? u.BlindSubjectCode : u.Subject.Code,
|
||||||
TaskBlindName = u.TaskBlindName,
|
TaskBlindName = u.TaskBlindName,
|
||||||
TaskName = u.TaskName,
|
TaskName = u.TaskName,
|
||||||
|
|
||||||
|
@ -313,7 +363,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString(), findOriginStudy.VisitTaskId.ToString());
|
var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString(), findOriginStudy.VisitTaskId.ToString());
|
||||||
|
|
||||||
var study = await _repository.FirstOrDefaultAsync<TaskStudy>(t => t.Id == studyId);
|
var study = await _repository.FirstOrDefaultAsync<TaskStudy>(t => t.Id == studyId);
|
||||||
|
|
||||||
|
@ -324,7 +374,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
//特殊处理逻辑
|
//特殊处理逻辑
|
||||||
study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(study.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct());
|
study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(study.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct());
|
||||||
SpecialArchiveStudyDeal(study);
|
SpecialArchiveStudyDeal(study);
|
||||||
modalitys = study.Modalities;
|
modalitys = study.Modalities;
|
||||||
|
|
||||||
|
|
||||||
// 少了整个序列
|
// 少了整个序列
|
||||||
|
@ -535,50 +585,59 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
if (isAnonymize)
|
if (isAnonymize)
|
||||||
{
|
{
|
||||||
|
//受试者随机阅片,需要匿名化检查时间
|
||||||
DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
|
DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
|
||||||
|
|
||||||
DicomDataset dataset = dicomFile.Dataset;
|
DicomDataset dataset = dicomFile.Dataset;
|
||||||
|
dataset.AddOrUpdate(DicomTag.StudyDate, string.Empty);
|
||||||
|
dataset.AddOrUpdate(DicomTag.StudyTime, string.Empty);
|
||||||
|
|
||||||
foreach (var item in addOrUpdateFixedFieldList)
|
#region 前端已经匿名化,不需要做相关tag匿名化
|
||||||
{
|
//DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
|
||||||
|
|
||||||
var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
|
//DicomDataset dataset = dicomFile.Dataset;
|
||||||
|
|
||||||
dataset.AddOrUpdate(dicomTag, item.ReplaceValue);
|
//foreach (var item in addOrUpdateFixedFieldList)
|
||||||
}
|
//{
|
||||||
|
|
||||||
foreach (var item in ircFieldList)
|
// var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
|
||||||
{
|
|
||||||
|
|
||||||
var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
|
// dataset.AddOrUpdate(dicomTag, item.ReplaceValue);
|
||||||
|
//}
|
||||||
|
|
||||||
if (dicomTag == DicomTag.ClinicalTrialProtocolID)
|
//foreach (var item in ircFieldList)
|
||||||
{
|
//{
|
||||||
dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode);
|
|
||||||
|
|
||||||
}
|
// var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
|
||||||
if (dicomTag == DicomTag.ClinicalTrialSiteID)
|
|
||||||
{
|
|
||||||
//dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialSiteCode);
|
|
||||||
|
|
||||||
}
|
// if (dicomTag == DicomTag.ClinicalTrialProtocolID)
|
||||||
if (dicomTag == DicomTag.ClinicalTrialSubjectID)
|
// {
|
||||||
{
|
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode);
|
||||||
dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.SubjectCode);
|
|
||||||
|
|
||||||
}
|
// }
|
||||||
if (dicomTag == DicomTag.ClinicalTrialTimePointID)
|
// if (dicomTag == DicomTag.ClinicalTrialSiteID)
|
||||||
{
|
// {
|
||||||
dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.VisitNum.ToString());
|
// //dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialSiteCode);
|
||||||
|
|
||||||
}
|
// }
|
||||||
if (dicomTag == DicomTag.PatientID)
|
// if (dicomTag == DicomTag.ClinicalTrialSubjectID)
|
||||||
{
|
// {
|
||||||
dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode + "_" + subjectAndVisitInfo.SubjectCode);
|
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.SubjectCode);
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
// if (dicomTag == DicomTag.ClinicalTrialTimePointID)
|
||||||
|
// {
|
||||||
|
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.VisitNum.ToString());
|
||||||
|
|
||||||
|
// }
|
||||||
|
// if (dicomTag == DicomTag.PatientID)
|
||||||
|
// {
|
||||||
|
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode + "_" + subjectAndVisitInfo.SubjectCode);
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
//}
|
||||||
|
#endregion
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,8 @@ namespace IRaCIS.Application.Contracts
|
||||||
{
|
{
|
||||||
public string UserName { get; set; } = string.Empty;
|
public string UserName { get; set; } = string.Empty;
|
||||||
public string Password { get; set; } = string.Empty;
|
public string Password { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public Guid? UserId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class LoginReturnDTO
|
public class LoginReturnDTO
|
||||||
|
@ -28,6 +30,8 @@ namespace IRaCIS.Application.Contracts
|
||||||
public UserBasicInfo BasicInfo { get; set; } = new UserBasicInfo();
|
public UserBasicInfo BasicInfo { get; set; } = new UserBasicInfo();
|
||||||
public string JWTStr { get; set; }=string.Empty;
|
public string JWTStr { get; set; }=string.Empty;
|
||||||
|
|
||||||
|
public bool IsMFA { get; set; } = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class UserBasicInfo
|
public class UserBasicInfo
|
||||||
|
@ -59,7 +63,7 @@ namespace IRaCIS.Application.Contracts
|
||||||
|
|
||||||
public string PermissionStr { get; set; } = String.Empty;
|
public string PermissionStr { get; set; } = String.Empty;
|
||||||
|
|
||||||
|
public string EMail { get; set; } = string.Empty;
|
||||||
public bool IsFirstAdd { get; set; }
|
public bool IsFirstAdd { get; set; }
|
||||||
public bool IsReviewer { get; set; } = false;
|
public bool IsReviewer { get; set; } = false;
|
||||||
|
|
||||||
|
|
|
@ -10,12 +10,16 @@ namespace IRaCIS.Application.Services
|
||||||
Task<UserDetailDTO> GetUser(Guid id);
|
Task<UserDetailDTO> GetUser(Guid id);
|
||||||
Task<PageOutput<UserListDTO>> GetUserList(UserListQueryDTO param);
|
Task<PageOutput<UserListDTO>> GetUserList(UserListQueryDTO param);
|
||||||
Task<IResponseOutput<LoginReturnDTO>> Login(string userName, string password);
|
Task<IResponseOutput<LoginReturnDTO>> Login(string userName, string password);
|
||||||
|
Task<IResponseOutput> VerifyMFACodeAsync(Guid userId, string Code);
|
||||||
|
|
||||||
|
Task<IResponseOutput> SendMFAEmail(Guid userId);
|
||||||
|
Task<UserBasicInfo> GetUserBasicInfo(Guid userId,string pwd);
|
||||||
Task<IResponseOutput> ModifyPassword(EditPasswordCommand editPwModel);
|
Task<IResponseOutput> ModifyPassword(EditPasswordCommand editPwModel);
|
||||||
Task<IResponseOutput> ResetPassword(Guid userId);
|
Task<IResponseOutput> ResetPassword(Guid userId);
|
||||||
|
|
||||||
Task<IResponseOutput> UpdateUser(UserCommand model);
|
Task<IResponseOutput> UpdateUser(UserCommand model);
|
||||||
Task<IResponseOutput> UpdateUserState(Guid userId, UserStateEnum state);
|
Task<IResponseOutput> UpdateUserState(Guid userId, UserStateEnum state);
|
||||||
|
|
||||||
//Task<IResponseOutput> SendVerificationCode(string emailOrPhone, VerifyType verificationType, bool isReviewer = false);
|
//Task<IResponseOutput> SendVerificationCode(string emailOrPhone, VerifyType verificationType, bool isReviewer = false);
|
||||||
//Task<IResponseOutput> SetNewPassword(ResetPasswordCommand resetPwdModel);
|
//Task<IResponseOutput> SetNewPassword(ResetPasswordCommand resetPwdModel);
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,9 @@ using Medallion.Threading;
|
||||||
using EasyCaching.Core;
|
using EasyCaching.Core;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using LoginReturnDTO = IRaCIS.Application.Contracts.LoginReturnDTO;
|
using LoginReturnDTO = IRaCIS.Application.Contracts.LoginReturnDTO;
|
||||||
|
using IRaCIS.Core.Application.Auth;
|
||||||
|
using BeetleX.Redis.Commands;
|
||||||
|
using IRaCIS.Core.Domain.Models;
|
||||||
|
|
||||||
namespace IRaCIS.Application.Services
|
namespace IRaCIS.Application.Services
|
||||||
{
|
{
|
||||||
|
@ -22,17 +25,17 @@ namespace IRaCIS.Application.Services
|
||||||
public class UserService : BaseService, IUserService
|
public class UserService : BaseService, IUserService
|
||||||
{
|
{
|
||||||
private readonly IRepository<User> _userRepository;
|
private readonly IRepository<User> _userRepository;
|
||||||
|
|
||||||
private readonly IMailVerificationService _mailVerificationService;
|
private readonly IMailVerificationService _mailVerificationService;
|
||||||
private readonly IRepository<VerificationCode> _verificationCodeRepository;
|
private readonly IRepository<VerificationCode> _verificationCodeRepository;
|
||||||
private readonly IRepository<Doctor> _doctorRepository;
|
private readonly IRepository<Doctor> _doctorRepository;
|
||||||
private readonly IRepository<TrialUser> _userTrialRepository;
|
private readonly IRepository<TrialUser> _userTrialRepository;
|
||||||
private readonly IRepository<UserLog> _userLogRepository;
|
private readonly IRepository<UserLog> _userLogRepository;
|
||||||
private readonly IRepository<UserPassWordLog> _userPassWordLogRepository;
|
private readonly IRepository<UserPassWordLog> _userPassWordLogRepository;
|
||||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||||
private readonly IEasyCachingProvider _cache;
|
private readonly IEasyCachingProvider _cache;
|
||||||
private readonly IReadingImageTaskService _readingImageTaskService;
|
private readonly IReadingImageTaskService _readingImageTaskService;
|
||||||
private readonly IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig;
|
private readonly IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig;
|
||||||
|
|
||||||
|
|
||||||
public UserService(IRepository<User> userRepository,
|
public UserService(IRepository<User> userRepository,
|
||||||
|
@ -41,20 +44,20 @@ namespace IRaCIS.Application.Services
|
||||||
IRepository<VerificationCode> verificationCodeRepository,
|
IRepository<VerificationCode> verificationCodeRepository,
|
||||||
IRepository<Doctor> doctorRepository,
|
IRepository<Doctor> doctorRepository,
|
||||||
IEasyCachingProvider cache,
|
IEasyCachingProvider cache,
|
||||||
IReadingImageTaskService readingImageTaskService,
|
IReadingImageTaskService readingImageTaskService,
|
||||||
IRepository<TrialUser> userTrialRepository,
|
IRepository<TrialUser> userTrialRepository,
|
||||||
IOptionsMonitor<ServiceVerifyConfigOption> verifyConfig,
|
IOptionsMonitor<ServiceVerifyConfigOption> verifyConfig,
|
||||||
IRepository<UserLog> userLogRepository,
|
IRepository<UserLog> userLogRepository,
|
||||||
IRepository<UserPassWordLog> userPassWordLogRepository
|
IRepository<UserPassWordLog> userPassWordLogRepository
|
||||||
,
|
,
|
||||||
IDistributedLockProvider distributedLockProvider)
|
IDistributedLockProvider distributedLockProvider)
|
||||||
{
|
{
|
||||||
_userLogRepository = userLogRepository;
|
_userLogRepository = userLogRepository;
|
||||||
this._userPassWordLogRepository = userPassWordLogRepository;
|
this._userPassWordLogRepository = userPassWordLogRepository;
|
||||||
_verifyConfig = verifyConfig;
|
_verifyConfig = verifyConfig;
|
||||||
_cache = cache;
|
_cache = cache;
|
||||||
this._readingImageTaskService = readingImageTaskService;
|
this._readingImageTaskService = readingImageTaskService;
|
||||||
_userRepository = userRepository;
|
_userRepository = userRepository;
|
||||||
_mailVerificationService = mailVerificationService;
|
_mailVerificationService = mailVerificationService;
|
||||||
_verificationCodeRepository = verificationCodeRepository;
|
_verificationCodeRepository = verificationCodeRepository;
|
||||||
_doctorRepository = doctorRepository;
|
_doctorRepository = doctorRepository;
|
||||||
|
@ -95,45 +98,45 @@ namespace IRaCIS.Application.Services
|
||||||
|
|
||||||
private async Task VerifyUserPwdAsync(Guid userId, string newPwd, string? oldPwd = null)
|
private async Task VerifyUserPwdAsync(Guid userId, string newPwd, string? oldPwd = null)
|
||||||
{
|
{
|
||||||
//var dbUser = (await _userRepository.FirstOrDefaultAsync(t => t.Id == userId)).IfNullThrowException();
|
//var dbUser = (await _userRepository.FirstOrDefaultAsync(t => t.Id == userId)).IfNullThrowException();
|
||||||
|
|
||||||
if (oldPwd != null && oldPwd == newPwd)
|
if (oldPwd != null && oldPwd == newPwd)
|
||||||
{
|
{
|
||||||
//---新密码与旧密码相同。
|
//---新密码与旧密码相同。
|
||||||
throw new BusinessValidationFailedException(_localizer["User_NewOldPwdSame"]);
|
throw new BusinessValidationFailedException(_localizer["User_NewOldPwdSame"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var dbUser = (await _userRepository.Where(t => t.Id == userId).FirstOrDefaultAsync()).IfNullThrowException();
|
var dbUser = (await _userRepository.Where(t => t.Id == userId).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
if (oldPwd != null && dbUser.Password != oldPwd)
|
if (oldPwd != null && dbUser.Password != oldPwd)
|
||||||
{
|
{
|
||||||
//---旧密码验证失败。
|
//---旧密码验证失败。
|
||||||
throw new BusinessValidationFailedException(_localizer["User_OldPwdInvalid"]);
|
throw new BusinessValidationFailedException(_localizer["User_OldPwdInvalid"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dbUser.Password == newPwd)
|
if (dbUser.Password == newPwd)
|
||||||
{
|
{
|
||||||
//---新密码与旧密码相同。
|
//---新密码与旧密码相同。
|
||||||
throw new BusinessValidationFailedException(_localizer["User_NewOldPwdSame"]);
|
throw new BusinessValidationFailedException(_localizer["User_NewOldPwdSame"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var passWordList = await _userPassWordLogRepository.Where(x => x.UserId == userId).OrderByDescending(x => x.CreateTime).Take(2).ToListAsync();
|
var passWordList = await _userPassWordLogRepository.Where(x => x.UserId == userId).OrderByDescending(x => x.CreateTime).Take(2).ToListAsync();
|
||||||
if (passWordList.Any(x => x.PassWord == newPwd))
|
if (passWordList.Any(x => x.PassWord == newPwd))
|
||||||
{
|
{
|
||||||
throw new BusinessValidationFailedException(_localizer["User_PassWordRepeat"]);
|
throw new BusinessValidationFailedException(_localizer["User_PassWordRepeat"]);
|
||||||
}
|
}
|
||||||
if (oldPwd != null)
|
if (oldPwd != null)
|
||||||
{
|
{
|
||||||
await _userPassWordLogRepository.AddAsync(new UserPassWordLog()
|
await _userPassWordLogRepository.AddAsync(new UserPassWordLog()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
CreateTime = DateTime.Now,
|
||||||
|
PassWord = oldPwd,
|
||||||
|
UserId = userId,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
CreateTime = DateTime.Now,
|
|
||||||
PassWord = oldPwd,
|
|
||||||
UserId = userId,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
await _userRepository.BatchUpdateNoTrackingAsync(x => x.Id == userId, x => new User()
|
await _userRepository.BatchUpdateNoTrackingAsync(x => x.Id == userId, x => new User()
|
||||||
{
|
{
|
||||||
|
@ -142,7 +145,7 @@ namespace IRaCIS.Application.Services
|
||||||
await _userPassWordLogRepository.SaveChangesAsync();
|
await _userPassWordLogRepository.SaveChangesAsync();
|
||||||
|
|
||||||
|
|
||||||
await Task.CompletedTask;
|
await Task.CompletedTask;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -306,7 +309,7 @@ namespace IRaCIS.Application.Services
|
||||||
{
|
{
|
||||||
await _mailVerificationService.AdminResetPwdSendEmailAsync(userId, pwd);
|
await _mailVerificationService.AdminResetPwdSendEmailAsync(userId, pwd);
|
||||||
}
|
}
|
||||||
catch (Exception )
|
catch (Exception)
|
||||||
{
|
{
|
||||||
//---请检查邮箱地址或者联系维护人员, 邮件发送失败, 未能创建账户成功
|
//---请检查邮箱地址或者联系维护人员, 邮件发送失败, 未能创建账户成功
|
||||||
throw new BusinessValidationFailedException(_localizer["User_CreateFailed"]);
|
throw new BusinessValidationFailedException(_localizer["User_CreateFailed"]);
|
||||||
|
@ -319,7 +322,7 @@ namespace IRaCIS.Application.Services
|
||||||
IsFirstAdd = true
|
IsFirstAdd = true
|
||||||
});
|
});
|
||||||
|
|
||||||
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId=userId, OptType = UserOptType.ResetPassword }, true);
|
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId = userId, OptType = UserOptType.ResetPassword }, true);
|
||||||
|
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
|
@ -403,7 +406,7 @@ namespace IRaCIS.Application.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var list = await _userRepository.Where(t => t.EMail == email && t.Status== UserStateEnum.Enable).Select(t => new UserAccountDto() { UserId = t.Id, UserName = t.UserName, UserRealName = t.FullName, UserType = t.UserTypeRole.UserTypeShortName }).ToListAsync();
|
var list = await _userRepository.Where(t => t.EMail == email && t.Status == UserStateEnum.Enable).Select(t => new UserAccountDto() { UserId = t.Id, UserName = t.UserName, UserRealName = t.FullName, UserType = t.UserTypeRole.UserTypeShortName }).ToListAsync();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -431,7 +434,7 @@ namespace IRaCIS.Application.Services
|
||||||
IsFirstAdd = false
|
IsFirstAdd = false
|
||||||
});
|
});
|
||||||
|
|
||||||
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = userId, OptUserId = userId,LoginPassword=newPwd, OptType = UserOptType.UnloginModifyPasswoed }, true);
|
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = userId, OptUserId = userId, LoginPassword = newPwd, OptType = UserOptType.UnloginModifyPasswoed }, true);
|
||||||
|
|
||||||
return ResponseOutput.Result(success);
|
return ResponseOutput.Result(success);
|
||||||
|
|
||||||
|
@ -467,7 +470,7 @@ namespace IRaCIS.Application.Services
|
||||||
IsFirstAdd = false
|
IsFirstAdd = false
|
||||||
});
|
});
|
||||||
|
|
||||||
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId= _userInfo.Id, OptType = UserOptType.LoginModifyPassword }, true);
|
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId = _userInfo.Id, OptType = UserOptType.LoginModifyPassword }, true);
|
||||||
|
|
||||||
return ResponseOutput.Result(success);
|
return ResponseOutput.Result(success);
|
||||||
|
|
||||||
|
@ -555,11 +558,11 @@ namespace IRaCIS.Application.Services
|
||||||
var success = await _userRepository.SaveChangesAsync();
|
var success = await _userRepository.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
await _mailVerificationService.AddUserSendEmailAsync(saveItem.Id, userAddModel.BaseUrl, userAddModel.RouteUrl);
|
await _mailVerificationService.AddUserSendEmailAsync(saveItem.Id, userAddModel.BaseUrl, userAddModel.RouteUrl);
|
||||||
|
|
||||||
|
|
||||||
return ResponseOutput.Ok( new UserAddedReturnDTO { Id = saveItem.Id, UserCode = saveItem.UserCode });
|
return ResponseOutput.Ok(new UserAddedReturnDTO { Id = saveItem.Id, UserCode = saveItem.UserCode });
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -589,7 +592,7 @@ namespace IRaCIS.Application.Services
|
||||||
user.OrganizationName = AppSettings.DefaultInternalOrganizationName;
|
user.OrganizationName = AppSettings.DefaultInternalOrganizationName;
|
||||||
}
|
}
|
||||||
|
|
||||||
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId= model.Id , OptType = UserOptType.UpdateUser }, true);
|
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId = model.Id, OptType = UserOptType.UpdateUser }, true);
|
||||||
|
|
||||||
var success = await _userRepository.SaveChangesAsync();
|
var success = await _userRepository.SaveChangesAsync();
|
||||||
|
|
||||||
|
@ -611,7 +614,7 @@ namespace IRaCIS.Application.Services
|
||||||
return ResponseOutput.NotOk(_localizer["User_InProject"]);
|
return ResponseOutput.NotOk(_localizer["User_InProject"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId= userId, OptType = UserOptType.DeleteUser }, true);
|
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId = userId, OptType = UserOptType.DeleteUser }, true);
|
||||||
|
|
||||||
var success = await _userRepository.BatchDeleteNoTrackingAsync(t => t.Id == userId);
|
var success = await _userRepository.BatchDeleteNoTrackingAsync(t => t.Id == userId);
|
||||||
|
|
||||||
|
@ -629,7 +632,7 @@ namespace IRaCIS.Application.Services
|
||||||
public async Task<IResponseOutput> UpdateUserState(Guid userId, UserStateEnum state)
|
public async Task<IResponseOutput> UpdateUserState(Guid userId, UserStateEnum state)
|
||||||
{
|
{
|
||||||
|
|
||||||
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId = userId, OptType = state==UserStateEnum.Enable? UserOptType.AccountEnable: UserOptType.AccountLocked }, true);
|
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId = userId, OptType = state == UserStateEnum.Enable ? UserOptType.AccountEnable : UserOptType.AccountLocked }, true);
|
||||||
|
|
||||||
var success = await _userRepository.BatchUpdateNoTrackingAsync(u => u.Id == userId, t => new User
|
var success = await _userRepository.BatchUpdateNoTrackingAsync(u => u.Id == userId, t => new User
|
||||||
{
|
{
|
||||||
|
@ -639,7 +642,70 @@ namespace IRaCIS.Application.Services
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<UserBasicInfo> GetUserBasicInfo(Guid userId, string pwd)
|
||||||
|
{
|
||||||
|
var info = await _userRepository.Where(u => u.Id == userId && u.Password==pwd).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstNotNullAsync();
|
||||||
|
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发送MFA 验证邮件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[AllowAnonymous]
|
||||||
|
public async Task<IResponseOutput> SendMFAEmail(Guid userId)
|
||||||
|
{
|
||||||
|
var userInfo = await _userRepository.Where(u => u.Id == userId).Select(t => new { t.FullName, t.EMail }).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
int verificationCode = new Random().Next(100000, 1000000);
|
||||||
|
|
||||||
|
await _mailVerificationService.SenMFAVerifyEmail(userId, userInfo.FullName, userInfo.EMail, verificationCode);
|
||||||
|
|
||||||
|
return ResponseOutput.Ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证MFA 邮件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userId"></param>
|
||||||
|
/// <param name="Code"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="BusinessValidationFailedException"></exception>
|
||||||
|
[AllowAnonymous]
|
||||||
|
public async Task<IResponseOutput> VerifyMFACodeAsync(Guid userId, string Code)
|
||||||
|
{
|
||||||
|
var verificationRecord = await _repository.GetQueryable<VerificationCode>().OrderByDescending(x => x.ExpirationTime).Where(t => t.UserId == userId && t.Code == Code && t.CodeType == VerifyType.Email).FirstOrDefaultAsync();
|
||||||
|
VerifyEmialGetDoctorInfoOutDto result = new VerifyEmialGetDoctorInfoOutDto();
|
||||||
|
|
||||||
|
//检查数据库是否存在该验证码
|
||||||
|
if (verificationRecord == null)
|
||||||
|
{
|
||||||
|
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = userId, OptUserId = userId, OptType = UserOptType.MFALoginFail }, true);
|
||||||
|
//---验证码错误。
|
||||||
|
throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_WrongVerificationCode"]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//检查验证码是否失效
|
||||||
|
if (verificationRecord.ExpirationTime < DateTime.Now)
|
||||||
|
{
|
||||||
|
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = userId, OptUserId = userId, OptType = UserOptType.MFALoginFail }, true);
|
||||||
|
//---验证码已经过期。
|
||||||
|
throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_ExpiredVerificationCode"]);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
else //验证码正确 并且 没有超时
|
||||||
|
{
|
||||||
|
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = userId, OptUserId = userId, OptType = UserOptType.MFALogin }, true);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ResponseOutput.Ok();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 用户登陆
|
/// 用户登陆
|
||||||
|
@ -690,14 +756,12 @@ namespace IRaCIS.Application.Services
|
||||||
failCount++;
|
failCount++;
|
||||||
_cache.Set(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes));
|
_cache.Set(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes));
|
||||||
|
|
||||||
var errorPwdUserId = await _userRepository.Where(u => u.UserName==userName).Select(t=>t.Id).FirstOrDefaultAsync();
|
var errorPwdUserId = await _userRepository.Where(u => u.UserName == userName).Select(t => t.Id).FirstOrDefaultAsync();
|
||||||
|
|
||||||
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = errorPwdUserId, OptUserId = errorPwdUserId, LoginFaildName = userName, LoginPassword = password, OptType = UserOptType.AccountOrPasswordError }, true);
|
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = errorPwdUserId, OptUserId = errorPwdUserId, LoginFaildName = userName, LoginPassword = password, OptType = UserOptType.AccountOrPasswordError }, true);
|
||||||
|
|
||||||
return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new LoginReturnDTO());
|
return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new LoginReturnDTO());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loginUser.Status == 0)
|
if (loginUser.Status == 0)
|
||||||
|
@ -712,26 +776,26 @@ namespace IRaCIS.Application.Services
|
||||||
if (loginUser.LastChangePassWordTime != null && DateTime.Now.AddDays(-90) > loginUser.LastChangePassWordTime.Value)
|
if (loginUser.LastChangePassWordTime != null && DateTime.Now.AddDays(-90) > loginUser.LastChangePassWordTime.Value)
|
||||||
{
|
{
|
||||||
loginUser.LoginState = 1;
|
loginUser.LoginState = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//登录成功 清除缓存
|
//登录成功 清除缓存
|
||||||
_cache.Set(cacheKey, 0, TimeSpan.FromMinutes(lockoutMinutes));
|
_cache.Set(cacheKey, 0, TimeSpan.FromMinutes(lockoutMinutes));
|
||||||
|
|
||||||
|
|
||||||
if (loginUser.LastLoginIP != string.Empty)
|
if (loginUser.LastLoginIP != string.Empty)
|
||||||
{
|
{
|
||||||
// 与上一次IP不一致
|
// 与上一次IP不一致
|
||||||
if (loginUser.LastLoginIP != _userInfo.IP)
|
if (loginUser.LastLoginIP != _userInfo.IP)
|
||||||
{
|
{
|
||||||
loginUser.LoginState = 2;
|
loginUser.LoginState = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = loginUser.Id, OptUserId = loginUser.Id, OptType = UserOptType.Login }, true);
|
}
|
||||||
|
|
||||||
|
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = loginUser.Id, OptUserId = loginUser.Id, OptType = UserOptType.Login }, true);
|
||||||
|
|
||||||
userLoginReturnModel.BasicInfo = loginUser;
|
userLoginReturnModel.BasicInfo = loginUser;
|
||||||
|
|
||||||
|
@ -743,21 +807,13 @@ namespace IRaCIS.Application.Services
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await _userRepository.BatchUpdateNoTrackingAsync(x => x.Id == loginUser.Id, x => new User()
|
await _userRepository.BatchUpdateNoTrackingAsync(x => x.Id == loginUser.Id, x => new User()
|
||||||
{
|
{
|
||||||
LastLoginIP = _userInfo.IP
|
LastLoginIP = _userInfo.IP
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// 登录 清除缓存
|
|
||||||
//_cache.Remove(userLoginReturnModel.BasicInfo.Id.ToString());
|
|
||||||
|
|
||||||
var userId = loginUser.Id;
|
|
||||||
await _cache.SetAsync($"{userId.ToString()}_Online", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes));
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
return ResponseOutput.Ok(userLoginReturnModel);
|
return ResponseOutput.Ok(userLoginReturnModel);
|
||||||
|
|
||||||
|
@ -766,12 +822,12 @@ namespace IRaCIS.Application.Services
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<PageOutput<UserLogView>> GetUserLogList(UserLogQuery inQuery)
|
public async Task<PageOutput<UserLogView>> GetUserLogList(UserLogQuery inQuery)
|
||||||
{
|
{
|
||||||
DateTime? trialCreateTime = inQuery.TrialId != null ?_repository.Where<Trial>(t=>t.Id==inQuery.TrialId).Select(t=>t.CreateTime).FirstOrDefault() : null;
|
DateTime? trialCreateTime = inQuery.TrialId != null ? _repository.Where<Trial>(t => t.Id == inQuery.TrialId).Select(t => t.CreateTime).FirstOrDefault() : null;
|
||||||
|
|
||||||
var userLogQueryable =
|
var userLogQueryable =
|
||||||
_userLogRepository
|
_userLogRepository
|
||||||
.WhereIf(inQuery.TrialId != null, t => t.LoginUser.UserTrials.Any(c => c.TrialId == inQuery.TrialId && (c.UserId == t.LoginUserId || c.UserId == t.OptUserId)))
|
.WhereIf(inQuery.TrialId != null, t => t.LoginUser.UserTrials.Any(c => c.TrialId == inQuery.TrialId && (c.UserId == t.LoginUserId || c.UserId == t.OptUserId)))
|
||||||
.WhereIf(trialCreateTime != null, t => t.CreateTime>= trialCreateTime)
|
.WhereIf(trialCreateTime != null, t => t.CreateTime >= trialCreateTime)
|
||||||
.WhereIf(inQuery.OptType != null, t => t.OptType == inQuery.OptType)
|
.WhereIf(inQuery.OptType != null, t => t.OptType == inQuery.OptType)
|
||||||
.WhereIf(inQuery.UserId != null, t => t.LoginUserId == inQuery.UserId)
|
.WhereIf(inQuery.UserId != null, t => t.LoginUserId == inQuery.UserId)
|
||||||
.WhereIf(inQuery.BeginDate != null, t => t.CreateTime >= inQuery.BeginDate)
|
.WhereIf(inQuery.BeginDate != null, t => t.CreateTime >= inQuery.BeginDate)
|
||||||
|
|
|
@ -344,6 +344,8 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
{
|
{
|
||||||
public string TrialModalitys { get; set;}
|
public string TrialModalitys { get; set;}
|
||||||
|
|
||||||
|
public bool IsImageFilter { get; set; }
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 项目ID
|
/// 项目ID
|
||||||
|
@ -506,6 +508,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
|
|
||||||
public ReadingImageUpload? ImageUploadEnum { get; set; }
|
public ReadingImageUpload? ImageUploadEnum { get; set; }
|
||||||
|
|
||||||
|
public Guid TrialReadingCriterionId { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -864,6 +867,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
|
|
||||||
public class SetCriterionReadingInfoInDto
|
public class SetCriterionReadingInfoInDto
|
||||||
{
|
{
|
||||||
|
public bool IsImageFilter { get; set; }
|
||||||
public string CriterionModalitys { get; set; }
|
public string CriterionModalitys { get; set; }
|
||||||
|
|
||||||
public ReadingImageDownload? ImageDownloadEnum { get; set; }
|
public ReadingImageDownload? ImageDownloadEnum { get; set; }
|
||||||
|
|
|
@ -317,12 +317,12 @@ namespace IRaCIS.Core.Application
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
var trialModalitys = _readingQuestionCriterionTrialRepository.Where(t => t.Id == inDto.TrialReadingCriterionId).Select(t => t.Trial.Modalitys).FirstOrDefault();
|
//var trialModalitys = _readingQuestionCriterionTrialRepository.Where(t => t.Id == inDto.TrialReadingCriterionId).Select(t => t.Trial.Modalitys).FirstOrDefault();
|
||||||
var systemCriterion = await _readingQuestionCriterionSystemRepository.Where(x => x.Id == trialCriterion.ReadingQuestionCriterionSystemId).FirstNotNullAsync();
|
var systemCriterion = await _readingQuestionCriterionSystemRepository.Where(x => x.Id == trialCriterion.ReadingQuestionCriterionSystemId).FirstNotNullAsync();
|
||||||
|
|
||||||
await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
|
await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
|
||||||
{
|
{
|
||||||
CriterionModalitys= trialModalitys,
|
//CriterionModalitys= trialModalitys,
|
||||||
IsOncologyReading = systemCriterion.IsOncologyReading,
|
IsOncologyReading = systemCriterion.IsOncologyReading,
|
||||||
IsSystemSetOncology = systemCriterion.IsOncologyReading,
|
IsSystemSetOncology = systemCriterion.IsOncologyReading,
|
||||||
IseCRFShowInDicomReading = systemCriterion.IseCRFShowInDicomReading,
|
IseCRFShowInDicomReading = systemCriterion.IseCRFShowInDicomReading,
|
||||||
|
@ -604,6 +604,7 @@ namespace IRaCIS.Core.Application
|
||||||
|
|
||||||
await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
|
await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
|
||||||
{
|
{
|
||||||
|
IsImageFilter=inDto.IsImageFilter,
|
||||||
ImageDownloadEnum = inDto.ImageDownloadEnum,
|
ImageDownloadEnum = inDto.ImageDownloadEnum,
|
||||||
ImageUploadEnum = inDto.ImageUploadEnum,
|
ImageUploadEnum = inDto.ImageUploadEnum,
|
||||||
CriterionModalitys = inDto.CriterionModalitys,
|
CriterionModalitys = inDto.CriterionModalitys,
|
||||||
|
@ -953,7 +954,7 @@ namespace IRaCIS.Core.Application
|
||||||
trialInfo.UpdateTime = DateTime.Now;
|
trialInfo.UpdateTime = DateTime.Now;
|
||||||
|
|
||||||
|
|
||||||
await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialConfig.TrialId && t.IsSigned == false, u => new ReadingQuestionCriterionTrial() { CriterionModalitys = trialConfig.Modalitys });
|
//await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialConfig.TrialId && t.IsSigned == false, u => new ReadingQuestionCriterionTrial() { CriterionModalitys = trialConfig.Modalitys });
|
||||||
|
|
||||||
return ResponseOutput.Ok(await _repository.SaveChangesAsync());
|
return ResponseOutput.Ok(await _repository.SaveChangesAsync());
|
||||||
}
|
}
|
||||||
|
@ -1039,7 +1040,8 @@ namespace IRaCIS.Core.Application
|
||||||
if (trialConfig.TrialCriterionIds.Contains(item.Id))
|
if (trialConfig.TrialCriterionIds.Contains(item.Id))
|
||||||
{
|
{
|
||||||
item.IsConfirm = true;
|
item.IsConfirm = true;
|
||||||
item.CriterionModalitys = trialInfo.Modalitys;
|
|
||||||
|
//item.CriterionModalitys = trialInfo.Modalitys;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -249,7 +249,8 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
|
|
||||||
CreateMap<ReadingQuestionCriterionTrial, GetTrialReadingInfoOutDto>()
|
CreateMap<ReadingQuestionCriterionTrial, GetTrialReadingInfoOutDto>()
|
||||||
.ForMember(t => t.TrialModalitys, u => u.MapFrom(c => c.Trial.Modalitys));
|
.ForMember(t => t.TrialModalitys, u => u.MapFrom(c => c.Trial.Modalitys))
|
||||||
|
.ForMember(t => t.TrialReadingCriterionId, u => u.MapFrom(c => c.Id));
|
||||||
|
|
||||||
|
|
||||||
CreateMap<ReadingQuestionTrial, TrialAdditionaQuestion>()
|
CreateMap<ReadingQuestionTrial, TrialAdditionaQuestion>()
|
||||||
|
|
|
@ -93,7 +93,11 @@ namespace IRaCIS.Core.Domain.Models
|
||||||
|
|
||||||
DeleteUser=10,
|
DeleteUser=10,
|
||||||
|
|
||||||
UpdateUser=11
|
UpdateUser=11,
|
||||||
|
|
||||||
|
MFALogin=12,
|
||||||
|
|
||||||
|
MFALoginFail=13,
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -279,6 +279,8 @@ namespace IRaCIS.Core.Domain.Models
|
||||||
public ReadingImageDownload? ImageDownloadEnum { get; set; }
|
public ReadingImageDownload? ImageDownloadEnum { get; set; }
|
||||||
|
|
||||||
public ReadingImageUpload? ImageUploadEnum { get; set; }
|
public ReadingImageUpload? ImageUploadEnum { get; set; }
|
||||||
|
|
||||||
|
public bool IsImageFilter { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ReadingImageDownload
|
public enum ReadingImageDownload
|
||||||
|
|
|
@ -22,6 +22,8 @@ namespace IRaCIS.Core.Domain.Share
|
||||||
public int LoginFailLockMinutes { get; set; }
|
public int LoginFailLockMinutes { get; set; }
|
||||||
|
|
||||||
public int AutoLoginOutMinutes { get; set; }
|
public int AutoLoginOutMinutes { get; set; }
|
||||||
|
|
||||||
|
public bool OpenLoginMFA { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SystemEmailSendConfig
|
public class SystemEmailSendConfig
|
||||||
|
|
Loading…
Reference in New Issue