用户初步修改
parent
2e7a0fe68d
commit
c1a58401eb
|
@ -2209,7 +2209,7 @@
|
|||
<summary>
|
||||
重置密码为 默认密码
|
||||
</summary>
|
||||
<param name="userId"></param>
|
||||
<param name="identityUserId"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserService.AnonymousSendVerificationCode(System.String)">
|
||||
|
@ -2232,7 +2232,7 @@
|
|||
<summary>
|
||||
(未登陆) 设置新密码
|
||||
</summary>
|
||||
<param name="userId"></param>
|
||||
<param name="identityUserId"></param>
|
||||
<param name="newPwd"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
|
@ -2249,13 +2249,6 @@
|
|||
<param name="inQuery"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserService.GetUser(System.Guid)">
|
||||
<summary>
|
||||
根据用户Id获取用户详细信息[New]
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>xiuga
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserService.AddUser(IRaCIS.Application.Contracts.UserCommand)">
|
||||
<summary>
|
||||
添加用户
|
||||
|
@ -2270,13 +2263,6 @@
|
|||
<param name="model"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserService.DeleteUser(System.Guid)">
|
||||
<summary>
|
||||
删除用户
|
||||
</summary>
|
||||
<param name="userId"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserService.UpdateUserState(System.Guid,IRaCIS.Core.Domain.Share.UserStateEnum)">
|
||||
<summary>
|
||||
禁用或者启用账户
|
||||
|
@ -2285,7 +2271,7 @@
|
|||
<param name="state"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserService.SendMFAEmail(System.Guid,System.Int32)">
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserService.SendMFAEmail(System.Guid,IRaCIS.Core.Domain.Share.UserMFAType)">
|
||||
<summary>
|
||||
发送MFA 验证邮件
|
||||
</summary>
|
||||
|
@ -2310,6 +2296,23 @@
|
|||
<param name="password"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserService.GetUserLoginRoleList(IRaCIS.Application.Contracts.IRCLoginDto,IRaCIS.Core.Application.Auth.ITokenService,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.SystemEmailSendConfig},IRaCIS.Core.Application.Contracts.IReadingImageTaskService)">
|
||||
<summary>
|
||||
账号验证,获取账号角色信息 获取临时token
|
||||
</summary>
|
||||
<returns></returns>
|
||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.UserService.LoginSelectUserRole(System.Guid,System.Guid,IRaCIS.Core.Application.Auth.ITokenService)">
|
||||
<summary>
|
||||
验证密码成功后,选定角色,然后获取当前角色的Token
|
||||
</summary>
|
||||
<param name="identityUserId"></param>
|
||||
<param name="userTypeId"></param>
|
||||
<param name="_tokenService"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.CodeTemplateService.GetDataBaseTableList(System.String,System.String)">
|
||||
<summary>
|
||||
获取数据库的表信息 以及字段信息
|
||||
|
@ -13117,6 +13120,12 @@
|
|||
<param name="_readingConsistentClinicalDataRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.TestService.UserMutiAccount">
|
||||
<summary>
|
||||
用户多账号,初次维护数据
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.TestService.ModifyClinicalDataTable">
|
||||
<summary>
|
||||
维护临床数据 --一定要在同步表前同步数据才行
|
||||
|
@ -17536,11 +17545,6 @@
|
|||
GCP机构
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Application.Contracts.UserBasicInfo.LastLoginIP">
|
||||
<summary>
|
||||
LastLoginIP
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:IRaCIS.Application.Contracts.UserBasicInfo.LastChangePassWordTime">
|
||||
<summary>
|
||||
上一次修改密码的时间
|
||||
|
|
|
@ -99,11 +99,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
CreateMap<DoctorDTO, SelectionReviewerDTO>()
|
||||
;
|
||||
|
||||
CreateMap<User, UserBasicInfo>()
|
||||
.ForMember(d => d.UserTypeShortName, u => u.MapFrom(t => t.UserTypeRole.UserTypeShortName))
|
||||
.ForMember(d => d.Code, u => u.MapFrom(t => t.UserCode))
|
||||
.ForMember(d => d.PermissionStr, u => u.MapFrom(t => t.UserTypeRole.PermissionStr))
|
||||
.ForMember(d => d.RealName, u => u.MapFrom(user => string.IsNullOrEmpty(user.FirstName) ? user.LastName : user.LastName + " / " + user.FirstName));
|
||||
CreateMap<User, UserBasicInfo>();
|
||||
|
||||
CreateMap<TrialExperience, TrialExperienceListDTO>()
|
||||
.ForMember(x=>x.VisitReadingCount, u => u.MapFrom(t => (t.ExperienceDataType==ExperienceDataType.TrialAuto||t.ExperienceDataType==ExperienceDataType.SystemAuto)?
|
||||
|
@ -116,11 +112,11 @@ namespace IRaCIS.Core.Application.Service
|
|||
.ForMember(d => d.EvaluationCriteriaList, u => u.MapFrom(t => t.ExperienceCriteriaList.Select(t => t.EvaluationCriteria.Value)))
|
||||
.ForMember(d => d.EvaluationCriteriaIdList, u => u.MapFrom(t => t.ExperienceCriteriaList.Select(t => t.EvaluationCriteriaId)));
|
||||
|
||||
CreateMap<Doctor, UserBasicInfo>()
|
||||
.ForMember(d => d.Code, u => u.MapFrom(t => t.ReviewerCode))
|
||||
.ForMember(d => d.RealName, u => u.MapFrom(t => t.ChineseName))
|
||||
.ForMember(d => d.IsReviewer, u => u.MapFrom(t => true))
|
||||
.ForMember(d => d.UserName, u => u.MapFrom(doctor => doctor.LastName + " / " + doctor.FirstName));
|
||||
//CreateMap<Doctor, UserBasicInfo>()
|
||||
// .ForMember(d => d.Code, u => u.MapFrom(t => t.ReviewerCode))
|
||||
// .ForMember(d => d.RealName, u => u.MapFrom(t => t.ChineseName))
|
||||
// .ForMember(d => d.IsReviewer, u => u.MapFrom(t => true))
|
||||
// .ForMember(d => d.UserName, u => u.MapFrom(doctor => doctor.LastName + " / " + doctor.FirstName));
|
||||
|
||||
#region 医生基本信息
|
||||
CreateMap<Doctor, SelectionReviewerDTO>()
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace IRaCIS.Application.Contracts
|
|||
{
|
||||
public string JwtStr { get; set; }
|
||||
|
||||
public bool IsExistMutiAccount => AccountList.Count > 1;
|
||||
public bool IsMutiAccount => AccountList.Count > 1;
|
||||
|
||||
public List<UserAccountInfo> AccountList { get; set; } = new List<UserAccountInfo>();
|
||||
}
|
||||
|
@ -38,6 +38,7 @@ namespace IRaCIS.Application.Contracts
|
|||
public class UserAccountInfo
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public Guid IdentityUserId { get; set; }
|
||||
public string UserName { get; set; } = string.Empty;
|
||||
public string FullName { get; set; } = string.Empty;
|
||||
|
||||
|
@ -48,6 +49,11 @@ namespace IRaCIS.Application.Contracts
|
|||
|
||||
public UserTypeEnum UserType { get; set; }
|
||||
|
||||
public bool IsUserRoleDisabled { get; set; }
|
||||
|
||||
[Comment("多账号信息是否已经确认")]
|
||||
public bool IsMutiAccountInfoConfirm { get; set; }
|
||||
|
||||
}
|
||||
public class LoginReturnDTO
|
||||
{
|
||||
|
@ -60,43 +66,47 @@ namespace IRaCIS.Application.Contracts
|
|||
|
||||
}
|
||||
|
||||
public class IRCLoginReturnDTO
|
||||
{
|
||||
public UserBasicInfo BasicInfo { get; set; } = new UserBasicInfo();
|
||||
public string JWTStr { get; set; } = string.Empty;
|
||||
|
||||
public bool IsMFA { get; set; } = false;
|
||||
|
||||
public SystemEmailSendConfigView CompanyInfo { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class UserBasicInfo
|
||||
{
|
||||
public Guid IdentityUserId { get; set; }
|
||||
|
||||
public bool IsMutiAccount => AccountList?.Count > 1;
|
||||
public List<UserAccountInfo> AccountList { get; set; }
|
||||
|
||||
public Guid Id { get; set; }
|
||||
public string UserName { get; set; } = string.Empty;
|
||||
public string RealName { get; set; } = string.Empty;
|
||||
public string FullName { get; set; } = string.Empty;
|
||||
public int? Sex { get; set; } // 1-男 2-女
|
||||
public string UserCode { get; set; }
|
||||
public string EMail { get; set; }
|
||||
|
||||
public int Status { get; set; }
|
||||
public bool IsTestUser { get; set; }
|
||||
public bool IsZhiZhun { get; set; }
|
||||
public bool IsFirstAdd { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// LastLoginIP
|
||||
/// </summary>
|
||||
public bool PasswordChanged { get; set; }
|
||||
|
||||
public int LoginState { get; set; } = 0;
|
||||
public string LastLoginIP { get; set; } = string.Empty;
|
||||
|
||||
public UserTypeEnum UserTypeEnum { get; set; }
|
||||
|
||||
public DateTime? LastLoginTime { get; set; }
|
||||
/// <summary>
|
||||
/// 上一次修改密码的时间
|
||||
/// </summary>
|
||||
public DateTime? LastChangePassWordTime { get; set; }
|
||||
public bool IsTestUser { get; set; }
|
||||
public bool IsAdmin { get; set; } = false;
|
||||
public string UserTypeShortName { get; set; } = string.Empty;
|
||||
public bool PasswordChanged { get; set; }
|
||||
public int Status { get; set; }
|
||||
public Guid UserTypeId { get; set; }
|
||||
|
||||
public string Code { 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 IsZhiZhun { get; set; }
|
||||
public bool IsReviewer { get; set; } = false;
|
||||
|
||||
public int LoginState { get; set; } = 0;
|
||||
|
||||
}
|
||||
|
||||
|
@ -151,11 +161,7 @@ namespace IRaCIS.Application.Contracts
|
|||
|
||||
public class UserInfo
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string UserName { get; set; } = string.Empty;
|
||||
public string Password { get; set; } = string.Empty;
|
||||
public string RealName { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public string FirstName { get; set; } = string.Empty;
|
||||
|
||||
|
@ -166,34 +172,19 @@ namespace IRaCIS.Application.Contracts
|
|||
|
||||
public string Phone { get; set; } = string.Empty;
|
||||
public string EMail { get; set; } = string.Empty;
|
||||
public Guid UserTypeId { get; set; } = Guid.Empty;
|
||||
|
||||
public string UserCode { get; set; } = string.Empty;
|
||||
|
||||
public bool IsZhiZhun { get; set; }
|
||||
|
||||
public string UserType { get; set; } = string.Empty;
|
||||
|
||||
public string UserTypeShortName { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public UserTypeEnum UserTypeEnum { get; set; }
|
||||
|
||||
|
||||
|
||||
//public Guid OrganizationTypeId { get; set; } = Guid.Empty;
|
||||
//public string OrganizationType { get; set; } = String.Empty;
|
||||
//public Guid OrganizationId { get; set; }
|
||||
public string OrganizationName { get; set; } = string.Empty;
|
||||
|
||||
|
||||
|
||||
public string DepartmentName { get; set; } = String.Empty;
|
||||
public string PositionName { get; set; } = String.Empty;
|
||||
|
||||
public bool IsTestUser { get; set; }
|
||||
|
||||
public DateTime? LastLoginTime { get; set; }
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -208,11 +199,23 @@ namespace IRaCIS.Application.Contracts
|
|||
|
||||
public class UserCommand : UserInfo
|
||||
{
|
||||
public Guid? IdentityUserId { get; set; }
|
||||
|
||||
public List<UserAddUserType> UserRoleList { get; set; }
|
||||
|
||||
|
||||
public string BaseUrl { get; set; } = string.Empty;
|
||||
public string RouteUrl { get; set; } = string.Empty;
|
||||
|
||||
//public string FirstName { get; set; }
|
||||
//public string LastName { get; set; }
|
||||
}
|
||||
|
||||
public class UserAddUserType
|
||||
{
|
||||
public UserTypeEnum UserTypeEnum { get; set; }
|
||||
|
||||
public Guid UserTypeId { get; set; }
|
||||
|
||||
public bool IsUserRoleDisabled { get; set; }
|
||||
}
|
||||
|
||||
public class EditPasswordCommand
|
||||
|
@ -268,26 +271,21 @@ namespace IRaCIS.Application.Contracts
|
|||
|
||||
public class UserListDTO : UserInfo
|
||||
{
|
||||
[JsonIgnore]
|
||||
public Guid testGuid { get; set; }
|
||||
public bool CanEditUserType { get; set; }
|
||||
|
||||
//public bool CanEditUserType { get; set; }
|
||||
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
public List<string> RoleNameArray { get; set; } = new List<string>();
|
||||
public IEnumerable<RoleDTO> RoleNameList { get; set; } = new List<RoleDTO>();
|
||||
public Guid IdentityUserId { get; set; }
|
||||
|
||||
public string FullName { get; set; }
|
||||
|
||||
|
||||
public List<UserAddUserType> UserRoleList { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class UserIdRoleName : RoleDTO
|
||||
{
|
||||
public Guid UserId { get; set; }
|
||||
}
|
||||
public class UserIdRoleNameList
|
||||
{
|
||||
public Guid UserId { get; set; }
|
||||
public IEnumerable<RoleDTO> RoleList { get; set; } = new List<RoleDTO>();
|
||||
}
|
||||
|
||||
|
||||
|
||||
public class AllowAnonymousResetPasswordCommand
|
||||
|
|
|
@ -6,13 +6,13 @@ namespace IRaCIS.Core.Application.Service
|
|||
public interface IUserService
|
||||
{
|
||||
Task<IResponseOutput<UserAddedReturnDTO>> AddUser(UserCommand userAddModel);
|
||||
Task<IResponseOutput> DeleteUser(Guid userId);
|
||||
Task<UserDetailDTO> GetUser(Guid id);
|
||||
//Task<IResponseOutput> DeleteUser(Guid userId);
|
||||
//Task<UserDetailDTO> GetUser(Guid id);
|
||||
Task<PageOutput<UserListDTO>> GetUserList(UserListQueryDTO param);
|
||||
Task<IResponseOutput<LoginReturnDTO>> Login(string userName, string password);
|
||||
Task<IResponseOutput> VerifyMFACodeAsync(Guid userId, string Code);
|
||||
|
||||
Task<IResponseOutput> SendMFAEmail(Guid userId, int mfaType = 0);
|
||||
Task<IResponseOutput> SendMFAEmail(Guid userId, UserMFAType mfaType = 0);
|
||||
Task<UserBasicInfo> GetUserBasicInfo(Guid userId, string pwd);
|
||||
Task<IResponseOutput> ModifyPassword(EditPasswordCommand editPwModel);
|
||||
Task<IResponseOutput> ResetPassword(Guid userId);
|
||||
|
|
|
@ -1,14 +1,19 @@
|
|||
using IP2Region.Net.Abstractions;
|
||||
using DocumentFormat.OpenXml.Wordprocessing;
|
||||
using IP2Region.Net.Abstractions;
|
||||
using IRaCIS.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Auth;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using MassTransit;
|
||||
using Medallion.Threading;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Org.BouncyCastle.Utilities.Encoders;
|
||||
using Panda.DynamicWebApi.Attributes;
|
||||
using System.Text.RegularExpressions;
|
||||
using ZiggyCreatures.Caching.Fusion;
|
||||
|
@ -33,18 +38,18 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
private SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
|
||||
|
||||
private async Task VerifyUserNameAsync(Guid? userId, string userName)
|
||||
private async Task VerifyUserNameAsync(Guid? identityUserId, string userName)
|
||||
{
|
||||
if (await _userRepository.WhereIf(userId != null, t => t.Id != userId).AnyAsync(t => t.UserName == userName))
|
||||
if (await _userRepository.WhereIf(identityUserId != null, t => t.IdentityUserId != identityUserId).AnyAsync(t => t.UserName == userName))
|
||||
{
|
||||
//---用户名已经存在。
|
||||
throw new BusinessValidationFailedException(_localizer["User_UsernameExist"]);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task VerifyUserPhoneAsync(Guid? userId, Guid userTypeId, string phone)
|
||||
private async Task VerifyUserPhoneAsync(Guid? identityUserId, string phone)
|
||||
{
|
||||
if (await _userRepository.WhereIf(userId != null, t => t.Id != userId).AnyAsync(t => (t.Phone == phone && t.UserTypeId == userTypeId)))
|
||||
if (await _userRepository.WhereIf(identityUserId != null, t => t.IdentityUserId != identityUserId).AnyAsync(t => (t.Phone == phone)))
|
||||
{
|
||||
//---该用户类型中已存在具有相同的电话的用户。
|
||||
throw new BusinessValidationFailedException(_localizer["User_PhoneDup"]);
|
||||
|
@ -52,16 +57,16 @@ namespace IRaCIS.Core.Application.Service
|
|||
}
|
||||
|
||||
|
||||
private async Task VerifyUserEmailAsync(Guid? userId, Guid userTypeId, string email)
|
||||
private async Task VerifyUserEmailAsync(Guid? identityUserId, string email)
|
||||
{
|
||||
if (await _userRepository.WhereIf(userId != null, t => t.Id != userId).AnyAsync(t => (t.EMail == email && t.UserTypeId == userTypeId)))
|
||||
if (await _userRepository.WhereIf(identityUserId != null, t => t.IdentityUserId != identityUserId).AnyAsync(t => t.EMail == email))
|
||||
{
|
||||
//---该用户类型中已存在具有相同邮箱的用户。
|
||||
throw new BusinessValidationFailedException(_localizer["User_EmailDup"]);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task VerifyUserPwdAsync(Guid userId, string newPwd, string? oldPwd = null)
|
||||
private async Task VerifyUserPwdAsync(Guid identityUserId, string newPwd, string? oldPwd = null)
|
||||
{
|
||||
//var dbUser = (await _userRepository.FirstOrDefaultAsync(t => t.Id == userId)).IfNullThrowException();
|
||||
|
||||
|
@ -74,7 +79,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
}
|
||||
|
||||
|
||||
var dbUser = (await _userRepository.Where(t => t.Id == userId).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
var dbUser = (await _userRepository.Where(t => t.IdentityUserId == identityUserId).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
if (oldPwd != null && dbUser.Password != oldPwd)
|
||||
{
|
||||
|
@ -88,7 +93,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
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.IdentityUserId == identityUserId).OrderByDescending(x => x.CreateTime).Take(2).ToListAsync();
|
||||
|
||||
if (passWordList.Any(x => x.PassWord == newPwd))
|
||||
{
|
||||
|
@ -99,7 +104,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
if (oldPwd == null)
|
||||
{
|
||||
oldPwd = await _userRepository.Where(x => x.Id == userId).Select(x => x.Password).FirstOrDefaultAsync();
|
||||
oldPwd = await _userRepository.Where(x => x.IdentityUserId == identityUserId).Select(x => x.Password).FirstOrDefaultAsync();
|
||||
}
|
||||
|
||||
if (oldPwd.IsNotNullOrEmpty())
|
||||
|
@ -109,11 +114,11 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
CreateTime = DateTime.Now,
|
||||
PassWord = oldPwd!,
|
||||
UserId = userId,
|
||||
IdentityUserId = identityUserId,
|
||||
});
|
||||
}
|
||||
|
||||
await _userRepository.BatchUpdateNoTrackingAsync(x => x.Id == userId, x => new User()
|
||||
await _userRepository.BatchUpdateNoTrackingAsync(x => x.IdentityUserId == identityUserId, x => new User()
|
||||
{
|
||||
LastChangePassWordTime = DateTime.Now,
|
||||
});
|
||||
|
@ -184,10 +189,10 @@ namespace IRaCIS.Core.Application.Service
|
|||
{
|
||||
|
||||
|
||||
await VerifyUserEmailAsync(_userInfo.Id, _userInfo.UserTypeId, newEmail);
|
||||
await VerifyUserEmailAsync(_userInfo.IdentityUserId, newEmail);
|
||||
|
||||
|
||||
await _userRepository.UpdatePartialFromQueryAsync(_userInfo.Id, u => new User()
|
||||
await _userRepository.UpdatePartialFromQueryAsync(_userInfo.IdentityUserId, u => new User()
|
||||
{
|
||||
EMail = newEmail
|
||||
});
|
||||
|
@ -208,9 +213,9 @@ namespace IRaCIS.Core.Application.Service
|
|||
public async Task<IResponseOutput> SetNewPhone(string newPhone)
|
||||
{
|
||||
|
||||
await VerifyUserPhoneAsync(_userInfo.Id, _userInfo.UserTypeId, newPhone);
|
||||
await VerifyUserPhoneAsync(_userInfo.IdentityUserId, newPhone);
|
||||
|
||||
await _userRepository.UpdatePartialFromQueryAsync(_userInfo.Id, u => new User()
|
||||
await _userRepository.UpdatePartialFromQueryAsync(_userInfo.IdentityUserId, u => new User()
|
||||
{
|
||||
Phone = newPhone
|
||||
});
|
||||
|
@ -224,10 +229,10 @@ namespace IRaCIS.Core.Application.Service
|
|||
[HttpPut("{newUserName}")]
|
||||
public async Task<IResponseOutput> SetNewUserName(string newUserName)
|
||||
{
|
||||
await VerifyUserNameAsync(_userInfo.Id, newUserName);
|
||||
await VerifyUserNameAsync(_userInfo.IdentityUserId, newUserName);
|
||||
|
||||
|
||||
await _userRepository.UpdatePartialFromQueryAsync(_userInfo.Id, u => new User()
|
||||
await _userRepository.UpdatePartialFromQueryAsync(_userInfo.IdentityUserId, u => new User()
|
||||
{
|
||||
UserName = newUserName
|
||||
});
|
||||
|
@ -240,15 +245,15 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
|
||||
[HttpGet]
|
||||
public async Task<IResponseOutput> InitSetUserNameAndPwd(Guid userId, string newUserName, string newPWd)
|
||||
public async Task<IResponseOutput> InitSetUserNameAndPwd(string newUserName, string newPWd)
|
||||
{
|
||||
|
||||
|
||||
await VerifyUserPwdAsync(userId, newPWd);
|
||||
await VerifyUserPwdAsync(_userInfo.IdentityUserId, newPWd);
|
||||
|
||||
await VerifyUserNameAsync(userId, newUserName);
|
||||
await VerifyUserNameAsync(_userInfo.IdentityUserId, newUserName);
|
||||
|
||||
await _userRepository.UpdatePartialFromQueryAsync(userId, u => new User()
|
||||
await _userRepository.UpdatePartialFromQueryAsync(_userInfo.IdentityUserId, u => new User()
|
||||
{
|
||||
UserName = newUserName,
|
||||
|
||||
|
@ -269,29 +274,29 @@ namespace IRaCIS.Core.Application.Service
|
|||
/// <summary>
|
||||
/// 重置密码为 默认密码
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="identityUserId"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("{userId:guid}")]
|
||||
[HttpGet("{identityUserId:guid}")]
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> ResetPassword(Guid userId)
|
||||
public async Task<IResponseOutput> ResetPassword(Guid identityUserId)
|
||||
{
|
||||
|
||||
var pwd = IRCEmailPasswordHelper.GenerateRandomPassword(10);
|
||||
|
||||
|
||||
await _mailVerificationService.AdminResetPwdSendEmailAsync(userId, pwd);
|
||||
await _mailVerificationService.AdminResetPwdSendEmailAsync(identityUserId, pwd);
|
||||
|
||||
await _userRepository.UpdatePartialFromQueryAsync(userId, u => new User()
|
||||
await _userRepository.UpdatePartialFromQueryAsync(t => t.IdentityUserId == identityUserId, u => new User()
|
||||
{
|
||||
Password = MD5Helper.Md5(pwd),
|
||||
IsFirstAdd = true
|
||||
});
|
||||
|
||||
var userName = _userRepository.Where(t => t.Id == userId).Select(t => t.UserName).FirstOrDefault();
|
||||
var userName = _userRepository.Where(t => t.IdentityUserId == identityUserId).Select(t => t.UserName).FirstOrDefault();
|
||||
|
||||
await _fusionCache.RemoveAsync(CacheKeys.UserLoginError(userName));
|
||||
|
||||
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();
|
||||
}
|
||||
|
@ -386,24 +391,24 @@ namespace IRaCIS.Core.Application.Service
|
|||
/// <summary>
|
||||
/// (未登陆) 设置新密码
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="identityUserId"></param>
|
||||
/// <param name="newPwd"></param>
|
||||
/// <returns></returns>
|
||||
[AllowAnonymous]
|
||||
[HttpGet("{userId:guid}/{newPwd}")]
|
||||
public async Task<IResponseOutput> AnonymousSetPassword(Guid userId, string newPwd)
|
||||
public async Task<IResponseOutput> AnonymousSetPassword(Guid identityUserId, string newPwd)
|
||||
{
|
||||
|
||||
|
||||
await VerifyUserPwdAsync(userId, newPwd);
|
||||
await VerifyUserPwdAsync(identityUserId, newPwd);
|
||||
|
||||
var success = await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == userId, u => new User()
|
||||
var success = await _userRepository.BatchUpdateNoTrackingAsync(t => t.IdentityUserId == identityUserId, u => new User()
|
||||
{
|
||||
Password = newPwd,
|
||||
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);
|
||||
|
||||
|
@ -418,7 +423,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
public async Task<IResponseOutput> ModifyPassword(EditPasswordCommand editPwModel)
|
||||
{
|
||||
|
||||
await VerifyUserPwdAsync(_userInfo.Id, editPwModel.NewPassWord, editPwModel.OldPassWord);
|
||||
await VerifyUserPwdAsync(_userInfo.IdentityUserId, editPwModel.NewPassWord, editPwModel.OldPassWord);
|
||||
|
||||
|
||||
if (!string.IsNullOrEmpty(editPwModel.NewUserName))
|
||||
|
@ -426,14 +431,14 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
await VerifyUserNameAsync(_userInfo.Id, editPwModel.NewUserName);
|
||||
|
||||
await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == _userInfo.Id, u => new User()
|
||||
await _userRepository.BatchUpdateNoTrackingAsync(t => t.IdentityUserId == _userInfo.IdentityUserId, u => new User()
|
||||
{
|
||||
UserName = editPwModel.NewUserName,
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
var success = await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == _userInfo.Id, u => new User()
|
||||
var success = await _userRepository.BatchUpdateNoTrackingAsync(t => t.IdentityUserId == _userInfo.IdentityUserId, u => new User()
|
||||
{
|
||||
Password = editPwModel.NewPassWord,
|
||||
IsFirstAdd = false
|
||||
|
@ -471,23 +476,69 @@ namespace IRaCIS.Core.Application.Service
|
|||
.WhereIf(inQuery.UserState != null, t => t.Status == inQuery.UserState)
|
||||
.WhereIf(inQuery.IsTestUser != null, t => t.IsTestUser == inQuery.IsTestUser)
|
||||
.WhereIf(inQuery.IsZhiZhun != null, t => t.IsZhiZhun == inQuery.IsZhiZhun)
|
||||
.ProjectTo<UserListDTO>(_mapper.ConfigurationProvider);
|
||||
.GroupBy(t => t.IdentityUserId).Select(g => new UserListDTO()
|
||||
{
|
||||
IdentityUserId = g.Key,
|
||||
UserRoleList = g.Select(c => new UserAddUserType()
|
||||
{
|
||||
UserTypeEnum = c.UserTypeEnum,
|
||||
UserTypeId = c.UserTypeId,
|
||||
}).ToList(),
|
||||
|
||||
UserCode = g.FirstOrDefault().UserCode,
|
||||
DepartmentName = g.FirstOrDefault().DepartmentName,
|
||||
CreateTime = g.FirstOrDefault().CreateTime,
|
||||
EMail = g.FirstOrDefault().EMail,
|
||||
FirstName = g.FirstOrDefault().FirstName,
|
||||
IsTestUser = g.FirstOrDefault().IsTestUser,
|
||||
IsZhiZhun = g.FirstOrDefault().IsZhiZhun,
|
||||
LastName = g.FirstOrDefault().LastName,
|
||||
OrganizationName = g.FirstOrDefault().OrganizationName,
|
||||
FullName = g.FirstOrDefault().FullName,
|
||||
Phone = g.FirstOrDefault().Phone,
|
||||
PositionName = g.FirstOrDefault().PositionName,
|
||||
Sex = g.FirstOrDefault().Sex,
|
||||
Status = g.FirstOrDefault().Status,
|
||||
UserName = g.FirstOrDefault().UserName,
|
||||
});
|
||||
|
||||
return await userQueryable.ToPagedListAsync(inQuery);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据用户Id获取用户详细信息[New]
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>xiuga
|
||||
[HttpGet("{id:guid}")]
|
||||
public async Task<UserDetailDTO> GetUser(Guid id)
|
||||
{
|
||||
var userQuery = _userRepository.Where(t => t.Id == id).ProjectTo<UserDetailDTO>(_mapper.ConfigurationProvider);
|
||||
return await (userQuery.FirstOrDefaultAsync()).IfNullThrowException();
|
||||
}
|
||||
///// <summary>
|
||||
///// 根据用户Id获取用户详细信息[New]
|
||||
///// </summary>
|
||||
///// <param name="id"></param>
|
||||
///// <returns></returns>xiuga
|
||||
//[HttpGet("{id:guid}")]
|
||||
//public async Task<UserDetailDTO> GetUser(Guid id)
|
||||
//{
|
||||
// var userQuery = _userRepository.Where(t => t.Id == id).ProjectTo<UserDetailDTO>(_mapper.ConfigurationProvider);
|
||||
// return await (userQuery.FirstOrDefaultAsync()).IfNullThrowException();
|
||||
//}
|
||||
|
||||
///// <summary>
|
||||
///// 删除用户
|
||||
///// </summary>
|
||||
///// <param name="userId"></param>
|
||||
///// <returns></returns>
|
||||
//[HttpDelete("{userId:guid}")]
|
||||
//public async Task<IResponseOutput> DeleteUser(Guid userId)
|
||||
//{
|
||||
// if (await _userTrialRepository.AnyAsync(t => t.Id == userId))
|
||||
// {
|
||||
// //---该用户已经参加项目,不能够删除。
|
||||
// return ResponseOutput.NotOk(_localizer["User_InProject"]);
|
||||
// }
|
||||
|
||||
// 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);
|
||||
|
||||
// return ResponseOutput.Result(success);
|
||||
//}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 添加用户
|
||||
|
@ -501,13 +552,16 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
await VerifyUserNameAsync(null, userAddModel.UserName);
|
||||
|
||||
await VerifyUserEmailAsync(null, userAddModel.UserTypeId, userAddModel.EMail);
|
||||
await VerifyUserEmailAsync(null, userAddModel.EMail);
|
||||
|
||||
//await VerifyUserPhoneAsync(null, userAddModel.UserTypeId, userAddModel.Phone);
|
||||
|
||||
|
||||
var saveItem = _mapper.Map<User>(userAddModel);
|
||||
|
||||
//设置用户标识
|
||||
saveItem.IdentityUserId = NewId.NextSequentialGuid();
|
||||
|
||||
var @lock = _distributedLockProvider.CreateLock($"UserAccount");
|
||||
|
||||
using (await @lock.AcquireAsync())
|
||||
|
@ -526,16 +580,29 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
saveItem.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10));
|
||||
|
||||
await _userRepository.AddAsync(saveItem);
|
||||
|
||||
var success = await _userRepository.SaveChangesAsync();
|
||||
}
|
||||
|
||||
//处理多个角色
|
||||
|
||||
await _mailVerificationService.AddUserSendEmailAsync(saveItem.Id, userAddModel.BaseUrl, userAddModel.RouteUrl);
|
||||
foreach (var item in userAddModel.UserRoleList)
|
||||
{
|
||||
var cloneUser = saveItem.Clone();
|
||||
|
||||
cloneUser.UserTypeId = item.UserTypeId;
|
||||
cloneUser.UserTypeEnum = item.UserTypeEnum;
|
||||
cloneUser.IsUserRoleDisabled = item.IsUserRoleDisabled;
|
||||
|
||||
await _userRepository.AddAsync(cloneUser);
|
||||
|
||||
}
|
||||
|
||||
var success = await _userRepository.SaveChangesAsync();
|
||||
|
||||
await _mailVerificationService.AddUserSendEmailAsync(saveItem.IdentityUserId, userAddModel.BaseUrl, userAddModel.RouteUrl);
|
||||
|
||||
|
||||
return ResponseOutput.Ok(new UserAddedReturnDTO { Id = saveItem.Id, UserCode = saveItem.UserCode });
|
||||
return ResponseOutput.Ok(new UserAddedReturnDTO { Id = saveItem.IdentityUserId, UserCode = saveItem.UserCode });
|
||||
|
||||
}
|
||||
|
||||
|
@ -548,33 +615,60 @@ namespace IRaCIS.Core.Application.Service
|
|||
{
|
||||
|
||||
|
||||
await VerifyUserNameAsync(model.Id, model.UserName);
|
||||
await VerifyUserNameAsync(model.IdentityUserId, model.UserName);
|
||||
|
||||
await VerifyUserEmailAsync(model.Id, model.UserTypeId, model.EMail);
|
||||
await VerifyUserEmailAsync(model.IdentityUserId, model.EMail);
|
||||
|
||||
//await VerifyUserPhoneAsync(model.Id, model.UserTypeId, model.Phone);
|
||||
|
||||
var user = await _userRepository.FirstOrDefaultAsync(t => t.Id == model.Id);
|
||||
var userRoleList = await _userRepository.Where(t => t.IdentityUserId == model.IdentityUserId, true).ToListAsync();
|
||||
|
||||
if (user == null) return Null404NotFound(user);
|
||||
|
||||
if (user.Status!=model.Status)
|
||||
if (userRoleList.Any(t => t.Status != model.Status))
|
||||
{
|
||||
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId = model.Id, OptType = model.Status == UserStateEnum.Enable ? UserOptType.AccountEnable : UserOptType.AccountLocked }, true);
|
||||
//await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId = model.Id, OptType = model.Status == UserStateEnum.Enable ? UserOptType.AccountEnable : UserOptType.AccountLocked }, true);
|
||||
|
||||
}
|
||||
|
||||
|
||||
_mapper.Map(model, user);
|
||||
|
||||
if (user.IsZhiZhun)
|
||||
if (model.IsZhiZhun)
|
||||
{
|
||||
user.OrganizationName = _userInfo.IsEn_Us ? _systemEmailConfig.OrganizationName : _systemEmailConfig.OrganizationNameCN;
|
||||
model.OrganizationName = _userInfo.IsEn_Us ? _systemEmailConfig.OrganizationName : _systemEmailConfig.OrganizationNameCN;
|
||||
}
|
||||
|
||||
//await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId = model.Id, OptType = UserOptType.UpdateUser });
|
||||
|
||||
foreach (var role in userRoleList)
|
||||
{
|
||||
role.UserName = model.UserName;
|
||||
role.FirstName = model.FirstName;
|
||||
role.LastName = model.LastName;
|
||||
role.Phone = model.Phone;
|
||||
role.EMail = model.EMail;
|
||||
role.DepartmentName = model.DepartmentName;
|
||||
role.OrganizationName = model.OrganizationName;
|
||||
role.Sex = model.Sex;
|
||||
role.Status = model.Status;
|
||||
role.UserCode = model.UserCode;
|
||||
role.PositionName = model.PositionName;
|
||||
role.IsTestUser = model.IsTestUser;
|
||||
role.IsZhiZhun = model.IsZhiZhun;
|
||||
|
||||
role.IsUserRoleDisabled = model.UserRoleList.FirstOrDefault(t => t.UserTypeId == role.UserTypeId)?.IsUserRoleDisabled ?? false;
|
||||
}
|
||||
|
||||
var needAddRoleList = model.UserRoleList.Where(t => !userRoleList.Any(c => c.UserTypeId == t.UserTypeId)).ToList();
|
||||
|
||||
foreach (var addRole in needAddRoleList)
|
||||
{
|
||||
var cloneUser = userRoleList.FirstOrDefault().Clone();
|
||||
|
||||
cloneUser.UserTypeId = addRole.UserTypeId;
|
||||
cloneUser.UserTypeEnum = addRole.UserTypeEnum;
|
||||
cloneUser.IsUserRoleDisabled = addRole.IsUserRoleDisabled;
|
||||
|
||||
await _userRepository.AddAsync(cloneUser);
|
||||
}
|
||||
|
||||
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId = model.Id, OptType = UserOptType.UpdateUser });
|
||||
|
||||
|
||||
|
||||
var success = await _userRepository.SaveChangesAsync();
|
||||
|
||||
|
@ -582,26 +676,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除用户
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
[HttpDelete("{userId:guid}")]
|
||||
public async Task<IResponseOutput> DeleteUser(Guid userId)
|
||||
{
|
||||
if (await _userTrialRepository.AnyAsync(t => t.Id == userId))
|
||||
{
|
||||
//---该用户已经参加项目,不能够删除。
|
||||
return ResponseOutput.NotOk(_localizer["User_InProject"]);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
return ResponseOutput.Result(success);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 禁用或者启用账户
|
||||
|
@ -616,7 +691,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
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.IdentityUserId == userId, t => new User
|
||||
{
|
||||
Status = state
|
||||
});
|
||||
|
@ -638,7 +713,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
/// <param name="mfaType"></param>
|
||||
/// <returns></returns>
|
||||
[AllowAnonymous]
|
||||
public async Task<IResponseOutput> SendMFAEmail(Guid userId, int mfaType)
|
||||
public async Task<IResponseOutput> SendMFAEmail(Guid userId, UserMFAType mfaType)
|
||||
{
|
||||
var userInfo = await _userRepository.Where(u => u.Id == userId).Select(t => new { t.FullName, t.EMail }).FirstOrDefaultAsync();
|
||||
|
||||
|
@ -835,11 +910,255 @@ namespace IRaCIS.Core.Application.Service
|
|||
[HttpGet]
|
||||
public async Task<IResponseOutput> LoginOut(Guid userId)
|
||||
{
|
||||
await _fusionCache.RemoveAsync(CacheKeys.UserToken(_userInfo.Id));
|
||||
await _fusionCache.RemoveAsync(CacheKeys.UserToken(_userInfo.IdentityUserId));
|
||||
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = userId, OptUserId = _userInfo.Id, OptType = UserOptType.LoginOut }, true);
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
|
||||
#region 多账号修改
|
||||
|
||||
/// <summary>
|
||||
/// 账号验证,获取账号角色信息 获取临时token
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="BusinessValidationFailedException"></exception>
|
||||
[AllowAnonymous]
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput<IRCLoginReturnDTO>> GetUserLoginRoleList(IRCLoginDto loginDto,
|
||||
[FromServices] ITokenService _tokenService,
|
||||
[FromServices] IOptionsMonitor<SystemEmailSendConfig> _emailConfig,
|
||||
[FromServices] IReadingImageTaskService readingImageTaskService)
|
||||
{
|
||||
|
||||
var userName = loginDto.UserName;
|
||||
var password = loginDto.Password;
|
||||
|
||||
var emailConfig = _emailConfig.CurrentValue;
|
||||
var companyInfo = new SystemEmailSendConfigView() { CompanyName = emailConfig.CompanyName, CompanyNameCN = emailConfig.CompanyNameCN, CompanyShortName = emailConfig.CompanyShortName, CompanyShortNameCN = emailConfig.CompanyShortNameCN };
|
||||
|
||||
|
||||
int maxFailures = _verifyConfig.CurrentValue.LoginMaxFailCount;
|
||||
int lockoutMinutes = _verifyConfig.CurrentValue.LoginFailLockMinutes;
|
||||
|
||||
// 生成缓存键
|
||||
string cacheKey = CacheKeys.UserLoginError(userName);
|
||||
|
||||
// 从缓存中获取登录失败次数
|
||||
int? failCount = await _fusionCache.GetOrDefaultAsync<int?>(cacheKey);
|
||||
|
||||
if (failCount == null)
|
||||
{
|
||||
failCount = 0;
|
||||
}
|
||||
|
||||
//每次登录 都重置缓存时间
|
||||
await _fusionCache.SetAsync<int?>(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes));
|
||||
|
||||
|
||||
if (failCount >= maxFailures)
|
||||
{
|
||||
//await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = Guid.Empty, OptUserId = Guid.Empty, LoginFaildName = userName, LoginPassword = password, OptType = UserOptType.AccountLocked }, true);
|
||||
|
||||
//$"密码连续错误{maxFailures}次,当前账号已被限制登录,请等待 {lockoutMinutes} 分钟后再试。"
|
||||
throw new BusinessValidationFailedException(_localizer["User_ErrorLimit", maxFailures, lockoutMinutes]);
|
||||
}
|
||||
|
||||
var userLoginReturnModel = new IRCLoginReturnDTO();
|
||||
|
||||
|
||||
var loginUser = await _userRepository.Where(u => u.UserName.Equals(userName) && u.Password == password).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
|
||||
|
||||
if (loginUser == null)
|
||||
{
|
||||
|
||||
//错误次数累加
|
||||
failCount++;
|
||||
await _fusionCache.SetAsync(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes));
|
||||
|
||||
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);
|
||||
|
||||
return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new IRCLoginReturnDTO());
|
||||
|
||||
}
|
||||
|
||||
if (loginUser.Status == 0)
|
||||
{
|
||||
//await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = loginUser.Id, OptUserId = loginUser.Id, LoginFaildName = userName, OptType = UserOptType.LoginLockedAccount }, true);
|
||||
|
||||
//---该用户已经被禁用。
|
||||
return ResponseOutput.NotOk(_localizer["User_Disabled"], new IRCLoginReturnDTO());
|
||||
}
|
||||
|
||||
//登录成功 清除缓存
|
||||
await _fusionCache.SetAsync(cacheKey, 0, TimeSpan.FromMinutes(lockoutMinutes));
|
||||
var ipinfo = _searcher.Search(_userInfo.IP);
|
||||
|
||||
var iPRegion = string.Join('|', ipinfo.Split('|').TakeLast(3));
|
||||
|
||||
if (loginUser.LastLoginIP != string.Empty)
|
||||
{
|
||||
// 与上一次IP不一致
|
||||
if (loginUser.LastLoginIP != iPRegion)
|
||||
{
|
||||
loginUser.LoginState = 2;
|
||||
}
|
||||
}
|
||||
|
||||
//超过90天没修改密码
|
||||
if (_verifyConfig.CurrentValue.IsNeedChangePassWord && loginUser.LastChangePassWordTime != null && DateTime.Now.AddDays(-_verifyConfig.CurrentValue.ChangePassWordDays) > loginUser.LastChangePassWordTime.Value)
|
||||
{
|
||||
loginUser.LoginState = 1;
|
||||
}
|
||||
|
||||
//await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = loginUser.Id, OptUserId = loginUser.Id, OptType = UserOptType.Login }, true);
|
||||
|
||||
userLoginReturnModel.BasicInfo = loginUser;
|
||||
|
||||
if (loginUser.LastChangePassWordTime == null)
|
||||
{
|
||||
await _userRepository.BatchUpdateNoTrackingAsync(x => x.IdentityUserId == loginUser.IdentityUserId, x => new User()
|
||||
{
|
||||
LastChangePassWordTime = DateTime.Now
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
await _userRepository.BatchUpdateNoTrackingAsync(x => x.IdentityUserId == loginUser.IdentityUserId, x => new User()
|
||||
{
|
||||
LastLoginIP = iPRegion,
|
||||
LastLoginTime = DateTime.Now
|
||||
|
||||
});
|
||||
|
||||
//返回临时token
|
||||
userLoginReturnModel.JWTStr = _tokenService.GetToken(new UserTokenInfo() { UserName = userName });
|
||||
|
||||
var userId = loginUser.Id;
|
||||
|
||||
var identityUserId = loginUser.IdentityUserId;
|
||||
|
||||
|
||||
if (_verifyConfig.CurrentValue.OpenLoginMFA)
|
||||
{
|
||||
|
||||
//MFA 发送邮件
|
||||
|
||||
userLoginReturnModel.IsMFA = true;
|
||||
|
||||
var email = userLoginReturnModel.BasicInfo.EMail;
|
||||
|
||||
var hiddenEmail = IRCEmailPasswordHelper.MaskEmail(email);
|
||||
|
||||
userLoginReturnModel.BasicInfo.EMail = hiddenEmail;
|
||||
|
||||
//修改密码
|
||||
if (userLoginReturnModel.BasicInfo.IsFirstAdd || userLoginReturnModel.BasicInfo.LoginState == 1)
|
||||
{
|
||||
//userLoginReturnModel.JWTStr = _tokenService.GetToken(userLoginReturnModel.BasicInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
//正常登录才发送邮件
|
||||
await SendMFAEmail(userId, UserMFAType.Login);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// 验证阅片休息时间
|
||||
await readingImageTaskService.ResetReadingRestTime(userLoginReturnModel.BasicInfo.Id);
|
||||
|
||||
await _fusionCache.SetAsync(CacheKeys.UserToken(identityUserId), userLoginReturnModel.JWTStr, TimeSpan.FromDays(7));
|
||||
|
||||
await _fusionCache.SetAsync(CacheKeys.UserAutoLoginOut(identityUserId), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes));
|
||||
}
|
||||
|
||||
userLoginReturnModel.BasicInfo.AccountList = await _userRepository.Where(t => t.IdentityUserId == identityUserId).ProjectTo<UserAccountInfo>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
userLoginReturnModel.CompanyInfo = companyInfo;
|
||||
|
||||
return ResponseOutput.Ok(userLoginReturnModel);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 验证密码成功后,选定角色,然后获取当前角色的Token
|
||||
/// </summary>
|
||||
/// <param name="identityUserId"></param>
|
||||
/// <param name="userTypeId"></param>
|
||||
/// <param name="_tokenService"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="BusinessValidationFailedException"></exception>
|
||||
public async Task<string> LoginSelectUserRole(Guid identityUserId, Guid userTypeId, [FromServices] ITokenService _tokenService)
|
||||
{
|
||||
var userTokenInfo = await _userRepository.Where(t => t.IdentityUserId == identityUserId && t.UserTypeId == userTypeId).Select(t => new UserTokenInfo()
|
||||
{
|
||||
UserRoleId = t.Id,
|
||||
IdentityUserId = t.IdentityUserId,
|
||||
UserTypeEnum = t.UserTypeEnum,
|
||||
UserTypeId = userTypeId,
|
||||
IsTestUser = t.IsTestUser,
|
||||
IsZhiZhun = t.IsZhiZhun,
|
||||
FullName = t.FullName,
|
||||
PermissionStr = t.UserTypeRole.PermissionStr,
|
||||
UserName = t.UserName,
|
||||
UserTypeShortName = t.UserTypeRole.UserTypeShortName,
|
||||
|
||||
}).FirstOrDefaultAsync();
|
||||
|
||||
if (userTokenInfo != null)
|
||||
{
|
||||
var jwt = _tokenService.GetToken(userTokenInfo);
|
||||
|
||||
var selectUserInfo = _userRepository.Where(t => t.IdentityUserId == identityUserId && t.UserTypeId == userTypeId).FirstOrDefault();
|
||||
|
||||
//多账号没维护
|
||||
if (await _userRepository.Where(t => t.IdentityUserId == identityUserId).AnyAsync(t => t.IsMutiAccountInfoConfirm == false))
|
||||
{
|
||||
//将信息维护为一致
|
||||
await _userRepository.BatchUpdateNoTrackingAsync(t => t.IdentityUserId == identityUserId, u => new User()
|
||||
{
|
||||
Code = selectUserInfo.Code,
|
||||
UserName = selectUserInfo.UserName,
|
||||
FirstName = selectUserInfo.FirstName,
|
||||
LastName = selectUserInfo.LastName,
|
||||
Phone = selectUserInfo.Phone,
|
||||
EMail = selectUserInfo.EMail,
|
||||
DepartmentName = selectUserInfo.DepartmentName,
|
||||
OrganizationName = selectUserInfo.OrganizationName,
|
||||
IsFirstAdd = selectUserInfo.IsFirstAdd,
|
||||
Sex = selectUserInfo.Sex,
|
||||
Status = selectUserInfo.Status,
|
||||
UserCode = selectUserInfo.UserCode,
|
||||
Password = selectUserInfo.Password,
|
||||
PasswordChanged = selectUserInfo.PasswordChanged,
|
||||
LastChangePassWordTime = selectUserInfo.LastChangePassWordTime,
|
||||
PositionName = selectUserInfo.PositionName,
|
||||
IsTestUser = selectUserInfo.IsTestUser,
|
||||
IsZhiZhun = selectUserInfo.IsZhiZhun,
|
||||
AutoCutNextTask = selectUserInfo.AutoCutNextTask,
|
||||
//DoctorId=selectUserInfo.DoctorId,
|
||||
LastLoginIP = selectUserInfo.LastLoginIP,
|
||||
LastLoginTime = selectUserInfo.LastLoginTime,
|
||||
});
|
||||
}
|
||||
|
||||
return jwt;
|
||||
//return new LoginSelectRoleReturn() { AccountList = accountList, JwtStr = jwt };
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new BusinessValidationFailedException("传递参数查询数据库不存在!");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
@ -74,18 +74,18 @@ namespace IRaCIS.Core.Application.Service
|
|||
CreateMap<UserType, TrialUserType>()
|
||||
.ForMember(d => d.UserType, u => u.MapFrom(t => t.UserTypeName));
|
||||
|
||||
CreateMap<User, UserDetailDTO>()
|
||||
.ForMember(d => d.RealName, u => u.MapFrom(s => s.FullName))
|
||||
.ForMember(d => d.UserTypeId, u => u.MapFrom(s => s.UserTypeRole.Id))
|
||||
.ForMember(d => d.UserType, u => u.MapFrom(s => s.UserTypeRole.UserTypeName))
|
||||
.ForMember(d => d.UserTypeShortName, u => u.MapFrom(s => s.UserTypeRole.UserTypeShortName))
|
||||
.ForMember(d => d.CanEditUserType, u => u.MapFrom(s => !s.UserTrials.Any()));
|
||||
// CreateMap<User, UserDetailDTO>()
|
||||
//.ForMember(d => d.RealName, u => u.MapFrom(s => s.FullName))
|
||||
//.ForMember(d => d.UserTypeId, u => u.MapFrom(s => s.UserTypeRole.Id))
|
||||
//.ForMember(d => d.UserType, u => u.MapFrom(s => s.UserTypeRole.UserTypeName))
|
||||
//.ForMember(d => d.UserTypeShortName, u => u.MapFrom(s => s.UserTypeRole.UserTypeShortName))
|
||||
//.ForMember(d => d.CanEditUserType, u => u.MapFrom(s => !s.UserTrials.Any()));
|
||||
|
||||
CreateMap<User, UserListDTO>()
|
||||
.ForMember(d => d.RealName, u => u.MapFrom(s => s.FullName))
|
||||
.ForMember(d => d.UserTypeId, u => u.MapFrom(s => s.UserTypeRole.Id))
|
||||
.ForMember(d => d.UserType, u => u.MapFrom(s => s.UserTypeRole.UserTypeShortName))
|
||||
.ForMember(d => d.CanEditUserType, u => u.MapFrom(s => !s.UserTrials.Any()));
|
||||
// CreateMap<User, UserListDTO>()
|
||||
// .ForMember(d => d.RealName, u => u.MapFrom(s => s.FullName))
|
||||
// .ForMember(d => d.UserTypeId, u => u.MapFrom(s => s.UserTypeRole.Id))
|
||||
// .ForMember(d => d.UserType, u => u.MapFrom(s => s.UserTypeRole.UserTypeShortName))
|
||||
// .ForMember(d => d.CanEditUserType, u => u.MapFrom(s => !s.UserTrials.Any()));
|
||||
|
||||
var token = string.Empty;
|
||||
var userId = Guid.Empty;
|
||||
|
@ -141,6 +141,8 @@ namespace IRaCIS.Core.Application.Service
|
|||
CreateMap<UserBasicInfo, UserTokenInfo>()
|
||||
.ForMember(d => d.UserRoleId, c => c.MapFrom(t => t.Id));
|
||||
|
||||
CreateMap<User, UserAccountInfo>();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -94,7 +94,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
//}
|
||||
|
||||
|
||||
var trialIdExistList = _trialRepository.Select(t => t.Id).ToList().Select(t=>t.ToString());
|
||||
var trialIdExistList = _trialRepository.Select(t => t.Id).ToList().Select(t => t.ToString());
|
||||
|
||||
#region 列出根目录
|
||||
|
||||
|
@ -152,6 +152,31 @@ namespace IRaCIS.Core.Application.Service
|
|||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 用户多账号,初次维护数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<IResponseOutput> UserMutiAccount()
|
||||
{
|
||||
|
||||
var userList = _userRepository.Where().Select(t => new { t.Id, t.EMail,t.DoctorId }).ToList();
|
||||
|
||||
foreach (var item in userList.GroupBy(t => t.EMail.Trim()))
|
||||
{
|
||||
var emailUserIdList = item.Select(t => t.Id).ToList();
|
||||
|
||||
var doctorId = item.Select(t => t.DoctorId).First();
|
||||
|
||||
await _userRepository.BatchUpdateNoTrackingAsync(t => emailUserIdList.Contains(t.Id), u => new User() { IdentityUserId = NewId.NextSequentialGuid(),DoctorId=doctorId });
|
||||
}
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
[LowerCamelCaseJson]
|
||||
public class TestModel
|
||||
{
|
||||
|
|
|
@ -81,7 +81,6 @@ public class User : BaseFullAuditEntity
|
|||
|
||||
public DateTime? LastLoginTime { get; set; }
|
||||
|
||||
public bool SuperAdmin { get; set; }
|
||||
|
||||
public UserTypeEnum UserTypeEnum { get; set; }
|
||||
|
||||
|
@ -89,7 +88,15 @@ public class User : BaseFullAuditEntity
|
|||
|
||||
#region 新增字段
|
||||
|
||||
//public Guid IdentityUserId { get; set; }
|
||||
public bool SuperAdmin { get; set; }
|
||||
|
||||
|
||||
public bool IsUserRoleDisabled { get; set; }
|
||||
|
||||
public Guid IdentityUserId { get; set; }
|
||||
|
||||
[Comment("多账号信息是否已经确认")]
|
||||
public bool IsMutiAccountInfoConfirm { get; set; }
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
|
|
@ -13,15 +13,31 @@ public class UserLog : BaseAddAuditEntity
|
|||
[JsonIgnore]
|
||||
public User OptUser { get; set; }
|
||||
#endregion
|
||||
|
||||
public string IP { get; set; } = string.Empty;
|
||||
public string LoginFaildName { get; set; } = string.Empty;
|
||||
public UserOptType OptType { get; set; }
|
||||
public string LoginPassword { get; set; } = string.Empty;
|
||||
public Guid? LoginUserId { get; set; }
|
||||
|
||||
public string IPRegion { get; set; } = string.Empty;
|
||||
|
||||
|
||||
#region 账号修改 维护
|
||||
|
||||
//public Guid? LoginIdentityUserId { get; set; }
|
||||
|
||||
//public string LoginUserName { get; set; }
|
||||
|
||||
//public UserTypeEnum loginUserType { get; set; }
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
public Guid? LoginUserId { get; set; }
|
||||
[Comment("被操作的人,自己操作的就是自己")]
|
||||
public Guid? OptUserId { get; set; }
|
||||
public string IPRegion { get; set; } = string.Empty;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -13,4 +13,6 @@ public class UserPassWordLog : BaseAddAuditEntity
|
|||
|
||||
[Comment("密码")]
|
||||
public string PassWord { get; set; } = string.Empty;
|
||||
|
||||
public Guid IdentityUserId { get; set; }
|
||||
}
|
||||
|
|
18229
IRaCIS.Core.Infra.EFCore/Migrations/20241223050707_UserModify.Designer.cs
generated
Normal file
18229
IRaCIS.Core.Infra.EFCore/Migrations/20241223050707_UserModify.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,112 @@
|
|||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace IRaCIS.Core.Infra.EFCore.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class UserModify : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_SCPInstance_SCPStudy_StudyId",
|
||||
table: "SCPInstance");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_TaskInstance_TaskStudy_StudyId",
|
||||
table: "TaskInstance");
|
||||
|
||||
migrationBuilder.AddColumn<Guid>(
|
||||
name: "IdentityUserId",
|
||||
table: "UserPassWordLog",
|
||||
type: "uniqueidentifier",
|
||||
nullable: false,
|
||||
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"));
|
||||
|
||||
migrationBuilder.AddColumn<Guid>(
|
||||
name: "IdentityUserId",
|
||||
table: "User",
|
||||
type: "uniqueidentifier",
|
||||
nullable: false,
|
||||
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"));
|
||||
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "IsMutiAccountInfoConfirm",
|
||||
table: "User",
|
||||
type: "bit",
|
||||
nullable: false,
|
||||
defaultValue: false,
|
||||
comment: "多账号信息是否已经确认");
|
||||
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "IsUserRoleDisabled",
|
||||
table: "User",
|
||||
type: "bit",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_SCPInstance_SCPStudy_StudyId",
|
||||
table: "SCPInstance",
|
||||
column: "StudyId",
|
||||
principalTable: "SCPStudy",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_TaskInstance_TaskStudy_StudyId",
|
||||
table: "TaskInstance",
|
||||
column: "StudyId",
|
||||
principalTable: "TaskStudy",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_SCPInstance_SCPStudy_StudyId",
|
||||
table: "SCPInstance");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_TaskInstance_TaskStudy_StudyId",
|
||||
table: "TaskInstance");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "IdentityUserId",
|
||||
table: "UserPassWordLog");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "IdentityUserId",
|
||||
table: "User");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "IsMutiAccountInfoConfirm",
|
||||
table: "User");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "IsUserRoleDisabled",
|
||||
table: "User");
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_SCPInstance_SCPStudy_StudyId",
|
||||
table: "SCPInstance",
|
||||
column: "StudyId",
|
||||
principalTable: "SCPStudy",
|
||||
principalColumn: "SeqId",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_TaskInstance_TaskStudy_StudyId",
|
||||
table: "TaskInstance",
|
||||
column: "StudyId",
|
||||
principalTable: "TaskStudy",
|
||||
principalColumn: "SeqId",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -12694,13 +12694,23 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
|
|||
.HasMaxLength(400)
|
||||
.HasColumnType("nvarchar(400)");
|
||||
|
||||
b.Property<Guid>("IdentityUserId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<bool>("IsFirstAdd")
|
||||
.HasColumnType("bit")
|
||||
.HasComment("首次登录需要修改密码");
|
||||
|
||||
b.Property<bool>("IsMutiAccountInfoConfirm")
|
||||
.HasColumnType("bit")
|
||||
.HasComment("多账号信息是否已经确认");
|
||||
|
||||
b.Property<bool>("IsTestUser")
|
||||
.HasColumnType("bit");
|
||||
|
||||
b.Property<bool>("IsUserRoleDisabled")
|
||||
.HasColumnType("bit");
|
||||
|
||||
b.Property<bool>("IsZhiZhun")
|
||||
.HasColumnType("bit")
|
||||
.HasComment("内部用户 外部用户");
|
||||
|
@ -12925,6 +12935,9 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
|
|||
b.Property<Guid>("CreateUserId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid>("IdentityUserId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<string>("PassWord")
|
||||
.IsRequired()
|
||||
.HasMaxLength(400)
|
||||
|
@ -15716,6 +15729,7 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
|
|||
b.HasOne("IRaCIS.Core.Domain.Models.SCPStudy", "SCPStudy")
|
||||
.WithMany("InstanceList")
|
||||
.HasForeignKey("StudyId")
|
||||
.HasPrincipalKey("Id")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
|
@ -16517,6 +16531,7 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
|
|||
b.HasOne("IRaCIS.Core.Domain.Models.TaskStudy", "TaskStudy")
|
||||
.WithMany("InstanceList")
|
||||
.HasForeignKey("StudyId")
|
||||
.HasPrincipalKey("Id")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
|
|
Loading…
Reference in New Issue