595 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			595 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
| using IRaCIS.Core.Domain.Share;
 | |
| using MimeKit;
 | |
| using IRaCIS.Core.Application.Helper;
 | |
| using MailKit;
 | |
| using Microsoft.AspNetCore.Hosting;
 | |
| using IRaCIS.Core.Application.Auth;
 | |
| using AutoMapper;
 | |
| using IRaCIS.Application.Contracts;
 | |
| using Nito.AsyncEx;
 | |
| 
 | |
| namespace IRaCIS.Application.Services
 | |
| {
 | |
|     public interface IMailVerificationService
 | |
|     {
 | |
| 
 | |
|         Task AnolymousSendEmail(string researchProgramNo, string emailAddress, int verificationCode);
 | |
| 
 | |
|         Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode);
 | |
| 
 | |
|         Task AnolymousSendEmailForResetAccount(string emailAddress, int verificationCode);
 | |
| 
 | |
|         Task AddUserSendEmailAsync(Guid userId, string baseUrl, string routeUrl);
 | |
| 
 | |
|         Task AdminResetPwdSendEmailAsync(Guid userId);
 | |
| 
 | |
|         Task SiteSurveyUserJoinEmail(Guid trialId, Guid userId, string baseUrl, string rootUrl);
 | |
| 
 | |
|         Task ExternalUserJoinEmail(Guid trialId, Guid userId, string baseUrl, string rootUrl);
 | |
| 
 | |
|         Task<Guid> DoctorJoinTrialEmail(Guid trialId, Guid doctorId, string baseUrl, string rootUrl);
 | |
| 
 | |
| 
 | |
|     }
 | |
| 
 | |
|     public class MailVerificationService : IMailVerificationService
 | |
|     {
 | |
|         private readonly IRepository<VerificationCode> _verificationCodeRepository;
 | |
| 
 | |
|         private readonly IRepository<SystemBasicData> _systemBasicDatarepository;
 | |
| 
 | |
|         private readonly IWebHostEnvironment _hostEnvironment;
 | |
|         private readonly IRepository<User> _userRepository;
 | |
| 
 | |
|         private readonly ITokenService _tokenService;
 | |
| 
 | |
|         private readonly IMapper _mapper;
 | |
| 
 | |
|         private readonly IRepository<Trial> _trialRepository;
 | |
|         private readonly IRepository<UserType> _userTypeRepository;
 | |
| 
 | |
|         private readonly IRepository<Doctor> _doctorTypeRepository;
 | |
| 
 | |
|         private readonly AsyncLock _mutex = new AsyncLock();
 | |
| 
 | |
| 
 | |
| 
 | |
|         public MailVerificationService(IRepository<VerificationCode> verificationCodeRepository,
 | |
|             IRepository<SystemBasicData> systemBasicDatarepository,
 | |
|             IWebHostEnvironment hostEnvironment,
 | |
|             IRepository<User> userRepository,
 | |
|             ITokenService tokenService,
 | |
|             IRepository<Trial> trialRepository,
 | |
|              IRepository<UserType> userTypeRepository,
 | |
|              IRepository<Doctor> doctorTypeRepository,
 | |
|             IMapper mapper)
 | |
|         {
 | |
|             _verificationCodeRepository = verificationCodeRepository;
 | |
|             _systemBasicDatarepository = systemBasicDatarepository;
 | |
| 
 | |
|             _hostEnvironment = hostEnvironment;
 | |
| 
 | |
|             _mapper = mapper;
 | |
| 
 | |
|             _tokenService = tokenService;
 | |
|             _userRepository = userRepository;
 | |
|             _trialRepository = trialRepository;
 | |
| 
 | |
|             _userTypeRepository = userTypeRepository;
 | |
|             _doctorTypeRepository = doctorTypeRepository;
 | |
| 
 | |
|         }
 | |
| 
 | |
|         //重置邮箱
 | |
|         public async Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode)
 | |
|         {
 | |
| 
 | |
| 
 | |
|             var messageToSend = new MimeMessage();
 | |
|             //发件地址
 | |
|             messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
 | |
|             //收件地址
 | |
|             messageToSend.To.Add(new MailboxAddress(userName, emailAddress));
 | |
|             //主题
 | |
|             messageToSend.Subject = "[来自展影IRC] 关于重置邮箱的提醒";
 | |
| 
 | |
|             var builder = new BodyBuilder();
 | |
| 
 | |
| 
 | |
|             var pathToFile = _hostEnvironment.WebRootPath
 | |
|                           + Path.DirectorySeparatorChar.ToString()
 | |
|                           + "EmailTemplate"
 | |
|                           + Path.DirectorySeparatorChar.ToString()
 | |
|                           + "UserOptCommon.html";
 | |
| 
 | |
|             using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
 | |
|             {
 | |
|                 var templateInfo = SourceReader.ReadToEnd();
 | |
| 
 | |
| 
 | |
|                 builder.HtmlBody = string.Format(templateInfo,
 | |
|                     $" 尊敬的 {userName} , ",
 | |
|                     "您正在进行邮箱重置操作",
 | |
|                     verificationCode
 | |
|                     );
 | |
|             }
 | |
| 
 | |
|             messageToSend.Body = builder.ToMessageBody();
 | |
| 
 | |
| 
 | |
| 
 | |
|             EventHandler<MessageSentEventArgs> sucessHandle = (sender, args) =>
 | |
|           {
 | |
|               // args.Response 
 | |
|               var code = verificationCode.ToString();
 | |
|               _ = _verificationCodeRepository.AddAsync(new VerificationCode()
 | |
|               {
 | |
|                   CodeType = 0,
 | |
|                   HasSend = true,
 | |
|                   Code = code,
 | |
|                   UserId = userId,
 | |
|                   ExpirationTime = DateTime.Now.AddMinutes(3)
 | |
|               }).Result;
 | |
|               _ = _verificationCodeRepository.SaveChangesAsync().Result;
 | |
| 
 | |
|           };
 | |
| 
 | |
| 
 | |
|             await SendEmailHelper.SendEmailAsync(messageToSend, sucessHandle);
 | |
| 
 | |
| 
 | |
|         }
 | |
| 
 | |
| 
 | |
| 
 | |
|         //不登录  通过邮箱重置密码
 | |
|         public async Task AnolymousSendEmailForResetAccount(string emailAddress, int verificationCode)
 | |
|         {
 | |
|             var messageToSend = new MimeMessage();
 | |
|             //发件地址
 | |
|             messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
 | |
|             //收件地址
 | |
|             messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress));
 | |
|             //主题
 | |
|             messageToSend.Subject = "[来自展影IRC] 关于重置密码的提醒";
 | |
| 
 | |
| 
 | |
| 
 | |
|             var builder = new BodyBuilder();
 | |
| 
 | |
|             var pathToFile = _hostEnvironment.WebRootPath
 | |
|                         + Path.DirectorySeparatorChar.ToString()
 | |
|                         + "EmailTemplate"
 | |
|                         + Path.DirectorySeparatorChar.ToString()
 | |
|                         + "UserOptCommon.html";
 | |
| 
 | |
|             using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
 | |
|             {
 | |
|                 var templateInfo = SourceReader.ReadToEnd();
 | |
| 
 | |
| 
 | |
|                 builder.HtmlBody = string.Format(templateInfo,
 | |
|                     "",
 | |
|                    "您正在进行邮箱重置密码操作",
 | |
|                     verificationCode
 | |
|                     );
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             messageToSend.Body = builder.ToMessageBody();
 | |
| 
 | |
| 
 | |
|             EventHandler<MessageSentEventArgs> sucessHandle = (sender, args) =>
 | |
|              {
 | |
|                  var code = verificationCode.ToString();
 | |
|                  _ = _verificationCodeRepository.AddAsync(new VerificationCode()
 | |
|                  {
 | |
|                      CodeType = Core.Domain.Share.VerifyType.Email,
 | |
|                      HasSend = true,
 | |
|                      Code = code,
 | |
|                      UserId = Guid.Empty,//此时不知道用户
 | |
|                      EmailOrPhone = emailAddress,
 | |
|                      ExpirationTime = DateTime.Now.AddMinutes(3)
 | |
|                  }).Result;
 | |
|                  _ = _verificationCodeRepository.SaveChangesAsync().Result;
 | |
|              };
 | |
| 
 | |
| 
 | |
| 
 | |
|             await SendEmailHelper.SendEmailAsync(messageToSend, sucessHandle);
 | |
|         }
 | |
| 
 | |
|         //中心调研 登陆
 | |
|         public async Task AnolymousSendEmail(string researchProgramNo, string emailAddress, int verificationCode)
 | |
|         {
 | |
| 
 | |
| 
 | |
|             var messageToSend = new MimeMessage();
 | |
|             //发件地址
 | |
|             messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
 | |
|             //收件地址
 | |
|             messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress));
 | |
|             //主题
 | |
|             messageToSend.Subject = $"[来自展影IRC] [{researchProgramNo}] 关于中心调研的提醒";
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|             var builder = new BodyBuilder();
 | |
| 
 | |
|             var pathToFile = _hostEnvironment.WebRootPath
 | |
|                       + Path.DirectorySeparatorChar.ToString()
 | |
|                       + "EmailTemplate"
 | |
|                       + Path.DirectorySeparatorChar.ToString()
 | |
|                       + "UserOptCommon.html";
 | |
| 
 | |
|             using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
 | |
|             {
 | |
|                 var templateInfo = SourceReader.ReadToEnd();
 | |
| 
 | |
| 
 | |
|                 builder.HtmlBody = string.Format(templateInfo,
 | |
|                     "",
 | |
|                    "您正在参与展影医疗IRC项目中心调研工作",
 | |
|                     verificationCode
 | |
|                     );
 | |
|             }
 | |
| 
 | |
|             messageToSend.Body = builder.ToMessageBody();
 | |
| 
 | |
| 
 | |
| 
 | |
|             EventHandler<MessageSentEventArgs> sucessHandle = (sender, args) =>
 | |
|             {
 | |
|                 // args.Response 
 | |
|                 var code = verificationCode.ToString();
 | |
|                 _ = _verificationCodeRepository.AddAsync(new VerificationCode()
 | |
|                 {
 | |
|                     CodeType = VerifyType.Email,
 | |
|                     HasSend = true,
 | |
|                     Code = code,
 | |
|                     UserId = Guid.Empty,//此时不知道用户
 | |
|                     EmailOrPhone = emailAddress,
 | |
|                     ExpirationTime = DateTime.Now.AddMinutes(3)
 | |
|                 }).Result;
 | |
|                 _ = _verificationCodeRepository.SaveChangesAsync().Result;
 | |
|             };
 | |
| 
 | |
| 
 | |
| 
 | |
|             await SendEmailHelper.SendEmailAsync(messageToSend, sucessHandle);
 | |
| 
 | |
| 
 | |
|         }
 | |
| 
 | |
| 
 | |
| 
 | |
|         //添加用户发送邮件
 | |
|         public async Task AddUserSendEmailAsync(Guid userId, string baseUrl, string routeUrl)
 | |
|         {
 | |
| 
 | |
|             var sysUserInfo = (await _userRepository.Where(t => t.Id == userId).Include(t => t.UserTypeRole).FirstOrDefaultAsync()).IfNullThrowException();
 | |
| 
 | |
| 
 | |
|             var messageToSend = new MimeMessage();
 | |
|             //发件地址
 | |
|             messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
 | |
|             //收件地址
 | |
|             messageToSend.To.Add(new MailboxAddress(sysUserInfo.FullName, sysUserInfo.EMail));
 | |
|             //主题
 | |
|             messageToSend.Subject = "[来自展影IRC] 关于创建账户的提醒";
 | |
| 
 | |
| 
 | |
| 
 | |
|             var builder = new BodyBuilder();
 | |
| 
 | |
|             var pathToFile = _hostEnvironment.WebRootPath
 | |
|                         + Path.DirectorySeparatorChar.ToString()
 | |
|                         + "EmailTemplate"
 | |
|                         + Path.DirectorySeparatorChar.ToString()
 | |
|                         + "AdminAddUser.html";
 | |
| 
 | |
|             var token = _tokenService.GetToken(IRaCISClaims.Create(_mapper.Map<UserBasicInfo>(sysUserInfo)));
 | |
| 
 | |
|             await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token });
 | |
| 
 | |
|             routeUrl = routeUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&access_token=" + token;
 | |
| 
 | |
|             var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login"));
 | |
| 
 | |
|             var redirectUrl = $"{domain}/api/User/UserRedirect?url={ System.Web.HttpUtility.UrlEncode(routeUrl) }";
 | |
| 
 | |
|             using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
 | |
