导入人员发送邮件
continuous-integration/drone/push Build is passing Details

Uat_IRC_Net8
hang 2024-12-27 13:50:26 +08:00
parent ba2965e295
commit 918362e854
5 changed files with 137 additions and 116 deletions

View File

@ -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"));

View File

@ -166,6 +166,9 @@ namespace IRaCIS.Core.Application.Service
CreateMap<UserCommand, UserRole>();
CreateMap<TrialExternalUser, IdentityUser>();
}
}

View File

@ -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<SiteSurveyUserImportDto> 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<IdentityUser>(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<UserRole>();
foreach (var addUserRole in addUserRoleList)
else
{
addUserRole.IsGeneratedAccount = true;
//var trialSiteId = addUserRole.TrialSiteId;
var addRole = _mapper.Map<UserRole>(saveItem);
addRole.UserTypeEnum = addUserRole.UserTypeEnum;
addRole.UserTypeId = addUserRole.UserTypeId;
saveItem.UserRoleList.Add(addRole);
//不存在该角色,那么就添加
var addRole = _mapper.Map<UserRole>(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<IdentityUser>(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<UserRole>(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<UserRole>() { };
foreach (var userTypeId in userTypeIdList)
{
var addRole = _mapper.Map<UserRole>(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();

View File

@ -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; }

View File

@ -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<IdentityUser>(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<UserRole>(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);