From 14bc9f44299cf7a0d0d26e0964f140418479127e Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 25 Aug 2023 17:16:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=82=AE=E4=BB=B6=E5=8F=91?= =?UTF-8?q?=E9=80=81=E6=9E=9A=E4=B8=BE--026?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BackGroundJob/IRaCISCHangfireJob.cs | 64 ++++++++++--------- .../Helper/HangfireJobHelper.cs | 37 +++++++++-- .../Service/Document/EmailSendService.cs | 17 +++-- .../Document/TrialEmailNoticeConfigService.cs | 18 ++++++ 4 files changed, 95 insertions(+), 41 deletions(-) diff --git a/IRaCIS.Core.Application/BackGroundJob/IRaCISCHangfireJob.cs b/IRaCIS.Core.Application/BackGroundJob/IRaCISCHangfireJob.cs index b71798c43..278631030 100644 --- a/IRaCIS.Core.Application/BackGroundJob/IRaCISCHangfireJob.cs +++ b/IRaCIS.Core.Application/BackGroundJob/IRaCISCHangfireJob.cs @@ -1,5 +1,6 @@ using EasyCaching.Core; using Hangfire; +using Hangfire.Storage; using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.Service; using IRaCIS.Core.Domain.Share; @@ -59,7 +60,7 @@ namespace IRaCIS.Application.Services.BackGroundJob await InitInternationlizationDataAndWatchJsonFileAsync(); //创建邮件定时任务 - //await InitSysAndTrialCronJobAsync(); + await InitSysAndTrialCronJobAsync(); _logger.LogInformation("项目启动 hangfire 任务初始化 执行结束"); @@ -155,42 +156,45 @@ namespace IRaCIS.Application.Services.BackGroundJob public async Task InitSysAndTrialCronJobAsync() { - var taskInfoList = await _trialEmailNoticeConfigRepository.Where(t => t.Trial.TrialStatusStr == StaticData.TrialState.TrialOngoing && t.EmailCron != string.Empty) + //var deleteJobIdList = await _trialEmailNoticeConfigRepository.Where(t => t.Trial.TrialStatusStr != StaticData.TrialState.TrialOngoing && t.EmailCron != string.Empty && t.IsAutoSend) + // .Select(t => t.TrialId + "_" + t.Id) + // .ToListAsync(); + + //foreach (var jobId in deleteJobIdList) + //{ + // HangfireJobHelper.RemoveCronJob(jobId); + //} + + + var taskInfoList = await _trialEmailNoticeConfigRepository.Where(t => t.Trial.TrialStatusStr == StaticData.TrialState.TrialOngoing && t.EmailCron != string.Empty && t.IsAutoSend) .Select(t => new { t.Id, t.Code, t.EmailCron, t.BusinessScenarioEnum, t.TrialId }) .ToListAsync(); - foreach (var task in taskInfoList) { //利用主键作为任务Id - var jobId = task.Id.ToString(); - switch (task.BusinessScenarioEnum) - { - - case EmailBusinessScenario.QCTask: - HangfireJobHelper.AddOrUpdateCronJob(jobId, t => t.SendTrialImageQCTaskEmailAsync(task.TrialId), task.EmailCron); - break; - case EmailBusinessScenario.QCQuestion: - HangfireJobHelper.AddOrUpdateCronJob(jobId, t => t.SendTrialQCQuestionEmailAsync(task.TrialId), task.EmailCron); - break; - case EmailBusinessScenario.ImageQuestion: - HangfireJobHelper.AddOrUpdateCronJob(jobId, t => t.SendTrialImageQuestionAsync(task.TrialId), task.EmailCron); - break; - - //case CommonDocumentBusinessScenario.EnrollConfirmed: - // AddOrUpdateCronJob(jobId, task.Code, t => t.SendClinicalDataQuestionAsync(), task.EmailCron); - // break; - //case CommonDocumentBusinessScenario.PDConfirmed: - // break; - //case CommonDocumentBusinessScenario.ClinicalDataQuestion: - // break; - default: - break; - } + var jobId = $"{task.TrialId}_{task.Id}"; + HangfireJobHelper.AddOrUpdateTrialCronJob(jobId, task.TrialId, task.BusinessScenarioEnum, task.EmailCron); } + + var addOrUpdateJobIdList = taskInfoList.Select(t => $"{t.TrialId}_{t.Id}").ToList(); + + var list = JobStorage.Current.GetConnection().GetRecurringJobs().ToList(); + + //项目定时任务都在default 队列 + //var dbJobIdList = JobStorage.Current.GetConnection().GetRecurringJobs().Where(t => t.Queue == "default").Select(t => t.Id).ToList(); + + //var deleteList= dbJobIdList.Except(addOrUpdateJobIdList).ToList(); + + // foreach (var jobId in deleteList) + // { + // HangfireJobHelper.RemoveCronJob(jobId); + // } + + } - - } -} \ No newline at end of file + + +} diff --git a/IRaCIS.Core.Application/Helper/HangfireJobHelper.cs b/IRaCIS.Core.Application/Helper/HangfireJobHelper.cs index a489d3b3a..69eaf410d 100644 --- a/IRaCIS.Core.Application/Helper/HangfireJobHelper.cs +++ b/IRaCIS.Core.Application/Helper/HangfireJobHelper.cs @@ -1,6 +1,7 @@ using Hangfire; using IRaCIS.Core.Application.Service; using IRaCIS.Core.Domain.Share; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using NPOI.SS.Formula.Functions; using System; using System.Collections; @@ -15,7 +16,7 @@ namespace IRaCIS.Core.Application.Helper public static class HangfireJobHelper { - + //public static void AddOrUpdateCronJob(string jobId, string queueName, Expression methodCall, string cron) //{ @@ -25,7 +26,7 @@ namespace IRaCIS.Core.Application.Helper //添加 或者更新定时任务 Id 要唯一标识一个定义任务 - public static void AddOrUpdateCronJob(string jobId, Expression> methodCall, string cron, string queueName="default") + public static void AddOrUpdateCronJob(string jobId, Expression> methodCall, string cron, string queueName = "default") { RecurringJob.AddOrUpdate(jobId, queueName, methodCall, cron); } @@ -38,8 +39,11 @@ namespace IRaCIS.Core.Application.Helper public static void RemoveCronJob(string jobId) { RecurringJob.RemoveIfExists(jobId); + } + + public static void ImmediatelyOnceOnlyJob(Expression methodCall) { BackgroundJob.Enqueue("immediately_once", methodCall); @@ -50,9 +54,9 @@ namespace IRaCIS.Core.Application.Helper BackgroundJob.Enqueue("immediately_once", methodCall); } - public static void NotImmediatelyOnceOnlyJob(Expression methodCall,TimeSpan timeSpan) + public static void NotImmediatelyOnceOnlyJob(Expression methodCall, TimeSpan timeSpan) { - BackgroundJob.Schedule("not_immediately_once", methodCall,timeSpan); + BackgroundJob.Schedule("not_immediately_once", methodCall, timeSpan); } public static void NotImmediatelyOnceOnlyJob(Expression> methodCall, TimeSpan timeSpan) @@ -60,6 +64,29 @@ namespace IRaCIS.Core.Application.Helper BackgroundJob.Schedule("not_immediately_once", methodCall, timeSpan); } - + + public static void AddOrUpdateTrialCronJob (string jobId, Guid trialId, EmailBusinessScenario businessScenario, string emailCron) + { + + switch (businessScenario) + { + + case EmailBusinessScenario.QCTask: + HangfireJobHelper.AddOrUpdateCronJob(jobId, t => t.SendTrialImageQCTaskEmailAsync(trialId), emailCron); + break; + case EmailBusinessScenario.QCQuestion: + HangfireJobHelper.AddOrUpdateCronJob(jobId, t => t.SendTrialQCQuestionEmailAsync(trialId), emailCron); + break; + case EmailBusinessScenario.ImageQuestion: + HangfireJobHelper.AddOrUpdateCronJob(jobId, t => t.SendTrialImageQuestionAsync(trialId), emailCron); + break; + + default: + break; + } + + } } } + + diff --git a/IRaCIS.Core.Application/Service/Document/EmailSendService.cs b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs index 3e013bdbb..6d369ca01 100644 --- a/IRaCIS.Core.Application/Service/Document/EmailSendService.cs +++ b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs @@ -84,7 +84,8 @@ namespace IRaCIS.Core.Application.Service Func topicAndHtmlFunc = trialEmailConfig => { var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode); - var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, resultStr); + var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, + taskInfo.ResearchProgramNo, taskInfo.SubjectCode, resultStr); return (topicStr, htmlBodyStr); }; @@ -116,7 +117,7 @@ namespace IRaCIS.Core.Application.Service .Select(t => new { //待领取量 - ToBeClaimedCount = t.SubjectVisitList.Where(u => u.CurrentActionUserId == null && (u.PreliminaryAuditUserId == null || (u.PreliminaryAuditUserId != userId && u.ReviewAuditUserId == null))).Count(), + ToBeClaimedCount = t.SubjectVisitList.Where(u => u.SubmitState==SubmitStateEnum.Submitted && u.CurrentActionUserId == null && (u.PreliminaryAuditUserId == null || (u.PreliminaryAuditUserId != userId && u.ReviewAuditUserId == null))).Count(), //待审核通过,统计从已领取到QC提交之间的 已领取 待审核 审核中 (审核完成 领取人就会清理 所以只用查询当前领取人是自己的就好了) ToBeReviewedCount = t.SubjectVisitList.Where(u => u.CurrentActionUserId == userId).Count() @@ -132,7 +133,8 @@ namespace IRaCIS.Core.Application.Service Func topicAndHtmlFunc = trialEmailConfig => { var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo); - var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, user.FullName, DateTime.Now, sendStat.ToBeClaimedCount, sendStat.ToBeReviewedCount); + var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, + user.FullName, DateTime.Now, sendStat.ToBeClaimedCount, sendStat.ToBeReviewedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl); return (topicStr, htmlBodyStr); }; @@ -180,7 +182,8 @@ namespace IRaCIS.Core.Application.Service Func topicAndHtmlFunc = trialEmailConfig => { var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo); - var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, user.FullName, DateTime.Now, sendStat.ToBeDealedCount, sendStat.ReUploadTobeDealedCount); + var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, + user.FullName, DateTime.Now, sendStat.ToBeDealedCount, sendStat.ReUploadTobeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl); return (topicStr, htmlBodyStr); }; @@ -225,7 +228,8 @@ namespace IRaCIS.Core.Application.Service Func topicAndHtmlFunc = trialEmailConfig => { var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo); - var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, user.FullName, DateTime.Now, sendStat.ToBeDealedCount); + var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, + user.FullName, DateTime.Now, sendStat.ToBeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl); return (topicStr, htmlBodyStr); }; @@ -244,7 +248,8 @@ namespace IRaCIS.Core.Application.Service Func topicAndHtmlFunc = trialEmailConfig => { var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, info.ResearchProgramNo,info.Code,info.VisitName); - var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, info.ResearchProgramNo, info.Code, info.VisitName,_userInfo.UserName,content, _SystemEmailSendConfig.CurrentValue.SiteUrl); + var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, + info.ResearchProgramNo, info.Code, info.VisitName,_userInfo.UserName,content, _SystemEmailSendConfig.CurrentValue.SiteUrl); return (topicStr, htmlBodyStr); }; diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs index 2c0dd7b91..cbf6299b7 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -1599,6 +1599,7 @@ namespace IRaCIS.Core.Application.Service item.SMTPServerAddress = emailConfig.EmailSMTPServerAddress; item.FromName=emailConfig.EmailFromName; item.SMTPServerPort = emailConfig.EmailSMTPServerPort; + item.IsAutoSend = false; item.TrialReadingCriterionId = list.FirstOrDefault(t => t.CriterionType == item.CriterionTypeEnum)?.TrialReadingCriterionId; @@ -1707,6 +1708,18 @@ namespace IRaCIS.Core.Application.Service await _trialEmailNoticeConfigRepository.SaveChangesAsync(); + var jobId = $"{addOrEditTrialEmailNoticeConfig.TrialId}_{id}"; + + if (addOrEditTrialEmailNoticeConfig.IsAutoSend) + { + HangfireJobHelper.AddOrUpdateTrialCronJob(jobId, addOrEditTrialEmailNoticeConfig.TrialId, addOrEditTrialEmailNoticeConfig.BusinessScenarioEnum, addOrEditTrialEmailNoticeConfig.EmailCron); + + } + else + { + HangfireJobHelper.RemoveCronJob(jobId); + } + return ResponseOutput.Ok(); } @@ -1817,6 +1830,11 @@ namespace IRaCIS.Core.Application.Service [HttpDelete("{trialEmailNoticeConfigId:guid}")] public async Task DeleteTrialEmailNoticeConfig(Guid trialEmailNoticeConfigId) { + var trialId=await _trialEmailNoticeConfigRepository.Where(t=>t.Id==trialEmailNoticeConfigId).Select(t=>t.TrialId).FirstOrDefaultAsync(); + var jobId = $"{trialId}_{trialEmailNoticeConfigId}"; + + HangfireJobHelper.RemoveCronJob(jobId); + var success = await _trialEmailNoticeConfigRepository.DeleteFromQueryAsync(t => t.Id == trialEmailNoticeConfigId, true); return ResponseOutput.Ok();