diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index 9822ca3e9..252dd9873 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -2209,7 +2209,7 @@
重置密码为 默认密码
-
+
@@ -2232,7 +2232,7 @@
(未登陆) 设置新密码
-
+
@@ -2249,13 +2249,6 @@
-
-
- 根据用户Id获取用户详细信息[New]
-
-
- xiuga
-
添加用户
@@ -2270,13 +2263,6 @@
-
-
- 删除用户
-
-
-
-
禁用或者启用账户
@@ -2285,7 +2271,7 @@
-
+
发送MFA 验证邮件
@@ -2310,6 +2296,23 @@
+
+
+ 账号验证,获取账号角色信息 获取临时token
+
+
+
+
+
+
+ 验证密码成功后,选定角色,然后获取当前角色的Token
+
+
+
+
+
+
+
获取数据库的表信息 以及字段信息
@@ -13117,6 +13120,12 @@
+
+
+ 用户多账号,初次维护数据
+
+
+
维护临床数据 --一定要在同步表前同步数据才行
@@ -17536,11 +17545,6 @@
GCP机构
-
-
- LastLoginIP
-
-
上一次修改密码的时间
diff --git a/IRaCIS.Core.Application/Service/Doctor/_MapConfig.cs b/IRaCIS.Core.Application/Service/Doctor/_MapConfig.cs
index 1c89b276e..54e1f6ac4 100644
--- a/IRaCIS.Core.Application/Service/Doctor/_MapConfig.cs
+++ b/IRaCIS.Core.Application/Service/Doctor/_MapConfig.cs
@@ -99,11 +99,7 @@ namespace IRaCIS.Core.Application.Service
CreateMap()
;
- CreateMap()
- .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();
CreateMap()
.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()
- .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()
+ // .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()
diff --git a/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs b/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs
index eed865cf6..12710c1fe 100644
--- a/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs
+++ b/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs
@@ -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 AccountList { get; set; } = new List();
}
@@ -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 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; }
- ///
- /// LastLoginIP
- ///
+ 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; }
///
/// 上一次修改密码的时间
///
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; }
+
}
///
@@ -208,11 +199,23 @@ namespace IRaCIS.Application.Contracts
public class UserCommand : UserInfo
{
+ public Guid? IdentityUserId { get; set; }
+
+ public List 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 RoleNameArray { get; set; } = new List();
- public IEnumerable RoleNameList { get; set; } = new List();
+ public Guid IdentityUserId { get; set; }
+
+ public string FullName { get; set; }
+
+
+ public List UserRoleList { get; set; }
}
- public class UserIdRoleName : RoleDTO
- {
- public Guid UserId { get; set; }
- }
- public class UserIdRoleNameList
- {
- public Guid UserId { get; set; }
- public IEnumerable RoleList { get; set; } = new List();
- }
+
public class AllowAnonymousResetPasswordCommand
diff --git a/IRaCIS.Core.Application/Service/Management/Interface/IUserService.cs b/IRaCIS.Core.Application/Service/Management/Interface/IUserService.cs
index dd3778899..5ca28d3f2 100644
--- a/IRaCIS.Core.Application/Service/Management/Interface/IUserService.cs
+++ b/IRaCIS.Core.Application/Service/Management/Interface/IUserService.cs
@@ -6,13 +6,13 @@ namespace IRaCIS.Core.Application.Service
public interface IUserService
{
Task> AddUser(UserCommand userAddModel);
- Task DeleteUser(Guid userId);
- Task GetUser(Guid id);
+ //Task DeleteUser(Guid userId);
+ //Task GetUser(Guid id);
Task> GetUserList(UserListQueryDTO param);
Task> Login(string userName, string password);
Task VerifyMFACodeAsync(Guid userId, string Code);
- Task SendMFAEmail(Guid userId, int mfaType = 0);
+ Task SendMFAEmail(Guid userId, UserMFAType mfaType = 0);
Task GetUserBasicInfo(Guid userId, string pwd);
Task ModifyPassword(EditPasswordCommand editPwModel);
Task ResetPassword(Guid userId);
diff --git a/IRaCIS.Core.Application/Service/Management/UserService.cs b/IRaCIS.Core.Application/Service/Management/UserService.cs
index da5edcef3..5cd66f644 100644
--- a/IRaCIS.Core.Application/Service/Management/UserService.cs
+++ b/IRaCIS.Core.Application/Service/Management/UserService.cs
@@ -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 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 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 InitSetUserNameAndPwd(Guid userId, string newUserName, string newPWd)
+ public async Task 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
///
/// 重置密码为 默认密码
///
- ///
+ ///
///
- [HttpGet("{userId:guid}")]
+ [HttpGet("{identityUserId:guid}")]
[UnitOfWork]
- public async Task ResetPassword(Guid userId)
+ public async Task 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
///
/// (未登陆) 设置新密码
///
- ///
+ ///
///
///
[AllowAnonymous]
[HttpGet("{userId:guid}/{newPwd}")]
- public async Task AnonymousSetPassword(Guid userId, string newPwd)
+ public async Task 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 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(_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);
}
- ///
- /// 根据用户Id获取用户详细信息[New]
- ///
- ///
- /// xiuga
- [HttpGet("{id:guid}")]
- public async Task GetUser(Guid id)
- {
- var userQuery = _userRepository.Where(t => t.Id == id).ProjectTo(_mapper.ConfigurationProvider);
- return await (userQuery.FirstOrDefaultAsync()).IfNullThrowException();
- }
+ /////
+ ///// 根据用户Id获取用户详细信息[New]
+ /////
+ /////
+ ///// xiuga
+ //[HttpGet("{id:guid}")]
+ //public async Task GetUser(Guid id)
+ //{
+ // var userQuery = _userRepository.Where(t => t.Id == id).ProjectTo(_mapper.ConfigurationProvider);
+ // return await (userQuery.FirstOrDefaultAsync()).IfNullThrowException();
+ //}
+
+ /////
+ ///// 删除用户
+ /////
+ /////
+ /////
+ //[HttpDelete("{userId:guid}")]
+ //public async Task 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);
+ //}
+
///
/// 添加用户
@@ -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(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
}
- ///
- /// 删除用户
- ///
- ///
- ///
- [HttpDelete("{userId:guid}")]
- public async Task 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);
- }
///
/// 禁用或者启用账户
@@ -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
///
///
[AllowAnonymous]
- public async Task SendMFAEmail(Guid userId, int mfaType)
+ public async Task 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 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 多账号修改
+
+ ///
+ /// 账号验证,获取账号角色信息 获取临时token
+ ///
+ ///
+ ///
+ [AllowAnonymous]
+ [HttpPost]
+ public async Task> GetUserLoginRoleList(IRCLoginDto loginDto,
+ [FromServices] ITokenService _tokenService,
+ [FromServices] IOptionsMonitor _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(cacheKey);
+
+ if (failCount == null)
+ {
+ failCount = 0;
+ }
+
+ //每次登录 都重置缓存时间
+ await _fusionCache.SetAsync(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(_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(_mapper.ConfigurationProvider).ToListAsync();
+ userLoginReturnModel.CompanyInfo = companyInfo;
+
+ return ResponseOutput.Ok(userLoginReturnModel);
+
+ }
+
+ ///
+ /// 验证密码成功后,选定角色,然后获取当前角色的Token
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public async Task 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
}
}
diff --git a/IRaCIS.Core.Application/Service/Management/_MapConfig.cs b/IRaCIS.Core.Application/Service/Management/_MapConfig.cs
index 38e720471..b90851205 100644
--- a/IRaCIS.Core.Application/Service/Management/_MapConfig.cs
+++ b/IRaCIS.Core.Application/Service/Management/_MapConfig.cs
@@ -74,18 +74,18 @@ namespace IRaCIS.Core.Application.Service
CreateMap()
.ForMember(d => d.UserType, u => u.MapFrom(t => t.UserTypeName));
- CreateMap()
- .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()
+ //.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()
- .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()
+ // .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()
.ForMember(d => d.UserRoleId, c => c.MapFrom(t => t.Id));
+ CreateMap();
+
}
}
diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs
index 16548150f..8c1466cc9 100644
--- a/IRaCIS.Core.Application/TestService.cs
+++ b/IRaCIS.Core.Application/TestService.cs
@@ -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();
}
+
+ ///
+ /// 用户多账号,初次维护数据
+ ///
+ ///
+ public async Task 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
{
diff --git a/IRaCIS.Core.Domain/Management/User.cs b/IRaCIS.Core.Domain/Management/User.cs
index b23d8a6ef..1e1706907 100644
--- a/IRaCIS.Core.Domain/Management/User.cs
+++ b/IRaCIS.Core.Domain/Management/User.cs
@@ -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
}
diff --git a/IRaCIS.Core.Domain/Management/UserLog.cs b/IRaCIS.Core.Domain/Management/UserLog.cs
index 58af47440..3c11a410a 100644
--- a/IRaCIS.Core.Domain/Management/UserLog.cs
+++ b/IRaCIS.Core.Domain/Management/UserLog.cs
@@ -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;
}
diff --git a/IRaCIS.Core.Domain/Management/UserPassWordLog.cs b/IRaCIS.Core.Domain/Management/UserPassWordLog.cs
index 858442a0f..07263be67 100644
--- a/IRaCIS.Core.Domain/Management/UserPassWordLog.cs
+++ b/IRaCIS.Core.Domain/Management/UserPassWordLog.cs
@@ -13,4 +13,6 @@ public class UserPassWordLog : BaseAddAuditEntity
[Comment("密码")]
public string PassWord { get; set; } = string.Empty;
+
+ public Guid IdentityUserId { get; set; }
}
diff --git a/IRaCIS.Core.Infra.EFCore/Migrations/20241223050707_UserModify.Designer.cs b/IRaCIS.Core.Infra.EFCore/Migrations/20241223050707_UserModify.Designer.cs
new file mode 100644
index 000000000..fc9c523a4
--- /dev/null
+++ b/IRaCIS.Core.Infra.EFCore/Migrations/20241223050707_UserModify.Designer.cs
@@ -0,0 +1,18229 @@
+//
+using System;
+using IRaCIS.Core.Infra.EFCore;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace IRaCIS.Core.Infra.EFCore.Migrations
+{
+ [DbContext(typeof(IRaCISDBContext))]
+ [Migration("20241223050707_UserModify")]
+ partial class UserModify
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.10")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.Attachment", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Code")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)")
+ .HasComment("编码");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("DoctorId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ExpiryDate")
+ .HasColumnType("datetime2")
+ .HasComment("过期时间");
+
+ b.Property("FileName")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("IsOfficial")
+ .HasColumnType("bit")
+ .HasComment("是否正式简历");
+
+ b.Property("Language")
+ .HasColumnType("int")
+ .HasComment("1 中文 2为英文");
+
+ b.Property("Path")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)")
+ .HasComment("文件类型名");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreateUserId");
+
+ b.HasIndex("DoctorId");
+
+ b.ToTable("Attachment", t =>
+ {
+ t.HasComment("医生 - 简历|证书 文档表");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.CRO", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CROCode")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("CROName")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("CRONameCN")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("IsTrialLevel")
+ .HasColumnType("bit")
+ .HasComment("是否是项目级别");
+
+ b.Property("TrialId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("UpdateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("UpdateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreateUserId");
+
+ b.ToTable("CROCompany", t =>
+ {
+ t.HasComment("机构 - CRO");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.CheckChallengeDialog", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("IsCRCNeedReply")
+ .HasColumnType("bit")
+ .HasComment("CRC是否需要回复 前端使用");
+
+ b.Property("ParamInfo")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)")
+ .HasComment("核查的检查信息Json");
+
+ b.Property("SubjectVisitId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("TalkContent")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("UserTypeEnum")
+ .HasColumnType("int")
+ .HasComment("核查过程中的操作用户类型");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreateUserId");
+
+ b.HasIndex("SubjectVisitId");
+
+ b.ToTable("CheckChallengeDialog", t =>
+ {
+ t.HasComment("一致性核查 - 对话记录表");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.ClinicalAnswerRowInfo", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ClinicalFormId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("表单Id");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("QuestionId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("问题Id");
+
+ b.Property("RowIndex")
+ .HasColumnType("int");
+
+ b.Property("SubjectId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("受试者Id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreateUserId");
+
+ b.ToTable("ClinicalAnswerRowInfo", t =>
+ {
+ t.HasComment("受试者 - 临床表单表格问题行记录");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.ClinicalDataSystemSet", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ClinicalDataLevel")
+ .HasColumnType("int");
+
+ b.Property("ClinicalDataSetEnName")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("ClinicalDataSetEnum")
+ .HasColumnType("int")
+ .HasComment("枚举(字典里面取的)");
+
+ b.Property("ClinicalDataSetName")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("ClinicalUploadType")
+ .HasColumnType("int")
+ .HasComment("上传方式");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CriterionEnumListStr")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("FileName")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("IsApply")
+ .HasColumnType("bit")
+ .HasComment("是否应用");
+
+ b.Property("IsEnable")
+ .HasColumnType("bit");
+
+ b.Property("Path")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("UploadRole")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreateUserId");
+
+ b.ToTable("ClinicalDataSystemSet", t =>
+ {
+ t.HasComment("系统 - 临床数据配置");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.ClinicalDataTrialSet", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ClinicalDataLevel")
+ .HasColumnType("int")
+ .HasComment("临床级别");
+
+ b.Property("ClinicalDataSetEnName")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("ClinicalDataSetName")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("ClinicalUploadType")
+ .HasColumnType("int")
+ .HasComment("上传方式");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CriterionEnumListStr")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("FileName")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("IsApply")
+ .HasColumnType("bit")
+ .HasComment("是否应用");
+
+ b.Property("IsConfirm")
+ .HasColumnType("bit");
+
+ b.Property("Path")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("SystemClinicalDataSetId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("TrialId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("UploadRole")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreateUserId");
+
+ b.HasIndex("SystemClinicalDataSetId");
+
+ b.HasIndex("TrialId");
+
+ b.ToTable("ClinicalDataTrialSet", t =>
+ {
+ t.HasComment("项目 - 临床数据适应标准配置");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.ClinicalForm", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CheckDate")
+ .HasColumnType("datetime2")
+ .HasComment("检查日期");
+
+ b.Property("ClinicalDataTrialSetId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("PicturePath")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)")
+ .HasComment("截图地址");
+
+ b.Property("ReadingId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SubjectId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("受试者Id");
+
+ b.Property("TrialId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("VisitId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ClinicalDataTrialSetId");
+
+ b.HasIndex("CreateUserId");
+
+ b.HasIndex("SubjectId");
+
+ b.ToTable("ClinicalForm", t =>
+ {
+ t.HasComment("受试者 - 临床表单");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.ClinicalQuestionAnswer", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Answer")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("ClinicalDataTrialSetId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ClinicalFormId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("表单Id");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("QuestionId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("问题Id");
+
+ b.Property("SubjectId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("受试者Id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ClinicalFormId");
+
+ b.HasIndex("CreateUserId");
+
+ b.ToTable("ClinicalQuestionAnswer", t =>
+ {
+ t.HasComment("受试者 - 临床表单问题答案");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.ClinicalTableAnswer", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Answer")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)")
+ .HasComment("答案");
+
+ b.Property("ClinicalFormId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("表单Id");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("QuestionId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("问题Id");
+
+ b.Property("RowId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("答案行的Id");
+
+ b.Property("SubjectId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("受试者Id");
+
+ b.Property("TableQuestionId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreateUserId");
+
+ b.HasIndex("RowId");
+
+ b.ToTable("ClinicalTableAnswer", t =>
+ {
+ t.HasComment("受试者 - 临床表单表格问题答案");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.CommonDocument", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("BusinessScenarioEnum")
+ .HasColumnType("int")
+ .HasComment("业务场景");
+
+ b.Property("Code")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CriterionTypeEnum")
+ .HasColumnType("int")
+ .HasComment("系统标准枚举");
+
+ b.Property("DeleteUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("DeletedTime")
+ .HasColumnType("datetime2");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("FileTypeEnum")
+ .HasColumnType("int")
+ .HasComment("类型-上传|导出|邮件附件");
+
+ b.Property("IsDeleted")
+ .HasColumnType("bit");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("NameCN")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("Path")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("UpdateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("UpdateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreateUserId");
+
+ b.ToTable("CommonDocument", t =>
+ {
+ t.HasComment("数据上传 | 数据导出 | 邮件附件 文件记录表 (需要同步)");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.CriterionNidusSystem", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CriterionId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("IsSystemCriterion")
+ .HasColumnType("bit");
+
+ b.Property("LesionType")
+ .HasColumnType("int")
+ .HasComment("病灶类型");
+
+ b.Property("OrganType")
+ .HasColumnType("int")
+ .HasComment("器官类型");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreateUserId");
+
+ b.HasIndex("CriterionId");
+
+ b.ToTable("CriterionNidusSystem", t =>
+ {
+ t.HasComment("系统标准 - 病灶器官表 (需要同步)");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.CriterionNidusTrial", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CriterionId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("LesionType")
+ .HasColumnType("int");
+
+ b.Property("OrganType")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreateUserId");
+
+ b.ToTable("CriterionNidusTrial", t =>
+ {
+ t.HasComment("项目标准 - 病灶器官表");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.DataInspection", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("BatchId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("批次Id");
+
+ b.Property("ChildrenTypeId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("子类");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreateUserName")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)")
+ .HasComment("创建人姓名");
+
+ b.Property("CreateUserRealName")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("DoctorUserId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("阅片医生");
+
+ b.Property("EntityName")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)")
+ .HasComment("被稽查实体名");
+
+ b.Property("GeneralId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("要稽查对象Id");
+
+ b.Property("IP")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("Identification")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)")
+ .HasComment("标识");
+
+ b.Property("IsFrontAdd")
+ .HasColumnType("bit")
+ .HasComment("是否是前端添加");
+
+ b.Property("IsSign")
+ .HasColumnType("bit");
+
+ b.Property("JsonDetail")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("LastJsonDetail")
+ .HasColumnType("nvarchar(max)")
+ .HasComment("上一条json");
+
+ b.Property("ModuleTypeId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ObjectRelationParentId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("被稽查对象外键1");
+
+ b.Property("ObjectRelationParentId2")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ObjectRelationParentId3")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ObjectTypeId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("OptTypeId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ParentId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("父ID");
+
+ b.Property("Reason")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("RoleName")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)")
+ .HasComment("角色名称");
+
+ b.Property("SignId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SubjectId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SubjectVisitId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("TrialId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("TrialReadingCriterionId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("TrialSiteId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("VisitStageId")
+ .HasColumnType("uniqueidentifier")
+ .HasComment("访视计划ID");
+
+ b.Property("VisitTaskId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreateUserId");
+
+ b.HasIndex("TrialReadingCriterionId");
+
+ b.HasIndex("VisitTaskId");
+
+ b.ToTable("DataInspection", t =>
+ {
+ t.HasComment("稽查 - 记录表");
+ });
+ });
+
+ modelBuilder.Entity("IRaCIS.Core.Domain.Models.DicomInstance", b =>
+ {
+ b.Property("SeqId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Anonymize")
+ .HasColumnType("bit");
+
+ b.Property("CPIStatus")
+ .HasColumnType("bit");
+
+ b.Property("CreateTime")
+ .HasColumnType("datetime2");
+
+ b.Property("CreateUserId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("FileSize")
+ .HasColumnType("bigint");
+
+ b.Property("FrameOfReferenceUID")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("HtmlPath")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ImageColumns")
+ .HasColumnType("int");
+
+ b.Property("ImageRows")
+ .HasColumnType("int");
+
+ b.Property("ImagerPixelSpacing")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("InstanceNumber")
+ .HasColumnType("int");
+
+ b.Property("InstanceTime")
+ .HasColumnType("datetime2");
+
+ b.Property("NumberOfFrames")
+ .HasColumnType("int");
+
+ b.Property("Path")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("PixelSpacing")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("SeriesId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SeriesInstanceUid")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("SliceLocation")
+ .HasColumnType("int");
+
+ b.Property("SliceThickness")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("SopInstanceUid")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("StudyId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("StudyInstanceUid")
+ .IsRequired()
+ .HasMaxLength(400)
+ .HasColumnType("nvarchar(400)");
+
+ b.Property("SubjectId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SubjectVisitId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("TrialId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("UpdateTime")
+ .HasColumnType("datetime2");
+
+ b.Property