diff --git a/IRaCIS.Core.Application/Service/Common/MailService.cs b/IRaCIS.Core.Application/Service/Common/MailService.cs index e15e61e3e..e2c2e6c02 100644 --- a/IRaCIS.Core.Application/Service/Common/MailService.cs +++ b/IRaCIS.Core.Application/Service/Common/MailService.cs @@ -32,7 +32,7 @@ namespace IRaCIS.Core.Application.Service Task SiteSurveyUserJoinEmail(Guid trialId, Guid userId, string baseUrl, string rootUrl); - Task ExternalUserJoinEmail(Guid trialId, Guid userId,string userTypes, string baseUrl, string rootUrl); + Task ExternalUserJoinEmail(Guid trialId, Guid userId, string userTypes, string baseUrl, string rootUrl); Task<(Guid identityUserId, Guid userRoleId)> DoctorJoinTrialEmail(Guid trialId, Guid doctorId, string baseUrl, string rootUrl); @@ -434,8 +434,8 @@ namespace IRaCIS.Core.Application.Service var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId)).IfNullThrowException(); var sysUserInfo = (await _identityUserRepository.Where(t => t.Id == userId).FirstOrDefaultAsync()).IfNullThrowException(); - - var messageToSend = new MimeMessage(); + + var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); //收件地址 @@ -453,7 +453,7 @@ namespace IRaCIS.Core.Application.Service var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); - var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; + var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}"; @@ -471,7 +471,7 @@ namespace IRaCIS.Core.Application.Service trialInfo.ResearchProgramNo, trialInfo.TrialCode, sysUserInfo.UserName, - userTypes, + userTypes, sysUserInfo.IsFirstAdd ? redirectUrl : baseUrl ); @@ -512,7 +512,7 @@ namespace IRaCIS.Core.Application.Service await _identityUserRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new Domain.Models.IdentityUser() { EmailToken = token }); } - var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; + var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); @@ -623,7 +623,7 @@ namespace IRaCIS.Core.Application.Service await _identityUserRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new Domain.Models.IdentityUser() { EmailToken = token }); } - var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; + var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); diff --git a/IRaCIS.Core.Application/Service/Management/_MapConfig.cs b/IRaCIS.Core.Application/Service/Management/_MapConfig.cs index 65062672c..2ebb3d732 100644 --- a/IRaCIS.Core.Application/Service/Management/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Management/_MapConfig.cs @@ -166,6 +166,9 @@ namespace IRaCIS.Core.Application.Service CreateMap(); + + CreateMap(); + } } diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs index 973b69a9d..5a2150498 100644 --- a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs +++ b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs @@ -28,6 +28,8 @@ using StackExchange.Redis; using Panda.DynamicWebApi.Attributes; using IdentityModel; using Microsoft.AspNetCore.Components.Routing; +using IRaCIS.Core.Application.ViewModel; +using Microsoft.AspNetCore.Identity; namespace IRaCIS.Core.Application.Contracts { @@ -1078,7 +1080,6 @@ namespace IRaCIS.Core.Application.Contracts public async Task ImportGenerateAccountAndJoinTrialAsync(Guid trialId, string baseUrl, string routeUrl, List list) { - var trialType = _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialType).FirstOrDefault(); @@ -1088,55 +1089,36 @@ namespace IRaCIS.Core.Application.Contracts var first = addUserRoleList.FirstOrDefault(); - //找下系统中是否存在该用户类型的 并且邮箱 或者手机的账户 - var sysUserInfo = await _identityUserRepository.Where(t => t.EMail == item.Key, true).Include(t => t.UserRoleList).FirstOrDefaultAsync(); + var userEmail = item.Key; - if (sysUserInfo == null) + var userTypeIdList = item.Select(t => t.UserTypeId).ToList(); + + var existSysUser = await _identityUserRepository.Where(t => t.EMail == userEmail, true).Include(t => t.UserRoleList).FirstOrDefaultAsync(); + + if (existSysUser != null) { - var @lock = _distributedLockProvider.CreateLock($"UserCode"); - using (await @lock.AcquireAsync()) + //账号状态设置为启用 + existSysUser.Status = UserStateEnum.Enable; + + foreach (var userTypeId in userTypeIdList) { - var saveItem = _mapper.Map(first); + var findRole = existSysUser.UserRoleList.FirstOrDefault(t => t.UserTypeId == userTypeId); - - if (trialType == TrialType.NoneOfficial) + if (findRole != null) { - saveItem.IsTestUser = true; + //存在该角色,设置为启用 + findRole.IsUserRoleDisabled = false; } - - // 中心调研生成账号 都是外部的 - saveItem.IsZhiZhun = false; - saveItem.Code = _identityUserRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1; - - saveItem.UserCode = AppSettings.GetCodeStr(saveItem.Code, nameof(IdentityUser)); - - saveItem.UserName = saveItem.UserCode; - - saveItem.UserRoleList = new List(); - - foreach (var addUserRole in addUserRoleList) + else { - addUserRole.IsGeneratedAccount = true; - - //var trialSiteId = addUserRole.TrialSiteId; - - var addRole = _mapper.Map(saveItem); - - addRole.UserTypeEnum = addUserRole.UserTypeEnum; - addRole.UserTypeId = addUserRole.UserTypeId; - - saveItem.UserRoleList.Add(addRole); - + //不存在该角色,那么就添加 + var addRole = _mapper.Map(existSysUser); + addRole.UserTypeEnum = _userTypeRepository.Where(t => t.Id == userTypeId).Select(t => t.UserTypeEnum).First(); + addRole.UserTypeId = userTypeId; + addRole.IsUserRoleDisabled = false; + existSysUser.UserRoleList.Add(addRole); } - - - var newUser = await _identityUserRepository.AddAsync(saveItem); - - await _identityUserRepository.SaveChangesAsync(); - - sysUserInfo = newUser; - } @@ -1144,86 +1126,114 @@ namespace IRaCIS.Core.Application.Contracts else { - foreach (var addUserRole in addUserRoleList) + //生成账户 并插入 + var generateUser = _mapper.Map(first); + + if (trialType == TrialType.NoneOfficial) { - var find = sysUserInfo.UserRoleList.FirstOrDefault(t => t.UserTypeEnum == addUserRole.UserTypeEnum && t.UserTypeId == addUserRole.UserTypeId); - - if (find != null && find.IsUserRoleDisabled == true) - { - find.IsUserRoleDisabled = false; - - } - else - { - var addRole = _mapper.Map(sysUserInfo); - - addRole.Id = NewId.NextSequentialGuid(); - addRole.IdentityUserId = sysUserInfo.Id; - addRole.UserTypeEnum = addUserRole.UserTypeEnum; - addRole.UserTypeId = addUserRole.UserTypeId; - - sysUserInfo.UserRoleList.Add(addRole); - } + generateUser.IsTestUser = true; } - await _identityUserRepository.SaveChangesAsync(); + // 外部人员生成账号 都是外部的 + generateUser.IsZhiZhun = false; + + generateUser.Code = _identityUserRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1; + + generateUser.UserCode = AppSettings.GetCodeStr(generateUser.Code, nameof(IdentityUser)); + + //generateUser.UserName = generateUser.UserCode; + + + generateUser.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10)); + + generateUser.Status = UserStateEnum.Disable; + + generateUser.UserRoleList = new List() { }; + + foreach (var userTypeId in userTypeIdList) + { + var addRole = _mapper.Map(generateUser); + + addRole.Id = NewId.NextSequentialGuid(); + + addRole.UserTypeEnum = _userTypeRepository.Where(t => t.Id == userTypeId).Select(t => t.UserTypeEnum).First(); + + addRole.UserTypeId = userTypeId; + + generateUser.UserRoleList.Add(addRole); + } + + var newAddUser = await _identityUserRepository.AddAsync(generateUser); + + + existSysUser = newAddUser; } - var userId = sysUserInfo.Id; + await _identityUserRepository.SaveChangesAsync(); - //判断是否加入到项目 - var findTrialUser = await _trialIdentityUserRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.IdentityUserId == userId, true); + 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 isNeedSendEmail = false; if (findTrialUser == null) { - - await _trialIdentityUserRepository.AddAsync(new TrialIdentityUser() + //没有项目参与人员 + findTrialUser = await _trialIdentityUserRepository.AddAsync(new TrialIdentityUser() { + IdentityUserId = identityUserId, TrialId = trialId, - IdentityUserId = userId, JoinTime = DateTime.Now, - TrialUserRoleList = - sysUserInfo.UserRoleList.Select(t => new TrialUserRole() { TrialId = trialId, UserId = t.Id }).ToList() + + TrialUserRoleList = userTypeIdList.Select(u => new TrialUserRole() + { + TrialId = trialId, + UserId = existSysUser.UserRoleList.FirstOrDefault(t => t.UserTypeId == u).Id, + + }).ToList() }); - await _mailVerificationService.SiteSurveyUserJoinEmail(trialId, userId, baseUrl, routeUrl); - + isNeedSendEmail = true; } - else if (findTrialUser.IsDeleted == true) + else { - await _trialIdentityUserRepository.UpdatePartialFromQueryAsync(t => t.TrialId == trialId && t.IdentityUserId == userId, c => new TrialIdentityUser() + //有该人员 + //是否有该角色 + + foreach (var userTypeId in userTypeIdList) { - IsDeleted = false, - DeletedTime = null, - JoinTime = DateTime.Now, - }); + var findTrialUserRole = findTrialUser.TrialUserRoleList.Where(t => t.UserRole.UserTypeId == userTypeId).FirstOrDefault(); - await _mailVerificationService.SiteSurveyUserJoinEmail(trialId, userId, baseUrl, routeUrl); - } + if (findTrialUserRole == null) + { + isNeedSendEmail = true; + //添加该角色 + findTrialUser.TrialUserRoleList.Add(new TrialUserRole() { TrialUserId = findTrialUser.Id, TrialId = trialId, UserId = existSysUser.UserRoleList.FirstOrDefault(t => t.UserTypeId == userTypeId).Id }); + } + else + { + //如果禁用,那么启用 + if (findTrialUserRole.IsDeleted == true) + { + findTrialUserRole.IsDeleted = false; + findTrialUserRole.DeletedTime = null; + } - - foreach (var userRole in addUserRoleList) - { - var userRoleId = sysUserInfo.UserRoleList.Where(t => t.UserTypeId == userRole.UserTypeId).First().Id; - - var findTrialSiteUser = await _trialSiteUserRoleRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.UserId == userRoleId && t.TrialSiteId == userRole.TrialSiteId, true); - if (findTrialSiteUser == null) - { - await _trialSiteUserRoleRepository.AddAsync(new TrialSiteUserRole() { TrialId = trialId, TrialSiteId = userRole.TrialSiteId, UserId = userRoleId }); + } } - else - { - findTrialSiteUser.IsDeleted = false; - findTrialSiteUser.DeletedTime = null; - } - - findTrialSiteUser.IsDeleted = false; } + if (isNeedSendEmail) + { + await _mailVerificationService.SiteSurveyUserJoinEmail(trialId, identityUserId, baseUrl, routeUrl); + } await _trialSiteUserRoleRepository.SaveChangesAsync(); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialExternalUserViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialExternalUserViewModel.cs index 4a0cdeebc..93311c74f 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialExternalUserViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialExternalUserViewModel.cs @@ -171,8 +171,7 @@ namespace IRaCIS.Core.Application.ViewModel public bool IsSystemUser { get; set; } - [NotDefault] - public Guid SystemUserId { get; set; } + //public Guid SystemUserId { get; set; } [NotDefault] public Guid UserTypeId { get; set; } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialExternalUserService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialExternalUserService.cs index df25aa2e2..27f02712a 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialExternalUserService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialExternalUserService.cs @@ -16,6 +16,7 @@ using Microsoft.AspNetCore.Mvc; using DocumentFormat.OpenXml.Spreadsheet; using IRaCIS.Core.Domain.Models; using IRaCIS.Application.Contracts; +using MassTransit; namespace IRaCIS.Core.Application.Service { @@ -76,7 +77,7 @@ namespace IRaCIS.Core.Application.Service if (existSysUser.LastName != addOrEditTrialExternalUser.LastName || existSysUser.FirstName != addOrEditTrialExternalUser.FirstName) { //$"该用户在系统中的用户名为:{existSysUser.LastName + " / " + existSysUser.FirstName} 电话:{existSysUser.Phone},与填写信息存在不一致项, 请将界面信息修改为与系统一致,再进行保存", - return ResponseOutput.NotOk(_localizer["TrialExternalUser_Inconsistency", existSysUser.LastName + " / " + existSysUser.FirstName, existSysUser.Phone], new { existSysUser.LastName, existSysUser.FirstName, existSysUser.Phone, existSysUser.IsZhiZhun, existSysUser.IsTestUser }, ApiResponseCodeEnum.NeedTips); + return ResponseOutput.NotOk(_localizer["TrialExternalUser_Inconsistency", existSysUser.LastName + " / " + existSysUser.FirstName, existSysUser.Phone], new { existSysUser.LastName, existSysUser.FirstName, existSysUser.Phone, existSysUser.OrganizationName, existSysUser.IsZhiZhun, existSysUser.IsTestUser }, ApiResponseCodeEnum.NeedTips); } } @@ -147,7 +148,7 @@ namespace IRaCIS.Core.Application.Service Id = addEntity.Id, Email=addEntity.Email, IsSystemUser=addEntity.IsSystemUser, - SystemUserId=addEntity.SystemUserId, + //SystemUserId=addEntity.SystemUserId, UserTypeId=addOrEditTrialExternalUser.UserTypeId } } @@ -256,7 +257,7 @@ namespace IRaCIS.Core.Application.Service { //生成账户 并插入 - var externalUser = _trialExternalUseRepository.FirstOrDefaultAsync(t => t.Id == itemFirst.Id); + var externalUser = await _trialExternalUseRepository.FirstOrDefaultAsync(t => t.Id == itemFirst.Id); var generateUser = _mapper.Map(externalUser); if (trialType == TrialType.NoneOfficial) @@ -269,10 +270,9 @@ namespace IRaCIS.Core.Application.Service generateUser.Code = _identityUserRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1; - generateUser.UserCode = AppSettings.GetCodeStr(generateUser.Code, nameof(IdentityUser)); - generateUser.UserName = generateUser.UserCode; + //generateUser.UserName = generateUser.UserCode; generateUser.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10)); @@ -285,8 +285,8 @@ namespace IRaCIS.Core.Application.Service { var addRole = _mapper.Map(generateUser); + addRole.Id = NewId.NextSequentialGuid(); addRole.UserTypeEnum = _userTypeRepository.Where(t => t.Id == userTypeId).Select(t => t.UserTypeEnum).First(); - addRole.UserTypeId = userTypeId; generateUser.UserRoleList.Add(addRole); @@ -294,7 +294,15 @@ namespace IRaCIS.Core.Application.Service var newAddUser = await _identityUserRepository.AddAsync(generateUser); - await _trialExternalUseRepository.BatchUpdateNoTrackingAsync(t => externalIdList.Contains(t.Id), u => new TrialExternalUser() { IsSystemUser = false, SystemUserId = newAddUser.Id }); + await _trialExternalUseRepository.BatchUpdateNoTrackingAsync(t => externalIdList.Contains(t.Id), u => new TrialExternalUser() + { + IsSystemUser = false, + SystemUserId = newAddUser.Id, + FirstName = existSysUser.FirstName, + LastName = existSysUser.LastName, + OrganizationName = existSysUser.OrganizationName, + Phone = existSysUser.Phone, + }); existSysUser = newAddUser; @@ -315,7 +323,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).FirstOrDefaultAsync(); + var findTrialUser = await _trialIdentityUserRepository.Where(t => t.TrialId == trialId && t.IdentityUserId == identityUserId, true).Include(t => t.TrialUserRoleList).ThenInclude(t => t.UserRole).FirstOrDefaultAsync(); if (findTrialUser == null) { @@ -329,7 +337,7 @@ namespace IRaCIS.Core.Application.Service TrialUserRoleList = userTypeIdList.Select(u => new TrialUserRole() { TrialId = trialId, - UserId = existSysUser.UserRoleList.FirstOrDefault(t=>t.UserTypeId==u).Id, + UserId = existSysUser.UserRoleList.FirstOrDefault(t => t.UserTypeId == u).Id, }).ToList() }); @@ -342,12 +350,12 @@ namespace IRaCIS.Core.Application.Service foreach (var userTypeId in userTypeIdList) { - var findTrialUserRole = findTrialUser.TrialUserRoleList.Where(t => t.UserId == userTypeId).FirstOrDefault(); + var findTrialUserRole = findTrialUser.TrialUserRoleList.Where(t => t.UserRole.UserTypeId == userTypeId).FirstOrDefault(); if (findTrialUserRole == null) { //添加该角色 - findTrialUser.TrialUserRoleList.Add(new TrialUserRole() { TrialUserId = findTrialUser.Id, TrialId = trialId, UserId = existSysUser.UserRoleList.FirstOrDefault(t => t.UserTypeId == userTypeId).Id }); + findTrialUser.TrialUserRoleList.Add(new TrialUserRole() { TrialUserId = findTrialUser.Id, TrialId = trialId, UserId = existSysUser.UserRoleList.FirstOrDefault(t => t.UserTypeId == userTypeId).Id }); } else { @@ -362,9 +370,10 @@ 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.UserTypeShortName)); await _mailVerificationService.ExternalUserJoinEmail(trialId, identityUserId, usertyps, sendEmail.BaseUrl, sendEmail.RouteUrl);