分布式锁项目修改
parent
a565282a94
commit
8436a319f8
|
@ -13,9 +13,9 @@ using IRaCIS.Core.Domain.Share;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using IRaCIS.Core.Infra.EFCore.Common;
|
using IRaCIS.Core.Infra.EFCore.Common;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Nito.AsyncEx;
|
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Filter;
|
using IRaCIS.Core.Application.Filter;
|
||||||
|
using Medallion.Threading;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service
|
namespace IRaCIS.Core.Application.Service
|
||||||
{
|
{
|
||||||
|
@ -31,16 +31,17 @@ namespace IRaCIS.Core.Application.Service
|
||||||
private readonly IRepository<SubjectUser> _subjectUserRepository;
|
private readonly IRepository<SubjectUser> _subjectUserRepository;
|
||||||
private readonly IRepository<Subject> _subjectRepository;
|
private readonly IRepository<Subject> _subjectRepository;
|
||||||
private readonly IRepository<Enroll> _enrollRepository;
|
private readonly IRepository<Enroll> _enrollRepository;
|
||||||
|
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||||
|
|
||||||
private readonly AsyncLock _mutex = new AsyncLock();
|
|
||||||
|
|
||||||
public TaskConsistentRuleService(IRepository<VisitTask> visitTaskRepository, IRepository<Enroll> enrollRepository, IRepository<TaskConsistentRule> taskConsistentRuleRepository, IRepository<SubjectUser> subjectUserRepository, IRepository<Subject> subjectRepository)
|
public TaskConsistentRuleService(IRepository<VisitTask> visitTaskRepository, IRepository<Enroll> enrollRepository, IRepository<TaskConsistentRule> taskConsistentRuleRepository, IRepository<SubjectUser> subjectUserRepository, IRepository<Subject> subjectRepository, IDistributedLockProvider distributedLockProvider)
|
||||||
{
|
{
|
||||||
_taskConsistentRuleRepository = taskConsistentRuleRepository;
|
_taskConsistentRuleRepository = taskConsistentRuleRepository;
|
||||||
_visitTaskRepository = visitTaskRepository;
|
_visitTaskRepository = visitTaskRepository;
|
||||||
_subjectUserRepository = subjectUserRepository;
|
_subjectUserRepository = subjectUserRepository;
|
||||||
_subjectRepository = subjectRepository;
|
_subjectRepository = subjectRepository;
|
||||||
_enrollRepository = enrollRepository;
|
_enrollRepository = enrollRepository;
|
||||||
|
_distributedLockProvider = distributedLockProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -142,7 +143,9 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
//var list = query.OrderByDescending(t => t.IsHaveGeneratedTask).ToList();
|
//var list = query.OrderByDescending(t => t.IsHaveGeneratedTask).ToList();
|
||||||
|
|
||||||
using (await _mutex.LockAsync())
|
var @lock = _distributedLockProvider.CreateLock($"VisitTaskCode");
|
||||||
|
|
||||||
|
using (await @lock.AcquireAsync())
|
||||||
{
|
{
|
||||||
int maxCodeInt = 0;
|
int maxCodeInt = 0;
|
||||||
|
|
||||||
|
@ -293,7 +296,9 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
var configDoctorUserIdList = await doctorUserIdQuery.ToListAsync();
|
var configDoctorUserIdList = await doctorUserIdQuery.ToListAsync();
|
||||||
|
|
||||||
using (await _mutex.LockAsync())
|
var @lock = _distributedLockProvider.CreateLock($"VisitTaskCode");
|
||||||
|
|
||||||
|
using (await @lock.AcquireAsync())
|
||||||
{
|
{
|
||||||
int maxCodeInt = 0;
|
int maxCodeInt = 0;
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ using IRaCIS.Core.Application.Auth;
|
||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
using IRaCIS.Application.Contracts;
|
using IRaCIS.Application.Contracts;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
using Medallion.Threading;
|
||||||
|
|
||||||
namespace IRaCIS.Application.Services
|
namespace IRaCIS.Application.Services
|
||||||
{
|
{
|
||||||
|
@ -53,7 +54,7 @@ namespace IRaCIS.Application.Services
|
||||||
private readonly IRepository<UserType> _userTypeRepository;
|
private readonly IRepository<UserType> _userTypeRepository;
|
||||||
|
|
||||||
private readonly IRepository<Doctor> _doctorTypeRepository;
|
private readonly IRepository<Doctor> _doctorTypeRepository;
|
||||||
|
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||||
|
|
||||||
private readonly SystemEmailSendConfig _systemEmailConfig;
|
private readonly SystemEmailSendConfig _systemEmailConfig;
|
||||||
|
|
||||||
|
@ -67,7 +68,7 @@ namespace IRaCIS.Application.Services
|
||||||
IRepository<Trial> trialRepository,
|
IRepository<Trial> trialRepository,
|
||||||
IRepository<UserType> userTypeRepository,
|
IRepository<UserType> userTypeRepository,
|
||||||
IRepository<Doctor> doctorTypeRepository,
|
IRepository<Doctor> doctorTypeRepository,
|
||||||
IMapper mapper, IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig)
|
IMapper mapper, IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig, IDistributedLockProvider distributedLockProvider)
|
||||||
{
|
{
|
||||||
_systemEmailConfig = systemEmailConfig.CurrentValue;
|
_systemEmailConfig = systemEmailConfig.CurrentValue;
|
||||||
_verificationCodeRepository = verificationCodeRepository;
|
_verificationCodeRepository = verificationCodeRepository;
|
||||||
|
@ -83,7 +84,7 @@ namespace IRaCIS.Application.Services
|
||||||
|
|
||||||
_userTypeRepository = userTypeRepository;
|
_userTypeRepository = userTypeRepository;
|
||||||
_doctorTypeRepository = doctorTypeRepository;
|
_doctorTypeRepository = doctorTypeRepository;
|
||||||
|
_distributedLockProvider = distributedLockProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
//重置邮箱
|
//重置邮箱
|
||||||
|
@ -604,7 +605,9 @@ namespace IRaCIS.Application.Services
|
||||||
|
|
||||||
var userType = await _userTypeRepository.FirstAsync(t => t.UserTypeEnum == UserTypeEnum.IndependentReviewer);
|
var userType = await _userTypeRepository.FirstAsync(t => t.UserTypeEnum == UserTypeEnum.IndependentReviewer);
|
||||||
|
|
||||||
using (await _mutex.LockAsync())
|
var @lock = _distributedLockProvider.CreateLock($"UserCode");
|
||||||
|
|
||||||
|
using (await @lock.AcquireAsync())
|
||||||
{
|
{
|
||||||
var isDoctorHaveAccount = await _userRepository.AnyAsync(t => t.DoctorId == doctorId);
|
var isDoctorHaveAccount = await _userRepository.AnyAsync(t => t.DoctorId == doctorId);
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ using MailKit.Security;
|
||||||
using MimeKit;
|
using MimeKit;
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.Filter;
|
using IRaCIS.Core.Application.Filter;
|
||||||
|
using Medallion.Threading;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Contracts
|
namespace IRaCIS.Core.Application.Contracts
|
||||||
{
|
{
|
||||||
|
@ -32,21 +33,23 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
private readonly IRepository<TrialUser> _trialUserRepository;
|
private readonly IRepository<TrialUser> _trialUserRepository;
|
||||||
private readonly ITokenService _tokenService;
|
private readonly ITokenService _tokenService;
|
||||||
private readonly IMailVerificationService _mailVerificationService;
|
private readonly IMailVerificationService _mailVerificationService;
|
||||||
|
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||||
|
|
||||||
public TrialSiteSurveyService(IRepository<TrialSiteSurvey> trialSiteSurveyRepository, IRepository<TrialUser> trialUserRepository, IRepository<TrialSiteUserSurvey> trialSiteUserSurveyRepository,
|
public TrialSiteSurveyService(IRepository<TrialSiteSurvey> trialSiteSurveyRepository, IRepository<TrialUser> trialUserRepository, IRepository<TrialSiteUserSurvey> trialSiteUserSurveyRepository,
|
||||||
IRepository<User> userRepository, IRepository<TrialSite> trialSiteRepository,
|
IRepository<User> userRepository, IRepository<TrialSite> trialSiteRepository,
|
||||||
IRepository<Doctor> doctorRepository,
|
IRepository<Doctor> doctorRepository,
|
||||||
ITokenService tokenService,
|
ITokenService tokenService,
|
||||||
IMailVerificationService mailVerificationService)
|
IMailVerificationService mailVerificationService, IDistributedLockProvider distributedLockProvider)
|
||||||
{
|
{
|
||||||
_trialSiteSurveyRepository = trialSiteSurveyRepository;
|
_trialSiteSurveyRepository = trialSiteSurveyRepository;
|
||||||
_trialSiteUserSurveyRepository = trialSiteUserSurveyRepository;
|
_trialSiteUserSurveyRepository = trialSiteUserSurveyRepository;
|
||||||
_userRepository = userRepository;
|
_userRepository = userRepository;
|
||||||
_trialUserRepository = trialUserRepository;
|
_trialUserRepository = trialUserRepository;
|
||||||
_trialSiteRepository = trialSiteRepository;
|
_trialSiteRepository = trialSiteRepository;
|
||||||
this._doctorRepository = doctorRepository;
|
_doctorRepository = doctorRepository;
|
||||||
_tokenService = tokenService;
|
_tokenService = tokenService;
|
||||||
_mailVerificationService = mailVerificationService;
|
_mailVerificationService = mailVerificationService;
|
||||||
|
_distributedLockProvider = distributedLockProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -903,118 +906,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region 废弃
|
|
||||||
//Site 调研邀请
|
|
||||||
public async Task<IResponseOutput> SendInviteEmail(InviteEmailCommand inviteEmailCommand)
|
|
||||||
{
|
|
||||||
|
|
||||||
var trialInfo = await _repository.FirstOrDefaultAsync<Trial>(t => t.Id == inviteEmailCommand.TrialId);
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var item in inviteEmailCommand.UserList)
|
|
||||||
{
|
|
||||||
|
|
||||||
var messageToSend = new MimeMessage();
|
|
||||||
//发件地址
|
|
||||||
messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
|
|
||||||
//收件地址
|
|
||||||
messageToSend.To.Add(new MailboxAddress(String.Empty, item.Email));
|
|
||||||
//主题
|
|
||||||
//$"[来自展影IRC] [{trialInfo.ResearchProgramNo}] 邀请信";
|
|
||||||
messageToSend.Subject = _localizer["TrialSiteSurvey_IRCInvitation", trialInfo.ResearchProgramNo];
|
|
||||||
|
|
||||||
var builder = new BodyBuilder();
|
|
||||||
|
|
||||||
//找下系统中是否存在该用户类型的 并且邮箱 或者手机的账户
|
|
||||||
var sysUserInfo = await _userRepository.Where(t => t.UserTypeId == item.UserTypeId && t.EMail == item.Email).Include(t => t.UserTypeRole).FirstOrDefaultAsync();
|
|
||||||
|
|
||||||
//int verificationCode = new Random().Next(100000, 1000000);
|
|
||||||
|
|
||||||
//var baseApiUrl = baseUrl.Remove(baseUrl.IndexOf("#")) + "api";
|
|
||||||
|
|
||||||
|
|
||||||
if (sysUserInfo == null)
|
|
||||||
{
|
|
||||||
|
|
||||||
lock (lockObj)
|
|
||||||
{
|
|
||||||
var saveItem = _mapper.Map<User>(item);
|
|
||||||
|
|
||||||
saveItem.Code = _userRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1;
|
|
||||||
|
|
||||||
saveItem.UserCode = AppSettings.GetCodeStr(saveItem.Code, nameof(User)); ;
|
|
||||||
|
|
||||||
saveItem.UserName = saveItem.UserCode;
|
|
||||||
|
|
||||||
saveItem.UserTypeEnum = _repository.Where<UserType>(t => t.Id == saveItem.UserTypeId).Select(t => t.UserTypeEnum).First();
|
|
||||||
|
|
||||||
//saveItem.Password = MD5Helper.Md5(verificationCode.ToString());
|
|
||||||
|
|
||||||
_ = _repository.AddAsync(saveItem).Result;
|
|
||||||
|
|
||||||
_ = _repository.SaveChangesAsync().Result;
|
|
||||||
|
|
||||||
|
|
||||||
sysUserInfo = saveItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
builder.HtmlBody = @$"<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
|
||||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
|
||||||
<div style='padding-top: 20px;'>
|
|
||||||
<div style='line-height: 40px;font-size: 18px'>
|
|
||||||
{sysUserInfo.LastName + "/" + sysUserInfo.FirstName}:
|
|
||||||
</div>
|
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
|
||||||
{_localizer["TrialSiteSurvey_IRCInvitationContent", trialInfo.ResearchProgramNo]}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<a href=' {inviteEmailCommand.RouteUrl + "?Id=" + item.Id + "&IsExternalUser=0"}' 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;margin-bottom: 100px;'>
|
|
||||||
查看并确认
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>";
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
messageToSend.Body = builder.ToMessageBody();
|
|
||||||
|
|
||||||
using (var smtp = new MailKit.Net.Smtp.SmtpClient())
|
|
||||||
{
|
|
||||||
|
|
||||||
smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;
|
|
||||||
|
|
||||||
smtp.MessageSent += (sender, args) =>
|
|
||||||
{
|
|
||||||
|
|
||||||
_ = _trialSiteUserSurveyRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Id, u => new TrialSiteUserSurvey() { IsGenerateSuccess = true, InviteState = TrialSiteUserStateEnum.HasSend, ConfirmTime = null, RejectReason = String.Empty, SystemUserId = sysUserInfo.Id, ExpireTime = DateTime.Now.AddDays(7) }).Result;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
await smtp.ConnectAsync("smtp.163.com", 465, SecureSocketOptions.StartTls);
|
|
||||||
|
|
||||||
|
|
||||||
await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH");
|
|
||||||
|
|
||||||
|
|
||||||
await smtp.SendAsync(messageToSend);
|
|
||||||
|
|
||||||
|
|
||||||
await smtp.DisconnectAsync(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return ResponseOutput.Ok();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue