分布式锁项目修改

IRC_NewDev
hang 2023-10-12 09:59:06 +08:00
parent a565282a94
commit 8436a319f8
3 changed files with 22 additions and 122 deletions

View File

@ -13,9 +13,9 @@ using IRaCIS.Core.Domain.Share;
using System.Linq.Expressions;
using IRaCIS.Core.Infra.EFCore.Common;
using System.Linq;
using Nito.AsyncEx;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Filter;
using Medallion.Threading;
namespace IRaCIS.Core.Application.Service
{
@ -31,16 +31,17 @@ namespace IRaCIS.Core.Application.Service
private readonly IRepository<SubjectUser> _subjectUserRepository;
private readonly IRepository<Subject> _subjectRepository;
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;
_visitTaskRepository = visitTaskRepository;
_subjectUserRepository = subjectUserRepository;
_subjectRepository = subjectRepository;
_enrollRepository = enrollRepository;
_distributedLockProvider = distributedLockProvider;
}
/// <summary>
@ -142,7 +143,9 @@ namespace IRaCIS.Core.Application.Service
//var list = query.OrderByDescending(t => t.IsHaveGeneratedTask).ToList();
using (await _mutex.LockAsync())
var @lock = _distributedLockProvider.CreateLock($"VisitTaskCode");
using (await @lock.AcquireAsync())
{
int maxCodeInt = 0;
@ -293,7 +296,9 @@ namespace IRaCIS.Core.Application.Service
var configDoctorUserIdList = await doctorUserIdQuery.ToListAsync();
using (await _mutex.LockAsync())
var @lock = _distributedLockProvider.CreateLock($"VisitTaskCode");
using (await @lock.AcquireAsync())
{
int maxCodeInt = 0;

View File

@ -7,6 +7,7 @@ using IRaCIS.Core.Application.Auth;
using AutoMapper;
using IRaCIS.Application.Contracts;
using Microsoft.Extensions.Options;
using Medallion.Threading;
namespace IRaCIS.Application.Services
{
@ -53,7 +54,7 @@ namespace IRaCIS.Application.Services
private readonly IRepository<UserType> _userTypeRepository;
private readonly IRepository<Doctor> _doctorTypeRepository;
private readonly IDistributedLockProvider _distributedLockProvider;
private readonly SystemEmailSendConfig _systemEmailConfig;
@ -67,7 +68,7 @@ namespace IRaCIS.Application.Services
IRepository<Trial> trialRepository,
IRepository<UserType> userTypeRepository,
IRepository<Doctor> doctorTypeRepository,
IMapper mapper, IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig)
IMapper mapper, IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig, IDistributedLockProvider distributedLockProvider)
{
_systemEmailConfig = systemEmailConfig.CurrentValue;
_verificationCodeRepository = verificationCodeRepository;
@ -83,7 +84,7 @@ namespace IRaCIS.Application.Services
_userTypeRepository = userTypeRepository;
_doctorTypeRepository = doctorTypeRepository;
_distributedLockProvider = distributedLockProvider;
}
//重置邮箱
@ -604,7 +605,9 @@ namespace IRaCIS.Application.Services
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);

View File

@ -15,6 +15,7 @@ using MailKit.Security;
using MimeKit;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Filter;
using Medallion.Threading;
namespace IRaCIS.Core.Application.Contracts
{
@ -32,21 +33,23 @@ namespace IRaCIS.Core.Application.Contracts
private readonly IRepository<TrialUser> _trialUserRepository;
private readonly ITokenService _tokenService;
private readonly IMailVerificationService _mailVerificationService;
private readonly IDistributedLockProvider _distributedLockProvider;
public TrialSiteSurveyService(IRepository<TrialSiteSurvey> trialSiteSurveyRepository, IRepository<TrialUser> trialUserRepository, IRepository<TrialSiteUserSurvey> trialSiteUserSurveyRepository,
IRepository<User> userRepository, IRepository<TrialSite> trialSiteRepository,
IRepository<Doctor> doctorRepository,
ITokenService tokenService,
IMailVerificationService mailVerificationService)
IMailVerificationService mailVerificationService, IDistributedLockProvider distributedLockProvider)
{
_trialSiteSurveyRepository = trialSiteSurveyRepository;
_trialSiteUserSurveyRepository = trialSiteUserSurveyRepository;
_userRepository = userRepository;
_trialUserRepository = trialUserRepository;
_trialSiteRepository = trialSiteRepository;
this._doctorRepository = doctorRepository;
_doctorRepository = doctorRepository;
_tokenService = tokenService;
_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