diff --git a/IRaCIS.Core.API/Controllers/ExtraController.cs b/IRaCIS.Core.API/Controllers/ExtraController.cs
index 0aaba76b6..68d71badf 100644
--- a/IRaCIS.Core.API/Controllers/ExtraController.cs
+++ b/IRaCIS.Core.API/Controllers/ExtraController.cs
@@ -106,195 +106,6 @@ namespace IRaCIS.Api.Controllers
- /// 系统用户登录接口[New]
- [HttpPost, Route("user/login")]
- [AllowAnonymous]
- public async Task Login(UserLoginDTO loginUser,
- [FromServices] IFusionCache _fusionCache,
- [FromServices] IUserService _userService,
- [FromServices] ITokenService _tokenService,
- [FromServices] IReadingImageTaskService readingImageTaskService,
- [FromServices] IOptionsMonitor _verifyConfig,
- [FromServices] IOptionsMonitor _emailConfig,
- [FromServices] IMapper _mapper,
- [FromServices] IMailVerificationService _mailVerificationService)
- {
- var emailConfig = _emailConfig.CurrentValue;
- var companyInfo = new SystemEmailSendConfigView() { CompanyName = emailConfig.CompanyName, CompanyNameCN = emailConfig.CompanyNameCN, CompanyShortName = emailConfig.CompanyShortName, CompanyShortNameCN = emailConfig.CompanyShortNameCN };
-
- //MFA 邮箱验证 前端传递用户Id 和MFACode
- if (loginUser.UserId != null && _verifyConfig.CurrentValue.OpenLoginMFA)
- {
- Guid userId = (Guid)loginUser.UserId;
-
- //验证MFA 编码是否有问题 ,前端要拆开,自己调用验证的逻辑
- //await _userService.VerifyMFACodeAsync(userId, loginUser.MFACode);
-
- //var loginUser = await _userRoleRepository.Where(u => u.UserName.Equals(userName) && u.Password == password).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
-
- var basicInfo = await _userService.GetUserBasicInfo(userId, loginUser.Password);
-
- var loginReturn = new LoginReturnDTO() { BasicInfo = basicInfo };
-
- loginReturn.JWTStr = _tokenService.GetToken(new UserTokenInfo() { IdentityUserId = basicInfo.IdentityUserId });
-
-
- // 创建一个 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", loginReturn.JWTStr, option);
-
- // 验证阅片休息时间
- await readingImageTaskService.ResetReadingRestTime(userId);
-
-
- await _fusionCache.SetAsync(CacheKeys.UserAutoLoginOut(userId), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes));
-
- loginReturn.CompanyInfo = companyInfo;
- 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("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.IdentityUserId;
-
- if (_verifyConfig.CurrentValue.OpenLoginMFA)
- {
-
-
-
-
- //MFA 发送邮件
-
- returnModel.Data.IsMFA = true;
-
- var email = returnModel.Data.BasicInfo.EMail;
-
- var hiddenEmail = IRCEmailPasswordHelper.MaskEmail(email);
-
- returnModel.Data.BasicInfo.EMail = hiddenEmail;
-
- //修改密码
- if (returnModel.Data.BasicInfo.IsFirstAdd || returnModel.Data.BasicInfo.LoginState == 1)
- {
- returnModel.Data.JWTStr = _tokenService.GetToken(_mapper.Map(returnModel.Data.BasicInfo));
- }
- else
- {
- //正常登录才发送邮件
- await _userService.SendMFAEmail(new Core.Application.ViewModel.SendMfaCommand() { IdentityUserId= userId });
-
- }
-
- }
- else
- {
- returnModel.Data.JWTStr = _tokenService.GetToken(_mapper.Map(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.IdentityUserId);
-
-
-
- await _fusionCache.SetAsync(CacheKeys.UserAutoLoginOut(userId), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes));
- }
-
- }
-
- returnModel.Data.CompanyInfo = companyInfo;
- return returnModel;
-
- }
-
-
-
-
- }
-
[AllowAnonymous]
[HttpGet, Route("user/getPublicKey")]
public IResponseOutput GetPublicKey([FromServices] IOptionsMonitor _IRCEncreptOption)
diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.xml b/IRaCIS.Core.API/IRaCIS.Core.API.xml
index 556371672..df2392c13 100644
--- a/IRaCIS.Core.API/IRaCIS.Core.API.xml
+++ b/IRaCIS.Core.API/IRaCIS.Core.API.xml
@@ -34,9 +34,6 @@
-
- 系统用户登录接口[New]
-
回调到前端,前端调用后端的接口
diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index d412a314d..81568c41e 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -12047,7 +12047,7 @@
-
+
IR影像阅片
diff --git a/IRaCIS.Core.Application/Service/Management/UserService.cs b/IRaCIS.Core.Application/Service/Management/UserService.cs
index da75b1e42..6758e4559 100644
--- a/IRaCIS.Core.Application/Service/Management/UserService.cs
+++ b/IRaCIS.Core.Application/Service/Management/UserService.cs
@@ -968,8 +968,8 @@ namespace IRaCIS.Core.Application.Service
[HttpPost]
public async Task> GetUserLoginRoleList(IRCLoginDto loginDto,
[FromServices] ITokenService _tokenService,
- [FromServices] IOptionsMonitor _emailConfig,
- [FromServices] IReadingImageTaskService readingImageTaskService)
+ [FromServices] IOptionsMonitor _emailConfig
+ )
{
var userName = loginDto.UserName;
@@ -1018,7 +1018,7 @@ namespace IRaCIS.Core.Application.Service
var isLoginUncommonly = false;
- //登录用户是系统用户的时候,就要要记录异地登录
+ #region //登录用户是系统用户的时候,就要要记录异地登录
//账号在系统存在
if (isExistAccount || loginUser != null)
@@ -1065,30 +1065,27 @@ namespace IRaCIS.Core.Application.Service
}
+ #endregion
+
+
if (loginUser == null)
{
//错误次数累加
failCount++;
+
await _fusionCache.SetAsync(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes));
-
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionUserName = userName, LoginPassword = password, OptType = UserOptType.AccountOrPasswordError }, true);
-
return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new IRCLoginReturnDTO());
}
- #region 处理用户状态
-
-
- #endregion
-
if (loginUser.Status == 0)
{
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = loginUser.IdentityUserId, ActionUserName = userName, OptType = UserOptType.LoginLockedAccount, IsLoginUncommonly = isLoginUncommonly }, true);
@@ -1152,8 +1149,6 @@ namespace IRaCIS.Core.Application.Service
}
else
{
- // 验证阅片休息时间
- await readingImageTaskService.ResetReadingRestTime(userLoginReturnModel.BasicInfo.IdentityUserId);
await _fusionCache.SetAsync(CacheKeys.UserToken(identityUserId), userLoginReturnModel.JWTStr, TimeSpan.FromDays(7));
@@ -1175,7 +1170,7 @@ namespace IRaCIS.Core.Application.Service
///
///
[HttpGet]
- public async Task LoginSelectUserRole(Guid userRoleId, [FromServices] ITokenService _tokenService)
+ public async Task LoginSelectUserRole(Guid userRoleId, [FromServices] ITokenService _tokenService, [FromServices] IReadingImageTaskService readingImageTaskService)
{
var identityUserId = _userInfo.IdentityUserId;
@@ -1199,6 +1194,8 @@ namespace IRaCIS.Core.Application.Service
{
var jwt = _tokenService.GetToken(userTokenInfo);
+ // 验证阅片休息时间
+ await readingImageTaskService.ResetReadingRestTime(userTokenInfo.UserRoleId);
await _fusionCache.SetAsync(CacheKeys.UserToken(userTokenInfo.IdentityUserId), jwt, TimeSpan.FromDays(7));
diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs
index e3634cc07..e83bcef85 100644
--- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs
+++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs
@@ -32,6 +32,7 @@ namespace IRaCIS.Core.Application.Service
IRepository _noneDicomStudyRepository,
IRepository _visitTaskRepository,
IRepository _trialRepository,
+ IRepository _userLogRepository,
IRepository _readingTableQuestionAnswerRepository,
IRepository _readingOncologyTaskInfoRepository,
IVisitTaskHelpeService _visitTaskHelpeService,
@@ -3274,30 +3275,35 @@ namespace IRaCIS.Core.Application.Service
///
///
[HttpPost]
- public async Task ResetReadingRestTime([FromServices] IRepository _userLogRepository)
+ public async Task ResetReadingRestTime(Guid? userRoleId)
{
-
+ var roleId = (userRoleId != null && userRoleId != Guid.Empty) ? (Guid) userRoleId : _userInfo.UserRoleId;
//int readingMinute = 120; // 为60整数
int restMinute = 10; //
- var startReadingTime = await _fusionCache.GetOrDefaultAsync(CacheKeys.StartReadingTimeKey(_userInfo.UserRoleId));
- var startRestTime = await _fusionCache.GetOrDefaultAsync(CacheKeys.StartRestTime(_userInfo.UserRoleId));
+ var startReadingTime = await _fusionCache.GetOrDefaultAsync(CacheKeys.StartReadingTimeKey(roleId));
+ var startRestTime = await _fusionCache.GetOrDefaultAsync(CacheKeys.StartRestTime(roleId));
if (startRestTime != null)
{
var cacheStartRestTime = DateTime.Parse(startRestTime!.ToString());
int timespanMin = (DateTime.Now - cacheStartRestTime).Minutes;
if (timespanMin > restMinute)
{
- await _fusionCache.RemoveAsync(CacheKeys.StartRestTime(_userInfo.UserRoleId));
+ await _fusionCache.RemoveAsync(CacheKeys.StartRestTime(roleId));
}
}
else if (startReadingTime != null)
{
- await _fusionCache.SetAsync(CacheKeys.StartReadingTimeKey(_userInfo.UserRoleId), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromHours(48));
+ await _fusionCache.SetAsync(CacheKeys.StartReadingTimeKey(roleId), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromHours(48));
}
- await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = _userInfo.IdentityUserId, OptType = UserOptType.WebUnlock }, true);
+ //前端屏幕解锁才调用
+ if (userRoleId == null)
+ {
+ await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = _userInfo.IdentityUserId, OptType = UserOptType.WebUnlock }, true);
+
+ }
return true;
}