diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 88206247a..12f0cc3b5 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -12914,9 +12914,6 @@ Setting页面 为 site 勾选CRC用户列表 - - 项目参与人员退出 其中IQC退出 回去释放工作量 - 分页获取临床项目列表 默认后台加急状态为3 查所有的 @@ -17100,6 +17097,32 @@ + + + 维护用户角色表中的账户信息 + + + + + + + 维护用户角色表中的账户信息 + + + + + + + 账户日志 记录账户每次操作的信息 + + + + + + 账户日志 记录账户每次操作的信息 + + + 因为可能先一致性核查通过,生成其他标准的任务了,新签名的标准也需要产生任务 diff --git a/IRaCIS.Core.Application/Service/Common/MailService.cs b/IRaCIS.Core.Application/Service/Common/MailService.cs index 8d57b1160..665d2dc4f 100644 --- a/IRaCIS.Core.Application/Service/Common/MailService.cs +++ b/IRaCIS.Core.Application/Service/Common/MailService.cs @@ -30,7 +30,7 @@ namespace IRaCIS.Core.Application.Service Task AdminResetPwdSendEmailAsync(Guid userId, string pwdNotMd5 = "123456"); - Task SiteSurveyUserJoinEmail(Guid trialId, Guid userId, string baseUrl, string rootUrl); + Task SiteSurveyUserJoinEmail(Guid trialId, Guid userId, string userTypes, string baseUrl, string rootUrl); Task ExternalUserJoinEmail(Guid trialId, Guid userId, string userTypes, string baseUrl, string rootUrl); @@ -44,6 +44,7 @@ namespace IRaCIS.Core.Application.Service IRepository _visitTaskRepository, IRepository _trialSiteRepository, IRepository _userRoleRepository, + IRepository _userLogRepository, IRepository _identityUserRepository, IRepository _userFeedBackRepository, ITokenService _tokenService, @@ -301,8 +302,8 @@ namespace IRaCIS.Core.Application.Service var htmlBodyStr = string.Format(ReplaceCompanyName(input.htmlBodyStr), sysUserInfo.FullName, - sysUserInfo.UserName, - string.Join(',', sysUserInfo.UserRoleList.Select(t => t.UserTypeRole.UserTypeShortName)), + sysUserInfo.EMail, + //string.Join(',', sysUserInfo.UserRoleList.Select(t => t.UserTypeRole.UserTypeShortName)), redirectUrl ); @@ -339,7 +340,7 @@ namespace IRaCIS.Core.Application.Service sysUserInfo.FullName, sysUserInfo.UserName, - string.Join(',', sysUserInfo.UserRoleList.Select(t => t.UserTypeRole.UserTypeShortName)), + //string.Join(',', sysUserInfo.UserRoleList.Select(t => t.UserTypeRole.UserTypeShortName)), pwdNotMd5 ); @@ -470,7 +471,7 @@ namespace IRaCIS.Core.Application.Service trialInfo.ExperimentName, trialInfo.ResearchProgramNo, trialInfo.TrialCode, - sysUserInfo.UserName, + sysUserInfo.IsFirstAdd ? sysUserInfo.EMail : sysUserInfo.UserName, userTypes, sysUserInfo.IsFirstAdd ? redirectUrl : baseUrl ); @@ -484,15 +485,16 @@ namespace IRaCIS.Core.Application.Service await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig, null); + await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = _userInfo.IdentityUserId, ActionUserName = _userInfo.UserName, TargetIdentityUserId = userId, OptType = UserOptType.UpdateUserRole }, true); + } //Site调研 用户加入项目 - public async Task SiteSurveyUserJoinEmail(Guid trialId, Guid userId, string baseUrl, string rootUrl) + public async Task SiteSurveyUserJoinEmail(Guid trialId, Guid userId, string userTypes, string baseUrl, string rootUrl) { var sysUserInfo = (await _identityUserRepository.Where(t => t.Id == userId).FirstOrDefaultAsync()).IfNullThrowException(); - var userTypes = await _userRoleRepository.Where(t => t.IdentityUserId == sysUserInfo.Id).Select(t => t.UserTypeRole.UserTypeShortName).ToListAsync(); var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId); @@ -531,8 +533,8 @@ namespace IRaCIS.Core.Application.Service trialInfo.ExperimentName, trialInfo.ResearchProgramNo, trialInfo.TrialCode, - sysUserInfo.UserName, - string.Join(',', userTypes), + sysUserInfo.IsFirstAdd ? sysUserInfo.EMail : sysUserInfo.UserName, + userTypes, sysUserInfo.IsFirstAdd ? redirectUrl : baseUrl ); @@ -545,6 +547,7 @@ namespace IRaCIS.Core.Application.Service await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig); + await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = _userInfo.IdentityUserId, ActionUserName = _userInfo.UserName, TargetIdentityUserId = userId, OptType = UserOptType.UpdateUserRole }, true); } @@ -596,13 +599,30 @@ namespace IRaCIS.Core.Application.Service - await _userRoleRepository.SaveChangesAsync(); } else { - sysUserInfo = (await _identityUserRepository.Where(t => t.UserRoleList.Any(t => t.DoctorId == doctorId || t.IdentityUser.EMail == doctor.EMail)).Include(t => t.UserRoleList).FirstOrDefaultAsync()).IfNullThrowException(); + sysUserInfo = (await _identityUserRepository.Where(t => t.UserRoleList.Any(t => t.DoctorId == doctorId || t.IdentityUser.EMail == doctor.EMail), true).Include(t => t.UserRoleList).FirstOrDefaultAsync()).IfNullThrowException(); + + + var findRole = sysUserInfo.UserRoleList.FirstOrDefault(t => t.UserTypeId == userType.Id); + //不存在该角色,那么就加入该角色 + if (findRole == null) + { + sysUserInfo.UserRoleList.Add(new UserRole() { DoctorId = doctorId, UserTypeEnum = UserTypeEnum.IndependentReviewer, UserTypeId = userType.Id }); + } + else + { + findRole.IsUserRoleDisabled = false; + } + + sysUserInfo.Status = UserStateEnum.Enable; + } + + //保证能有userRoleId + await _userRoleRepository.SaveChangesAsync(); } @@ -645,8 +665,8 @@ namespace IRaCIS.Core.Application.Service trialInfo.ExperimentName, trialInfo.ResearchProgramNo, trialInfo.TrialCode, - sysUserInfo.UserName, - userType.UserTypeShortName, + sysUserInfo.IsFirstAdd ? sysUserInfo.EMail : sysUserInfo.UserName, + $"{userType.UserTypeShortName} ({userType.UserTypeName})", sysUserInfo.IsFirstAdd ? redirectUrl : baseUrl ); @@ -659,6 +679,9 @@ namespace IRaCIS.Core.Application.Service await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig, null); + await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = _userInfo.IdentityUserId, ActionUserName = _userInfo.UserName, TargetIdentityUserId = sysUserInfo.Id, OptType = UserOptType.UpdateUserRole }, true); + + return (sysUserInfo.Id, sysUserInfo.UserRoleList.First(t => t.UserTypeEnum == UserTypeEnum.IndependentReviewer).Id); } diff --git a/IRaCIS.Core.Application/Service/Management/UserService.cs b/IRaCIS.Core.Application/Service/Management/UserService.cs index f47188a63..dc43fb811 100644 --- a/IRaCIS.Core.Application/Service/Management/UserService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserService.cs @@ -503,8 +503,11 @@ namespace IRaCIS.Core.Application.Service var user = await _identityUserRepository.Where(t => t.Id == identityUserId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); - user.AccountList = await _userRoleRepository.Where(t => t.IdentityUserId == identityUserId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + if (user != null) + { + user.AccountList = await _userRoleRepository.Where(t => t.IdentityUserId == identityUserId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + } return user; } diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs index 03a1a5fbf..83a40e9a1 100644 --- a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs +++ b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs @@ -30,6 +30,8 @@ using IdentityModel; using Microsoft.AspNetCore.Components.Routing; using IRaCIS.Core.Application.ViewModel; using Microsoft.AspNetCore.Identity; +using NPOI.SS.Formula.Functions; +using System.Security.Policy; namespace IRaCIS.Core.Application.Contracts { @@ -522,7 +524,7 @@ namespace IRaCIS.Core.Application.Contracts } else if (verifyRecord.ExpirationTime < DateTime.Now) { - return ResponseOutput.NotOk(_localizer["TrialSiteSurvey_WrongVerificationCode"]); + return ResponseOutput.NotOk(_localizer["TrialSiteSurvey_ExpiredVerificationCode"]); } else { @@ -873,6 +875,7 @@ namespace IRaCIS.Core.Application.Contracts { //不存在该角色,那么就添加 var addRole = _mapper.Map(existSysUser); + addRole.Id = NewId.NextSequentialGuid(); addRole.UserTypeEnum = _userTypeRepository.Where(t => t.Id == userTypeId).Select(t => t.UserTypeEnum).First(); addRole.UserTypeId = userTypeId.Value; addRole.IsUserRoleDisabled = false; @@ -893,6 +896,7 @@ namespace IRaCIS.Core.Application.Contracts generateUser.IsTestUser = true; } + generateUser.Id = NewId.NextSequentialGuid(); // 外部人员生成账号 都是外部的 generateUser.IsZhiZhun = false; @@ -905,7 +909,7 @@ namespace IRaCIS.Core.Application.Contracts generateUser.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10)); - generateUser.Status = UserStateEnum.Disable; + generateUser.Status = UserStateEnum.Enable; generateUser.UserRoleList = new List() { }; @@ -935,7 +939,7 @@ namespace IRaCIS.Core.Application.Contracts var identityUserId = existSysUser.Id; - var findTrialUser = await _trialIdentityUserRepository.Where(t => t.TrialId == trialId && t.IdentityUserId == identityUserId, true).Include(t => t.TrialUserRoleList).ThenInclude(t => t.UserRole).FirstOrDefaultAsync(); + var findTrialUser = await _trialIdentityUserRepository.Where(t => t.TrialId == trialId && t.IdentityUserId == identityUserId, true, true).Include(t => t.TrialUserRoleList).ThenInclude(t => t.UserRole).FirstOrDefaultAsync(); var isNeedSendEmail = false; @@ -964,6 +968,16 @@ namespace IRaCIS.Core.Application.Contracts //有该人员 //是否有该角色 + + if (findTrialUser.IsDeleted == true) + { + findTrialUser.IsDeleted = false; + findTrialUser.DeletedTime = null; + findTrialUser.RemoveTime = null; + findTrialUser.JoinTime = DateTime.Now; + } + + foreach (var userTypeId in userTypeIdList) { var findTrialUserRole = findTrialUser.TrialUserRoleList.Where(t => t.UserRole.UserTypeId == userTypeId).FirstOrDefault(); @@ -991,7 +1005,12 @@ namespace IRaCIS.Core.Application.Contracts if (isNeedSendEmail) { - await _mailVerificationService.SiteSurveyUserJoinEmail(trialId, identityUserId, baseUrl, routeUrl); + + var dbUserType = _userTypeRepository.Where(t => userTypeIdList.Contains(t.Id)).ToList(); + + var usertyps = string.Join(',', dbUserType.Select(t => t.UserTypeName)); + + await _mailVerificationService.SiteSurveyUserJoinEmail(trialId, identityUserId, usertyps, baseUrl, routeUrl); } var userJoinIdList = item.Select(t => t.Id).ToList(); @@ -1061,6 +1080,7 @@ namespace IRaCIS.Core.Application.Contracts { //不存在该角色,那么就添加 var addRole = _mapper.Map(existSysUser); + addRole.Id = NewId.NextSequentialGuid(); addRole.UserTypeEnum = _userTypeRepository.Where(t => t.Id == userTypeId).Select(t => t.UserTypeEnum).First(); addRole.UserTypeId = userTypeId; addRole.IsUserRoleDisabled = false; @@ -1081,6 +1101,8 @@ namespace IRaCIS.Core.Application.Contracts generateUser.IsTestUser = true; } + generateUser.Id = NewId.NextSequentialGuid(); + // 外部人员生成账号 都是外部的 generateUser.IsZhiZhun = false; @@ -1090,10 +1112,9 @@ namespace IRaCIS.Core.Application.Contracts //generateUser.UserName = generateUser.UserCode; - generateUser.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10)); - generateUser.Status = UserStateEnum.Disable; + generateUser.Status = UserStateEnum.Enable; generateUser.UserRoleList = new List() { }; @@ -1123,7 +1144,7 @@ namespace IRaCIS.Core.Application.Contracts var identityUserId = existSysUser.Id; - var findTrialUser = await _trialIdentityUserRepository.Where(t => t.TrialId == trialId && t.IdentityUserId == identityUserId, true).Include(t => t.TrialUserRoleList).ThenInclude(t => t.UserRole).FirstOrDefaultAsync(); + var findTrialUser = await _trialIdentityUserRepository.Where(t => t.TrialId == trialId && t.IdentityUserId == identityUserId, true, true).Include(t => t.TrialUserRoleList).ThenInclude(t => t.UserRole).FirstOrDefaultAsync(); var isNeedSendEmail = false; @@ -1152,6 +1173,16 @@ namespace IRaCIS.Core.Application.Contracts //有该人员 //是否有该角色 + if (findTrialUser.IsDeleted == true) + { + findTrialUser.IsDeleted = false; + findTrialUser.DeletedTime = null; + findTrialUser.RemoveTime = null; + findTrialUser.JoinTime = DateTime.Now; + } + + + foreach (var userTypeId in userTypeIdList) { var findTrialUserRole = findTrialUser.TrialUserRoleList.Where(t => t.UserRole.UserTypeId == userTypeId).FirstOrDefault(); @@ -1177,9 +1208,46 @@ namespace IRaCIS.Core.Application.Contracts } + //加入到Site CRC + + foreach (var trialsSiteItem in addUserRoleList.GroupBy(t => t.TrialSiteId)) + { + var siteUserRoleList = trialsSiteItem.ToList(); + + foreach (var siteUserRole in siteUserRoleList) + { + var findUserRole = existSysUser.UserRoleList.Where(t => t.UserTypeId == siteUserRole.UserTypeId).FirstOrDefault(); + + if (findUserRole != null) + { + + var findTrialSiteUserRole = await _trialSiteUserRoleRepository.Where(t => t.TrialId == trialId && t.TrialSiteId == trialsSiteItem.Key && t.UserId == findUserRole.Id, true, true).FirstOrDefaultAsync(); + + if (findTrialSiteUserRole != null) + { + findTrialSiteUserRole.IsDeleted = false; + findTrialSiteUserRole.DeletedTime = null; + + } + else + { + await _trialSiteUserRoleRepository.AddAsync(new TrialSiteUserRole() { TrialId = trialId, TrialSiteId = trialsSiteItem.Key, UserId = findUserRole.Id }); + } + + } + else + { + throw new BusinessValidationFailedException("database dirty data ,pleasse check"); + } + } + + } + if (isNeedSendEmail) { - await _mailVerificationService.SiteSurveyUserJoinEmail(trialId, identityUserId, baseUrl, routeUrl); + var dbUserType = _userTypeRepository.Where(t => userTypeIdList.Contains(t.Id)).ToList(); + var usertyps = string.Join(',', dbUserType.Select(t => t.UserTypeName)); + await _mailVerificationService.SiteSurveyUserJoinEmail(trialId, identityUserId, usertyps, baseUrl, routeUrl); } await _trialSiteUserRoleRepository.SaveChangesAsync(); diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/_MapConfig.cs b/IRaCIS.Core.Application/Service/SiteSurvey/_MapConfig.cs index 80b34555b..b7353328d 100644 --- a/IRaCIS.Core.Application/Service/SiteSurvey/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/SiteSurvey/_MapConfig.cs @@ -93,8 +93,11 @@ namespace IRaCIS.Core.Application.AutoMapper .ForMember(d => d.UserTypeEnum, u => u.MapFrom(s => s.UserTypeRole.UserTypeEnum)); + CreateMap(); + CreateMap(); + } } } \ No newline at end of file diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialExternalUserService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialExternalUserService.cs index 27f02712a..f77d0e177 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialExternalUserService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialExternalUserService.cs @@ -277,7 +277,7 @@ namespace IRaCIS.Core.Application.Service generateUser.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10)); - generateUser.Status = UserStateEnum.Disable; + generateUser.Status = UserStateEnum.Enable; generateUser.UserRoleList = new List() { }; @@ -294,6 +294,10 @@ namespace IRaCIS.Core.Application.Service var newAddUser = await _identityUserRepository.AddAsync(generateUser); + + + existSysUser = newAddUser; + await _trialExternalUseRepository.BatchUpdateNoTrackingAsync(t => externalIdList.Contains(t.Id), u => new TrialExternalUser() { IsSystemUser = false, @@ -304,8 +308,6 @@ namespace IRaCIS.Core.Application.Service Phone = existSysUser.Phone, }); - existSysUser = newAddUser; - } await _identityUserRepository.SaveChangesAsync(); @@ -314,7 +316,7 @@ namespace IRaCIS.Core.Application.Service var identityUserId = existSysUser.Id; - var userTypeList = await _identityUserRepository.Where(t => t.Id == identityUserId).SelectMany(t => t.UserRoleList).Select(t => new { t.UserTypeId, t.UserTypeRole.UserTypeShortName }).ToListAsync(); + var userTypeList = await _identityUserRepository.Where(t => t.Id == identityUserId).SelectMany(t => t.UserRoleList).Select(t => new { t.UserTypeId, t.UserTypeRole.UserTypeName, t.UserTypeRole.UserTypeShortName }).ToListAsync(); var userHaveUserTypeIdList = userTypeList.Select(t => t.UserTypeId).ToList(); @@ -323,7 +325,7 @@ namespace IRaCIS.Core.Application.Service return ResponseOutput.NotOk("database dirty data "); } - var findTrialUser = await _trialIdentityUserRepository.Where(t => t.TrialId == trialId && t.IdentityUserId == identityUserId, true).Include(t => t.TrialUserRoleList).ThenInclude(t => t.UserRole).FirstOrDefaultAsync(); + var findTrialUser = await _trialIdentityUserRepository.Where(t => t.TrialId == trialId && t.IdentityUserId == identityUserId, true, true).Include(t => t.TrialUserRoleList).ThenInclude(t => t.UserRole).FirstOrDefaultAsync(); if (findTrialUser == null) { @@ -346,6 +348,14 @@ namespace IRaCIS.Core.Application.Service { //有该人员 + if (findTrialUser.IsDeleted == true) + { + findTrialUser.IsDeleted = false; + findTrialUser.DeletedTime = null; + findTrialUser.RemoveTime = null; + findTrialUser.JoinTime = DateTime.Now; + } + //是否有该角色 foreach (var userTypeId in userTypeIdList) @@ -373,7 +383,8 @@ namespace IRaCIS.Core.Application.Service await _trialIdentityUserRepository.SaveChangesAsync(); - var usertyps = string.Join(',', userTypeList.Where(t => userTypeIdList.Contains(t.UserTypeId)).Select(t => t.UserTypeShortName)); + + var usertyps = string.Join(',', userTypeList.Where(t => userTypeIdList.Contains(t.UserTypeId)).Select(t => t.UserTypeName)); await _mailVerificationService.ExternalUserJoinEmail(trialId, identityUserId, usertyps, sendEmail.BaseUrl, sendEmail.RouteUrl); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs index 185c13a10..2242e9d92 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs @@ -132,7 +132,7 @@ namespace IRaCIS.Core.Application.Service //之前已经选择的用户 不放在列表中,现在又要改回去 废弃 - var query = _userRoleRepository.Where(t => t.UserTypeEnum != UserTypeEnum.SuperAdmin) + var query = _userRoleRepository.Where(t => t.UserTypeEnum != UserTypeEnum.SuperAdmin && t.IdentityUser.Status == UserStateEnum.Enable) //正式或者培训的项目 不能允许测试用户(必须正式用户) 同时必须是内部的用户 .WhereIf(trialType == TrialType.OfficialTrial || trialType == TrialType.Training, t => t.IdentityUser.IsTestUser == false && t.IdentityUser.IsZhiZhun) @@ -184,7 +184,7 @@ namespace IRaCIS.Core.Application.Service var first = currentUserRoleList.FirstOrDefault(); - var findTrialuser = await _trialIdentityUserRepository.Where(t => t.TrialId == first.TrialId && t.IdentityUserId == item.Key, true).Include(t => t.TrialUserRoleList).FirstOrDefaultAsync(); + var findTrialuser = await _trialIdentityUserRepository.Where(t => t.TrialId == first.TrialId && t.IdentityUserId == item.Key, true, true).Include(t => t.TrialUserRoleList).FirstOrDefaultAsync(); if (findTrialuser == null) { @@ -201,6 +201,14 @@ namespace IRaCIS.Core.Application.Service } else { + if (findTrialuser.IsDeleted = true) + { + findTrialuser.IsDeleted = false; + findTrialuser.DeletedTime = null; + findTrialuser.JoinTime = DateTime.Now; + findTrialuser.RemoveTime = null; + } + findTrialuser.TrialUserRoleList.AddRange(currentUserRoleList.Select(t => new TrialUserRole() { UserId = t.UserId, TrialId = t.TrialId, TrialUserId = findTrialuser.Id }).ToList()); } @@ -238,45 +246,5 @@ namespace IRaCIS.Core.Application.Service - - - - - - - - /// 项目参与人员退出 其中IQC退出 回去释放工作量 - //[TrialAudit(AuditType.TrialAudit, AuditOptType.DeleteTrailStaff)] - [HttpDelete, Route("{id:guid}/{trialId:guid}/{isDelete:bool}")] - [TrialGlobalLimit("AfterStopCannNotOpt")] - [UnitOfWork] - [Obsolete] - public async Task DeleteMaintenanceUser(Guid id, bool isDelete) - { - - var trialUser = await _trialUseRoleRepository.AsQueryable().IgnoreQueryFilters().FirstOrDefaultAsync(t => t.Id == id); - - if (trialUser == null) return Null404NotFound(trialUser); - - if (await _trialSiteUserRoleRepository.AnyAsync(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId)) - { - //---人员已加入现场维护 - return ResponseOutput.NotOk(_localizer["TrialMaint_PersonnelJoined"]); - } - - if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC && isDelete) - { - await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.CurrentActionUserId == trialUser.UserId && t.TrialId == trialUser.TrialId && t.IsTake, u => new SubjectVisit() { CurrentActionUserId = null, CurrentActionUserExpireTime = null, IsTake = false }); - } - - await _trialUseRoleRepository.BatchUpdateNoTrackingAsync(t => t.Id == id, u => new TrialUserRole() { IsDeleted = isDelete, RemoveTime = isDelete ? DateTime.Now : null }); - - await _trialUseRoleRepository.SaveChangesAsync(); - - return ResponseOutput.Ok(); - } - - - } } diff --git a/IRaCIS.Core.Application/Service/WorkLoad/EnrollService.cs b/IRaCIS.Core.Application/Service/WorkLoad/EnrollService.cs index 826936f48..0a4ece20c 100644 --- a/IRaCIS.Core.Application/Service/WorkLoad/EnrollService.cs +++ b/IRaCIS.Core.Application/Service/WorkLoad/EnrollService.cs @@ -1,6 +1,7 @@ using DocumentFormat.OpenXml.Vml.Spreadsheet; using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Service.WorkLoad.DTO; +using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infra.EFCore.Common; using Microsoft.AspNetCore.Mvc; @@ -411,29 +412,51 @@ namespace IRaCIS.Core.Application.Service var (identityUserId, userRoleId) = await _mailVerificationService.DoctorJoinTrialEmail(trialId, intoGroupItem.DoctorId, confirmReviewerCommand.BaseUrl, confirmReviewerCommand.RouteUrl); - var findTrialUser = await _trialIdentityUserRepository.FirstOrDefaultAsync(t => t.IdentityUserId == identityUserId); - //项目中不存在 + var findTrialUser = await _trialIdentityUserRepository.Where(t => t.TrialId == trialId && t.IdentityUserId == identityUserId, true, true).Include(t => t.TrialUserRoleList).ThenInclude(t => t.UserRole).FirstOrDefaultAsync(); + if (findTrialUser == null) { - - await _trialIdentityUserRepository.AddAsync(new TrialIdentityUser() + //没有项目参与人员 + findTrialUser = await _trialIdentityUserRepository.AddAsync(new TrialIdentityUser() { - TrialId = trialId, IdentityUserId = identityUserId, + TrialId = trialId, JoinTime = DateTime.Now, + TrialUserRoleList = new List() { new TrialUserRole() { TrialId = trialId, UserId = userRoleId } } }); - } else { - if (!await _trialUserRoleRepository.AnyAsync(t => t.TrialId == trialId && t.UserId == userRoleId, true)) + + if (findTrialUser.IsDeleted == true) { - await _trialUserRoleRepository.AddAsync(new TrialUserRole() { TrialId = trialId, UserId = userRoleId, TrialUserId = findTrialUser.Id }); + findTrialUser.IsDeleted = false; + findTrialUser.DeletedTime = null; + findTrialUser.RemoveTime = null; + findTrialUser.JoinTime = DateTime.Now; + + } + + var findTrialUserRole = findTrialUser.TrialUserRoleList.Where(t => t.UserRole.UserTypeId == userRoleId).FirstOrDefault(); + + if (findTrialUserRole == null) + { + //添加该角色 + findTrialUser.TrialUserRoleList.Add(new TrialUserRole() { TrialUserId = findTrialUser.Id, TrialId = trialId, UserId = userRoleId }); + } + else + { + //如果禁用,那么启用 + if (findTrialUserRole.IsDeleted == true) + { + findTrialUserRole.IsDeleted = false; + findTrialUser.DeletedTime = null; + } + } } - await _userRoleRepository.BatchUpdateNoTrackingAsync(t => t.Id == userRoleId, u => new UserRole() { DoctorId = intoGroupItem.DoctorId }); await _enrollRepository.BatchUpdateNoTrackingAsync(t => t.Id == intoGroupItem.Id, u => new Enroll() { DoctorUserId = userRoleId }); diff --git a/IRaCIS.Core.Application/Triggers/AfterSaveTrigger/IdenttiyUserRoleInfoTrigger.cs b/IRaCIS.Core.Application/Triggers/AfterSaveTrigger/IdenttiyUserRoleInfoTrigger.cs index 9df9f4542..eee6976d3 100644 --- a/IRaCIS.Core.Application/Triggers/AfterSaveTrigger/IdenttiyUserRoleInfoTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/AfterSaveTrigger/IdenttiyUserRoleInfoTrigger.cs @@ -8,7 +8,11 @@ using System.Threading.Tasks; namespace IRaCIS.Core.Application.Triggers.AfterSaveTrigger { - + /// + /// 维护用户角色表中的账户信息 + /// + /// + /// public class IdenttiyUserRoleInfoTrigger(IRepository _identityUserRepository, IRepository _userRoleRepository) : IAfterSaveTrigger { public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) @@ -25,4 +29,7 @@ namespace IRaCIS.Core.Application.Triggers.AfterSaveTrigger }); } } + + + } diff --git a/IRaCIS.Core.Application/Triggers/AfterSaveTrigger/UserLogAfterTrigger.cs b/IRaCIS.Core.Application/Triggers/AfterSaveTrigger/UserLogAfterTrigger.cs index ce19b7e24..48c0017e0 100644 --- a/IRaCIS.Core.Application/Triggers/AfterSaveTrigger/UserLogAfterTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/AfterSaveTrigger/UserLogAfterTrigger.cs @@ -8,6 +8,10 @@ using System.Threading.Tasks; namespace IRaCIS.Core.Application.Triggers.AfterSaveTrigger { + /// + /// 账户日志 记录账户每次操作的信息 + /// + /// public class UserLogAfterTrigger(IRepository _identityUserRepository) : IAfterSaveTrigger { public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) @@ -58,4 +62,7 @@ namespace IRaCIS.Core.Application.Triggers.AfterSaveTrigger } } } + + + }