Compare commits
No commits in common. "88231fffb48c2e32f6f30c205524ecf7e37716c9" and "ebb33f45ba6b47c89e9dd1784a460b162622443f" have entirely different histories.
88231fffb4
...
ebb33f45ba
|
|
@ -13,7 +13,8 @@ using System.IO;
|
|||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infra.EFCore;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
using System.Runtime.InteropServices;
|
||||
using IRaCIS.Application.Services.BackGroundJob;
|
||||
using Hangfire;
|
||||
|
||||
namespace IRaCIS.Core.API
|
||||
{
|
||||
|
|
@ -57,30 +58,17 @@ namespace IRaCIS.Core.API
|
|||
|
||||
//// Serilog
|
||||
SerilogExtension.AddSerilogSetup(enviromentName, host.Services);
|
||||
|
||||
Log.Logger.Warning($"µ±Ç°»·¾³£º{enviromentName}");
|
||||
|
||||
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
Log.Logger.Warning($"当前部署平台环境:windows");
|
||||
}
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
||||
{
|
||||
Log.Logger.Warning($"当前部署平台环境:linux");
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Logger.Warning($"当前部署平台环境:OSX or FreeBSD");
|
||||
}
|
||||
|
||||
NewId.SetProcessIdProvider(new CurrentProcessIdProvider());
|
||||
|
||||
////缓存项目的状态 匿名化数据
|
||||
//await InitCache(host);
|
||||
|
||||
host.Run();
|
||||
|
||||
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,39 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IRaCIS.Core.Application.Helper
|
||||
{
|
||||
public class FileConvertHelper
|
||||
{
|
||||
|
||||
|
||||
static public void ConvertWordToPdf(string inputWordFilePath, string outputPdfDir)
|
||||
{
|
||||
// 设置 libreoffice 命令行参数
|
||||
string arguments = $"--headless --invisible --convert-to pdf \"{inputWordFilePath}\" --outdir \"{outputPdfDir}\"";
|
||||
|
||||
// 启动 libreoffice 进程
|
||||
using (Process process = new Process())
|
||||
{
|
||||
process.StartInfo.FileName = "libreoffice";
|
||||
process.StartInfo.Arguments = arguments;
|
||||
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
|
||||
process.StartInfo.RedirectStandardOutput = true;
|
||||
process.StartInfo.RedirectStandardError = true;
|
||||
process.StartInfo.UseShellExecute = false;
|
||||
process.StartInfo.CreateNoWindow = true;
|
||||
|
||||
process.Start();
|
||||
|
||||
// 等待进程结束
|
||||
process.WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -95,25 +95,6 @@
|
|||
<param name="type"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Helper.OSSService.UploadToOSS(System.IO.Stream,System.String,System.String)">
|
||||
<summary>
|
||||
oosFolderPath 不要 "/ "开头 应该: TempFolder/ChildFolder
|
||||
</summary>
|
||||
<param name="fileStream"></param>
|
||||
<param name="oosFolderPath"></param>
|
||||
<param name="fileRealName"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Helper.OSSService.UploadToOSS(System.String,System.String)">
|
||||
<summary>
|
||||
oosFolderPath 不要 "/ "开头 应该: TempFolder/ChildFolder
|
||||
</summary>
|
||||
<param name="localFilePath"></param>
|
||||
<param name="oosFolderPath"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.TaskMedicalReviewRuleService">
|
||||
<summary>
|
||||
医学审核生成规则 废弃
|
||||
|
|
|
|||
|
|
@ -31,8 +31,6 @@ namespace IRaCIS.Core.Application.Service
|
|||
Task SendTrialQCQuestionEmailAsync(Guid trialId);
|
||||
Task SendTrialImageQuestionAsync(Guid trialId);
|
||||
Task SendPIAuditResultAsync(Guid visitTaskId);
|
||||
|
||||
Task<(TrialEmailNoticeConfig?, SMTPEmailConfig?)> BuildEmailConfig(Guid trialId, EmailBusinessScenario businessScenario, Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr, bool isEn_us, Guid? onlyToUserId)> topicAndHtmlFunc, Guid? siteId = null, Guid? trialReadingCriterionId = null);
|
||||
}
|
||||
|
||||
public class EmailSendService : BaseService, IEmailSendService
|
||||
|
|
@ -465,142 +463,6 @@ namespace IRaCIS.Core.Application.Service
|
|||
}
|
||||
}
|
||||
|
||||
public async Task<(TrialEmailNoticeConfig?, SMTPEmailConfig?)> BuildEmailConfig(Guid trialId, EmailBusinessScenario businessScenario, Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr, bool isEn_us, Guid? onlyToUserId)> topicAndHtmlFunc, Guid? siteId = null, Guid? trialReadingCriterionId = null)
|
||||
{
|
||||
//找到配置
|
||||
var trialEmailConfig = await _trialEmailNoticeConfigRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionId && t.BusinessScenarioEnum == businessScenario, ignoreQueryFilters: true)
|
||||
.Include(t => t.TrialEmailNoticeUserList).Include(t => t.TrialEmailBlackUserList).FirstOrDefaultAsync();
|
||||
|
||||
|
||||
if (trialEmailConfig == null || trialEmailConfig.IsAutoSend == false)
|
||||
{
|
||||
return (null, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
var sendEmailConfig = new SMTPEmailConfig();
|
||||
|
||||
var (topicStr, htmlBodyStr, isEn_us, onlyToUserId) = topicAndHtmlFunc(trialEmailConfig);
|
||||
|
||||
|
||||
sendEmailConfig.TopicDescription = topicStr;
|
||||
sendEmailConfig.HtmlBodyStr = htmlBodyStr;
|
||||
|
||||
|
||||
var blackUserIdList = trialEmailConfig.TrialEmailBlackUserList.Select(t => t.UserId).ToList();
|
||||
|
||||
|
||||
var toUserTypeEnumList = trialEmailConfig.TrialEmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.To).Select(c => c.UserType).ToList();
|
||||
|
||||
var copyUserTypeEnumList = trialEmailConfig.TrialEmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.Copy).Select(c => c.UserType).ToList();
|
||||
|
||||
var allUserTypeEnumList = toUserTypeEnumList.Union(copyUserTypeEnumList).Distinct().ToList();
|
||||
|
||||
var allUserList = await _repository.Where<TrialUser>(t => t.TrialId == trialId && allUserTypeEnumList.Contains(t.User.UserTypeEnum)).Select(t => new { t.UserId, t.User.EMail, t.User.FullName, t.User.UserTypeEnum }).ToListAsync();
|
||||
|
||||
|
||||
var toUserList = allUserList.Where(t => toUserTypeEnumList.Contains(t.UserTypeEnum))
|
||||
.ToList();
|
||||
|
||||
//收件人 有CRC CRA , CRC CRA的账户要按照中心发送
|
||||
if (siteId == null && toUserTypeEnumList.Any(t => t == UserTypeEnum.ClinicalResearchCoordinator || t == UserTypeEnum.CRA) && onlyToUserId == null)
|
||||
{
|
||||
throw new BusinessValidationFailedException("当前场景收件人包含CRC CRA,但是没有siteId,请联系后端开发");
|
||||
}
|
||||
if (siteId != null && toUserTypeEnumList.Any(t => t == UserTypeEnum.ClinicalResearchCoordinator || t == UserTypeEnum.CRA))
|
||||
{
|
||||
var curentSiteUserIdList = _repository.Where<TrialSiteUser>(t => t.TrialId == trialId && t.SiteId == siteId).Select(t => t.UserId).ToList();
|
||||
|
||||
toUserList = toUserList.Where(t => (t.UserTypeEnum != UserTypeEnum.CRA && t.UserTypeEnum != UserTypeEnum.ClinicalResearchCoordinator) || curentSiteUserIdList.Contains(t.UserId)).ToList();
|
||||
}
|
||||
|
||||
|
||||
//去除黑名单
|
||||
toUserList = toUserList.Where(t => !blackUserIdList.Contains(t.UserId)).ToList();
|
||||
|
||||
var copyUserList = allUserList.Where(t => copyUserTypeEnumList.Contains(t.UserTypeEnum))
|
||||
.Where(t => !blackUserIdList.Contains(t.UserId)).ToList();
|
||||
|
||||
if (siteId != null && copyUserTypeEnumList.Any(t => t == UserTypeEnum.ClinicalResearchCoordinator || t == UserTypeEnum.CRA))
|
||||
{
|
||||
var curentSiteUserIdList = _repository.Where<TrialSiteUser>(t => t.TrialId == trialId && t.SiteId == siteId).Select(t => t.UserId).ToList();
|
||||
|
||||
copyUserList = copyUserList.Where(t => (t.UserTypeEnum != UserTypeEnum.CRA && t.UserTypeEnum != UserTypeEnum.ClinicalResearchCoordinator) || curentSiteUserIdList.Contains(t.UserId)).ToList();
|
||||
}
|
||||
|
||||
if (onlyToUserId != null)
|
||||
{
|
||||
toUserList = toUserList.Where(t => t.UserId == onlyToUserId).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
sendEmailConfig.HtmlBodyStr = htmlBodyStr.Replace(EmailNamePlaceholder, string.Join(isEn_us ? ", " : "、", toUserList.Select(t => t.FullName).ToList()));
|
||||
}
|
||||
|
||||
if (toUserList.Count() == 0)
|
||||
{
|
||||
//---没有收件人,无法发送邮件
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_NoRecipient"]);
|
||||
}
|
||||
|
||||
|
||||
if (trialEmailConfig.FromEmail.Contains("@") && !string.IsNullOrEmpty(trialEmailConfig.FromEmail))
|
||||
{
|
||||
|
||||
sendEmailConfig.FromEmailAddress = new MimeKit.MailboxAddress(trialEmailConfig.FromName, trialEmailConfig.FromEmail);
|
||||
sendEmailConfig.AuthorizationCode = trialEmailConfig.AuthorizationCode;
|
||||
sendEmailConfig.UserName = trialEmailConfig.FromEmail;
|
||||
|
||||
sendEmailConfig.Host = trialEmailConfig.SMTPServerAddress;
|
||||
sendEmailConfig.Port = trialEmailConfig.SMTPServerPort;
|
||||
}
|
||||
else
|
||||
{
|
||||
//---项目发件邮箱配置有误,请核实
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidEmailConfig"]);
|
||||
}
|
||||
|
||||
foreach (var item in toUserList)
|
||||
{
|
||||
|
||||
if (item.EMail.Contains("@") && !string.IsNullOrEmpty(item.EMail))
|
||||
{
|
||||
|
||||
sendEmailConfig.ToMailAddressList.Add(new MimeKit.MailboxAddress(item.FullName, item.EMail));
|
||||
|
||||
}
|
||||
}
|
||||
foreach (var item in copyUserList)
|
||||
{
|
||||
|
||||
if (item.EMail.Contains("@") && !string.IsNullOrEmpty(item.EMail))
|
||||
{
|
||||
|
||||
sendEmailConfig.CopyToMailAddressList.Add(new MimeKit.MailboxAddress(item.FullName, item.EMail));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//邮件附件 这里是原格式发送,不是PDF
|
||||
|
||||
//if (trialEmailConfig.AttachCNPath != string.Empty && trialEmailConfig.AttachPath != string.Empty)
|
||||
//{
|
||||
// var phyPath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, isEn_us? trialEmailConfig.AttachName: trialEmailConfig.AttachNameCN);
|
||||
|
||||
// //先预先生成了邮件,发送预先生成的邮件
|
||||
// sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig()
|
||||
// {
|
||||
// FileName = $"{attachPrefix}_{Path.GetFileName(_userInfo.IsEn_Us ? trialEmailConfig.AttachName : trialEmailConfig.AttachNameCN)}",
|
||||
|
||||
// FileStream = File.OpenRead(phyPath),
|
||||
// });
|
||||
//}
|
||||
|
||||
return (trialEmailConfig, sendEmailConfig);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,11 +21,6 @@ using IRaCIS.Core.Domain.Share.Common;
|
|||
using System.IO;
|
||||
using System.Linq;
|
||||
using Spire.Doc;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using SharpCompress.Common;
|
||||
using SkiaSharp;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
|
|
@ -47,7 +42,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
private readonly IRepository<TrialUser> _trialUserRepository;
|
||||
private readonly IRepository<Subject> _subjectRepository;
|
||||
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
|
||||
private readonly IEmailSendService _emailSendService;
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -61,7 +56,6 @@ namespace IRaCIS.Core.Application.Service
|
|||
IRepository<SubjectVisit> subjectVisitRepository,
|
||||
IRepository<TrialEmailBlackUser> trialEmailBlackUserRepository,
|
||||
IRepository<EmailNoticeConfig> emailNoticeConfigRepository
|
||||
, IEmailSendService emailSendService
|
||||
)
|
||||
{
|
||||
_trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository;
|
||||
|
|
@ -73,7 +67,6 @@ namespace IRaCIS.Core.Application.Service
|
|||
_subjectVisitRepository = subjectVisitRepository;
|
||||
_trialEmailBlackUserRepository = trialEmailBlackUserRepository;
|
||||
_emailNoticeConfigRepository = emailNoticeConfigRepository;
|
||||
_emailSendService = emailSendService;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -262,8 +255,8 @@ namespace IRaCIS.Core.Application.Service
|
|||
/// <exception cref="BusinessValidationFailedException"></exception>
|
||||
public async Task<string> BaseBusinessScenarioSendEmailAsync(Guid visitTaskId, bool? isHandSend, EmailStoreSendMode emailStoreMode, string sendFileRelativePath)
|
||||
{
|
||||
var isEn_us = _userInfo.IsEn_Us;
|
||||
EmailBusinessScenario businessScenarioEnum = EmailBusinessScenario.None;
|
||||
|
||||
EmailBusinessScenario? businessScenarioEnum = null;
|
||||
|
||||
#region 任务关联的项目配置 标准信息及配置,subject 信息
|
||||
var taskInfo = await _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => new
|
||||
|
|
@ -359,29 +352,146 @@ namespace IRaCIS.Core.Application.Service
|
|||
#endregion
|
||||
|
||||
|
||||
#region 邮件内容装配
|
||||
#region 发收件人配置 确保无误
|
||||
|
||||
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr, bool isEn_us, Guid? onlyToUserId)> topicAndHtmlFunc = trialEmailConfig =>
|
||||
|
||||
var emailConfig = await _trialEmailNoticeConfigRepository.Where(t => t.TrialId == taskInfo.TrialId && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.BusinessScenarioEnum == businessScenarioEnum)
|
||||
.Include(t => t.TrialEmailNoticeUserList).FirstOrDefaultAsync();
|
||||
|
||||
|
||||
if (emailConfig == null || (emailConfig.IsAutoSend == false && isHandSend == null))
|
||||
{
|
||||
var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode);
|
||||
//throw new BusinessValidationFailedException("找不到该项目标准场景下邮件的配置");
|
||||
|
||||
var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
|
||||
StaticData.EmailSend.EmailNamePlaceholder, taskInfo.ResearchProgramNo, taskInfo.SubjectCode);
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
|
||||
return (topicStr, htmlBodyStr, isEn_us, null);
|
||||
};
|
||||
var sendEmailConfig = new SMTPEmailConfig();
|
||||
|
||||
//收件人 如果是CRC CRA 要按照中心发送
|
||||
var toUserTypeEnumList = emailConfig.TrialEmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.To).Select(c => c.UserType).ToList();
|
||||
|
||||
|
||||
var (trialEmailConfig, sendEmailConfig) = await _emailSendService.BuildEmailConfig(taskInfo.TrialId, businessScenarioEnum, topicAndHtmlFunc, taskInfo.SiteId);
|
||||
|
||||
var toUserList = _repository.Where<TrialSiteUser>(t => t.TrialId == taskInfo.TrialId && toUserTypeEnumList.Contains(t.User.UserTypeEnum) && t.SiteId == taskInfo.SiteId).Select(t => new { t.User.EMail, t.User.FullName }).ToList();
|
||||
|
||||
var copyUserTypeEnumList = emailConfig.TrialEmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.Copy).Select(c => c.UserType).ToList();
|
||||
var copyUserList = _repository.Where<TrialUser>(t => t.TrialId == taskInfo.TrialId && copyUserTypeEnumList.Contains(t.User.UserTypeEnum)).Select(t => new { t.User.EMail, t.User.FullName }).ToList();
|
||||
|
||||
|
||||
if (toUserList.Count() == 0)
|
||||
{
|
||||
//---没有收件人,无法发送邮件
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_NoRecipient"]);
|
||||
}
|
||||
|
||||
|
||||
if (emailConfig.FromEmail.Contains("@") && !string.IsNullOrEmpty(emailConfig.FromEmail))
|
||||
{
|
||||
|
||||
sendEmailConfig.FromEmailAddress = new MimeKit.MailboxAddress(emailConfig.FromName, emailConfig.FromEmail);
|
||||
sendEmailConfig.AuthorizationCode = emailConfig.AuthorizationCode;
|
||||
sendEmailConfig.UserName = emailConfig.FromEmail;
|
||||
|
||||
sendEmailConfig.Host = emailConfig.SMTPServerAddress;
|
||||
sendEmailConfig.Port = emailConfig.SMTPServerPort;
|
||||
|
||||
|
||||
//测试
|
||||
//sendEmailConfig.ToMailAddressList.Add(new MimeKit.MailboxAddress("ddd", "872297557@qq.com"));
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//---项目发件邮箱配置有误,请核实
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidEmailConfig"]);
|
||||
}
|
||||
|
||||
foreach (var item in toUserList)
|
||||
{
|
||||
|
||||
if (item.EMail.Contains("@") && !string.IsNullOrEmpty(item.EMail))
|
||||
{
|
||||
|
||||
sendEmailConfig.ToMailAddressList.Add(new MimeKit.MailboxAddress(item.FullName, item.EMail));
|
||||
|
||||
}
|
||||
}
|
||||
foreach (var item in copyUserList)
|
||||
{
|
||||
|
||||
if (item.EMail.Contains("@") && !string.IsNullOrEmpty(item.EMail))
|
||||
{
|
||||
|
||||
sendEmailConfig.CopyToMailAddressList.Add(new MimeKit.MailboxAddress(item.FullName, item.EMail));
|
||||
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 确保 邮件Html存在
|
||||
|
||||
//邮件附件
|
||||
var path = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, _userInfo.IsEn_Us ? emailConfig.AttachPath : emailConfig.AttachCNPath);
|
||||
|
||||
if (!File.Exists(path))
|
||||
{
|
||||
//---找不到该项目标准场景下邮件模板
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_EmailTemplateNotFound"]);
|
||||
}
|
||||
|
||||
|
||||
var pathToFile = _hostEnvironment.WebRootPath
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "EmailTemplate"
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
//+ "SubjectEnrollConfirmOrPDProgress.html";
|
||||
+ (_userInfo.IsEn_Us ? "SubjectEnrollConfirmOrPDProgress_US.html" : "SubjectEnrollConfirmOrPDProgress.html");
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 不同场景 Tile 设置
|
||||
|
||||
//自动发送
|
||||
if (sendEmailConfig != null)
|
||||
if (businessScenarioEnum == EmailBusinessScenario.EnrollConfirmed)
|
||||
{
|
||||
sendEmailConfig.TopicDescription = _localizer["TrialEmailN_EnrollmentConfirmation", taskInfo.ResearchProgramNo, taskInfo.SubjectCode];
|
||||
|
||||
using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||
{
|
||||
var templateInfo = SourceReader.ReadToEnd();
|
||||
|
||||
|
||||
sendEmailConfig.HtmlBodyStr = string.Format(templateInfo,
|
||||
//--- 附件为疾病进展确认报告,请查收
|
||||
_localizer["TrialEmailN_SubjectDiseaseProgression"]
|
||||
);
|
||||
}
|
||||
}
|
||||
else if (businessScenarioEnum == EmailBusinessScenario.PDConfirmed)
|
||||
{
|
||||
sendEmailConfig.TopicDescription = _localizer["TrialEmailN_PDReport", taskInfo.ResearchProgramNo, taskInfo.SubjectCode];
|
||||
|
||||
using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||
{
|
||||
var templateInfo = SourceReader.ReadToEnd();
|
||||
|
||||
|
||||
sendEmailConfig.HtmlBodyStr = string.Format(templateInfo,
|
||||
//--- 附件为疾病进展确认报告,请查收
|
||||
_localizer["TrialEmailN_SubjectDiseaseProgression"]
|
||||
);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 不同标准 不同项目配置 发送邮件的时机 处理具体逻辑
|
||||
|
||||
var answer = "否";
|
||||
|
|
@ -431,6 +541,10 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
else if (businessScenarioEnum == EmailBusinessScenario.PDConfirmed)
|
||||
{
|
||||
|
|
@ -685,12 +799,11 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
var phyPath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, sendFileRelativePath);
|
||||
|
||||
var attachPrefix = $"{taskInfo.SubjectCode}";
|
||||
|
||||
//先预先生成了邮件,发送预先生成的邮件
|
||||
sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig()
|
||||
{
|
||||
FileName = $"{attachPrefix}_{Path.GetFileNameWithoutExtension(_userInfo.IsEn_Us ? trialEmailConfig.AttachName : trialEmailConfig!.AttachNameCN)}.pdf",
|
||||
FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(_userInfo.IsEn_Us ? emailConfig.AttachName : emailConfig.AttachNameCN)}.pdf",
|
||||
|
||||
FileStream = File.OpenRead(phyPath),
|
||||
});
|
||||
|
|
@ -714,8 +827,6 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
};
|
||||
|
||||
var path = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, _userInfo.IsEn_Us ? trialEmailConfig.AttachPath : trialEmailConfig.AttachCNPath);
|
||||
|
||||
var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetSubjectEnrollConfirmOrPDEmailPath(_hostEnvironment, Path.GetFileName(path), taskInfo.TrialId, taskInfo.SiteId, taskInfo.SubjectId, true);
|
||||
|
||||
if (emailStoreMode == EmailStoreSendMode.StoreLocalSend || emailStoreMode == EmailStoreSendMode.OnlyStoreLocalNotSentEmail)
|
||||
|
|
@ -723,31 +834,13 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
MemoryStream wordMemoryStream = new MemoryStream();
|
||||
|
||||
Document document = new Document();
|
||||
|
||||
MiniSoftware.MiniWord.SaveAsByTemplate(wordMemoryStream, path, value);
|
||||
|
||||
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
Document document = new Document();
|
||||
|
||||
document.LoadFromStream(wordMemoryStream, FileFormat.Docx);
|
||||
|
||||
document.SaveToFile(serverFilePath, FileFormat.PDF);
|
||||
}
|
||||
else
|
||||
{
|
||||
var wordStoreServerPath = Path.Combine(Path.GetDirectoryName(serverFilePath), Path.GetFileNameWithoutExtension(serverFilePath) + ".docx");
|
||||
|
||||
using (FileStream fileStream = new FileStream(wordStoreServerPath, FileMode.Create, FileAccess.Write))
|
||||
{
|
||||
wordMemoryStream.WriteTo(fileStream);
|
||||
}
|
||||
FileConvertHelper.ConvertWordToPdf(wordStoreServerPath, Path.GetDirectoryName(serverFilePath));
|
||||
|
||||
File.Delete(wordStoreServerPath);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -765,42 +858,20 @@ namespace IRaCIS.Core.Application.Service
|
|||
{
|
||||
|
||||
|
||||
MemoryStream wordMemoryStream = new MemoryStream();
|
||||
MemoryStream memoryStream = new MemoryStream();
|
||||
MemoryStream pdfMemoryStream = new MemoryStream();
|
||||
|
||||
|
||||
MiniSoftware.MiniWord.SaveAsByTemplate(wordMemoryStream, path, value);
|
||||
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
MiniSoftware.MiniWord.SaveAsByTemplate(memoryStream, path, value);
|
||||
Document document = new Document();
|
||||
document.LoadFromStream(wordMemoryStream, FileFormat.Docx);
|
||||
|
||||
document.LoadFromStream(memoryStream, FileFormat.Docx);
|
||||
document.SaveToStream(pdfMemoryStream, FileFormat.PDF);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
var wordStoreServerPath = Path.Combine(Path.GetDirectoryName(serverFilePath), Path.GetFileNameWithoutExtension(serverFilePath) + ".docx");
|
||||
|
||||
using (FileStream fileStream = new FileStream(wordStoreServerPath, FileMode.Create, FileAccess.Write))
|
||||
{
|
||||
wordMemoryStream.WriteTo(fileStream);
|
||||
}
|
||||
FileConvertHelper.ConvertWordToPdf(wordStoreServerPath, Path.GetDirectoryName(serverFilePath));
|
||||
|
||||
File.Delete(wordStoreServerPath);
|
||||
|
||||
using (FileStream fileStream = new FileStream(serverFilePath, FileMode.Open, FileAccess.Read))
|
||||
{
|
||||
fileStream.CopyTo(pdfMemoryStream);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pdfMemoryStream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig()
|
||||
{
|
||||
FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(_userInfo.IsEn_Us ? trialEmailConfig.AttachName : trialEmailConfig.AttachNameCN)}.pdf",
|
||||
FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(_userInfo.IsEn_Us ? emailConfig.AttachName : emailConfig.AttachNameCN)}.pdf",
|
||||
|
||||
FileStream = pdfMemoryStream
|
||||
});
|
||||
|
|
@ -819,11 +890,6 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
|
||||
#endregion
|
||||
}
|
||||
else
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1174,7 +1174,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|||
var dbSubjectVisitList = await _subjectVisitRepository.Where(t => cRCRequestToQCCommand.SubjectVisitIds.Contains(t.Id), true).ProjectTo<QCCRCVisitViewModel>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
//普通提交
|
||||
if (dbSubjectVisitList.Count == 1)
|
||||
if (dbSubjectVisitList.Count() == 1)
|
||||
{
|
||||
var sv = dbSubjectVisitList[0];
|
||||
|
||||
|
|
@ -1183,7 +1183,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|||
if (sv.PDState == PDStateEnum.PDProgress)
|
||||
{
|
||||
|
||||
if (nameList.Count > 0)
|
||||
if (nameList.Count() > 0)
|
||||
{
|
||||
//$"当前访视要求进行疾病进展确认。请在提交当前访视前,先处理未提交的前序访视:{string.Join('、', nameList)}。"
|
||||
return ResponseOutput.NotOk(_localizer["QCOperation_DiseaseProgressConfirmation", string.Join('、', nameList)], 1, ApiResponseCodeEnum.NeedTips);
|
||||
|
|
@ -1191,7 +1191,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|||
}
|
||||
else
|
||||
{
|
||||
if (nameList.Count > 0)
|
||||
if (nameList.Count() > 0)
|
||||
{
|
||||
//$"在提交当前访视后,请尽快处理尚未提交的前序访视:{string.Join('、', nameList)}。"
|
||||
return ResponseOutput.NotOk(_localizer["QCOperation_UnsubmittedVisits", string.Join('、', nameList)], 0, ApiResponseCodeEnum.NeedTips);
|
||||
|
|
@ -1247,7 +1247,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
|||
}
|
||||
|
||||
//单个提交提示信息
|
||||
if (dbSubjectVisitList.Count == 1 && dbSubjectVisitList.First().SubmitState == SubmitStateEnum.Submitted)
|
||||
if (dbSubjectVisitList.Count() == 1 && dbSubjectVisitList.First().SubmitState == SubmitStateEnum.Submitted)
|
||||
{
|
||||
//---当前访视的影像数据,已经由其他CRC提交。
|
||||
return ResponseOutput.NotOk(_localizer["QCOperation_ImagesSubmitted"], 3, ApiResponseCodeEnum.NeedTips);
|
||||
|
|
|
|||
|
|
@ -48,11 +48,11 @@ namespace IRaCIS.Core.Application
|
|||
//正参与的数量
|
||||
TrialCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin
|
||||
? await _trialRepository.CountAsync()
|
||||
: await _trialUserRepository.Where(t => t.UserId == _userInfo.Id && t.Trial.IsDeleted==false).CountAsync(),
|
||||
: await _trialUserRepository.Where(t => t.UserId == _userInfo.Id).CountAsync(),
|
||||
|
||||
DeletedCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin
|
||||
? await _trialRepository.AsQueryable(true).CountAsync(t => t.IsDeleted)
|
||||
: await _trialUserRepository.AsQueryable(true).Where(t => t.UserId == _userInfo.Id && t.Trial.IsDeleted)
|
||||
: await _trialUserRepository.AsQueryable(true).Where(t => t.UserId == _userInfo.Id && t.IsDeleted)
|
||||
.CountAsync(),
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -46,7 +46,6 @@ namespace IRaCIS.Core.Domain.Share
|
|||
|
||||
public enum EmailBusinessScenario
|
||||
{
|
||||
None = -1,
|
||||
EnrollConfirmed = 1,
|
||||
|
||||
PDConfirmed = 2,
|
||||
|
|
|
|||
|
|
@ -121,10 +121,7 @@ public static class StaticData
|
|||
public static readonly string UploadFileFolder = "UploadFile";
|
||||
}
|
||||
|
||||
public static class EmailSend
|
||||
{
|
||||
public static string EmailNamePlaceholder = "EmailNamePlaceholder";
|
||||
}
|
||||
|
||||
|
||||
public static class TrialOpt
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue