用户初步修改
parent
2e7a0fe68d
commit
c1a58401eb
|
@ -2209,7 +2209,7 @@
|
||||||
<summary>
|
<summary>
|
||||||
重置密码为 默认密码
|
重置密码为 默认密码
|
||||||
</summary>
|
</summary>
|
||||||
<param name="userId"></param>
|
<param name="identityUserId"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.UserService.AnonymousSendVerificationCode(System.String)">
|
<member name="M:IRaCIS.Core.Application.Service.UserService.AnonymousSendVerificationCode(System.String)">
|
||||||
|
@ -2232,7 +2232,7 @@
|
||||||
<summary>
|
<summary>
|
||||||
(未登陆) 设置新密码
|
(未登陆) 设置新密码
|
||||||
</summary>
|
</summary>
|
||||||
<param name="userId"></param>
|
<param name="identityUserId"></param>
|
||||||
<param name="newPwd"></param>
|
<param name="newPwd"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
@ -2249,13 +2249,6 @@
|
||||||
<param name="inQuery"></param>
|
<param name="inQuery"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</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)">
|
<member name="M:IRaCIS.Core.Application.Service.UserService.AddUser(IRaCIS.Application.Contracts.UserCommand)">
|
||||||
<summary>
|
<summary>
|
||||||
添加用户
|
添加用户
|
||||||
|
@ -2270,13 +2263,6 @@
|
||||||
<param name="model"></param>
|
<param name="model"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</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)">
|
<member name="M:IRaCIS.Core.Application.Service.UserService.UpdateUserState(System.Guid,IRaCIS.Core.Domain.Share.UserStateEnum)">
|
||||||
<summary>
|
<summary>
|
||||||
禁用或者启用账户
|
禁用或者启用账户
|
||||||
|
@ -2285,7 +2271,7 @@
|
||||||
<param name="state"></param>
|
<param name="state"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</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>
|
<summary>
|
||||||
发送MFA 验证邮件
|
发送MFA 验证邮件
|
||||||
</summary>
|
</summary>
|
||||||
|
@ -2310,6 +2296,23 @@
|
||||||
<param name="password"></param>
|
<param name="password"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</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)">
|
<member name="M:IRaCIS.Core.Application.Service.CodeTemplateService.GetDataBaseTableList(System.String,System.String)">
|
||||||
<summary>
|
<summary>
|
||||||
获取数据库的表信息 以及字段信息
|
获取数据库的表信息 以及字段信息
|
||||||
|
@ -13117,6 +13120,12 @@
|
||||||
<param name="_readingConsistentClinicalDataRepository"></param>
|
<param name="_readingConsistentClinicalDataRepository"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.TestService.UserMutiAccount">
|
||||||
|
<summary>
|
||||||
|
用户多账号,初次维护数据
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.TestService.ModifyClinicalDataTable">
|
<member name="M:IRaCIS.Core.Application.Service.TestService.ModifyClinicalDataTable">
|
||||||
<summary>
|
<summary>
|
||||||
维护临床数据 --一定要在同步表前同步数据才行
|
维护临床数据 --一定要在同步表前同步数据才行
|
||||||
|
@ -17536,11 +17545,6 @@
|
||||||
GCP机构
|
GCP机构
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:IRaCIS.Application.Contracts.UserBasicInfo.LastLoginIP">
|
|
||||||
<summary>
|
|
||||||
LastLoginIP
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:IRaCIS.Application.Contracts.UserBasicInfo.LastChangePassWordTime">
|
<member name="P:IRaCIS.Application.Contracts.UserBasicInfo.LastChangePassWordTime">
|
||||||
<summary>
|
<summary>
|
||||||
上一次修改密码的时间
|
上一次修改密码的时间
|
||||||
|
|
|
@ -99,11 +99,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
CreateMap<DoctorDTO, SelectionReviewerDTO>()
|
CreateMap<DoctorDTO, SelectionReviewerDTO>()
|
||||||
;
|
;
|
||||||
|
|
||||||
CreateMap<User, UserBasicInfo>()
|
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<TrialExperience, TrialExperienceListDTO>()
|
CreateMap<TrialExperience, TrialExperienceListDTO>()
|
||||||
.ForMember(x=>x.VisitReadingCount, u => u.MapFrom(t => (t.ExperienceDataType==ExperienceDataType.TrialAuto||t.ExperienceDataType==ExperienceDataType.SystemAuto)?
|
.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.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)));
|
.ForMember(d => d.EvaluationCriteriaIdList, u => u.MapFrom(t => t.ExperienceCriteriaList.Select(t => t.EvaluationCriteriaId)));
|
||||||
|
|
||||||
CreateMap<Doctor, UserBasicInfo>()
|
//CreateMap<Doctor, UserBasicInfo>()
|
||||||
.ForMember(d => d.Code, u => u.MapFrom(t => t.ReviewerCode))
|
// .ForMember(d => d.Code, u => u.MapFrom(t => t.ReviewerCode))
|
||||||
.ForMember(d => d.RealName, u => u.MapFrom(t => t.ChineseName))
|
// .ForMember(d => d.RealName, u => u.MapFrom(t => t.ChineseName))
|
||||||
.ForMember(d => d.IsReviewer, u => u.MapFrom(t => true))
|
// .ForMember(d => d.IsReviewer, u => u.MapFrom(t => true))
|
||||||
.ForMember(d => d.UserName, u => u.MapFrom(doctor => doctor.LastName + " / " + doctor.FirstName));
|
// .ForMember(d => d.UserName, u => u.MapFrom(doctor => doctor.LastName + " / " + doctor.FirstName));
|
||||||
|
|
||||||
#region 医生基本信息
|
#region 医生基本信息
|
||||||
CreateMap<Doctor, SelectionReviewerDTO>()
|
CreateMap<Doctor, SelectionReviewerDTO>()
|
||||||
|
|
|
@ -30,7 +30,7 @@ namespace IRaCIS.Application.Contracts
|
||||||
{
|
{
|
||||||
public string JwtStr { get; set; }
|
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>();
|
public List<UserAccountInfo> AccountList { get; set; } = new List<UserAccountInfo>();
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ namespace IRaCIS.Application.Contracts
|
||||||
public class UserAccountInfo
|
public class UserAccountInfo
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
|
public Guid IdentityUserId { get; set; }
|
||||||
public string UserName { get; set; } = string.Empty;
|
public string UserName { get; set; } = string.Empty;
|
||||||
public string FullName { 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 UserTypeEnum UserType { get; set; }
|
||||||
|
|
||||||
|
public bool IsUserRoleDisabled { get; set; }
|
||||||
|
|
||||||
|
[Comment("多账号信息是否已经确认")]
|
||||||
|
public bool IsMutiAccountInfoConfirm { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
public class LoginReturnDTO
|
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 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 Guid Id { get; set; }
|
||||||
public string UserName { get; set; } = string.Empty;
|
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 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>
|
public bool PasswordChanged { get; set; }
|
||||||
/// LastLoginIP
|
|
||||||
/// </summary>
|
public int LoginState { get; set; } = 0;
|
||||||
public string LastLoginIP { get; set; } = string.Empty;
|
public string LastLoginIP { get; set; } = string.Empty;
|
||||||
|
public DateTime? LastLoginTime { get; set; }
|
||||||
public UserTypeEnum UserTypeEnum { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 上一次修改密码的时间
|
/// 上一次修改密码的时间
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public DateTime? LastChangePassWordTime { get; set; }
|
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 class UserInfo
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
|
||||||
public string UserName { get; set; } = string.Empty;
|
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;
|
public string FirstName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
@ -166,34 +172,19 @@ namespace IRaCIS.Application.Contracts
|
||||||
|
|
||||||
public string Phone { get; set; } = string.Empty;
|
public string Phone { get; set; } = string.Empty;
|
||||||
public string EMail { 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 string UserCode { get; set; } = string.Empty;
|
||||||
|
|
||||||
public bool IsZhiZhun { get; set; }
|
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 OrganizationName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public string DepartmentName { get; set; } = String.Empty;
|
public string DepartmentName { get; set; } = String.Empty;
|
||||||
public string PositionName { get; set; } = String.Empty;
|
public string PositionName { get; set; } = String.Empty;
|
||||||
|
|
||||||
public bool IsTestUser { get; set; }
|
public bool IsTestUser { get; set; }
|
||||||
|
|
||||||
public DateTime? LastLoginTime { get; set; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -208,11 +199,23 @@ namespace IRaCIS.Application.Contracts
|
||||||
|
|
||||||
public class UserCommand : UserInfo
|
public class UserCommand : UserInfo
|
||||||
{
|
{
|
||||||
|
public Guid? IdentityUserId { get; set; }
|
||||||
|
|
||||||
|
public List<UserAddUserType> UserRoleList { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public string BaseUrl { get; set; } = string.Empty;
|
public string BaseUrl { get; set; } = string.Empty;
|
||||||
public string RouteUrl { 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
|
public class EditPasswordCommand
|
||||||
|
@ -268,26 +271,21 @@ namespace IRaCIS.Application.Contracts
|
||||||
|
|
||||||
public class UserListDTO : UserInfo
|
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 DateTime CreateTime { get; set; }
|
||||||
|
|
||||||
public List<string> RoleNameArray { get; set; } = new List<string>();
|
public Guid IdentityUserId { get; set; }
|
||||||
public IEnumerable<RoleDTO> RoleNameList { get; set; } = new List<RoleDTO>();
|
|
||||||
|
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
|
public class AllowAnonymousResetPasswordCommand
|
||||||
|
|
|
@ -6,13 +6,13 @@ namespace IRaCIS.Core.Application.Service
|
||||||
public interface IUserService
|
public interface IUserService
|
||||||
{
|
{
|
||||||
Task<IResponseOutput<UserAddedReturnDTO>> AddUser(UserCommand userAddModel);
|
Task<IResponseOutput<UserAddedReturnDTO>> AddUser(UserCommand userAddModel);
|
||||||
Task<IResponseOutput> DeleteUser(Guid userId);
|
//Task<IResponseOutput> DeleteUser(Guid userId);
|
||||||
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> 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<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);
|
||||||
|
|
|
@ -1,14 +1,19 @@
|
||||||
using IP2Region.Net.Abstractions;
|
using DocumentFormat.OpenXml.Wordprocessing;
|
||||||
|
using IP2Region.Net.Abstractions;
|
||||||
using IRaCIS.Application.Contracts;
|
using IRaCIS.Application.Contracts;
|
||||||
|
using IRaCIS.Core.Application.Auth;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
|
using MassTransit;
|
||||||
using Medallion.Threading;
|
using Medallion.Threading;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using Microsoft.AspNetCore.Identity;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
using Org.BouncyCastle.Utilities.Encoders;
|
||||||
using Panda.DynamicWebApi.Attributes;
|
using Panda.DynamicWebApi.Attributes;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using ZiggyCreatures.Caching.Fusion;
|
using ZiggyCreatures.Caching.Fusion;
|
||||||
|
@ -33,18 +38,18 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
private SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
|
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"]);
|
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"]);
|
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"]);
|
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();
|
//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)
|
if (oldPwd != null && dbUser.Password != oldPwd)
|
||||||
{
|
{
|
||||||
|
@ -88,7 +93,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
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.IdentityUserId == identityUserId).OrderByDescending(x => x.CreateTime).Take(2).ToListAsync();
|
||||||
|
|
||||||
if (passWordList.Any(x => x.PassWord == newPwd))
|
if (passWordList.Any(x => x.PassWord == newPwd))
|
||||||
{
|
{
|
||||||
|
@ -99,7 +104,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
if (oldPwd == null)
|
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())
|
if (oldPwd.IsNotNullOrEmpty())
|
||||||
|
@ -109,11 +114,11 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
CreateTime = DateTime.Now,
|
CreateTime = DateTime.Now,
|
||||||
PassWord = oldPwd!,
|
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,
|
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
|
EMail = newEmail
|
||||||
});
|
});
|
||||||
|
@ -208,9 +213,9 @@ namespace IRaCIS.Core.Application.Service
|
||||||
public async Task<IResponseOutput> SetNewPhone(string newPhone)
|
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
|
Phone = newPhone
|
||||||
});
|
});
|
||||||
|
@ -224,10 +229,10 @@ namespace IRaCIS.Core.Application.Service
|
||||||
[HttpPut("{newUserName}")]
|
[HttpPut("{newUserName}")]
|
||||||
public async Task<IResponseOutput> SetNewUserName(string 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
|
UserName = newUserName
|
||||||
});
|
});
|
||||||
|
@ -240,15 +245,15 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
|
|
||||||
[HttpGet]
|
[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,
|
UserName = newUserName,
|
||||||
|
|
||||||
|
@ -269,29 +274,29 @@ namespace IRaCIS.Core.Application.Service
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 重置密码为 默认密码
|
/// 重置密码为 默认密码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="userId"></param>
|
/// <param name="identityUserId"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("{userId:guid}")]
|
[HttpGet("{identityUserId:guid}")]
|
||||||
[UnitOfWork]
|
[UnitOfWork]
|
||||||
public async Task<IResponseOutput> ResetPassword(Guid userId)
|
public async Task<IResponseOutput> ResetPassword(Guid identityUserId)
|
||||||
{
|
{
|
||||||
|
|
||||||
var pwd = IRCEmailPasswordHelper.GenerateRandomPassword(10);
|
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),
|
Password = MD5Helper.Md5(pwd),
|
||||||
IsFirstAdd = true
|
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 _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();
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
|
@ -386,24 +391,24 @@ namespace IRaCIS.Core.Application.Service
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// (未登陆) 设置新密码
|
/// (未登陆) 设置新密码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="userId"></param>
|
/// <param name="identityUserId"></param>
|
||||||
/// <param name="newPwd"></param>
|
/// <param name="newPwd"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
[HttpGet("{userId:guid}/{newPwd}")]
|
[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,
|
Password = newPwd,
|
||||||
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);
|
||||||
|
|
||||||
|
@ -418,7 +423,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
public async Task<IResponseOutput> ModifyPassword(EditPasswordCommand editPwModel)
|
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))
|
if (!string.IsNullOrEmpty(editPwModel.NewUserName))
|
||||||
|
@ -426,14 +431,14 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
await VerifyUserNameAsync(_userInfo.Id, editPwModel.NewUserName);
|
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,
|
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,
|
Password = editPwModel.NewPassWord,
|
||||||
IsFirstAdd = false
|
IsFirstAdd = false
|
||||||
|
@ -471,23 +476,69 @@ namespace IRaCIS.Core.Application.Service
|
||||||
.WhereIf(inQuery.UserState != null, t => t.Status == inQuery.UserState)
|
.WhereIf(inQuery.UserState != null, t => t.Status == inQuery.UserState)
|
||||||
.WhereIf(inQuery.IsTestUser != null, t => t.IsTestUser == inQuery.IsTestUser)
|
.WhereIf(inQuery.IsTestUser != null, t => t.IsTestUser == inQuery.IsTestUser)
|
||||||
.WhereIf(inQuery.IsZhiZhun != null, t => t.IsZhiZhun == inQuery.IsZhiZhun)
|
.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);
|
return await userQueryable.ToPagedListAsync(inQuery);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
///// <summary>
|
||||||
/// 根据用户Id获取用户详细信息[New]
|
///// 根据用户Id获取用户详细信息[New]
|
||||||
/// </summary>
|
///// </summary>
|
||||||
/// <param name="id"></param>
|
///// <param name="id"></param>
|
||||||
/// <returns></returns>xiuga
|
///// <returns></returns>xiuga
|
||||||
[HttpGet("{id:guid}")]
|
//[HttpGet("{id:guid}")]
|
||||||
public async Task<UserDetailDTO> GetUser(Guid id)
|
//public async Task<UserDetailDTO> GetUser(Guid id)
|
||||||
{
|
//{
|
||||||
var userQuery = _userRepository.Where(t => t.Id == id).ProjectTo<UserDetailDTO>(_mapper.ConfigurationProvider);
|
// var userQuery = _userRepository.Where(t => t.Id == id).ProjectTo<UserDetailDTO>(_mapper.ConfigurationProvider);
|
||||||
return await (userQuery.FirstOrDefaultAsync()).IfNullThrowException();
|
// 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>
|
/// <summary>
|
||||||
/// 添加用户
|
/// 添加用户
|
||||||
|
@ -501,13 +552,16 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
await VerifyUserNameAsync(null, userAddModel.UserName);
|
await VerifyUserNameAsync(null, userAddModel.UserName);
|
||||||
|
|
||||||
await VerifyUserEmailAsync(null, userAddModel.UserTypeId, userAddModel.EMail);
|
await VerifyUserEmailAsync(null, userAddModel.EMail);
|
||||||
|
|
||||||
//await VerifyUserPhoneAsync(null, userAddModel.UserTypeId, userAddModel.Phone);
|
//await VerifyUserPhoneAsync(null, userAddModel.UserTypeId, userAddModel.Phone);
|
||||||
|
|
||||||
|
|
||||||
var saveItem = _mapper.Map<User>(userAddModel);
|
var saveItem = _mapper.Map<User>(userAddModel);
|
||||||
|
|
||||||
|
//设置用户标识
|
||||||
|
saveItem.IdentityUserId = NewId.NextSequentialGuid();
|
||||||
|
|
||||||
var @lock = _distributedLockProvider.CreateLock($"UserAccount");
|
var @lock = _distributedLockProvider.CreateLock($"UserAccount");
|
||||||
|
|
||||||
using (await @lock.AcquireAsync())
|
using (await @lock.AcquireAsync())
|
||||||
|
@ -526,16 +580,29 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
saveItem.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10));
|
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,31 +615,58 @@ 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);
|
//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 (userRoleList.Any(t => t.Status != model.Status))
|
||||||
|
|
||||||
if (user.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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (model.IsZhiZhun)
|
||||||
_mapper.Map(model, user);
|
|
||||||
|
|
||||||
if (user.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 });
|
//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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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>
|
/// <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);
|
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
|
Status = state
|
||||||
});
|
});
|
||||||
|
@ -638,7 +713,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
/// <param name="mfaType"></param>
|
/// <param name="mfaType"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[AllowAnonymous]
|
[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();
|
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]
|
[HttpGet]
|
||||||
public async Task<IResponseOutput> LoginOut(Guid userId)
|
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);
|
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = userId, OptUserId = _userInfo.Id, OptType = UserOptType.LoginOut }, true);
|
||||||
|
|
||||||
return ResponseOutput.Ok();
|
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>()
|
CreateMap<UserType, TrialUserType>()
|
||||||
.ForMember(d => d.UserType, u => u.MapFrom(t => t.UserTypeName));
|
.ForMember(d => d.UserType, u => u.MapFrom(t => t.UserTypeName));
|
||||||
|
|
||||||
CreateMap<User, UserDetailDTO>()
|
// CreateMap<User, UserDetailDTO>()
|
||||||
.ForMember(d => d.RealName, u => u.MapFrom(s => s.FullName))
|
//.ForMember(d => d.RealName, u => u.MapFrom(s => s.FullName))
|
||||||
.ForMember(d => d.UserTypeId, u => u.MapFrom(s => s.UserTypeRole.Id))
|
//.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.UserType, u => u.MapFrom(s => s.UserTypeRole.UserTypeName))
|
||||||
.ForMember(d => d.UserTypeShortName, u => u.MapFrom(s => s.UserTypeRole.UserTypeShortName))
|
//.ForMember(d => d.UserTypeShortName, u => u.MapFrom(s => s.UserTypeRole.UserTypeShortName))
|
||||||
.ForMember(d => d.CanEditUserType, u => u.MapFrom(s => !s.UserTrials.Any()));
|
//.ForMember(d => d.CanEditUserType, u => u.MapFrom(s => !s.UserTrials.Any()));
|
||||||
|
|
||||||
CreateMap<User, UserListDTO>()
|
// CreateMap<User, UserListDTO>()
|
||||||
.ForMember(d => d.RealName, u => u.MapFrom(s => s.FullName))
|
// .ForMember(d => d.RealName, u => u.MapFrom(s => s.FullName))
|
||||||
.ForMember(d => d.UserTypeId, u => u.MapFrom(s => s.UserTypeRole.Id))
|
// .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.UserType, u => u.MapFrom(s => s.UserTypeRole.UserTypeShortName))
|
||||||
.ForMember(d => d.CanEditUserType, u => u.MapFrom(s => !s.UserTrials.Any()));
|
// .ForMember(d => d.CanEditUserType, u => u.MapFrom(s => !s.UserTrials.Any()));
|
||||||
|
|
||||||
var token = string.Empty;
|
var token = string.Empty;
|
||||||
var userId = Guid.Empty;
|
var userId = Guid.Empty;
|
||||||
|
@ -141,6 +141,8 @@ namespace IRaCIS.Core.Application.Service
|
||||||
CreateMap<UserBasicInfo, UserTokenInfo>()
|
CreateMap<UserBasicInfo, UserTokenInfo>()
|
||||||
.ForMember(d => d.UserRoleId, c => c.MapFrom(t => t.Id));
|
.ForMember(d => d.UserRoleId, c => c.MapFrom(t => t.Id));
|
||||||
|
|
||||||
|
CreateMap<User, UserAccountInfo>();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -152,6 +152,31 @@ namespace IRaCIS.Core.Application.Service
|
||||||
return ResponseOutput.Ok();
|
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]
|
[LowerCamelCaseJson]
|
||||||
public class TestModel
|
public class TestModel
|
||||||
{
|
{
|
||||||
|
|
|
@ -81,7 +81,6 @@ public class User : BaseFullAuditEntity
|
||||||
|
|
||||||
public DateTime? LastLoginTime { get; set; }
|
public DateTime? LastLoginTime { get; set; }
|
||||||
|
|
||||||
public bool SuperAdmin { get; set; }
|
|
||||||
|
|
||||||
public UserTypeEnum UserTypeEnum { get; set; }
|
public UserTypeEnum UserTypeEnum { get; set; }
|
||||||
|
|
||||||
|
@ -89,7 +88,15 @@ public class User : BaseFullAuditEntity
|
||||||
|
|
||||||
#region 新增字段
|
#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
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,15 +13,31 @@ public class UserLog : BaseAddAuditEntity
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public User OptUser { get; set; }
|
public User OptUser { get; set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public string IP { get; set; } = string.Empty;
|
public string IP { get; set; } = string.Empty;
|
||||||
public string LoginFaildName { get; set; } = string.Empty;
|
public string LoginFaildName { get; set; } = string.Empty;
|
||||||
public UserOptType OptType { get; set; }
|
public UserOptType OptType { get; set; }
|
||||||
public string LoginPassword { get; set; } = string.Empty;
|
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("被操作的人,自己操作的就是自己")]
|
[Comment("被操作的人,自己操作的就是自己")]
|
||||||
public Guid? OptUserId { get; set; }
|
public Guid? OptUserId { get; set; }
|
||||||
public string IPRegion { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,4 +13,6 @@ public class UserPassWordLog : BaseAddAuditEntity
|
||||||
|
|
||||||
[Comment("密码")]
|
[Comment("密码")]
|
||||||
public string PassWord { get; set; } = string.Empty;
|
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)
|
.HasMaxLength(400)
|
||||||
.HasColumnType("nvarchar(400)");
|
.HasColumnType("nvarchar(400)");
|
||||||
|
|
||||||
|
b.Property<Guid>("IdentityUserId")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
b.Property<bool>("IsFirstAdd")
|
b.Property<bool>("IsFirstAdd")
|
||||||
.HasColumnType("bit")
|
.HasColumnType("bit")
|
||||||
.HasComment("首次登录需要修改密码");
|
.HasComment("首次登录需要修改密码");
|
||||||
|
|
||||||
|
b.Property<bool>("IsMutiAccountInfoConfirm")
|
||||||
|
.HasColumnType("bit")
|
||||||
|
.HasComment("多账号信息是否已经确认");
|
||||||
|
|
||||||
b.Property<bool>("IsTestUser")
|
b.Property<bool>("IsTestUser")
|
||||||
.HasColumnType("bit");
|
.HasColumnType("bit");
|
||||||
|
|
||||||
|
b.Property<bool>("IsUserRoleDisabled")
|
||||||
|
.HasColumnType("bit");
|
||||||
|
|
||||||
b.Property<bool>("IsZhiZhun")
|
b.Property<bool>("IsZhiZhun")
|
||||||
.HasColumnType("bit")
|
.HasColumnType("bit")
|
||||||
.HasComment("内部用户 外部用户");
|
.HasComment("内部用户 外部用户");
|
||||||
|
@ -12925,6 +12935,9 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
|
||||||
b.Property<Guid>("CreateUserId")
|
b.Property<Guid>("CreateUserId")
|
||||||
.HasColumnType("uniqueidentifier");
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.Property<Guid>("IdentityUserId")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
b.Property<string>("PassWord")
|
b.Property<string>("PassWord")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(400)
|
.HasMaxLength(400)
|
||||||
|
@ -15716,6 +15729,7 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
|
||||||
b.HasOne("IRaCIS.Core.Domain.Models.SCPStudy", "SCPStudy")
|
b.HasOne("IRaCIS.Core.Domain.Models.SCPStudy", "SCPStudy")
|
||||||
.WithMany("InstanceList")
|
.WithMany("InstanceList")
|
||||||
.HasForeignKey("StudyId")
|
.HasForeignKey("StudyId")
|
||||||
|
.HasPrincipalKey("Id")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
|
|
||||||
|
@ -16517,6 +16531,7 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
|
||||||
b.HasOne("IRaCIS.Core.Domain.Models.TaskStudy", "TaskStudy")
|
b.HasOne("IRaCIS.Core.Domain.Models.TaskStudy", "TaskStudy")
|
||||||
.WithMany("InstanceList")
|
.WithMany("InstanceList")
|
||||||
.HasForeignKey("StudyId")
|
.HasForeignKey("StudyId")
|
||||||
|
.HasPrincipalKey("Id")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue