添加新的用户表提交
continuous-integration/drone/push Build is pending Details

Uat_IRC_Net8
hang 2024-12-24 16:25:04 +08:00
parent f7519b2095
commit dc32df27ec
13 changed files with 18999 additions and 209 deletions

View File

@ -10,5 +10,6 @@ global using Microsoft.Extensions.Localization;
global using AutoMapper; global using AutoMapper;
global using IRaCIS.Core.Domain.Share; global using IRaCIS.Core.Domain.Share;
global using IRaCIS.Core.Application.BusinessFilter; global using IRaCIS.Core.Application.BusinessFilter;
global using IdentityUser = IRaCIS.Core.Domain.Models.IdentityUser;

View File

@ -2269,14 +2269,6 @@
<param name="model"></param> <param name="model"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.UserService.UpdateUserState(System.Guid,IRaCIS.Core.Domain.Share.UserStateEnum)">
<summary>
禁用或者启用账户
</summary>
<param name="userId"></param>
<param name="state"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.UserService.SendMFAEmail(System.Guid,IRaCIS.Core.Domain.Share.UserMFAType)"> <member name="M:IRaCIS.Core.Application.Service.UserService.SendMFAEmail(System.Guid,IRaCIS.Core.Domain.Share.UserMFAType)">
<summary> <summary>
发送MFA 验证邮件 发送MFA 验证邮件
@ -2313,7 +2305,7 @@
<summary> <summary>
验证密码成功后选定角色然后获取当前角色的Token 验证密码成功后选定角色然后获取当前角色的Token
</summary> </summary>
<param name="userTypeId"></param> <param name="userRoleId"></param>
<param name="_tokenService"></param> <param name="_tokenService"></param>
<returns></returns> <returns></returns>
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception> <exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
@ -13125,7 +13117,7 @@
<param name="_readingConsistentClinicalDataRepository"></param> <param name="_readingConsistentClinicalDataRepository"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.TestService.UserMutiAccount"> <member name="M:IRaCIS.Core.Application.Service.TestService.UserMutiAccount(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.IdentityUser})">
<summary> <summary>
用户多账号,初次维护数据 用户多账号,初次维护数据
</summary> </summary>

View File

@ -160,7 +160,9 @@ namespace IRaCIS.Application.Contracts
{ {
//public bool CanEditUserType { get; set; } //public bool CanEditUserType { get; set; }
public Guid IdentityUserId { get; set; } public string FullName { get; set; }
public Guid Id { get; set; }
public List<UserAccountInfo> AccountList { get; set; } public List<UserAccountInfo> AccountList { get; set; }
} }
@ -205,7 +207,7 @@ namespace IRaCIS.Application.Contracts
public class UserCommand : UserInfo public class UserCommand : UserInfo
{ {
public Guid? IdentityUserId { get; set; } public Guid? Id { get; set; }
public List<UserAddUserType> UserRoleList { get; set; } public List<UserAddUserType> UserRoleList { get; set; }

View File

@ -18,7 +18,7 @@ namespace IRaCIS.Core.Application.Service
Task<IResponseOutput> ResetPassword(Guid userId); Task<IResponseOutput> ResetPassword(Guid userId);
Task<IResponseOutput> UpdateUser(UserCommand model); Task<IResponseOutput> UpdateUser(UserCommand model);
Task<IResponseOutput> UpdateUserState(Guid userId, UserStateEnum state); //Task<IResponseOutput> UpdateUserState(Guid userId, UserStateEnum state);
//Task<IResponseOutput> SendVerificationCode(string emailOrPhone, VerifyType verificationType, bool isReviewer = false); //Task<IResponseOutput> SendVerificationCode(string emailOrPhone, VerifyType verificationType, bool isReviewer = false);
//Task<IResponseOutput> SetNewPassword(ResetPasswordCommand resetPwdModel); //Task<IResponseOutput> SetNewPassword(ResetPasswordCommand resetPwdModel);

View File

@ -17,6 +17,7 @@ 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;
using LoginReturnDTO = IRaCIS.Application.Contracts.LoginReturnDTO; using LoginReturnDTO = IRaCIS.Application.Contracts.LoginReturnDTO;
namespace IRaCIS.Core.Application.Service namespace IRaCIS.Core.Application.Service
@ -32,6 +33,7 @@ namespace IRaCIS.Core.Application.Service
IRepository<Trial> _trialRepository, IRepository<Trial> _trialRepository,
IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig, IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig,
IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig, IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig,
IRepository<IdentityUser> _identityUserRepository,
ISearcher _searcher, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, IUserService ISearcher _searcher, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, IUserService
{ {
@ -40,7 +42,7 @@ namespace IRaCIS.Core.Application.Service
private async Task VerifyUserNameAsync(Guid? identityUserId, string userName) private async Task VerifyUserNameAsync(Guid? identityUserId, string userName)
{ {
if (await _userRepository.WhereIf(identityUserId != null, t => t.IdentityUserId != identityUserId).AnyAsync(t => t.UserName == userName)) if (await _identityUserRepository.WhereIf(identityUserId != null, t => t.Id != identityUserId).AnyAsync(t => t.UserName == userName))
{ {
//---用户名已经存在。 //---用户名已经存在。
throw new BusinessValidationFailedException(_localizer["User_UsernameExist"]); throw new BusinessValidationFailedException(_localizer["User_UsernameExist"]);
@ -49,7 +51,7 @@ namespace IRaCIS.Core.Application.Service
private async Task VerifyUserPhoneAsync(Guid? identityUserId, string phone) private async Task VerifyUserPhoneAsync(Guid? identityUserId, string phone)
{ {
if (await _userRepository.WhereIf(identityUserId != null, t => t.IdentityUserId != identityUserId).AnyAsync(t => (t.Phone == phone))) if (await _identityUserRepository.WhereIf(identityUserId != null, t => t.Id != identityUserId).AnyAsync(t => (t.Phone == phone)))
{ {
//---该用户类型中已存在具有相同的电话的用户。 //---该用户类型中已存在具有相同的电话的用户。
throw new BusinessValidationFailedException(_localizer["User_PhoneDup"]); throw new BusinessValidationFailedException(_localizer["User_PhoneDup"]);
@ -59,7 +61,7 @@ namespace IRaCIS.Core.Application.Service
private async Task VerifyUserEmailAsync(Guid? identityUserId, string email) private async Task VerifyUserEmailAsync(Guid? identityUserId, string email)
{ {
if (await _userRepository.WhereIf(identityUserId != null, t => t.IdentityUserId != identityUserId).AnyAsync(t => t.EMail == email)) if (await _identityUserRepository.WhereIf(identityUserId != null, t => t.Id != identityUserId).AnyAsync(t => t.EMail == email))
{ {
//---该用户类型中已存在具有相同邮箱的用户。 //---该用户类型中已存在具有相同邮箱的用户。
throw new BusinessValidationFailedException(_localizer["User_EmailDup"]); throw new BusinessValidationFailedException(_localizer["User_EmailDup"]);
@ -79,7 +81,7 @@ namespace IRaCIS.Core.Application.Service
} }
var dbUser = (await _userRepository.Where(t => t.IdentityUserId == identityUserId).FirstOrDefaultAsync()).IfNullThrowException(); var dbUser = (await _identityUserRepository.Where(t => t.Id == identityUserId).FirstOrDefaultAsync()).IfNullThrowException();
if (oldPwd != null && dbUser.Password != oldPwd) if (oldPwd != null && dbUser.Password != oldPwd)
{ {
@ -104,7 +106,7 @@ namespace IRaCIS.Core.Application.Service
if (oldPwd == null) if (oldPwd == null)
{ {
oldPwd = await _userRepository.Where(x => x.IdentityUserId == identityUserId).Select(x => x.Password).FirstOrDefaultAsync(); oldPwd = await _identityUserRepository.Where(x => x.Id == identityUserId).Select(x => x.Password).FirstOrDefaultAsync();
} }
if (oldPwd.IsNotNullOrEmpty()) if (oldPwd.IsNotNullOrEmpty())
@ -118,7 +120,7 @@ namespace IRaCIS.Core.Application.Service
}); });
} }
await _userRepository.BatchUpdateNoTrackingAsync(x => x.IdentityUserId == identityUserId, x => new User() await _identityUserRepository.BatchUpdateNoTrackingAsync(x => x.Id == identityUserId, x => new IdentityUser()
{ {
LastChangePassWordTime = DateTime.Now, LastChangePassWordTime = DateTime.Now,
}); });
@ -192,7 +194,7 @@ namespace IRaCIS.Core.Application.Service
await VerifyUserEmailAsync(_userInfo.IdentityUserId, newEmail); await VerifyUserEmailAsync(_userInfo.IdentityUserId, newEmail);
await _userRepository.UpdatePartialFromQueryAsync(_userInfo.IdentityUserId, u => new User() await _identityUserRepository.UpdatePartialFromQueryAsync(_userInfo.IdentityUserId, u => new IdentityUser()
{ {
EMail = newEmail EMail = newEmail
}); });
@ -215,7 +217,7 @@ namespace IRaCIS.Core.Application.Service
await VerifyUserPhoneAsync(_userInfo.IdentityUserId, newPhone); await VerifyUserPhoneAsync(_userInfo.IdentityUserId, newPhone);
await _userRepository.UpdatePartialFromQueryAsync(_userInfo.IdentityUserId, u => new User() await _identityUserRepository.UpdatePartialFromQueryAsync(_userInfo.IdentityUserId, u => new IdentityUser()
{ {
Phone = newPhone Phone = newPhone
}); });
@ -232,7 +234,7 @@ namespace IRaCIS.Core.Application.Service
await VerifyUserNameAsync(_userInfo.IdentityUserId, newUserName); await VerifyUserNameAsync(_userInfo.IdentityUserId, newUserName);
await _userRepository.UpdatePartialFromQueryAsync(_userInfo.IdentityUserId, u => new User() await _identityUserRepository.UpdatePartialFromQueryAsync(_userInfo.IdentityUserId, u => new IdentityUser()
{ {
UserName = newUserName UserName = newUserName
}); });
@ -253,7 +255,7 @@ namespace IRaCIS.Core.Application.Service
await VerifyUserNameAsync(_userInfo.IdentityUserId, newUserName); await VerifyUserNameAsync(_userInfo.IdentityUserId, newUserName);
await _userRepository.UpdatePartialFromQueryAsync(_userInfo.IdentityUserId, u => new User() await _identityUserRepository.UpdatePartialFromQueryAsync(_userInfo.IdentityUserId, u => new IdentityUser()
{ {
UserName = newUserName, UserName = newUserName,
@ -286,13 +288,13 @@ namespace IRaCIS.Core.Application.Service
await _mailVerificationService.AdminResetPwdSendEmailAsync(identityUserId, pwd); await _mailVerificationService.AdminResetPwdSendEmailAsync(identityUserId, pwd);
await _userRepository.UpdatePartialFromQueryAsync(t => t.IdentityUserId == identityUserId, u => new User() await _identityUserRepository.UpdatePartialFromQueryAsync(t => t.Id == identityUserId, u => new IdentityUser()
{ {
Password = MD5Helper.Md5(pwd), Password = MD5Helper.Md5(pwd),
IsFirstAdd = true IsFirstAdd = true
}); });
var userName = _userRepository.Where(t => t.IdentityUserId == identityUserId).Select(t => t.UserName).FirstOrDefault(); var userName = _identityUserRepository.Where(t => t.Id == identityUserId).Select(t => t.UserName).FirstOrDefault();
await _fusionCache.RemoveAsync(CacheKeys.UserLoginError(userName)); await _fusionCache.RemoveAsync(CacheKeys.UserLoginError(userName));
@ -323,7 +325,7 @@ namespace IRaCIS.Core.Application.Service
} }
////查找改邮箱或者手机的用户 ////查找改邮箱或者手机的用户
var exist = await _userRepository.AnyAsync(t => t.EMail == email); var exist = await _identityUserRepository.AnyAsync(t => t.EMail == email);
if (!exist) if (!exist)
{ {
@ -380,7 +382,7 @@ namespace IRaCIS.Core.Application.Service
} }
} }
var list = await _userRepository.Where(t => t.EMail == email && t.Status == UserStateEnum.Enable).Select(t => new UserAccountDto() { UserId = t.Id, UserName = t.UserName, UserRealName = t.FullName, UserType = t.UserTypeRole.UserTypeShortName }).ToListAsync(); var list = await _identityUserRepository.Where(t => t.EMail == email && t.Status == UserStateEnum.Enable).Select(t => new UserAccountDto() { UserId = t.Id, UserName = t.UserName, UserRealName = t.FullName }).ToListAsync();
@ -402,7 +404,7 @@ namespace IRaCIS.Core.Application.Service
await VerifyUserPwdAsync(identityUserId, newPwd); await VerifyUserPwdAsync(identityUserId, newPwd);
var success = await _userRepository.BatchUpdateNoTrackingAsync(t => t.IdentityUserId == identityUserId, u => new User() var success = await _identityUserRepository.BatchUpdateNoTrackingAsync(t => t.Id == identityUserId, u => new IdentityUser()
{ {
Password = newPwd, Password = newPwd,
IsFirstAdd = false IsFirstAdd = false
@ -431,14 +433,14 @@ namespace IRaCIS.Core.Application.Service
await VerifyUserNameAsync(_userInfo.Id, editPwModel.NewUserName); await VerifyUserNameAsync(_userInfo.Id, editPwModel.NewUserName);
await _userRepository.BatchUpdateNoTrackingAsync(t => t.IdentityUserId == _userInfo.IdentityUserId, u => new User() await _identityUserRepository.BatchUpdateNoTrackingAsync(t => t.Id == _userInfo.IdentityUserId, u => new IdentityUser()
{ {
UserName = editPwModel.NewUserName, UserName = editPwModel.NewUserName,
}); });
} }
var success = await _userRepository.BatchUpdateNoTrackingAsync(t => t.IdentityUserId == _userInfo.IdentityUserId, u => new User() var success = await _identityUserRepository.BatchUpdateNoTrackingAsync(t => t.Id == _userInfo.IdentityUserId, u => new IdentityUser()
{ {
Password = editPwModel.NewPassWord, Password = editPwModel.NewPassWord,
IsFirstAdd = false IsFirstAdd = false
@ -462,45 +464,63 @@ namespace IRaCIS.Core.Application.Service
[HttpPost] [HttpPost]
public async Task<PageOutput<UserListDTO>> GetUserList(UserListQueryDTO inQuery) public async Task<PageOutput<UserListDTO>> GetUserList(UserListQueryDTO inQuery)
{ {
var userQueryable = _userRepository.Where(x => x.UserTypeEnum != UserTypeEnum.SuperAdmin)
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserName), t => t.UserName.Contains(inQuery.UserName))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.RealName), t => t.FullName.Contains(inQuery.RealName))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.Phone), t => t.Phone.Contains(inQuery.Phone))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.OrganizationName), t => t.OrganizationName.Contains(inQuery.OrganizationName))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.EMail), t => t.EMail.Contains(inQuery.EMail))
.WhereIf(inQuery.BeginCreateTime != null, t => t.CreateTime >= inQuery.BeginCreateTime)
.WhereIf(inQuery.EndCreateTime != null, t => t.CreateTime <= inQuery.EndCreateTime)
.WhereIf(inQuery.BeginLastLoginTime != null, t => t.LastLoginTime >= inQuery.BeginLastLoginTime)
.WhereIf(inQuery.EndLastLoginTime != null, t => t.LastLoginTime <= inQuery.EndLastLoginTime)
.WhereIf(inQuery.UserType != null, t => t.UserTypeId == inQuery.UserType)
.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)
.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, var userQueryable = _identityUserRepository.Where(x => x.UserRoleList.Any(x => x.UserTypeEnum != UserTypeEnum.SuperAdmin))
DepartmentName = g.FirstOrDefault().DepartmentName, .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserName), t => t.UserName.Contains(inQuery.UserName))
CreateTime = g.FirstOrDefault().CreateTime, .WhereIf(!string.IsNullOrWhiteSpace(inQuery.RealName), t => t.FullName.Contains(inQuery.RealName))
EMail = g.FirstOrDefault().EMail, .WhereIf(!string.IsNullOrWhiteSpace(inQuery.Phone), t => t.Phone.Contains(inQuery.Phone))
FirstName = g.FirstOrDefault().FirstName, .WhereIf(!string.IsNullOrWhiteSpace(inQuery.OrganizationName), t => t.OrganizationName.Contains(inQuery.OrganizationName))
IsTestUser = g.FirstOrDefault().IsTestUser, .WhereIf(!string.IsNullOrWhiteSpace(inQuery.EMail), t => t.EMail.Contains(inQuery.EMail))
IsZhiZhun = g.FirstOrDefault().IsZhiZhun, .WhereIf(inQuery.BeginCreateTime != null, t => t.CreateTime >= inQuery.BeginCreateTime)
LastName = g.FirstOrDefault().LastName, .WhereIf(inQuery.EndCreateTime != null, t => t.CreateTime <= inQuery.EndCreateTime)
OrganizationName = g.FirstOrDefault().OrganizationName, .WhereIf(inQuery.BeginLastLoginTime != null, t => t.LastLoginTime >= inQuery.BeginLastLoginTime)
FullName = g.FirstOrDefault().FullName, .WhereIf(inQuery.EndLastLoginTime != null, t => t.LastLoginTime <= inQuery.EndLastLoginTime)
Phone = g.FirstOrDefault().Phone, .WhereIf(inQuery.UserType != null, t => t.UserRoleList.Any(t => t.UserTypeId == inQuery.UserType))
PositionName = g.FirstOrDefault().PositionName, .WhereIf(inQuery.UserState != null, t => t.Status == inQuery.UserState)
Sex = g.FirstOrDefault().Sex, .WhereIf(inQuery.IsTestUser != null, t => t.IsTestUser == inQuery.IsTestUser)
Status = g.FirstOrDefault().Status, .WhereIf(inQuery.IsZhiZhun != null, t => t.IsZhiZhun == inQuery.IsZhiZhun)
UserName = g.FirstOrDefault().UserName, .ProjectTo<UserListDTO>(_mapper.ConfigurationProvider);
});
//var userQueryable = _identityUserRepository.Where(x => x.UserTypeEnum != UserTypeEnum.SuperAdmin)
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.UserName), t => t.UserName.Contains(inQuery.UserName))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.RealName), t => t.FullName.Contains(inQuery.RealName))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.Phone), t => t.Phone.Contains(inQuery.Phone))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.OrganizationName), t => t.OrganizationName.Contains(inQuery.OrganizationName))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.EMail), t => t.EMail.Contains(inQuery.EMail))
// .WhereIf(inQuery.BeginCreateTime != null, t => t.CreateTime >= inQuery.BeginCreateTime)
// .WhereIf(inQuery.EndCreateTime != null, t => t.CreateTime <= inQuery.EndCreateTime)
// .WhereIf(inQuery.BeginLastLoginTime != null, t => t.LastLoginTime >= inQuery.BeginLastLoginTime)
// .WhereIf(inQuery.EndLastLoginTime != null, t => t.LastLoginTime <= inQuery.EndLastLoginTime)
// .WhereIf(inQuery.UserType != null, t => t.UserTypeId == inQuery.UserType)
// .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)
// .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);
@ -513,7 +533,7 @@ namespace IRaCIS.Core.Application.Service
public async Task<UserDetailDTO> GetUser() public async Task<UserDetailDTO> GetUser()
{ {
var userQuery = _userRepository.Where(t => t.IdentityUserId == _userInfo.IdentityUserId).ProjectTo<UserDetailDTO>(_mapper.ConfigurationProvider); var userQuery = _identityUserRepository.Where(t => t.Id == _userInfo.IdentityUserId).ProjectTo<UserDetailDTO>(_mapper.ConfigurationProvider);
var userRole = await userQuery.FirstOrDefaultAsync(); var userRole = await userQuery.FirstOrDefaultAsync();
@ -561,18 +581,17 @@ namespace IRaCIS.Core.Application.Service
//await VerifyUserPhoneAsync(null, userAddModel.UserTypeId, userAddModel.Phone); //await VerifyUserPhoneAsync(null, userAddModel.UserTypeId, userAddModel.Phone);
var saveItem = _mapper.Map<User>(userAddModel); var saveItem = _mapper.Map<IdentityUser>(userAddModel);
//设置用户标识
saveItem.IdentityUserId = NewId.NextSequentialGuid();
var @lock = _distributedLockProvider.CreateLock($"UserAccount"); var @lock = _distributedLockProvider.CreateLock($"UserAccount");
using (await @lock.AcquireAsync()) using (await @lock.AcquireAsync())
{ {
saveItem.Code = await _userRepository.Select(t => t.Code).DefaultIfEmpty().MaxAsync() + 1; saveItem.Code = await _identityUserRepository.Select(t => t.Code).DefaultIfEmpty().MaxAsync() + 1;
saveItem.UserCode = AppSettings.GetCodeStr(saveItem.Code, nameof(User)); saveItem.UserCode = AppSettings.GetCodeStr(saveItem.Code, nameof(IdentityUser));
if (saveItem.IsZhiZhun) if (saveItem.IsZhiZhun)
{ {
@ -584,29 +603,29 @@ namespace IRaCIS.Core.Application.Service
saveItem.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10)); saveItem.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10));
var addRoleList = new List<User>();
foreach (var role in userAddModel.UserRoleList)
{
var addRole = _mapper.Map<User>(userAddModel);
addRole.UserTypeEnum = role.UserTypeEnum;
addRole.UserTypeId = role.UserTypeId;
addRoleList.Add(addRole);
}
saveItem.UserRoleList = addRoleList;
await _identityUserRepository.AddAsync(saveItem);
var success = await _identityUserRepository.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.IdentityUserId, UserCode = saveItem.UserCode }); return ResponseOutput.Ok(new UserAddedReturnDTO { Id = saveItem.Id, UserCode = saveItem.UserCode });
} }
@ -619,60 +638,57 @@ namespace IRaCIS.Core.Application.Service
{ {
await VerifyUserNameAsync(model.IdentityUserId, model.UserName);
await VerifyUserEmailAsync(model.IdentityUserId, model.EMail); await VerifyUserNameAsync(model.Id, model.UserName);
await VerifyUserEmailAsync(model.Id, model.EMail);
//await VerifyUserPhoneAsync(model.Id, model.UserTypeId, model.Phone); //await VerifyUserPhoneAsync(model.Id, model.UserTypeId, model.Phone);
var userRoleList = await _userRepository.Where(t => t.IdentityUserId == model.IdentityUserId, true).ToListAsync(); var user = await _identityUserRepository.Where(t => t.Id == model.Id, true).Include(t => t.UserRoleList).FirstOrDefaultAsync();
if (userRoleList.Any(t => t.Status != model.Status)) if (user == null) return Null404NotFound(user);
var existDBRoleList = user.UserRoleList;
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)
{ {
model.OrganizationName = _userInfo.IsEn_Us ? _systemEmailConfig.OrganizationName : _systemEmailConfig.OrganizationNameCN; user.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) //处理角色的添加、禁用
foreach (var role in model.UserRoleList)
{ {
role.UserName = model.UserName; var find = existDBRoleList.FirstOrDefault(t => t.UserTypeEnum == role.UserTypeEnum && t.UserTypeId == role.UserTypeId);
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; if (find != null)
{
find.IsUserRoleDisabled = false;
}
else
{
var addRole = _mapper.Map<User>(model);
addRole.UserTypeEnum = role.UserTypeEnum;
addRole.UserTypeId = role.UserTypeId;
existDBRoleList.Add(addRole);
}
} }
var needAddRoleList = model.UserRoleList.Where(t => !userRoleList.Any(c => c.UserTypeId == t.UserTypeId)).ToList(); user.UserRoleList = existDBRoleList;
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);
}
var success = await _userRepository.SaveChangesAsync(); var success = await _userRepository.SaveChangesAsync();
@ -682,30 +698,30 @@ namespace IRaCIS.Core.Application.Service
/// <summary> ///// <summary>
/// 禁用或者启用账户 ///// 禁用或者启用账户
/// </summary> ///// </summary>
/// <param name="userId"></param> ///// <param name="userId"></param>
/// <param name="state"></param> ///// <param name="state"></param>
/// <returns></returns> ///// <returns></returns>
[HttpPost("{userId:guid}/{state:int}")] //[HttpPost("{userId:guid}/{state:int}")]
public async Task<IResponseOutput> UpdateUserState(Guid userId, UserStateEnum state) //public async Task<IResponseOutput> UpdateUserState(Guid userId, UserStateEnum state)
{ //{
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId = userId, OptType = state == UserStateEnum.Enable ? UserOptType.AccountEnable : UserOptType.AccountLocked }, true); // await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = _userInfo.Id, OptUserId = userId, OptType = state == UserStateEnum.Enable ? UserOptType.AccountEnable : UserOptType.AccountLocked }, true);
var success = await _userRepository.BatchUpdateNoTrackingAsync(u => u.IdentityUserId == userId, t => new User // var success = await _identityUserRepository.BatchUpdateNoTrackingAsync(u => u.IdentityUserId == userId, t => new User
{ // {
Status = state // Status = state
}); // });
return ResponseOutput.Result(success); // return ResponseOutput.Result(success);
} //}
public async Task<UserBasicInfo> GetUserBasicInfo(Guid userId, string pwd) public async Task<UserBasicInfo> GetUserBasicInfo(Guid userId, string pwd)
{ {
var info = await _userRepository.Where(u => u.Id == userId && u.Password == pwd).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstNotNullAsync(); var info = await _identityUserRepository.Where(u => u.Id == userId && u.Password == pwd).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstNotNullAsync();
return info; return info;
} }
@ -719,7 +735,7 @@ namespace IRaCIS.Core.Application.Service
[AllowAnonymous] [AllowAnonymous]
public async Task<IResponseOutput> SendMFAEmail(Guid userId, UserMFAType 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 _identityUserRepository.Where(u => u.Id == userId).Select(t => new { t.FullName, t.EMail }).FirstOrDefaultAsync();
int verificationCode = new Random().Next(100000, 1000000); int verificationCode = new Random().Next(100000, 1000000);
@ -813,7 +829,7 @@ namespace IRaCIS.Core.Application.Service
var userLoginReturnModel = new LoginReturnDTO(); var userLoginReturnModel = new LoginReturnDTO();
var loginUser = await _userRepository.Where(u => u.UserName.Equals(userName) && u.Password == password).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); var loginUser = await _identityUserRepository.Where(u => u.UserName.Equals(userName) && u.Password == password).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
if (loginUser == null) if (loginUser == null)
{ {
@ -822,7 +838,7 @@ namespace IRaCIS.Core.Application.Service
failCount++; failCount++;
await _fusionCache.SetAsync(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes)); await _fusionCache.SetAsync(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes));
var errorPwdUserId = await _userRepository.Where(u => u.UserName == userName).Select(t => t.Id).FirstOrDefaultAsync(); var errorPwdUserId = await _identityUserRepository.Where(u => u.UserName == userName).Select(t => t.Id).FirstOrDefaultAsync();
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = errorPwdUserId, OptUserId = errorPwdUserId, LoginFaildName = userName, LoginPassword = password, OptType = UserOptType.AccountOrPasswordError }, true); await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = errorPwdUserId, OptUserId = errorPwdUserId, LoginFaildName = userName, LoginPassword = password, OptType = UserOptType.AccountOrPasswordError }, true);
@ -865,7 +881,7 @@ namespace IRaCIS.Core.Application.Service
if (loginUser.LastChangePassWordTime == null) if (loginUser.LastChangePassWordTime == null)
{ {
await _userRepository.BatchUpdateNoTrackingAsync(x => x.Id == loginUser.Id, x => new User() await _identityUserRepository.BatchUpdateNoTrackingAsync(x => x.Id == loginUser.Id, x => new IdentityUser()
{ {
LastChangePassWordTime = DateTime.Now LastChangePassWordTime = DateTime.Now
@ -873,7 +889,7 @@ namespace IRaCIS.Core.Application.Service
} }
await _userRepository.BatchUpdateNoTrackingAsync(x => x.Id == loginUser.Id, x => new User() await _identityUserRepository.BatchUpdateNoTrackingAsync(x => x.Id == loginUser.Id, x => new IdentityUser()
{ {
LastLoginIP = iPRegion, LastLoginIP = iPRegion,
LastLoginTime = DateTime.Now LastLoginTime = DateTime.Now
@ -973,7 +989,12 @@ namespace IRaCIS.Core.Application.Service
var userLoginReturnModel = new IRCLoginReturnDTO(); var userLoginReturnModel = new IRCLoginReturnDTO();
var loginUser = await _userRepository.Where(u => u.UserName.Equals(userName) && u.Password == password).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); var loginUser = await _identityUserRepository.Where(u => u.UserName.Equals(userName) && u.Password == password).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
if (loginUser == null)
{
loginUser = await _identityUserRepository.Where(u => u.UserName.Equals(userName) && u.Password == password).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
}
if (loginUser == null) if (loginUser == null)
{ {
@ -982,7 +1003,7 @@ namespace IRaCIS.Core.Application.Service
failCount++; failCount++;
await _fusionCache.SetAsync(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes)); await _fusionCache.SetAsync(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes));
var errorPwdUserId = await _userRepository.Where(u => u.UserName == userName).Select(t => t.Id).FirstOrDefaultAsync(); var errorPwdUserId = await _identityUserRepository.Where(u => u.UserName == userName).Select(t => t.Id).FirstOrDefaultAsync();
//await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = errorPwdUserId, OptUserId = errorPwdUserId, LoginFaildName = userName, LoginPassword = password, OptType = UserOptType.AccountOrPasswordError }, true); //await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, LoginUserId = errorPwdUserId, OptUserId = errorPwdUserId, LoginFaildName = userName, LoginPassword = password, OptType = UserOptType.AccountOrPasswordError }, true);
@ -1025,7 +1046,7 @@ namespace IRaCIS.Core.Application.Service
if (loginUser.LastChangePassWordTime == null) if (loginUser.LastChangePassWordTime == null)
{ {
await _userRepository.BatchUpdateNoTrackingAsync(x => x.IdentityUserId == loginUser.IdentityUserId, x => new User() await _identityUserRepository.BatchUpdateNoTrackingAsync(x => x.Id == loginUser.IdentityUserId, x => new IdentityUser()
{ {
LastChangePassWordTime = DateTime.Now LastChangePassWordTime = DateTime.Now
@ -1033,7 +1054,7 @@ namespace IRaCIS.Core.Application.Service
} }
await _userRepository.BatchUpdateNoTrackingAsync(x => x.IdentityUserId == loginUser.IdentityUserId, x => new User() await _identityUserRepository.BatchUpdateNoTrackingAsync(x => x.Id == loginUser.IdentityUserId, x => new IdentityUser()
{ {
LastLoginIP = iPRegion, LastLoginIP = iPRegion,
LastLoginTime = DateTime.Now LastLoginTime = DateTime.Now
@ -1124,36 +1145,43 @@ namespace IRaCIS.Core.Application.Service
var selectUserInfo = _userRepository.Where(t => t.IdentityUserId == identityUserId && t.Id == userRoleId).FirstOrDefault(); var selectUserInfo = _userRepository.Where(t => t.IdentityUserId == identityUserId && t.Id == userRoleId).FirstOrDefault();
//多账号没维护 //if (!_identityUserRepository.Any(t => t.Id == identityUserId))
if (await _userRepository.Where(t => t.IdentityUserId == identityUserId).AnyAsync(t => t.IsMutiAccountInfoConfirm == false)) //{
{ // var identityUser = _mapper.Map<IdentityUser>(selectUserInfo);
//将信息维护为一致
await _userRepository.BatchUpdateNoTrackingAsync(t => t.IdentityUserId == identityUserId, u => new User() // await _identityUserRepository.AddAsync(identityUser, true);
{ //}
Code = selectUserInfo.Code,
UserName = selectUserInfo.UserName, ////多账号没维护
FirstName = selectUserInfo.FirstName, //if (await _userRepository.Where(t => t.IdentityUserId == identityUserId).AnyAsync(t => t.IsMutiAccountInfoConfirm == false))
LastName = selectUserInfo.LastName, //{
Phone = selectUserInfo.Phone, // //将信息维护为一致
EMail = selectUserInfo.EMail, // await _userRepository.BatchUpdateNoTrackingAsync(t => t.IdentityUserId == identityUserId, u => new User()
DepartmentName = selectUserInfo.DepartmentName, // {
OrganizationName = selectUserInfo.OrganizationName, // Code = selectUserInfo.Code,
IsFirstAdd = selectUserInfo.IsFirstAdd, // UserName = selectUserInfo.UserName,
Sex = selectUserInfo.Sex, // FirstName = selectUserInfo.FirstName,
Status = selectUserInfo.Status, // LastName = selectUserInfo.LastName,
UserCode = selectUserInfo.UserCode, // Phone = selectUserInfo.Phone,
Password = selectUserInfo.Password, // EMail = selectUserInfo.EMail,
PasswordChanged = selectUserInfo.PasswordChanged, // DepartmentName = selectUserInfo.DepartmentName,
LastChangePassWordTime = selectUserInfo.LastChangePassWordTime, // OrganizationName = selectUserInfo.OrganizationName,
PositionName = selectUserInfo.PositionName, // IsFirstAdd = selectUserInfo.IsFirstAdd,
IsTestUser = selectUserInfo.IsTestUser, // Sex = selectUserInfo.Sex,
IsZhiZhun = selectUserInfo.IsZhiZhun, // Status = selectUserInfo.Status,
AutoCutNextTask = selectUserInfo.AutoCutNextTask, // UserCode = selectUserInfo.UserCode,
//DoctorId=selectUserInfo.DoctorId, // Password = selectUserInfo.Password,
LastLoginIP = selectUserInfo.LastLoginIP, // PasswordChanged = selectUserInfo.PasswordChanged,
LastLoginTime = selectUserInfo.LastLoginTime, // 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 jwt;
//return new LoginSelectRoleReturn() { AccountList = accountList, JwtStr = jwt }; //return new LoginSelectRoleReturn() { AccountList = accountList, JwtStr = jwt };

View File

@ -146,6 +146,9 @@ namespace IRaCIS.Core.Application.Service
CreateMap<User, UserAccountInfo>() CreateMap<User, UserAccountInfo>()
.ForMember(d => d.UserTypeShortName, c => c.MapFrom(t => t.UserTypeRole.UserTypeShortName)); .ForMember(d => d.UserTypeShortName, c => c.MapFrom(t => t.UserTypeRole.UserTypeShortName));
CreateMap<IdentityUser, User>();
} }
} }

View File

@ -157,18 +157,24 @@ namespace IRaCIS.Core.Application.Service
/// 用户多账号,初次维护数据 /// 用户多账号,初次维护数据
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task<IResponseOutput> UserMutiAccount() public async Task<IResponseOutput> UserMutiAccount([FromServices] IRepository<IdentityUser> _identityUserRepository)
{ {
var userList = _userRepository.Where().Select(t => new { t.Id, t.EMail, t.DoctorId }).ToList(); var userList = _userRepository.Where().ToList();
foreach (var item in userList.GroupBy(t => t.EMail.Trim())) foreach (var item in userList.GroupBy(t => t.EMail.Trim()))
{ {
var emailUserIdList = item.Select(t => t.Id).ToList(); var emailUserIdList = item.Select(t => t.Id).ToList();
var doctorId = item.Select(t => t.DoctorId).First(); var identityUserId = NewId.NextSequentialGuid();
await _userRepository.BatchUpdateNoTrackingAsync(t => emailUserIdList.Contains(t.Id), u => new User() { IdentityUserId = NewId.NextSequentialGuid(), DoctorId = doctorId }); var identityUser = _mapper.Map<IdentityUser>(item.FirstOrDefault());
identityUser.Id = identityUserId;
await _identityUserRepository.AddAsync(identityUser);
await _userRepository.BatchUpdateNoTrackingAsync(t => emailUserIdList.Contains(t.Id), u => new User() { IdentityUserId = identityUserId });
} }
return ResponseOutput.Ok(); return ResponseOutput.Ok();

View File

@ -3,12 +3,18 @@ using IRaCIS.Core.Domain.Share;
namespace IRaCIS.Core.Domain.Models; namespace IRaCIS.Core.Domain.Models;
[Comment("后台 - 系统账户")] [Comment("后台 - 系统账户角色关系表")]
[Table("User")] [Table("User")]
public class User : BaseFullAuditEntity public class User : BaseFullAuditEntity
{ {
#region 导航属性 #region 导航属性
[ForeignKey("IdentityUserId")]
[JsonIgnore]
public IdentityUser IdentityUser { get; set; }
[JsonIgnore]
[ForeignKey("UserTypeId")] [ForeignKey("UserTypeId")]
public UserType UserTypeRole { get; set; } public UserType UserTypeRole { get; set; }
@ -56,15 +62,10 @@ public class User : BaseFullAuditEntity
public string PositionName { get; set; } public string PositionName { get; set; }
#endregion
[Comment("自动切换下一个任务")] [Comment("自动切换下一个任务")]
public bool AutoCutNextTask { get; set; } public bool AutoCutNextTask { get; set; }
public string DepartmentName { get; set; } = null!; public string DepartmentName { get; set; }
[Comment("医生生成账号后,会有值")]
public Guid? DoctorId { get; set; }
[Comment("首次登录需要修改密码")] [Comment("首次登录需要修改密码")]
public bool IsFirstAdd { get; set; } = true; public bool IsFirstAdd { get; set; } = true;
@ -82,21 +83,89 @@ public class User : BaseFullAuditEntity
public DateTime? LastLoginTime { get; set; } public DateTime? LastLoginTime { get; set; }
#endregion
[Comment("医生生成账号后,会有值")]
public Guid? DoctorId { get; set; }
public UserTypeEnum UserTypeEnum { get; set; } public UserTypeEnum UserTypeEnum { get; set; }
public Guid UserTypeId { get; set; } public Guid UserTypeId { get; set; }
#region 新增字段 #region 新增字段
[Comment("后续删除")]
public bool SuperAdmin { get; set; } public bool SuperAdmin { get; set; }
public bool IsUserRoleDisabled { get; set; }
public Guid IdentityUserId { get; set; } public Guid IdentityUserId { get; set; }
[Comment("多账号信息是否已经确认")] public bool IsUserRoleDisabled { get; set; }
public bool IsMutiAccountInfoConfirm { get; set; }
#endregion
}
[Comment("后台 - 系统真实账户表")]
[Table("IdentityUser")]
public class IdentityUser: BaseFullAuditEntity
{
public List<User> UserRoleList { get; set; } = new List<User>();
[Projectable]
public string FullName => LastName + " / " + FirstName;
#region 用户信息
public int Code { get; set; }
public string UserCode { get; set; }
public string UserName { get; set; }
public string EMail { get; set; }
[StringLength(1000)]
public string EmailToken { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Password { get; set; }
public bool PasswordChanged { get; set; }
public string Phone { get; set; }
public int? Sex { get; set; }
public UserStateEnum Status { get; set; } = UserStateEnum.Enable;
public string OrganizationName { get; set; }
public string PositionName { get; set; }
[Comment("自动切换下一个任务")]
public bool AutoCutNextTask { get; set; }
public string DepartmentName { get; set; }
[Comment("首次登录需要修改密码")]
public bool IsFirstAdd { get; set; } = true;
public bool IsTestUser { get; set; }
[Comment("内部用户 外部用户")]
public bool IsZhiZhun { get; set; }
[Comment("上一次修改密码的时间")]
public DateTime? LastChangePassWordTime { get; set; }
public string LastLoginIP { get; set; }
public DateTime? LastLoginTime { get; set; }
#endregion #endregion
} }

View File

@ -630,7 +630,7 @@ public class IRaCISDBContext : DbContext
public virtual DbSet<EventStoreRecord> EventStoreRecord { get; set; } public virtual DbSet<EventStoreRecord> EventStoreRecord { get; set; }
public virtual DbSet<IdentityUser> IdentityUser { get; set; }
} }

View File

@ -89,4 +89,17 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration
} }
} }
public class IdentityUserConfigration : IEntityTypeConfiguration<IdentityUser>
{
//当一个实体,针对同一个类,有两个一对一导航属性,但是是不同的外键,一个外键是一对一,一个是一对多,那么需要显示配置一对多的关系
public void Configure(EntityTypeBuilder<IdentityUser> builder)
{
builder.HasMany(s => s.UserRoleList)
.WithOne(t => t.IdentityUser)
.HasForeignKey(s => s.IdentityUserId);
}
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,132 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class AddIdentityUser : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "IsMutiAccountInfoConfirm",
table: "User");
migrationBuilder.AlterTable(
name: "User",
comment: "后台 - 系统账户角色关系表",
oldComment: "后台 - 系统账户");
migrationBuilder.AlterColumn<bool>(
name: "SuperAdmin",
table: "User",
type: "bit",
nullable: false,
comment: "后续删除",
oldClrType: typeof(bool),
oldType: "bit");
migrationBuilder.CreateTable(
name: "IdentityUser",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Code = table.Column<int>(type: "int", nullable: false),
UserCode = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
UserName = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
EMail = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
EmailToken = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: false),
FirstName = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
LastName = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
Password = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
PasswordChanged = table.Column<bool>(type: "bit", nullable: false),
Phone = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
Sex = table.Column<int>(type: "int", nullable: true),
Status = table.Column<int>(type: "int", nullable: false),
OrganizationName = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
PositionName = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
AutoCutNextTask = table.Column<bool>(type: "bit", nullable: false, comment: "自动切换下一个任务"),
DepartmentName = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
IsFirstAdd = table.Column<bool>(type: "bit", nullable: false, comment: "首次登录需要修改密码"),
IsTestUser = table.Column<bool>(type: "bit", nullable: false),
IsZhiZhun = table.Column<bool>(type: "bit", nullable: false, comment: "内部用户 外部用户"),
LastChangePassWordTime = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "上一次修改密码的时间"),
LastLoginIP = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
LastLoginTime = table.Column<DateTime>(type: "datetime2", nullable: true),
CreateUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
CreateTime = table.Column<DateTime>(type: "datetime2", nullable: false),
UpdateUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
UpdateTime = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_IdentityUser", x => x.Id);
table.ForeignKey(
name: "FK_IdentityUser_User_CreateUserId",
column: x => x.CreateUserId,
principalTable: "User",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
},
comment: "后台 - 系统真实账户表");
migrationBuilder.CreateIndex(
name: "IX_User_IdentityUserId",
table: "User",
column: "IdentityUserId");
migrationBuilder.CreateIndex(
name: "IX_IdentityUser_CreateUserId",
table: "IdentityUser",
column: "CreateUserId");
migrationBuilder.AddForeignKey(
name: "FK_User_IdentityUser_IdentityUserId",
table: "User",
column: "IdentityUserId",
principalTable: "IdentityUser",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_User_IdentityUser_IdentityUserId",
table: "User");
migrationBuilder.DropTable(
name: "IdentityUser");
migrationBuilder.DropIndex(
name: "IX_User_IdentityUserId",
table: "User");
migrationBuilder.AlterTable(
name: "User",
comment: "后台 - 系统账户",
oldComment: "后台 - 系统账户角色关系表");
migrationBuilder.AlterColumn<bool>(
name: "SuperAdmin",
table: "User",
type: "bit",
nullable: false,
oldClrType: typeof(bool),
oldType: "bit",
oldComment: "后续删除");
migrationBuilder.AddColumn<bool>(
name: "IsMutiAccountInfoConfirm",
table: "User",
type: "bit",
nullable: false,
defaultValue: false,
comment: "多账号信息是否已经确认");
}
}
}

View File

@ -2697,6 +2697,127 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
}); });
}); });
modelBuilder.Entity("IRaCIS.Core.Domain.Models.IdentityUser", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<bool>("AutoCutNextTask")
.HasColumnType("bit")
.HasComment("自动切换下一个任务");
b.Property<int>("Code")
.HasColumnType("int");
b.Property<DateTime>("CreateTime")
.HasColumnType("datetime2");
b.Property<Guid>("CreateUserId")
.HasColumnType("uniqueidentifier");
b.Property<string>("DepartmentName")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("EMail")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("EmailToken")
.IsRequired()
.HasMaxLength(1000)
.HasColumnType("nvarchar(1000)");
b.Property<string>("FirstName")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<bool>("IsFirstAdd")
.HasColumnType("bit")
.HasComment("首次登录需要修改密码");
b.Property<bool>("IsTestUser")
.HasColumnType("bit");
b.Property<bool>("IsZhiZhun")
.HasColumnType("bit")
.HasComment("内部用户 外部用户");
b.Property<DateTime?>("LastChangePassWordTime")
.HasColumnType("datetime2")
.HasComment("上一次修改密码的时间");
b.Property<string>("LastLoginIP")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<DateTime?>("LastLoginTime")
.HasColumnType("datetime2");
b.Property<string>("LastName")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("OrganizationName")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("Password")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<bool>("PasswordChanged")
.HasColumnType("bit");
b.Property<string>("Phone")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("PositionName")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<int?>("Sex")
.HasColumnType("int");
b.Property<int>("Status")
.HasColumnType("int");
b.Property<DateTime>("UpdateTime")
.HasColumnType("datetime2");
b.Property<Guid>("UpdateUserId")
.HasColumnType("uniqueidentifier");
b.Property<string>("UserCode")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.Property<string>("UserName")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
b.HasKey("Id");
b.HasIndex("CreateUserId");
b.ToTable("IdentityUser", t =>
{
t.HasComment("后台 - 系统真实账户表");
});
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.ImageShare", b => modelBuilder.Entity("IRaCIS.Core.Domain.Models.ImageShare", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
@ -12728,10 +12849,6 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.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");
@ -12789,7 +12906,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasColumnType("int"); .HasColumnType("int");
b.Property<bool>("SuperAdmin") b.Property<bool>("SuperAdmin")
.HasColumnType("bit"); .HasColumnType("bit")
.HasComment("后续删除");
b.Property<DateTime>("UpdateTime") b.Property<DateTime>("UpdateTime")
.HasColumnType("datetime2"); .HasColumnType("datetime2");
@ -12821,11 +12939,13 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.IsUnique() .IsUnique()
.HasFilter("[DoctorId] IS NOT NULL"); .HasFilter("[DoctorId] IS NOT NULL");
b.HasIndex("IdentityUserId");
b.HasIndex("UserTypeId"); b.HasIndex("UserTypeId");
b.ToTable("User", t => b.ToTable("User", t =>
{ {
t.HasComment("后台 - 系统账户"); t.HasComment("后台 - 系统账户角色关系表");
}); });
}); });
@ -14483,6 +14603,17 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Navigation("Site"); b.Navigation("Site");
}); });
modelBuilder.Entity("IRaCIS.Core.Domain.Models.IdentityUser", b =>
{
b.HasOne("IRaCIS.Core.Domain.Models.User", "CreateUser")
.WithMany()
.HasForeignKey("CreateUserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("CreateUser");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.InspectionFile", b => modelBuilder.Entity("IRaCIS.Core.Domain.Models.InspectionFile", b =>
{ {
b.HasOne("IRaCIS.Core.Domain.Models.User", "CreateUser") b.HasOne("IRaCIS.Core.Domain.Models.User", "CreateUser")
@ -17476,6 +17607,12 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.WithOne("User") .WithOne("User")
.HasForeignKey("IRaCIS.Core.Domain.Models.User", "DoctorId"); .HasForeignKey("IRaCIS.Core.Domain.Models.User", "DoctorId");
b.HasOne("IRaCIS.Core.Domain.Models.IdentityUser", "IdentityUser")
.WithMany("UserRoleList")
.HasForeignKey("IdentityUserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.UserType", "UserTypeRole") b.HasOne("IRaCIS.Core.Domain.Models.UserType", "UserTypeRole")
.WithMany("UserList") .WithMany("UserList")
.HasForeignKey("UserTypeId") .HasForeignKey("UserTypeId")
@ -17484,6 +17621,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Navigation("CreateUser"); b.Navigation("CreateUser");
b.Navigation("IdentityUser");
b.Navigation("UserTypeRole"); b.Navigation("UserTypeRole");
}); });
@ -17914,6 +18053,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Navigation("DoctorList"); b.Navigation("DoctorList");
}); });
modelBuilder.Entity("IRaCIS.Core.Domain.Models.IdentityUser", b =>
{
b.Navigation("UserRoleList");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.Menu", b => modelBuilder.Entity("IRaCIS.Core.Domain.Models.Menu", b =>
{ {
b.Navigation("UserTypeMenuList"); b.Navigation("UserTypeMenuList");