diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs index 5a2150498..42fa359e9 100644 --- a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs +++ b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs @@ -818,20 +818,8 @@ namespace IRaCIS.Core.Application.Contracts var allUserList = _trialSiteUserSurveyRepository.Where(t => t.TrialSiteSurveyId == trialSiteSurveyId).ProjectTo(_mapper.ConfigurationProvider).ToList(); - //已生成的不管 管的只需要是 生成失败的并且需要生成账号的 - var needGenerateList = allUserList.Where(t => t.IsHistoryUser == false && t.IsGenerateAccount && t.IsJoin != true).ToList(); + await GenerateAccountAndSendEmail(trialId, trialSiteSurveyId, trialSiteSurvey.TrialSiteId, siteSurvyeSubmit.BaseUrl, siteSurvyeSubmit.RouteUrl, allUserList); - await GenerateAccountAsync(needGenerateList, trialId); - - //新加入的 或者历史人员退出改为加入的 - var needSendEmailList = allUserList.Where(t => (t.IsHistoryUser == false && t.IsGenerateAccount && t.IsJoin != true) || (t.IsHistoryUser == true && t.IsHistoryUserOriginDeleted == true && t.IsHistoryUserDeleted == false)).ToList(); - - await SendSiteSurveyUserJoinEmail(new TrialSiteUserSurveyJoinCommand() { TrialId = trialId, TrialSiteSurveyId = trialSiteSurveyId, RouteUrl = siteSurvyeSubmit.RouteUrl, BaseUrl = siteSurvyeSubmit.BaseUrl, UserList = needSendEmailList }); - - - var needQuitUserList = allUserList.Where(t => t.IsHistoryUser && t.IsHistoryUserOriginDeleted == false && t.IsHistoryUserDeleted == true).ToList(); - - await DealSiteUserQuitSiteAsync(trialId, trialSiteSurvey.TrialSiteId, needQuitUserList); //将历史锁定的调研表废弃 await _trialSiteSurveyRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.TrialSiteId == trialSiteSurvey.TrialSiteId && t.State == TrialSiteSurveyEnum.PMCreatedAndLock && t.Id != trialSiteSurveyId, z => new TrialSiteSurvey() { IsDeleted = true }); @@ -842,238 +830,196 @@ namespace IRaCIS.Core.Application.Contracts } - - private async Task GenerateAccountAsync(List needGenerateList, Guid trialId) + private async Task GenerateAccountAndSendEmail(Guid trialId, Guid trialSiteSurveyId, Guid trialSiteId, string baseUrl, string routeUrl, List allUserList) { + //已生成的不管 管的只需要是 生成失败的并且需要生成账号的 + var needGenerateList = allUserList.Where(t => t.IsHistoryUser == false && t.IsGenerateAccount && t.IsJoin != true).ToList(); + + //新加入的 或者历史人员退出改为加入的 + var needSendEmailList = allUserList.Where(t => (t.IsHistoryUser == false && t.IsGenerateAccount && t.IsJoin != true) || (t.IsHistoryUser == true && t.IsHistoryUserOriginDeleted == true && t.IsHistoryUserDeleted == false)).ToList(); + + var trialType = _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialType).FirstOrDefault(); foreach (var item in needGenerateList.GroupBy(t => t.Email)) { - var addUserRoleList = item.ToList(); - //找下系统中是否存在该用户类型的 并且邮箱 或者手机的账户 - var sysUserInfo = await _identityUserRepository.Where(t => t.EMail == item.Key, true).Include(t => t.UserRoleList).FirstOrDefaultAsync(); + var first = addUserRoleList.FirstOrDefault(); + 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"); + //账号状态设置为启用 + existSysUser.Status = UserStateEnum.Enable; - using (await @lock.AcquireAsync()) + foreach (var userTypeId in userTypeIdList) { - var saveItem = _mapper.Map(item); + 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.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10)); - - - var userTypeIds = addUserRoleList.Select(t => t.UserTypeId).ToList(); - - var userTypeList = _userTypeRepository.Where(t => userTypeIds.Contains(t.Id)).Select(t => new { t.UserTypeEnum, UserTypeId = t.Id }).ToList(); - - saveItem.UserRoleList = new List(); - - foreach (var addUserRole in addUserRoleList) + else { - - - var addRole = _mapper.Map(saveItem); - - addRole.UserTypeEnum = userTypeList.First(t => t.UserTypeId == addRole.UserTypeId).UserTypeEnum; - addRole.UserTypeId = (Guid)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.Value; + addRole.IsUserRoleDisabled = false; + existSysUser.UserRoleList.Add(addRole); } - - - var newUser = await _identityUserRepository.AddAsync(saveItem); - - await _identityUserRepository.SaveChangesAsync(); - - sysUserInfo = newUser; - - foreach (var addUserRole in addUserRoleList) - { - //发送邮件的时候需要用到该字段 - addUserRole.SystemUserId = sysUserInfo.Id; - } - } - var trialSiteUserIdList = addUserRoleList.Select(t => t.Id).ToList(); - - await _trialSiteUserSurveyRepository.BatchUpdateNoTrackingAsync(t => trialSiteUserIdList.Contains(t.Id), u => new TrialSiteUserSurvey() { IsGenerateSuccess = true, SystemUserId = sysUserInfo.Id }); - } else { - var userTypeIds = addUserRoleList.Select(t => t.UserTypeId).ToList(); + //生成账户 并插入 + var generateUser = _mapper.Map(first); - var userTypeList = _userTypeRepository.Where(t => userTypeIds.Contains(t.Id)).Select(t => new { t.UserTypeEnum, UserTypeId = t.Id }).ToList(); - - foreach (var addUserRole in addUserRoleList) + if (trialType == TrialType.NoneOfficial) { - var find = sysUserInfo.UserRoleList.FirstOrDefault(t => 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 = userTypeList.First(t => t.UserTypeId == addRole.UserTypeId).UserTypeEnum; - addRole.UserTypeId = (Guid)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.Value; + + generateUser.UserRoleList.Add(addRole); + } + + var newAddUser = await _identityUserRepository.AddAsync(generateUser); + + + existSysUser = newAddUser; + } + await _identityUserRepository.SaveChangesAsync(); - - } - - await _trialSiteUserSurveyRepository.SaveChangesAsync(); - } + var identityUserId = existSysUser.Id; - private async Task SendSiteSurveyUserJoinEmail(TrialSiteUserSurveyJoinCommand joinCommand) - { - var trialSiteSurvey = await _trialSiteSurveyRepository.FirstAsync(t => t.Id == joinCommand.TrialSiteSurveyId); + var findTrialUser = await _trialIdentityUserRepository.Where(t => t.TrialId == trialId && t.IdentityUserId == identityUserId, true).Include(t => t.TrialUserRoleList).ThenInclude(t => t.UserRole).FirstOrDefaultAsync(); - foreach (var item in joinCommand.UserList.GroupBy(t => t.SystemUserId)) - { - - var userRoleList = item.ToList(); - - var first = userRoleList.First(); - - if (userRoleList.Any(t => t.SystemUserId == null)) - { - //---生成账户Id 未取到值,请排查 - throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_FailedToGenerateAccountId"]); - } - - var trialId = joinCommand.TrialId; - var userId = (Guid)item.Key; - var trialSiteId = trialSiteSurvey.TrialSiteId; - - var sysUserInfo = await _identityUserRepository.Where(t => t.Id == userId, true).Include(t => t.UserRoleList).FirstOrDefaultAsync(); - - //判断是否加入到项目 - var findTrialUser = await _trialIdentityUserRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.IdentityUserId == userId, true); - + 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 = - userRoleList.Select(t => new TrialUserRole() { TrialId = trialId, UserId = sysUserInfo.UserRoleList.Where(u => u.UserTypeId == t.UserTypeId).Select(t => t.Id).First() }).ToList() - }); - await _mailVerificationService.SiteSurveyUserJoinEmail(trialId, userId, joinCommand.BaseUrl, joinCommand.RouteUrl); - } - else if (findTrialUser.IsDeleted == true) - { - await _trialIdentityUserRepository.UpdatePartialFromQueryAsync(t => t.TrialId == trialId && t.IdentityUserId == userId, c => new TrialIdentityUser() - { - IsDeleted = false, - DeletedTime = null, - JoinTime = DateTime.Now, + TrialUserRoleList = userTypeIdList.Select(u => new TrialUserRole() + { + TrialId = trialId, + UserId = existSysUser.UserRoleList.FirstOrDefault(t => t.UserTypeId == u).Id, + + }).ToList() }); - await _mailVerificationService.SiteSurveyUserJoinEmail(trialId, userId, joinCommand.BaseUrl, joinCommand.RouteUrl); + isNeedSendEmail = true; } - - - foreach (var userSuvey in userRoleList) + else { - var userRoleId = sysUserInfo.UserRoleList.Where(t => t.UserTypeId == userSuvey.UserTypeId).First().Id; + //有该人员 + //是否有该角色 - var findTrialSiteUser = await _trialSiteUserRoleRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.UserId == userRoleId && t.TrialSiteId == trialSiteId, true); - if (findTrialSiteUser == null) + foreach (var userTypeId in userTypeIdList) { - await _trialSiteUserRoleRepository.AddAsync(new TrialSiteUserRole() { TrialId = trialId, TrialSiteId = trialSiteId, UserId = userRoleId }); + var findTrialUserRole = findTrialUser.TrialUserRoleList.Where(t => t.UserRole.UserTypeId == userTypeId).FirstOrDefault(); + + 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; + } + + } } - else - { - findTrialSiteUser.IsDeleted = false; - findTrialSiteUser.DeletedTime = null; - } - - findTrialSiteUser.IsDeleted = false; - - await _trialSiteUserSurveyRepository.UpdatePartialFromQueryAsync(t => t.Id == userSuvey.Id, u => new TrialSiteUserSurvey() { IsJoin = true }); } - await _identityUserRepository.BatchUpdateNoTrackingAsync(t => t.Id == userId, u => new Domain.Models.IdentityUser() { Status = UserStateEnum.Enable }); + + if (isNeedSendEmail) + { + await _mailVerificationService.SiteSurveyUserJoinEmail(trialId, identityUserId, baseUrl, routeUrl); + } + + var userJoinIdList = item.Select(t => t.Id).ToList(); + + await _trialSiteUserSurveyRepository.UpdatePartialFromQueryAsync(t => userJoinIdList.Contains(t.Id), u => new TrialSiteUserSurvey() { IsJoin = true, SystemUserId = existSysUser.Id }); + + //中心调研设置用户角色退出 + var needQuitUserList = item.Where(t => t.IsHistoryUser && t.IsHistoryUserOriginDeleted == false && t.IsHistoryUserDeleted == true).ToList(); + + var queitUserTypeIdList = needQuitUserList.Select(t => t.UserTypeId).ToList(); + + + await _trialSiteUserRoleRepository.UpdatePartialFromQueryAsync(t => t.TrialId == trialId && t.TrialSiteId == trialSiteId && queitUserTypeIdList.Contains(t.UserRole.UserTypeId), c => new TrialSiteUserRole() + { + IsDeleted = true, + DeletedTime = DateTime.Now, + }); + await _trialSiteUserRoleRepository.SaveChangesAsync(); - - - - } - await _trialSiteSurveyRepository.UpdatePartialFromQueryAsync(t => t.Id == trialSiteSurvey.Id && t.State == TrialSiteSurveyEnum.SPMApproved, u => new TrialSiteSurvey() { State = TrialSiteSurveyEnum.PMCreatedAndLock, ReviewerUserId = _userInfo.UserRoleId, ReviewerTime = DateTime.Now }); - - await _userRoleRepository.SaveChangesAsync(); - - return ResponseOutput.Ok(); - + await _trialSiteSurveyRepository.UpdatePartialFromQueryAsync(t => t.Id == trialSiteSurveyId && t.State == TrialSiteSurveyEnum.SPMApproved, u => new TrialSiteSurvey() { State = TrialSiteSurveyEnum.PMCreatedAndLock, ReviewerUserId = _userInfo.UserRoleId, ReviewerTime = DateTime.Now }); } - private async Task DealSiteUserQuitSiteAsync(Guid trialId, Guid siteId, List list) - { - var userIdList = list.Select(t => t.SystemUserId).ToList(); - - - await _trialSiteUserRoleRepository.UpdatePartialFromQueryAsync(t => t.TrialId == trialId && t.TrialSiteId == siteId && userIdList.Contains(t.UserRole.IdentityUserId), c => new TrialSiteUserRole() - { - IsDeleted = true, - DeletedTime = DateTime.Now, - }); - - - await _trialSiteUserRoleRepository.SaveChangesAsync(); - } diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteUserSurveyService.cs b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteUserSurveyService.cs index 1e88c1db8..4e3593cce 100644 --- a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteUserSurveyService.cs +++ b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteUserSurveyService.cs @@ -62,6 +62,8 @@ namespace IRaCIS.Core.Application.Contracts if (sysUserInfo != null) { + + if (trialType == TrialType.OfficialTrial || trialType == TrialType.Training) {