用户初步修改

Uat_IRC_Net8
hang 2024-12-23 15:47:39 +08:00
parent 2e7a0fe68d
commit c1a58401eb
13 changed files with 18928 additions and 203 deletions

View File

@ -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>
上一次修改密码的时间

View File

@ -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>()

View File

@ -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

View File

@ -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);

View File

@ -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
}
}

View File

@ -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>();
}
}

View File

@ -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
{

View File

@ -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
}

View File

@ -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;
}

View File

@ -13,4 +13,6 @@ public class UserPassWordLog : BaseAddAuditEntity
[Comment("密码")]
public string PassWord { get; set; } = string.Empty;
public Guid IdentityUserId { get; set; }
}

File diff suppressed because it is too large Load Diff

View File

@ -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);
}
}
}

View File

@ -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();