|             {
 | |
|                 var templateInfo = SourceReader.ReadToEnd();
 | |
| 
 | |
| 
 | |
|                 builder.HtmlBody = string.Format(templateInfo,
 | |
|                    sysUserInfo.FullName,
 | |
|                    sysUserInfo.UserName,
 | |
|                    sysUserInfo.UserTypeRole.UserTypeShortName,
 | |
|                     redirectUrl
 | |
|                     );
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             messageToSend.Body = builder.ToMessageBody();
 | |
| 
 | |
| 
 | |
|             await SendEmailHelper.SendEmailAsync(messageToSend);
 | |
|         }
 | |
| 
 | |
|         //管理员重置密码发送邮件
 | |
|         public async Task AdminResetPwdSendEmailAsync(Guid userId)
 | |
|         {
 | |
|             var sysUserInfo = (await _userRepository.Where(t => t.Id == userId).Include(t => t.UserTypeRole).FirstOrDefaultAsync()).IfNullThrowException();
 | |
| 
 | |
|             var messageToSend = new MimeMessage();
 | |
|             //发件地址
 | |
|             messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
 | |
|             //收件地址
 | |
|             messageToSend.To.Add(new MailboxAddress(sysUserInfo.FullName, sysUserInfo.EMail));
 | |
|             //主题
 | |
|             messageToSend.Subject = "[来自展影IRC] 关于重置账户密码的提醒";
 | |
| 
 | |
| 
 | |
| 
 | |
|             var builder = new BodyBuilder();
 | |
| 
 | |
|             var pathToFile = _hostEnvironment.WebRootPath
 | |
|                         + Path.DirectorySeparatorChar.ToString()
 | |
|                         + "EmailTemplate"
 | |
|                         + Path.DirectorySeparatorChar.ToString()
 | |
|                         + "AdminResetUser.html";
 | |
| 
 | |
| 
 | |
|             using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
 | |
|             {
 | |
|                 var templateInfo = SourceReader.ReadToEnd();
 | |
| 
 | |
| 
 | |
|                 builder.HtmlBody = string.Format(templateInfo,
 | |
|                    sysUserInfo.FullName,
 | |
|                    sysUserInfo.UserName,
 | |
|                    sysUserInfo.UserTypeRole.UserTypeShortName,
 | |
|                     AppSettings.DefaultPassword
 | |
|                     );
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             messageToSend.Body = builder.ToMessageBody();
 | |
| 
 | |
| 
 | |
|             await SendEmailHelper.SendEmailAsync(messageToSend);
 | |
|         }
 | |
| 
 | |
| 
 | |
|         //Site调研 用户加入项目
 | |
|         public async Task SiteSurveyUserJoinEmail(Guid trialId, Guid userId, string baseUrl, string rootUrl)
 | |
|         {
 | |
|             var sysUserInfo = (await _userRepository.Where(t => t.Id == userId).Include(t => t.UserTypeRole).FirstOrDefaultAsync()).IfNullThrowException();
 | |
| 
 | |
|             var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
 | |
| 
 | |
|             var messageToSend = new MimeMessage();
 | |
|             //发件地址
 | |
|             messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
 | |
|             //收件地址
 | |
|             messageToSend.To.Add(new MailboxAddress(sysUserInfo.FullName, sysUserInfo.EMail));
 | |
|             //主题
 | |
|             messageToSend.Subject = $"[来自展影IRC] [{ trialInfo.ResearchProgramNo}]邀请信";
 | |
| 
 | |
| 
 | |
| 
 | |
|             var builder = new BodyBuilder();
 | |
| 
 | |
| 
 | |
|             var token = _tokenService.GetToken(IRaCISClaims.Create(_mapper.Map<UserBasicInfo>(sysUserInfo)));
 | |
| 
 | |
|             if (sysUserInfo.IsFirstAdd)
 | |
|             {
 | |
|                 await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token });
 | |
|             }
 | |
| 
 | |
| 
 | |
|             var pathToFile = _hostEnvironment.WebRootPath
 | |
|                      + Path.DirectorySeparatorChar.ToString()
 | |
|                      + "EmailTemplate"
 | |
|                      + Path.DirectorySeparatorChar.ToString()
 | |
|                      + (sysUserInfo.IsFirstAdd ? "TrialUserFirstJoin.html" : "TrialUserExistJoin.html");
 | |
| 
 | |
|             using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
 | |
|             {
 | |
|                 var templateInfo = SourceReader.ReadToEnd();
 | |
| 
 | |
|                 var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&access_token=" + token;
 | |
| 
 | |
|                 var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login"));
 | |
| 
 | |
|                 var redirectUrl = $"{domain}/api/User/UserRedirect?url={ System.Web.HttpUtility.UrlEncode(routeUrl) }";
 | |
| 
 | |
|                 builder.HtmlBody = string.Format(templateInfo,
 | |
|                     sysUserInfo.FullName,
 | |
|                     trialInfo.ExperimentName,
 | |
|                     trialInfo.ResearchProgramNo,
 | |
|                     trialInfo.TrialCode,
 | |
|                     sysUserInfo.UserName,
 | |
|                     sysUserInfo.UserTypeRole.UserTypeShortName,
 | |
|                     sysUserInfo.IsFirstAdd ? redirectUrl : baseUrl
 | |
|                     );
 | |
|             }
 | |
| 
 | |
|             messageToSend.Body = builder.ToMessageBody();
 | |
| 
 | |
|             await SendEmailHelper.SendEmailAsync(messageToSend, null);
 | |
| 
 | |
| 
 | |
|         }
 | |
| 
 | |
|         //外部用户 加入项目
 | |
|         public async Task ExternalUserJoinEmail(Guid trialId, Guid userId, string baseUrl, string rootUrl)
 | |
|         {
 | |
|             var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId)).IfNullThrowException();
 | |
| 
 | |
|             var sysUserInfo = (await _userRepository.Where(t => t.Id == userId).Include(t => t.UserTypeRole).FirstOrDefaultAsync()).IfNullThrowException();
 | |
| 
 | |
| 
 | |
|             var messageToSend = new MimeMessage();
 | |
|             //发件地址
 | |
|             messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
 | |
|             //收件地址
 | |
|             messageToSend.To.Add(new MailboxAddress(String.Empty, sysUserInfo.EMail));
 | |
|             //主题
 | |
|             messageToSend.Subject = $"[来自展影IRC] [{ trialInfo.ResearchProgramNo}]邀请信";
 | |
| 
 | |
| 
 | |
|             var builder = new BodyBuilder();
 | |
| 
 | |
| 
 | |
| 
 | |
|             var token = _tokenService.GetToken(IRaCISClaims.Create(_mapper.Map<UserBasicInfo>(sysUserInfo)));
 | |
|             if (sysUserInfo.IsFirstAdd)
 | |
|             {
 | |
|                 await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token });
 | |
|             }
 | |
| 
 | |
|             var pathToFile = _hostEnvironment.WebRootPath
 | |
|                         + Path.DirectorySeparatorChar.ToString()
 | |
|                         + "EmailTemplate"
 | |
|                         + Path.DirectorySeparatorChar.ToString()
 | |
|                         + (sysUserInfo.IsFirstAdd ? "TrialUserFirstJoin.html" : "TrialUserExistJoin.html");
 | |
| 
 | |
|             using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
 | |
|             {
 | |
|                 var templateInfo = SourceReader.ReadToEnd();
 | |
| 
 | |
|                 var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login"));
 | |
| 
 | |
|                 var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&access_token=" + token;
 | |
| 
 | |
|                 var redirectUrl = $"{domain}/api/User/UserRedirect?url={ System.Web.HttpUtility.UrlEncode(routeUrl) }";
 | |
| 
 | |
|                 builder.HtmlBody = string.Format(templateInfo,
 | |
|                     sysUserInfo.FullName,
 | |
|                     trialInfo.ExperimentName,
 | |
|                     trialInfo.ResearchProgramNo,
 | |
|                     trialInfo.TrialCode,
 | |
|                    sysUserInfo.UserName,
 | |
|                     sysUserInfo.UserTypeRole.UserTypeShortName,
 | |
|                    sysUserInfo.IsFirstAdd ? redirectUrl : baseUrl
 | |
|                     );
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             messageToSend.Body = builder.ToMessageBody();
 | |
| 
 | |
| 
 | |
|             await SendEmailHelper.SendEmailAsync(messageToSend, null);
 | |
| 
 | |
|         }
 | |
| 
 | |
| 
 | |
| 
 | |
|         public async Task<Guid> DoctorJoinTrialEmail(Guid trialId, Guid doctorId, string baseUrl, string rootUrl)
 | |
|         {
 | |
|             var doctor = await _doctorTypeRepository.FindAsync(doctorId);
 | |
|             User sysUserInfo = null;
 | |
| 
 | |
|             var userType = await _userTypeRepository.FirstAsync(t => t.UserTypeEnum == UserTypeEnum.IndependentReviewer);
 | |
| 
 | |
|             using (await _mutex.LockAsync())
 | |
|             {
 | |
|                 var isDoctorHaveAccount = await _userRepository.AnyAsync(t => t.DoctorId == doctorId);
 | |
| 
 | |
| 
 | |
|                 if (!isDoctorHaveAccount)
 | |
|                 {
 | |
| 
 | |
|                     var saveItem = new User() { FirstName = doctor.FirstName, LastName = doctor.LastName, EMail = doctor.EMail };
 | |
| 
 | |
|                     saveItem.Code = _userRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1;
 | |
| 
 | |
|                     saveItem.UserCode = AppSettings.GetCodeStr(saveItem.Code, nameof(User));
 | |
| 
 | |
|                     saveItem.UserName = saveItem.UserCode;
 | |
| 
 | |
|                     saveItem.UserTypeEnum = UserTypeEnum.IndependentReviewer;
 | |
| 
 | |
|                     saveItem.DoctorId = doctorId;
 | |
|                     saveItem.UserTypeId = userType.Id;
 | |
| 
 | |
|                     sysUserInfo = await _userRepository.AddAsync(saveItem);
 | |
| 
 | |
|                     await _userRepository.SaveChangesAsync();
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     sysUserInfo = (await _userRepository.Where(t => t.DoctorId == doctorId).Include(t => t.UserTypeRole).FirstOrDefaultAsync()).IfNullThrowException();
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 
 | |
|             var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
 | |
| 
 | |
|             var messageToSend = new MimeMessage();
 | |
|             //发件地址
 | |
|             messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
 | |
|             //收件地址
 | |
|             messageToSend.To.Add(new MailboxAddress(doctor.FullName, doctor.EMail));
 | |
|             //主题
 | |
|             messageToSend.Subject = $"[来自展影IRC] [{ trialInfo.ResearchProgramNo}]邀请信";
 | |
| 
 | |
| 
 | |
|             var builder = new BodyBuilder();
 | |
| 
 | |
| 
 | |
|             var token = _tokenService.GetToken(IRaCISClaims.Create(_mapper.Map<UserBasicInfo>(sysUserInfo)));
 | |
| 
 | |
|             if (sysUserInfo.IsFirstAdd)
 | |
|             {
 | |
|                 await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token });
 | |
|             }
 | |
| 
 | |
| 
 | |
|             var pathToFile = _hostEnvironment.WebRootPath
 | |
|                      + Path.DirectorySeparatorChar.ToString()
 | |
|                      + "EmailTemplate"
 | |
|                      + Path.DirectorySeparatorChar.ToString()
 | |
|                      + (sysUserInfo.IsFirstAdd ? "TrialDoctorFirstJoin.html" : "TrialDoctorExistJoin.html");
 | |
| 
 | |
|             using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
 | |
|             {
 | |
|                 var templateInfo = SourceReader.ReadToEnd();
 | |
| 
 | |
|                 var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + userType.UserTypeShortName + "&access_token=" + token;
 | |
| 
 | |
|                 var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login"));
 | |
| 
 | |
|                 var redirectUrl = $"{domain}/api/User/UserRedirect?url={ System.Web.HttpUtility.UrlEncode(routeUrl) }";
 | |
| 
 | |
|                 builder.HtmlBody = string.Format(templateInfo,
 | |
|                     sysUserInfo.FullName,
 | |
|                     trialInfo.ExperimentName,
 | |
|                     trialInfo.ResearchProgramNo,
 | |
|                     trialInfo.TrialCode,
 | |
|                     sysUserInfo.UserName,
 | |
|                     userType.UserTypeShortName,
 | |
|                     sysUserInfo.IsFirstAdd ? redirectUrl : baseUrl
 | |
|                     );
 | |
|             }
 | |
| 
 | |
|             messageToSend.Body = builder.ToMessageBody();
 | |
| 
 | |
|             await SendEmailHelper.SendEmailAsync(messageToSend, null);
 | |
| 
 | |
|             return sysUserInfo.Id;
 | |
|         }
 | |
| 
 | |
| 
 | |
| 
 | |
|     }
 | |
| } |