分布式锁项目修改
							parent
							
								
									a565282a94
								
							
						
					
					
						commit
						8436a319f8
					
				| 
						 | 
				
			
			@ -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;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue