//-------------------------------------------------------------------- // 此代码由T4模板自动生成 byzhouhang 20210918 // 生成时间 2022-03-04 13:33:56 // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 //-------------------------------------------------------------------- using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Application.Interfaces; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Domain.Share; using MimeKit; using MailKit.Security; using Microsoft.AspNetCore.Authorization; using Panda.DynamicWebApi.Attributes; namespace IRaCIS.Core.Application.Service { /// /// 项目外部人员 录入流程相关 /// [ApiExplorerSettings(GroupName = "Trial")] public class TrialExternalUserService : BaseService, ITrialExternalUserService { private readonly IRepository _trialExternalUseRepository; private readonly IRepository _userRepository; private readonly IRepository _trialUserRepository; private readonly IRepository _trialSiteSurveyUserRepository; private readonly IRepository _trialSiteUserRepository; public TrialExternalUserService(IRepository trialExternalUseRepository, IRepository userRepository, IRepository trialUserRepository, IRepository trialSiteSurveyUserRepository, IRepository trialSiteUserRepository) { _trialExternalUseRepository = trialExternalUseRepository; _userRepository = userRepository; _trialUserRepository = trialUserRepository; _trialSiteSurveyUserRepository = trialSiteSurveyUserRepository; _trialSiteUserRepository = trialSiteUserRepository; } [HttpPost] public async Task> GetTrialExternalUserList(TrialExternalUserQuery queryTrialExternalUser) { var trialExternalUserQueryable = _trialExternalUseRepository.Where(t => t.TrialId == queryTrialExternalUser.TrialId) .WhereIf(!string.IsNullOrEmpty(queryTrialExternalUser.Phone), t => t.Phone.Contains(queryTrialExternalUser.Phone)) .WhereIf(!string.IsNullOrEmpty(queryTrialExternalUser.Email), t => t.Email.Contains(queryTrialExternalUser.Email)) .WhereIf(!string.IsNullOrEmpty(queryTrialExternalUser.Name), t => (t.LastName + " / " + t.FirstName).Contains(queryTrialExternalUser.Name)) .ProjectTo(_mapper.ConfigurationProvider); return await trialExternalUserQueryable.ToListAsync(); } /// /// 添加和更新接口 已验证邮箱和账户类型不允许添加重复项 /// /// /// public async Task AddOrUpdateTrialExternalUser(TrialExternalUserAddOrEdit addOrEditTrialExternalUser) { if (addOrEditTrialExternalUser.Id == null) { var existSysUser = await _userRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId); if (existSysUser != null) { if (existSysUser.LastName != addOrEditTrialExternalUser.LastName || existSysUser.FirstName != addOrEditTrialExternalUser.FirstName) { return ResponseOutput.NotOk($"该用户在系统中账户名为:{existSysUser.LastName + " / " + existSysUser.FirstName} 电话:{existSysUser.Phone},与填写信息存在不一致项, 现将界面信息修改为与系统一致,可进行保存", new { existSysUser.LastName, existSysUser.FirstName, existSysUser.Phone }, ApiResponseCodeEnum.NeedTips); } } //处理 生成账户 if (await _trialExternalUseRepository.AnyAsync(t => t.Email == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId && t.TrialId == addOrEditTrialExternalUser.TrialId)) { return ResponseOutput.NotOk("该外部用户表已存在 相同邮箱用户类型的账户"); } var addEntity = _mapper.Map(addOrEditTrialExternalUser); await _trialExternalUseRepository.AddAsync(addEntity); var existUser = await _userRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId); if (existUser != null) { addEntity.IsSystemUser = true; addEntity.SystemUserId = existUser.Id; } else { //生成账户 并插入 var generateUser = _mapper.Map(addOrEditTrialExternalUser); generateUser.Code = _userRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1; generateUser.UserCode = AppSettings.UserCodePrefix + generateUser.Code.ToString("D4"); generateUser.UserName = generateUser.UserCode; generateUser.UserTypeEnum = _repository.Where(t => t.Id == generateUser.UserTypeId).Select(t => t.UserTypeEnum).First(); generateUser.Password = MD5Helper.Md5("123456"); generateUser.Status = UserStateEnum.Disable; var newAddUser = await _repository.AddAsync(generateUser); addEntity.IsSystemUser = false; addEntity.SystemUserId = newAddUser.Id; } await _trialExternalUseRepository.SaveChangesAsync(); if (addOrEditTrialExternalUser.IsSendEmail) { await SendInviteEmail(new TrialExternalUserSendEmail() { //BaseUrl = addOrEditTrialExternalUser.BaseUrl, RouteUrl = addOrEditTrialExternalUser.RouteUrl, TrialId = addOrEditTrialExternalUser.TrialId, SendUsers = new List() { new UserEmail() { Id = addEntity.Id, Email=addEntity.Email, IsSystemUser=addEntity.IsSystemUser, SystemUserId=addEntity.SystemUserId } } }); } return ResponseOutput.Ok(addEntity.Id.ToString()); } else { return ResponseOutput.NotOk("这里不允许编辑,删除后再添加"); if (await _trialExternalUseRepository.AnyAsync(t => t.Email == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId && t.Id != addOrEditTrialExternalUser.Id && t.TrialId == addOrEditTrialExternalUser.TrialId)) { return ResponseOutput.NotOk("该邮箱和用户类型,已存在该账户"); } //if (addOrEditTrialExternalUser.IsSystemUser) //{ // return ResponseOutput.NotOk("系统账户不允许编辑"); //} var needUpdateEntity = await _trialExternalUseRepository.FirstOrDefaultAsync(t => t.Id == addOrEditTrialExternalUser.Id); //更改之前 先验证是否在系统账户中存在 _mapper.Map(addOrEditTrialExternalUser, needUpdateEntity); await _trialExternalUseRepository.SaveChangesAsync(); return ResponseOutput.Ok(needUpdateEntity.Id.ToString()); } } [HttpDelete("{trialExternalUserId:guid}/{isSystemUser:bool}/{systemUserId}")] public async Task DeleteTrialExternalUser(Guid trialExternalUserId, bool isSystemUser, Guid systemUserId) { var success = await _trialExternalUseRepository.BatchDeleteAsync(t => t.Id == trialExternalUserId); if (isSystemUser == false) { await _userRepository.BatchDeleteAsync(t => t.Id == systemUserId); } return ResponseOutput.Result(success); } /// /// 勾选用户 批量发送邮件 /// /// [HttpPost] public async Task SendInviteEmail(TrialExternalUserSendEmail sendEmail) { var trialInfo = await _repository.FirstOrDefaultAsync(t => t.Id == sendEmail.TrialId); foreach (var userInfo in sendEmail.SendUsers) { var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(String.Empty, userInfo.Email)); //主题 messageToSend.Subject = "GRR External User survey (Invite)"; //var baseApiUrl = sendEmail.BaseUrl.Remove(sendEmail.BaseUrl.IndexOf("#")) + "api"; var builder = new BodyBuilder(); var sysUserInfo = await _userRepository.Where(t => t.Id == userInfo.SystemUserId).FirstOrDefaultAsync(); builder.HtmlBody = @$"
{sysUserInfo.LastName + "/" + sysUserInfo.FirstName}:
您好,展影医疗作为 实验方案号:{trialInfo.ResearchProgramNo} 项目的IRC供应商,诚邀您参加该项目IRC相关工作,欢迎您提供指导和建议,非常感谢!
查看并确认
"; //< form action = '#' method = 'post' > // < button type = 'submit' style = 'margin-left:60px;font-size:14px;text-decoration: none;display: inline-block;height: 40px;width: 140px;background: #00D1B2;color:#fff;border-radius: 5px;line-height: 40px;text-align: center;border:none;margin-bottom: 100px;cursor: pointer' > 查看并确认 // messageToSend.Body = builder.ToMessageBody(); using (var smtp = new MailKit.Net.Smtp.SmtpClient()) { smtp.MessageSent += (sender, args) => { _ = _trialExternalUseRepository.BatchUpdateAsync(t => t.Id == userInfo.Id, u => new TrialExternalUser() { InviteState = TrialExternalUserStateEnum.HasSend, IsJoin = null, ConfirmTime = null, RejectReason = String.Empty, ExpireTime = DateTime.Now.AddDays(7) }).Result; }; smtp.ServerCertificateValidationCallback = (s, c, h, e) => true; await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH"); await smtp.SendAsync(messageToSend); await smtp.DisconnectAsync(true); } } return ResponseOutput.Ok(); } /// /// 不带Token 访问 用户选择 参与 不参与 Id: TrialExternalUserId /// /// /// [AllowAnonymous] public async Task TrialExternalUserJoinTrial(TrialExternalUserConfirm editTrialUserPreparation) { var needUpdate = await _trialExternalUseRepository.FirstOrDefaultAsync(t => t.Id == editTrialUserPreparation.Id); if (DateTime.Now > needUpdate.ExpireTime) { return ResponseOutput.NotOk("邀请加入时间已过期,重新被邀请后才可以进行确认操作"); } _mapper.Map(editTrialUserPreparation, needUpdate); needUpdate.InviteState = editTrialUserPreparation.IsJoin == true ? TrialExternalUserStateEnum.UserConfirmed : TrialExternalUserStateEnum.UserReject; var trialId = needUpdate.TrialId; var userId = needUpdate.SystemUserId; //判断TrialUser中是否存在 不存在就插入 if (!await _trialUserRepository.AnyAsync(t => t.TrialId == trialId && t.UserId == userId)) { await _trialUserRepository.AddAsync(new TrialUser() { TrialId = trialId, UserId = userId, JoinTime = DateTime.Now }); } var success = await _trialExternalUseRepository.SaveChangesAsync(); if (editTrialUserPreparation.IsJoin == true) { var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(String.Empty, needUpdate.Email)); //主题 messageToSend.Subject = $"GRR External User survey (Trial {(editTrialUserPreparation.IsJoin == false ? "Reject Success" : "Join Success")})"; var builder = new BodyBuilder(); var trialInfo = await _repository.FirstOrDefaultAsync(t => t.Id == needUpdate.TrialId); var sysUserInfo = await _userRepository.Where(t => t.Id == needUpdate.SystemUserId).Include(t => t.UserTypeRole).FirstOrDefaultAsync(); int verificationCode = new Random().Next(100000, 1000000); if (sysUserInfo.IsFirstAdd) { await _userRepository.BatchUpdateAsync(t => t.Id == sysUserInfo.Id, u => new User() { Password = MD5Helper.Md5(verificationCode.ToString()) }); } builder.HtmlBody = @$"
{sysUserInfo.LastName + "/" + sysUserInfo.FirstName}:
您好,欢迎您参加项目 实验方案号:{trialInfo.ResearchProgramNo}IRC相关工作。该项目采用电子化工作流,系统及您的账号信息如下:
项目编号: {trialInfo.TrialCode}
试验方案号: {trialInfo.ResearchProgramNo}
试验名称: {trialInfo.ExperimentName}
用户名: {sysUserInfo.UserName}
密码: {(sysUserInfo.IsFirstAdd ? verificationCode.ToString() + "(请在登录后进行修改)" : "***(您已有账号, 若忘记密码, 请通过邮箱找回)")}
角色: {sysUserInfo.UserTypeRole.UserTypeShortName}
系统登录地址: {editTrialUserPreparation.BaseUrl}
"; messageToSend.Body = builder.ToMessageBody(); using (var smtp = new MailKit.Net.Smtp.SmtpClient()) { smtp.ServerCertificateValidationCallback = (s, c, h, e) => true; await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH"); await smtp.SendAsync(messageToSend); await smtp.DisconnectAsync(true); } await _userRepository.BatchUpdateAsync(t => t.Id == userId, u => new User() { Status = UserStateEnum.Enable }); } return ResponseOutput.Ok(); //else //{ // builder.HtmlBody = @$" //
//
//
// {sysUserInfo.LastName + "/" + sysUserInfo.FirstName}: //
//
// 您好,您拒绝了参加 {trialInfo.ResearchProgramNo} 项目IRC相关工作的邀请。详细信息如下: //
//
//
// 项目编号: {trialInfo.TrialCode} //
//
// 试验方案号: {trialInfo.ResearchProgramNo} //
//
// 试验名称: {trialInfo.ExperimentName} //
//
// 用户名: {sysUserInfo.UserName} //
//
// 角色: {sysUserInfo.UserTypeRole.UserTypeShortName} //
//
//
//
// "; //} } /// /// 不带Token 访问 Site调研用户 加入项目 Id: TrialSiteSurveyUserId /// /// /// [AllowAnonymous] public async Task TrialSiteSurveyUserJoinTrial(TrialExternalUserConfirm editInfo) { var needUpdate = (await _trialSiteSurveyUserRepository.Where(t => t.Id == editInfo.Id, true).Include(t => t.TrialSiteSurvey).FirstOrDefaultAsync()).IfNullThrowException(); var revieweUser = await _userRepository.FirstOrDefaultAsync(t => t.Id == needUpdate.TrialSiteSurvey.ReviewerUserId); if (DateTime.Now > needUpdate.ExpireTime) { return ResponseOutput.NotOk("邀请加入时间已过期,重新被邀请后才可以进行确认操作"); } _mapper.Map(editInfo, needUpdate); needUpdate.InviteState = editInfo.IsJoin == true ? TrialSiteUserStateEnum.UserConfirmed : TrialSiteUserStateEnum.UserReject; if (needUpdate.SystemUserId == null) { return ResponseOutput.NotOk("调研表系统用户Id 存储有问题"); } var trialId = needUpdate.TrialSiteSurvey.TrialId; var siteId = needUpdate.TrialSiteSurvey.SiteId; var userId = (Guid)needUpdate.SystemUserId; if (!await _trialUserRepository.AnyAsync(t => t.TrialId == trialId && t.UserId == userId)) { await _trialUserRepository.AddAsync(new TrialUser() { TrialId = trialId, UserId = userId,JoinTime = DateTime.Now }); await _trialSiteUserRepository.AddAsync(new TrialSiteUser() { TrialId = trialId, SiteId = siteId, UserId = userId }); await _userRepository.BatchUpdateAsync(t => t.Id == needUpdate.SystemUserId, u => new User() { Status = UserStateEnum.Enable }); } var success = await _trialExternalUseRepository.SaveChangesAsync(); var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(String.Empty, editInfo.IsJoin == true ? needUpdate.Email : revieweUser.EMail)); //主题 messageToSend.Subject = $"GRR Site survey (Trial {(editInfo.IsJoin == false ? "Reject" : "Join Success")})"; var builder = new BodyBuilder(); var trialInfo = await _repository.FirstOrDefaultAsync(t => t.Id == needUpdate.TrialSiteSurvey.TrialId); var sysUserInfo = await _userRepository.Where(t => t.Id == needUpdate.SystemUserId).Include(t => t.UserTypeRole).FirstOrDefaultAsync(); int verificationCode = new Random().Next(100000, 1000000); if (sysUserInfo.IsFirstAdd) { await _userRepository.BatchUpdateAsync(t => t.Id == sysUserInfo.Id, u => new User() { Password = MD5Helper.Md5(verificationCode.ToString()) }); } if (editInfo.IsJoin == true) { builder.HtmlBody = @$"
{sysUserInfo.LastName + "/" + sysUserInfo.FirstName}:
您好,欢迎您参加项目 实验方案号: {trialInfo.ResearchProgramNo} IRC相关工作。该项目采用电子化工作流,系统及您的账号信息如下:
项目编号: {trialInfo.TrialCode}
试验方案号: {trialInfo.ResearchProgramNo}
试验名称: {trialInfo.ExperimentName}
用户名: {sysUserInfo.UserName}
密码: {(sysUserInfo.IsFirstAdd ? verificationCode.ToString() + "(请在登录后进行修改)" : "***(您已有账号, 若忘记密码, 请通过邮箱找回)")}
角色: {sysUserInfo.UserTypeRole.UserTypeShortName}
系统登录地址: {editInfo.BaseUrl}
"; } else { builder.HtmlBody = @$"
{revieweUser.LastName + "/" + revieweUser.FirstName}:
您好,{sysUserInfo.LastName + "/" + sysUserInfo.FirstName} 拒绝了参加 {trialInfo.ResearchProgramNo} 项目IRC相关工作的邀请。详细信息如下:
项目编号: {trialInfo.TrialCode}
试验方案号: {trialInfo.ResearchProgramNo}
试验名称: {trialInfo.ExperimentName}
用户名: {sysUserInfo.UserName}
角色: {sysUserInfo.UserTypeRole.UserTypeShortName}
拒绝原因: {editInfo.RejectReason}
"; } messageToSend.Body = builder.ToMessageBody(); using (var smtp = new MailKit.Net.Smtp.SmtpClient()) { smtp.ServerCertificateValidationCallback = (s, c, h, e) => true; await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH"); await smtp.SendAsync(messageToSend); await smtp.DisconnectAsync(true); } return ResponseOutput.Ok(); } /// /// 不带Token 访问 页面获取项目基本信息 和参与情况 (已经确认了 就不允许再次确认) Id: TrialExternalUserId/TrialSiteSurveyUserId /// /// /// /// [AllowAnonymous] public async Task JoinBasicInfo(Guid id, bool isExternalUser) { if (isExternalUser) { return (await _trialExternalUseRepository.Where(t => t.Id == id) .ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); } else { return (await _trialSiteSurveyUserRepository.Where(t => t.Id == id) .ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); } } /// /// 加入项目 /// /// /// /// [HttpGet("{trialId:guid}/{trialExternalUserId:guid}")] [NonDynamicMethod] public async Task UserConfirmJoinTrial(Guid trialId, Guid trialExternalUserId) { var externalUser = await _trialExternalUseRepository.FirstOrDefaultAsync(t => t.Id == trialExternalUserId); //判断TrialUser中是否存在 不存在就插入 if (!await _repository.AnyAsync(t => t.TrialId == trialId && t.UserId == externalUser.SystemUserId)) { await _repository.AddAsync(new TrialUser() { TrialId = trialId, UserId = (Guid)externalUser.SystemUserId }); await _trialExternalUseRepository.BatchUpdateAsync(t => t.Id == trialExternalUserId, u => new TrialExternalUser() { InviteState = TrialExternalUserStateEnum.UserConfirmed }); await _userRepository.BatchUpdateAsync(t => t.Id == externalUser.SystemUserId, u => new User() { Status = UserStateEnum.Enable }); await _userRepository.SaveChangesAsync(); } return ResponseOutput.Ok(); } } }