Merge branch 'Test.Study' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.Study
commit
9692ae569e
|
@ -988,7 +988,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||||
throw new BusinessValidationFailedException("请用提供格式的模板excel上传需要处理的数据");
|
throw new BusinessValidationFailedException("请用提供格式的模板excel上传需要处理的数据");
|
||||||
}
|
}
|
||||||
|
|
||||||
(serverFilePath, relativePath) = FileStoreHelper.GetTrialSiteSurveyFilePath(_hostEnvironment, fileName, trialId);
|
(serverFilePath, relativePath) = FileStoreHelper.GetOtherFileUploadPath(_hostEnvironment, StaticData.Folder.TempFile, fileName);
|
||||||
|
|
||||||
return serverFilePath;
|
return serverFilePath;
|
||||||
});
|
});
|
||||||
|
@ -1238,7 +1238,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
result = await SingleFileUploadAsync((fileName) => FileStoreHelper.GetOtherFileUploadPath(_hostEnvironment, StaticData.Folder.CommonFile, fileName));
|
result = await SingleFileUploadAsync((fileName) => FileStoreHelper.GetOtherFileUploadPath(_hostEnvironment, StaticData.Folder.TempFile, fileName));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using EasyCaching.Core;
|
using EasyCaching.Core;
|
||||||
using Hangfire;
|
using Hangfire;
|
||||||
|
using Hangfire.Storage;
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.Service;
|
using IRaCIS.Core.Application.Service;
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
|
@ -59,7 +60,7 @@ namespace IRaCIS.Application.Services.BackGroundJob
|
||||||
await InitInternationlizationDataAndWatchJsonFileAsync();
|
await InitInternationlizationDataAndWatchJsonFileAsync();
|
||||||
|
|
||||||
//创建邮件定时任务
|
//创建邮件定时任务
|
||||||
//await InitSysAndTrialCronJobAsync();
|
await InitSysAndTrialCronJobAsync();
|
||||||
|
|
||||||
|
|
||||||
_logger.LogInformation("项目启动 hangfire 任务初始化 执行结束");
|
_logger.LogInformation("项目启动 hangfire 任务初始化 执行结束");
|
||||||
|
@ -155,42 +156,45 @@ namespace IRaCIS.Application.Services.BackGroundJob
|
||||||
|
|
||||||
public async Task InitSysAndTrialCronJobAsync()
|
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 })
|
.Select(t => new { t.Id, t.Code, t.EmailCron, t.BusinessScenarioEnum, t.TrialId })
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
|
|
||||||
foreach (var task in taskInfoList)
|
foreach (var task in taskInfoList)
|
||||||
{
|
{
|
||||||
//利用主键作为任务Id
|
//利用主键作为任务Id
|
||||||
var jobId = task.Id.ToString();
|
var jobId = $"{task.TrialId}_{task.Id}";
|
||||||
switch (task.BusinessScenarioEnum)
|
|
||||||
{
|
|
||||||
|
|
||||||
case EmailBusinessScenario.QCTask:
|
|
||||||
HangfireJobHelper.AddOrUpdateCronJob<IEmailSendService>(jobId, t => t.SendTrialImageQCTaskEmailAsync(task.TrialId), task.EmailCron);
|
|
||||||
break;
|
|
||||||
case EmailBusinessScenario.QCQuestion:
|
|
||||||
HangfireJobHelper.AddOrUpdateCronJob<IEmailSendService>(jobId, t => t.SendTrialQCQuestionEmailAsync(task.TrialId), task.EmailCron);
|
|
||||||
break;
|
|
||||||
case EmailBusinessScenario.ImageQuestion:
|
|
||||||
HangfireJobHelper.AddOrUpdateCronJob<IEmailSendService>(jobId, t => t.SendTrialImageQuestionAsync(task.TrialId), task.EmailCron);
|
|
||||||
break;
|
|
||||||
|
|
||||||
//case CommonDocumentBusinessScenario.EnrollConfirmed:
|
|
||||||
// AddOrUpdateCronJob<IEmailSendService>(jobId, task.Code, t => t.SendClinicalDataQuestionAsync(), task.EmailCron);
|
|
||||||
// break;
|
|
||||||
//case CommonDocumentBusinessScenario.PDConfirmed:
|
|
||||||
// break;
|
|
||||||
//case CommonDocumentBusinessScenario.ClinicalDataQuestion:
|
|
||||||
// break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ public static class FileStoreHelper
|
||||||
|
|
||||||
if (isChangeToPdfFormat==false)
|
if (isChangeToPdfFormat==false)
|
||||||
{
|
{
|
||||||
trustedFileNameForFileStorage= fileName+ Guid.NewGuid().ToString() ;
|
trustedFileNameForFileStorage= Path.GetFileNameWithoutExtension(fileName) + Guid.NewGuid().ToString()+Path.GetExtension(fileName) ;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using Hangfire;
|
using Hangfire;
|
||||||
using IRaCIS.Core.Application.Service;
|
using IRaCIS.Core.Application.Service;
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
using NPOI.SS.Formula.Functions;
|
using NPOI.SS.Formula.Functions;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
@ -15,7 +16,7 @@ namespace IRaCIS.Core.Application.Helper
|
||||||
public static class HangfireJobHelper
|
public static class HangfireJobHelper
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//public static void AddOrUpdateCronJob(string jobId, string queueName, Expression<Action> methodCall, string cron)
|
//public static void AddOrUpdateCronJob(string jobId, string queueName, Expression<Action> methodCall, string cron)
|
||||||
//{
|
//{
|
||||||
|
@ -25,7 +26,7 @@ namespace IRaCIS.Core.Application.Helper
|
||||||
|
|
||||||
|
|
||||||
//添加 或者更新定时任务 Id 要唯一标识一个定义任务
|
//添加 或者更新定时任务 Id 要唯一标识一个定义任务
|
||||||
public static void AddOrUpdateCronJob<T>(string jobId, Expression<Action<T>> methodCall, string cron, string queueName="default")
|
public static void AddOrUpdateCronJob<T>(string jobId, Expression<Action<T>> methodCall, string cron, string queueName = "default")
|
||||||
{
|
{
|
||||||
RecurringJob.AddOrUpdate<T>(jobId, queueName, methodCall, cron);
|
RecurringJob.AddOrUpdate<T>(jobId, queueName, methodCall, cron);
|
||||||
}
|
}
|
||||||
|
@ -38,8 +39,11 @@ namespace IRaCIS.Core.Application.Helper
|
||||||
public static void RemoveCronJob(string jobId)
|
public static void RemoveCronJob(string jobId)
|
||||||
{
|
{
|
||||||
RecurringJob.RemoveIfExists(jobId);
|
RecurringJob.RemoveIfExists(jobId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static void ImmediatelyOnceOnlyJob(Expression<Action> methodCall)
|
public static void ImmediatelyOnceOnlyJob(Expression<Action> methodCall)
|
||||||
{
|
{
|
||||||
BackgroundJob.Enqueue("immediately_once", methodCall);
|
BackgroundJob.Enqueue("immediately_once", methodCall);
|
||||||
|
@ -50,9 +54,9 @@ namespace IRaCIS.Core.Application.Helper
|
||||||
BackgroundJob.Enqueue<T>("immediately_once", methodCall);
|
BackgroundJob.Enqueue<T>("immediately_once", methodCall);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void NotImmediatelyOnceOnlyJob(Expression<Action> methodCall,TimeSpan timeSpan)
|
public static void NotImmediatelyOnceOnlyJob(Expression<Action> methodCall, TimeSpan timeSpan)
|
||||||
{
|
{
|
||||||
BackgroundJob.Schedule("not_immediately_once", methodCall,timeSpan);
|
BackgroundJob.Schedule("not_immediately_once", methodCall, timeSpan);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void NotImmediatelyOnceOnlyJob<T>(Expression<Action<T>> methodCall, TimeSpan timeSpan)
|
public static void NotImmediatelyOnceOnlyJob<T>(Expression<Action<T>> methodCall, TimeSpan timeSpan)
|
||||||
|
@ -60,6 +64,29 @@ namespace IRaCIS.Core.Application.Helper
|
||||||
BackgroundJob.Schedule<T>("not_immediately_once", methodCall, timeSpan);
|
BackgroundJob.Schedule<T>("not_immediately_once", methodCall, timeSpan);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void AddOrUpdateTrialCronJob (string jobId, Guid trialId, EmailBusinessScenario businessScenario, string emailCron)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (businessScenario)
|
||||||
|
{
|
||||||
|
|
||||||
|
case EmailBusinessScenario.QCTask:
|
||||||
|
HangfireJobHelper.AddOrUpdateCronJob<IEmailSendService>(jobId, t => t.SendTrialImageQCTaskEmailAsync(trialId), emailCron);
|
||||||
|
break;
|
||||||
|
case EmailBusinessScenario.QCQuestion:
|
||||||
|
HangfireJobHelper.AddOrUpdateCronJob<IEmailSendService>(jobId, t => t.SendTrialQCQuestionEmailAsync(trialId), emailCron);
|
||||||
|
break;
|
||||||
|
case EmailBusinessScenario.ImageQuestion:
|
||||||
|
HangfireJobHelper.AddOrUpdateCronJob<IEmailSendService>(jobId, t => t.SendTrialImageQuestionAsync(trialId), emailCron);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -461,7 +461,7 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
public DateTime CreateTime { get; set; }
|
public DateTime CreateTime { get; set; }
|
||||||
public Guid Content { get; set; }
|
public string Content { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -338,7 +338,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
|
|
||||||
await subjectVisitClinicalDialogRepository.AddAsync(new SubjectVisitClinicalDialog() { SubjectVisitId = (Guid)taskInfo.SourceSubjectVisitId, Content = content }, true);
|
await subjectVisitClinicalDialogRepository.AddAsync(new SubjectVisitClinicalDialog() { SubjectVisitId = (Guid)taskInfo.SourceSubjectVisitId, Content = content }, true);
|
||||||
|
|
||||||
BackgroundJob.Enqueue( () => emailSendService.SendClinicalDataQuestionAsync(visiTaskId, content).Wait());
|
await emailSendService.SendClinicalDataQuestionAsync(visiTaskId, content);
|
||||||
|
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
|
@ -346,7 +346,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
||||||
public async Task<List<ClinicalDataDialog>> GetClinicalDataDialog(Guid visiTaskId,
|
public async Task<List<ClinicalDataDialog>> GetClinicalDataDialog(Guid visiTaskId,
|
||||||
[FromServices] IRepository<SubjectVisitClinicalDialog> _subjectVisitClinicalDialogRepository)
|
[FromServices] IRepository<SubjectVisitClinicalDialog> _subjectVisitClinicalDialogRepository)
|
||||||
{
|
{
|
||||||
var subjectVisitId= await _visitTaskRepository.Where(t => t.Id == visiTaskId).Select(t=>t.SourceSubjectVisitId).FirstOrDefaultAsync();
|
var subjectVisitId = await _visitTaskRepository.Where(t => t.Id == visiTaskId).Select(t => t.SourceSubjectVisitId).FirstOrDefaultAsync();
|
||||||
var list = _subjectVisitClinicalDialogRepository.Where(t => t.SubjectVisitId == subjectVisitId).ProjectTo<ClinicalDataDialog>(_mapper.ConfigurationProvider).OrderByDescending(t => t.CreateTime).ToList();
|
var list = _subjectVisitClinicalDialogRepository.Where(t => t.SubjectVisitId == subjectVisitId).ProjectTo<ClinicalDataDialog>(_mapper.ConfigurationProvider).OrderByDescending(t => t.CreateTime).ToList();
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
|
|
|
@ -38,10 +38,11 @@ namespace IRaCIS.Core.Application.Service
|
||||||
.ForMember(o => o.OncologyTaskTypeCount, t => t.MapFrom(u => u.SubjectVisitTaskList.Where(t => t.ReadingCategory == ReadingCategory.Oncology && t.TrialReadingCriterionId == trialReadingCriterionId && t.TaskState == TaskState.Effect).Select(t => t.VisitTaskNum).Distinct().Count()))
|
.ForMember(o => o.OncologyTaskTypeCount, t => t.MapFrom(u => u.SubjectVisitTaskList.Where(t => t.ReadingCategory == ReadingCategory.Oncology && t.TrialReadingCriterionId == trialReadingCriterionId && t.TaskState == TaskState.Effect).Select(t => t.VisitTaskNum).Distinct().Count()))
|
||||||
.ForMember(o => o.JudgeTaskTypeCount, t => t.MapFrom(u => u.SubjectVisitTaskList.Where(t => t.ReadingCategory == ReadingCategory.Judge && t.TrialReadingCriterionId == trialReadingCriterionId && t.TaskState == TaskState.Effect).Select(t => t.VisitTaskNum).Distinct().Count()));
|
.ForMember(o => o.JudgeTaskTypeCount, t => t.MapFrom(u => u.SubjectVisitTaskList.Where(t => t.ReadingCategory == ReadingCategory.Judge && t.TrialReadingCriterionId == trialReadingCriterionId && t.TaskState == TaskState.Effect).Select(t => t.VisitTaskNum).Distinct().Count()));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CreateMap<SubjectVisitClinicalDialog, ClinicalDataDialog>();
|
||||||
|
|
||||||
|
|
||||||
CreateMap<SubjectVisit, VisitGenerataTaskDTO>();
|
CreateMap<SubjectVisit, VisitGenerataTaskDTO>();
|
||||||
|
|
|
@ -75,20 +75,42 @@ namespace IRaCIS.Core.Application.Service
|
||||||
t.Subject.TrialSite.TrialSiteCode,
|
t.Subject.TrialSite.TrialSiteCode,
|
||||||
SubjectCode = t.Subject.Code,
|
SubjectCode = t.Subject.Code,
|
||||||
t.Trial.Sponsor.SponsorName,
|
t.Trial.Sponsor.SponsorName,
|
||||||
|
t.SourceSubjectVisit.VisitName,
|
||||||
t.TrialId,
|
t.TrialId,
|
||||||
|
|
||||||
}).FirstNotNullAsync();
|
}).FirstNotNullAsync();
|
||||||
|
|
||||||
var resultStr = _userInfo.IsEn_Us ? (result == true ? "Yes" : "No") : (result == true ? "是" : "否");
|
var resultStr = _userInfo.IsEn_Us ? (result == true ? "Yes" : "No") : (result == true ? "是" : "否");
|
||||||
|
|
||||||
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr)> topicAndHtmlFunc = trialEmailConfig =>
|
if (isEnrollment == true)
|
||||||
{
|
{
|
||||||
var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode);
|
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr)> topicAndHtmlFunc = trialEmailConfig =>
|
||||||
var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, resultStr);
|
{
|
||||||
return (topicStr, htmlBodyStr);
|
var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode);
|
||||||
};
|
|
||||||
|
|
||||||
await SendTrialEmailAsync(taskInfo.TrialId, businessScenarioEnum, topicAndHtmlFunc);
|
var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
|
||||||
|
_userInfo.UserName, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, resultStr);
|
||||||
|
return (topicStr, htmlBodyStr);
|
||||||
|
};
|
||||||
|
|
||||||
|
await SendTrialEmailAsync(taskInfo.TrialId, businessScenarioEnum, topicAndHtmlFunc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr)> topicAndHtmlFunc = trialEmailConfig =>
|
||||||
|
{
|
||||||
|
var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, taskInfo.VisitName);
|
||||||
|
|
||||||
|
var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
|
||||||
|
_userInfo.UserName, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, taskInfo.VisitName, resultStr);
|
||||||
|
|
||||||
|
return (topicStr, htmlBodyStr);
|
||||||
|
};
|
||||||
|
|
||||||
|
await SendTrialEmailAsync(taskInfo.TrialId, businessScenarioEnum, topicAndHtmlFunc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -116,7 +138,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
.Select(t => new
|
.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提交之间的 已领取 待审核 审核中 (审核完成 领取人就会清理 所以只用查询当前领取人是自己的就好了)
|
//待审核通过,统计从已领取到QC提交之间的 已领取 待审核 审核中 (审核完成 领取人就会清理 所以只用查询当前领取人是自己的就好了)
|
||||||
ToBeReviewedCount = t.SubjectVisitList.Where(u => u.CurrentActionUserId == userId).Count()
|
ToBeReviewedCount = t.SubjectVisitList.Where(u => u.CurrentActionUserId == userId).Count()
|
||||||
|
@ -132,7 +154,8 @@ namespace IRaCIS.Core.Application.Service
|
||||||
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr)> topicAndHtmlFunc = trialEmailConfig =>
|
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr)> topicAndHtmlFunc = trialEmailConfig =>
|
||||||
{
|
{
|
||||||
var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
|
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);
|
return (topicStr, htmlBodyStr);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -161,6 +184,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
//过滤项目 并且 将 _userInfo.Id 换位 当前发送邮件的Id
|
//过滤项目 并且 将 _userInfo.Id 换位 当前发送邮件的Id
|
||||||
var query = _trialRepository
|
var query = _trialRepository
|
||||||
|
.Where(t => t.Id == trialId)
|
||||||
.Select(t => new
|
.Select(t => new
|
||||||
{
|
{
|
||||||
ReUploadTobeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
|
ReUploadTobeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
|
||||||
|
@ -180,7 +204,8 @@ namespace IRaCIS.Core.Application.Service
|
||||||
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr)> topicAndHtmlFunc = trialEmailConfig =>
|
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr)> topicAndHtmlFunc = trialEmailConfig =>
|
||||||
{
|
{
|
||||||
var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
|
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);
|
return (topicStr, htmlBodyStr);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -207,12 +232,13 @@ namespace IRaCIS.Core.Application.Service
|
||||||
{
|
{
|
||||||
var userId = user.UserId;
|
var userId = user.UserId;
|
||||||
//过滤项目 并且 将 _userInfo.Id 换位 当前发送邮件的Id
|
//过滤项目 并且 将 _userInfo.Id 换位 当前发送邮件的Id
|
||||||
var query = _trialRepository
|
var query = _trialRepository.Where(t=>t.Id==trialId)
|
||||||
|
|
||||||
.Select(t => new
|
.Select(t => new
|
||||||
{
|
{
|
||||||
//质疑待处理
|
//质疑待处理
|
||||||
ToBeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
|
ToBeDealedCount = t.SubjectVisitList.Where(t=>t.TrialSite.CRCUserList.Any(t=>t.UserId==userId)).SelectMany(c => c.QCChallengeList)
|
||||||
.Where(u => u.CreateUserId == userId && u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC).Count(),
|
.Where(u => u.IsClosed == false && (u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC || u.LatestReplyUserId==null)).Count(),
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -225,7 +251,8 @@ namespace IRaCIS.Core.Application.Service
|
||||||
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr)> topicAndHtmlFunc = trialEmailConfig =>
|
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr)> topicAndHtmlFunc = trialEmailConfig =>
|
||||||
{
|
{
|
||||||
var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
|
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);
|
return (topicStr, htmlBodyStr);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -244,7 +271,8 @@ namespace IRaCIS.Core.Application.Service
|
||||||
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr)> topicAndHtmlFunc = trialEmailConfig =>
|
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr)> topicAndHtmlFunc = trialEmailConfig =>
|
||||||
{
|
{
|
||||||
var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, info.ResearchProgramNo,info.Code,info.VisitName);
|
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,
|
||||||
|
_userInfo.UserName, info.ResearchProgramNo, info.Code, info.VisitName,_userInfo.UserName,content, _SystemEmailSendConfig.CurrentValue.SiteUrl);
|
||||||
return (topicStr, htmlBodyStr);
|
return (topicStr, htmlBodyStr);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1599,6 +1599,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
item.SMTPServerAddress = emailConfig.EmailSMTPServerAddress;
|
item.SMTPServerAddress = emailConfig.EmailSMTPServerAddress;
|
||||||
item.FromName=emailConfig.EmailFromName;
|
item.FromName=emailConfig.EmailFromName;
|
||||||
item.SMTPServerPort = emailConfig.EmailSMTPServerPort;
|
item.SMTPServerPort = emailConfig.EmailSMTPServerPort;
|
||||||
|
item.IsAutoSend = false;
|
||||||
|
|
||||||
|
|
||||||
item.TrialReadingCriterionId = list.FirstOrDefault(t => t.CriterionType == item.CriterionTypeEnum)?.TrialReadingCriterionId;
|
item.TrialReadingCriterionId = list.FirstOrDefault(t => t.CriterionType == item.CriterionTypeEnum)?.TrialReadingCriterionId;
|
||||||
|
@ -1707,6 +1708,18 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
await _trialEmailNoticeConfigRepository.SaveChangesAsync();
|
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();
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1817,6 +1830,11 @@ namespace IRaCIS.Core.Application.Service
|
||||||
[HttpDelete("{trialEmailNoticeConfigId:guid}")]
|
[HttpDelete("{trialEmailNoticeConfigId:guid}")]
|
||||||
public async Task<IResponseOutput> DeleteTrialEmailNoticeConfig(Guid trialEmailNoticeConfigId)
|
public async Task<IResponseOutput> 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);
|
var success = await _trialEmailNoticeConfigRepository.DeleteFromQueryAsync(t => t.Id == trialEmailNoticeConfigId, true);
|
||||||
|
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
|
|
|
@ -93,6 +93,9 @@ public static class StaticData
|
||||||
public static readonly string EmailTemplate = "EmailTemplate";
|
public static readonly string EmailTemplate = "EmailTemplate";
|
||||||
|
|
||||||
public static readonly string CommonFile = "CommonFile";
|
public static readonly string CommonFile = "CommonFile";
|
||||||
|
|
||||||
|
public static readonly string TempFile = "TempFile";
|
||||||
|
|
||||||
public static readonly string CheckFile = "CheckFile";
|
public static readonly string CheckFile = "CheckFile";
|
||||||
public static readonly string SiteUserSurveryFile = "SiteUserSurveryFile";
|
public static readonly string SiteUserSurveryFile = "SiteUserSurveryFile";
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue