diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.csproj b/IRaCIS.Core.API/IRaCIS.Core.API.csproj
index c6af611a4..eccd92242 100644
--- a/IRaCIS.Core.API/IRaCIS.Core.API.csproj
+++ b/IRaCIS.Core.API/IRaCIS.Core.API.csproj
@@ -78,7 +78,9 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
+
+
diff --git a/IRaCIS.Core.API/Properties/launchSettings.json b/IRaCIS.Core.API/Properties/launchSettings.json
index 5993ff67d..aed031839 100644
--- a/IRaCIS.Core.API/Properties/launchSettings.json
+++ b/IRaCIS.Core.API/Properties/launchSettings.json
@@ -45,22 +45,7 @@
"ASPNETCORE_ENVIRONMENT": "Production"
},
"applicationUrl": "http://localhost:6300"
- },
- "IRaCIS.CertificateApply": {
- "commandName": "Project",
- "launchBrowser": true,
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "CertificateApply"
- },
- "applicationUrl": "http://localhost:6400"
- },
- "IRaCIS.CenterImageDev": {
- "commandName": "Project",
- "launchBrowser": true,
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "CenterImageDev"
- },
- "applicationUrl": "http://localhost:6500"
}
+
}
}
\ No newline at end of file
diff --git a/IRaCIS.Core.API/Startup.cs b/IRaCIS.Core.API/Startup.cs
index 886e443fc..705f5ad87 100644
--- a/IRaCIS.Core.API/Startup.cs
+++ b/IRaCIS.Core.API/Startup.cs
@@ -114,7 +114,7 @@ namespace IRaCIS.Core.API
//services.AddDistributedMemoryCache();
// hangfire 定时任务框架 有界面,更友好~
- //services.AddhangfireSetup(_configuration);
+ services.AddhangfireSetup(_configuration);
// QuartZ 定时任务框架 使用了hangfire 暂时不用,后续需要可以打开,已经配好
services.AddQuartZSetup(_configuration);
@@ -181,7 +181,7 @@ namespace IRaCIS.Core.API
app.UseLogDashboard("/LogDashboard");
//hangfire
- //app.UseHangfireConfig(env);
+ app.UseHangfireConfig(env);
////暂时废弃
//app.UseHttpReports();
diff --git a/IRaCIS.Core.API/_PipelineExtensions/Hangfire/HangfireConfig.cs b/IRaCIS.Core.API/_PipelineExtensions/Hangfire/HangfireConfig.cs
deleted file mode 100644
index 48423534d..000000000
--- a/IRaCIS.Core.API/_PipelineExtensions/Hangfire/HangfireConfig.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-锘縰sing Hangfire;
-using Hangfire.Dashboard;
-using IRaCIS.Application.Services.BackGroundJob;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Hosting;
-
-namespace IRaCIS.Core.API
-{
-
-
- public static class HangfireConfig
- {
-
- public static void UseHangfireConfig(this IApplicationBuilder app, IWebHostEnvironment env)
- {
- app.UseHangfireDashboard("/api/hangfire", new DashboardOptions()
- {
- //鐩存帴璁块棶锛屾病鏈夊甫token 鑾峰彇涓嶅埌鐢ㄦ埛韬唤淇℃伅锛屾墍浠ヨ繖绉嶈嚜瀹氫箟鎺堟潈鏆傛椂娌℃硶浣跨敤
- //Authorization = new[] { new hangfireAuthorizationFilter() }
-
- //鏈湴璇锋眰 鎵嶈兘鐪
- Authorization = new[] { new LocalRequestsOnlyAuthorizationFilter() }
-
- });
-
- #region hangfire
- //// 寤惰繜浠诲姟鎵ц 1绉掍箣鍚庢墽琛 鏈夋椂鍚姩娌¤繍琛 鎹㈡垚娣诲姞鍒伴槦鍒椾腑
- //BackgroundJob.Schedule(t => t.MemoryCacheTrialStatus(), TimeSpan.FromSeconds(1));
- ////娣诲姞鍒板悗鍙颁换鍔¢槦鍒楋紝
- //BackgroundJob.Enqueue(t => t.MemoryCacheTrialStatus());
-
- //鍛ㄦ湡鎬т换鍔★紝1澶╂墽琛屼竴娆
-
- RecurringJob.AddOrUpdate(t => t.ProjectStartCache(), Cron.Daily);
-
- #endregion
-
- }
- }
-}
diff --git a/IRaCIS.Core.API/_PipelineExtensions/HangfireConfig.cs b/IRaCIS.Core.API/_PipelineExtensions/HangfireConfig.cs
new file mode 100644
index 000000000..3b9cb8b7a
--- /dev/null
+++ b/IRaCIS.Core.API/_PipelineExtensions/HangfireConfig.cs
@@ -0,0 +1,66 @@
+锘縰sing Hangfire;
+using Hangfire.Dashboard;
+using Hangfire.Dashboard.BasicAuthorization;
+using IRaCIS.Application.Services.BackGroundJob;
+using IRaCIS.Core.API.Filter;
+using IRaCIS.Core.Application.Helper;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+
+namespace IRaCIS.Core.API
+{
+
+
+ public static class HangfireConfig
+ {
+
+ public static void UseHangfireConfig(this IApplicationBuilder app, IWebHostEnvironment env)
+ {
+
+
+ app.UseHangfireDashboard("/back/hangfire", new DashboardOptions()
+ {
+
+
+
+ Authorization = new IDashboardAuthorizationFilter[] { /*new hangfireAuthorizationFilter(),*/
+
+ new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions(){
+ SslRedirect=false,
+ RequireSsl=false,
+ Users=new BasicAuthAuthorizationUser[]{
+ new BasicAuthAuthorizationUser(){
+ Login="admin",
+ PasswordClear="admin",
+
+ }
+ }
+
+ })
+ },
+
+ DashboardTitle ="鍚庡彴浠诲姟绠$悊",
+
+
+ //Authorization = new BasicAuthAuthorizationFilter[] {
+ // new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions(){
+ // SslRedirect=false,
+ // RequireSsl=false,
+ // Users=new BasicAuthAuthorizationUser[]{
+ // new BasicAuthAuthorizationUser(){
+ // Login="admin",
+ // PasswordClear="test",
+
+ // }
+ // }
+
+ // })
+ //}
+
+ });
+
+
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/IRaCIS.Core.API/_ServiceExtensions/hangfireSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/hangfireSetup.cs
index a5dd1fc09..00b718e2c 100644
--- a/IRaCIS.Core.API/_ServiceExtensions/hangfireSetup.cs
+++ b/IRaCIS.Core.API/_ServiceExtensions/hangfireSetup.cs
@@ -1,13 +1,12 @@
锘縰sing Hangfire;
using Hangfire.SqlServer;
-using Hangfire.Tags.SqlServer;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
namespace IRaCIS.Core.API
{
- public static class hangfireSetup
+ public static class hangfireSetup
{
public static void AddhangfireSetup(this IServiceCollection services, IConfiguration configuration)
{
@@ -15,24 +14,29 @@ namespace IRaCIS.Core.API
services.AddHangfire(hangFireConfig =>
{
+
+ //hangFireConfig.UseInMemoryStorage();
+
//鎸囧畾瀛樺偍浠嬭川
hangFireConfig.UseSqlServerStorage(hangFireConnStr, new SqlServerStorageOptions()
{
- SchemaName = "hangfire",
+ SchemaName = "dbo",
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
- UsePageLocksOnDequeue = true,
DisableGlobalLocks = true
});
- hangFireConfig.UseTagsWithSql(); //nuget寮曞叆Hangfire.Tags.SqlServer
+ //hangFireConfig.UseTagsWithSql(); //nuget寮曞叆Hangfire.Tags.SqlServer
//.UseHangfireHttpJob();
});
- services.AddHangfireServer();
+ services.AddHangfireServer(option =>
+ {
+ option.Queues = new[] { "immediately_once", "default", "sys_init", "not_immediately_once" };
+ });
}
}
diff --git a/IRaCIS.Core.API/appsettings.CenterImageDev.json b/IRaCIS.Core.API/appsettings.CenterImageDev.json
deleted file mode 100644
index 948b3dacd..000000000
--- a/IRaCIS.Core.API/appsettings.CenterImageDev.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "Logging": {
- "LogLevel": {
- "Default": "Information",
- "Microsoft": "Warning",
- "Microsoft.Hosting.Lifetime": "Information"
- }
- },
- "ConnectionStrings": {
- "RemoteNew": "Server=123.56.94.154,1433\\MSSQLSERVER;Database=CenterImage_Test;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true"
- },
- "BasicSystemConfig": {
-
- "OpenUserComplexPassword": false,
-
- "OpenSignDocumentBeforeWork": false,
-
- "OpenTrialRelationDelete": true,
-
- "OpenLoginLimit": false,
-
- "LoginMaxFailCount": 5,
-
- "LoginFailLockMinutes": 30
- },
-
- "SystemEmailSendConfig": {
- "Port": 465,
- "Host": "smtp.qiye.aliyun.com",
- "FromEmail": "test@extimaging.com",
- "FromName": "Test_IRC",
- "AuthorizationCode": "SHzyyl2021"
- }
-
-}
diff --git a/IRaCIS.Core.API/appsettings.CertificateApply.json b/IRaCIS.Core.API/appsettings.CertificateApply.json
deleted file mode 100644
index 2c04ce923..000000000
--- a/IRaCIS.Core.API/appsettings.CertificateApply.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "Logging": {
- "LogLevel": {
- "Default": "Information",
- "Microsoft": "Warning",
- "Microsoft.Hosting.Lifetime": "Information"
- }
- },
- "ConnectionStrings": {
- "RemoteNew": "Server=123.56.94.154,1433\\MSSQLSERVER;Database=IRaCIS_Certificate;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true",
- "Hangfire": "Server=123.56.94.154,1433\\MSSQLSERVER;Database=Hangfire_IRaCIS;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true"
-
- },
- "BasicSystemConfig": {
-
- "OpenUserComplexPassword": false,
-
- "OpenSignDocumentBeforeWork": false,
-
- "OpenTrialRelationDelete": true,
-
- "OpenLoginLimit": false
- },
-
- "SystemEmailSendConfig": {
- "Port": 465,
- "Host": "smtp.qiye.aliyun.com",
- "FromEmail": "test@extimaging.com",
- "FromName": "Test_IRC",
- "AuthorizationCode": "SHzyyl2021"
- }
-
-}
diff --git a/IRaCIS.Core.API/appsettings.Development.json b/IRaCIS.Core.API/appsettings.Development.json
index 076ddb95f..3f816a12f 100644
--- a/IRaCIS.Core.API/appsettings.Development.json
+++ b/IRaCIS.Core.API/appsettings.Development.json
@@ -38,7 +38,9 @@
"Host": "smtp.qiye.aliyun.com",
"FromEmail": "test@extimaging.com",
"FromName": "Test_IRC",
- "AuthorizationCode": "SHzyyl2021"
+ "AuthorizationCode": "SHzyyl2021",
+
+ "SiteUrl": "http://test.extimaging.com/login"
}
}
diff --git a/IRaCIS.Core.API/appsettings.Production.json b/IRaCIS.Core.API/appsettings.Production.json
index 91ca65025..442c3a8d1 100644
--- a/IRaCIS.Core.API/appsettings.Production.json
+++ b/IRaCIS.Core.API/appsettings.Production.json
@@ -35,7 +35,8 @@
"Host": "smtp.qiye.aliyun.com",
"FromEmail": "IRC@extimaging.com",
"FromName": "IRC",
- "AuthorizationCode": "ExtImg@2022"
+ "AuthorizationCode": "ExtImg@2022",
+ "SiteUrl": "http://irc.extimaging.com/login"
}
diff --git a/IRaCIS.Core.API/appsettings.Staging.json b/IRaCIS.Core.API/appsettings.Staging.json
index c40e2367e..708834b73 100644
--- a/IRaCIS.Core.API/appsettings.Staging.json
+++ b/IRaCIS.Core.API/appsettings.Staging.json
@@ -27,7 +27,8 @@
"Host": "smtp.qiye.aliyun.com",
"FromEmail": "uat@extimaging.com",
"FromName": "UAT_IRC",
- "AuthorizationCode": "SHzyyl2021"
+ "AuthorizationCode": "SHzyyl2021",
+ "SiteUrl": "http://uat.extimaging.com/login"
}
diff --git a/IRaCIS.Core.Application/Helper/HangfireJobHelper.cs b/IRaCIS.Core.Application/Helper/HangfireJobHelper.cs
new file mode 100644
index 000000000..69eaf410d
--- /dev/null
+++ b/IRaCIS.Core.Application/Helper/HangfireJobHelper.cs
@@ -0,0 +1,92 @@
+锘縰sing 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;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IRaCIS.Core.Application.Helper
+{
+ public static class HangfireJobHelper
+ {
+
+
+
+ //public static void AddOrUpdateCronJob(string jobId, string queueName, Expression methodCall, string cron)
+ //{
+ // RecurringJob.AddOrUpdate(jobId, queueName, methodCall, cron);
+ //}
+
+
+
+ //娣诲姞 鎴栬呮洿鏂板畾鏃朵换鍔 Id 瑕佸敮涓鏍囪瘑涓涓畾涔変换鍔
+ public static void AddOrUpdateCronJob(string jobId, Expression> methodCall, string cron, string queueName = "default")
+ {
+ RecurringJob.AddOrUpdate(jobId, queueName, methodCall, cron);
+ }
+
+ public static void AddOrUpdateInitCronJob(string jobId, Expression> methodCall, string cron)
+ {
+ RecurringJob.AddOrUpdate(jobId, "sys_init", methodCall, cron);
+ }
+
+ public static void RemoveCronJob(string jobId)
+ {
+ RecurringJob.RemoveIfExists(jobId);
+
+ }
+
+
+
+ public static void ImmediatelyOnceOnlyJob(Expression methodCall)
+ {
+ BackgroundJob.Enqueue("immediately_once", methodCall);
+ }
+
+ public static void ImmediatelyOnceOnlyJob(Expression> methodCall)
+ {
+ BackgroundJob.Enqueue("immediately_once", methodCall);
+ }
+
+ public static void NotImmediatelyOnceOnlyJob(Expression methodCall, TimeSpan timeSpan)
+ {
+ BackgroundJob.Schedule("not_immediately_once", methodCall, timeSpan);
+ }
+
+ public static void NotImmediatelyOnceOnlyJob(Expression> methodCall, TimeSpan timeSpan)
+ {
+ 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/IRaCIS.Core.Application.csproj b/IRaCIS.Core.Application/IRaCIS.Core.Application.csproj
index 247ed6016..ece94b800 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.csproj
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.csproj
@@ -64,6 +64,7 @@
+
@@ -76,9 +77,6 @@
-
- true
-
true
diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index 5b5d1d667..56def288d 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -685,6 +685,27 @@
PublishLogService
+
+
+ 褰卞儚璐ㄦ帶
+
+
+
+
+
+
+ QC璐ㄧ枒
+
+
+
+
+
+
+ 褰卞儚璐ㄧ枒
+
+
+
+
TrialEmailNoticeConfigService
@@ -706,7 +727,7 @@
- 鍚屾绯荤粺閰嶇疆鐨勬枃妗e埌鎯抽」鐩腑
+ 鍚屾绯荤粺閰嶇疆鐨勬枃妗e埌鎯抽」鐩腑 ---搴熷純
@@ -756,6 +777,27 @@
+
+
+ 榛戝悕鍗曠敤鎴稩d 鍒楄〃
+
+
+
+
+
+
+ 鑾峰彇绯荤粺 閭欢閰嶇疆 鍕鹃夊垪琛
+
+
+
+
+
+
+ 鎵归噺鍕鹃 浼犻掑垪琛ㄦ瘡琛屾暟鎹紝鍚庡彴杩涜澶勭悊杞崲锛屽缓绔嬪叧鑱斿叧绯
+
+
+
+
鎸囧畾璧勬簮Id锛屾覆鏌揇icom妫鏌ョ殑Jpeg棰勮鍥惧儚
Dicom妫鏌ョ殑Id
@@ -8922,6 +8964,27 @@
TrialEmailNoticeConfigQuery 鍒楄〃鏌ヨ鍙傛暟妯″瀷
+
+ 涓氬姟妯″潡 ///
+
+
+ 涓氬姟灞傜骇 ///
+
+
+ 閭欢绫诲瀷 ///
+
+
+ 閭欢鍔犳ョ被鍨 ///
+
+
+ 瀹氭椂鍛ㄦ湡 ///
+
+
+ 閭欢涓婚 ///
+
+
+ 闄勪欢 ///
+
TrialEmailNoticeConfigAddOrEdit 鍒楄〃鏌ヨ鍙傛暟妯″瀷
@@ -9816,6 +9879,24 @@
鏄惁鍖哄垎鏍囧噯
+
+ 涓氬姟妯″潡 ///
+
+
+ 涓氬姟灞傜骇 ///
+
+
+ 閭欢绫诲瀷 ///
+
+
+ 閭欢鍔犳ョ被鍨 ///
+
+
+ 瀹氭椂鍛ㄦ湡 ///
+
+
+ 閭欢涓婚 ///
+
SystemBasicDataView 鍒楄〃瑙嗗浘妯″瀷
diff --git a/IRaCIS.Core.Application/Service/Common/DTO/CommonDocumentViewModel.cs b/IRaCIS.Core.Application/Service/Common/DTO/CommonDocumentViewModel.cs
index 25a9212ac..77e41901d 100644
--- a/IRaCIS.Core.Application/Service/Common/DTO/CommonDocumentViewModel.cs
+++ b/IRaCIS.Core.Application/Service/Common/DTO/CommonDocumentViewModel.cs
@@ -35,7 +35,7 @@ namespace IRaCIS.Core.Application.ViewModel
{
public CriterionType? CriterionTypeEnum { get; set; }
public CommonDocumentFileType? FileTypeEnum { get; set; }
- public CommonDocumentBusinessScenario? BusinessScenarioEnum { get; set; }
+ public EmailBusinessScenario? BusinessScenarioEnum { get; set; }
public string Name { get; set; } = String.Empty;
@@ -55,7 +55,7 @@ namespace IRaCIS.Core.Application.ViewModel
public CriterionType? CriterionTypeEnum { get; set; }
public CommonDocumentFileType FileTypeEnum { get; set; }
- public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; }
+ public EmailBusinessScenario BusinessScenarioEnum { get; set; }
//public Guid FileTypeId { get; set; }
diff --git a/IRaCIS.Core.Application/Service/Common/DTO/EmailNoticeConfigViewModel.cs b/IRaCIS.Core.Application/Service/Common/DTO/EmailNoticeConfigViewModel.cs
index ae2bfca4b..691b1e8bf 100644
--- a/IRaCIS.Core.Application/Service/Common/DTO/EmailNoticeConfigViewModel.cs
+++ b/IRaCIS.Core.Application/Service/Common/DTO/EmailNoticeConfigViewModel.cs
@@ -3,10 +3,16 @@
// 鐢熸垚鏃堕棿 2022-02-15 11:55:57
// 瀵规鏂囦欢鐨勬洿鏀瑰彲鑳戒細瀵艰嚧涓嶆纭殑琛屼负锛屽苟涓斿鏋滈噸鏂扮敓鎴愪唬鐮侊紝杩欎簺鏇存敼灏嗕細涓㈠け銆
//--------------------------------------------------------------------
+using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Share;
using Newtonsoft.Json;
namespace IRaCIS.Core.Application.Contracts
{
+ public class TrialSelectEmailNoticeConfigView : EmailNoticeConfigView
+ {
+ public bool IsHaveSelected { get; set; }
+ }
+
/// EmailNoticeConfigView 鍒楄〃瑙嗗浘妯″瀷
public class EmailNoticeConfigView : EmailNoticeConfigAddOrEdit
{
@@ -19,6 +25,12 @@ namespace IRaCIS.Core.Application.Contracts
+ public List EmailNoticeUserList { get; set; }
+
+
+ public new List ToUserTypeList => EmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.To).Select(t => t.UserType).ToList();
+ public new List CopyUserTypeList => EmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.Copy).Select(t => t.UserType).ToList();
+
//[JsonIgnore]
//public SystemBasicDataSelect Scenario { get; set; }
////public Guid? ScenarioParentId => Scenario.ParentId;
@@ -28,17 +40,29 @@ namespace IRaCIS.Core.Application.Contracts
}
+ public class EmailUserTypeDto
+ {
+ public UserTypeEnum UserType { get; set; }
+
+ public EmailUserType EmailUserType { get; set; }
+ }
+
///EmailNoticeConfigQuery 鍒楄〃鏌ヨ鍙傛暟妯″瀷
- public class EmailNoticeConfigQuery:PageInput
+ public class EmailNoticeConfigQuery : PageInput
{
//public Guid? ScenarioId { get; set; }
- public CommonDocumentBusinessScenario? BusinessScenarioEnum { get; set; }
+ public EmailBusinessScenario? BusinessScenarioEnum { get; set; }
public bool? IsReturnRequired { get; set; }
- public bool? IsUrgent { get; set; }
public bool? IsEnable { get; set; }
+ public CriterionType? CriterionTypeEnum { get; set; }
+
+ public Guid? TrialId { get; set; }
+
+ public bool? IsDistinguishCriteria { get; set; }
+
}
/// EmailNoticeConfigAddOrEdit 鍒楄〃鏌ヨ鍙傛暟妯″瀷
@@ -47,31 +71,66 @@ namespace IRaCIS.Core.Application.Contracts
public Guid? Id { get; set; }
public string Code { get; set; } = String.Empty;
-
- public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; }
+ public EmailBusinessScenario BusinessScenarioEnum { get; set; }
///
/// 鏄惁鍖哄垎鏍囧噯
///
public bool IsDistinguishCriteria { get; set; }
-
- //public string AuthorizationCode { get; set; } = String.Empty;
- //public Guid ScenarioId { get; set; }
- //public string Title { get; set; } = String.Empty;
- //public string Body { get; set; } = String.Empty;
- //public string FromEmail { get; set; } = String.Empty;
- //public string ReceiveEmail { get; set; } = String.Empty;
- //public string CopyEmail { get; set; } = String.Empty;
public bool IsReturnRequired { get; set; }
- public bool IsUrgent { get; set; }
public bool IsEnable { get; set; }
public bool IsAutoSend { get; set; }
public bool IsDeleted { get; set; }
+
+
+
+ public CriterionType? CriterionTypeEnum { get; set; }
+
+ /// 涓氬姟妯″潡 ///
+ public int BusinessModuleEnum { get; set; }
+
+ /// 涓氬姟灞傜骇 ///
+ public int BusinessLevelEnum { get; set; }
+
+ /// 閭欢绫诲瀷 ///
+ public int EmailTypeEnum { get; set; }
+
+ /// 閭欢鍔犳ョ被鍨 ///
+ public int EmailUrgentEnum { get; set; }
+ public string Description { get; set; } = string.Empty;
+
+
+ /// 瀹氭椂鍛ㄦ湡 ///
+ public string EmailCron { get; set; } = string.Empty;
+
+ /// 閭欢涓婚 ///
+ public string EmailTopic { get; set; } = string.Empty;
+
+ public string EmailTopicCN { get; set; } = string.Empty;
+
+
+ public string AttachPath { get; set; } = string.Empty;
+
+ public string AttachCNPath { get; set; } = string.Empty;
+
+ public string EmailHtmlContent { get; set; } = string.Empty;
+
+ public string EmailHtmlContentCN { get; set; } = string.Empty;
+
+ public string AttachName { get; set; }
+ public string AttachNameCN { get; set; }
+
+
+ public List ToUserTypeList { get; set; }
+ public List CopyUserTypeList { get; set; }
+
}
+
+
}
diff --git a/IRaCIS.Core.Application/Service/Common/EmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Common/EmailNoticeConfigService.cs
index 27adfc3be..aa07c35c1 100644
--- a/IRaCIS.Core.Application/Service/Common/EmailNoticeConfigService.cs
+++ b/IRaCIS.Core.Application/Service/Common/EmailNoticeConfigService.cs
@@ -17,19 +17,22 @@ namespace IRaCIS.Core.Application.Contracts
public class EmailNoticeConfigService : BaseService, IEmailNoticeConfigService
{
private readonly IRepository _emailNoticeConfigrepository;
+ private readonly IRepository _emailNoticeUserTypeRepository;
- public EmailNoticeConfigService(IRepository repository)
+ public EmailNoticeConfigService(IRepository repository, IRepository emailNoticeUserTypeRepository)
{
_emailNoticeConfigrepository = repository;
+ _emailNoticeUserTypeRepository = emailNoticeUserTypeRepository;
}
[HttpPost]
public async Task> GetEmailNoticeConfigList(EmailNoticeConfigQuery queryEmailNoticeConfig)
{
var emailNoticeConfigQueryable = _emailNoticeConfigrepository
+ .WhereIf(queryEmailNoticeConfig.IsDistinguishCriteria != null, t => t.IsDistinguishCriteria == queryEmailNoticeConfig.IsDistinguishCriteria)
+ .WhereIf(queryEmailNoticeConfig.CriterionTypeEnum != null, t => t.CriterionTypeEnum == queryEmailNoticeConfig.CriterionTypeEnum)
.WhereIf(queryEmailNoticeConfig.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == queryEmailNoticeConfig.BusinessScenarioEnum)
.WhereIf(queryEmailNoticeConfig.IsReturnRequired != null, t => t.IsReturnRequired == queryEmailNoticeConfig.IsReturnRequired)
- .WhereIf(queryEmailNoticeConfig.IsUrgent != null, t => t.IsUrgent == queryEmailNoticeConfig.IsUrgent)
.WhereIf(queryEmailNoticeConfig.IsEnable != null, t => t.IsEnable == queryEmailNoticeConfig.IsEnable)
.ProjectTo(_mapper.ConfigurationProvider);
@@ -39,10 +42,55 @@ namespace IRaCIS.Core.Application.Contracts
public async Task AddOrUpdateEmailNoticeConfig(EmailNoticeConfigAddOrEdit addOrEditEmailNoticeConfig)
{
-
- var entity = await _emailNoticeConfigrepository.InsertOrUpdateAsync(addOrEditEmailNoticeConfig, true);
+ if (addOrEditEmailNoticeConfig.Id == null)
+ {
+
+ var entity = _mapper.Map(addOrEditEmailNoticeConfig);
+
+
+ foreach (var item in addOrEditEmailNoticeConfig.ToUserTypeList)
+ {
+ entity.EmailNoticeUserTypeList.Add(new EmailNoticeUserType() { EmailUserType = EmailUserType.To, UserType = item });
+
+ }
+
+ foreach (var item in addOrEditEmailNoticeConfig.CopyUserTypeList)
+ {
+ entity.EmailNoticeUserTypeList.Add(new EmailNoticeUserType() { EmailUserType = EmailUserType.Copy, UserType = item });
+
+ }
+
+
+ await _emailNoticeConfigrepository.AddAsync(entity, true);
+
+ return ResponseOutput.Ok(entity.Id.ToString());
+ }
+ else
+ {
+ var emailNoticeConfigId = addOrEditEmailNoticeConfig.Id;
+ await _emailNoticeUserTypeRepository.BatchDeleteNoTrackingAsync(t => t.EmailNoticeConfigId == emailNoticeConfigId);
+
+
+ foreach (var item in addOrEditEmailNoticeConfig.ToUserTypeList)
+ {
+ await _emailNoticeUserTypeRepository.AddAsync(new EmailNoticeUserType() { EmailUserType = EmailUserType.To, UserType = item, EmailNoticeConfigId = (Guid)emailNoticeConfigId });
+
+ }
+
+ foreach (var item in addOrEditEmailNoticeConfig.CopyUserTypeList)
+ {
+ await _emailNoticeUserTypeRepository.AddAsync(new EmailNoticeUserType() { EmailUserType = EmailUserType.Copy, UserType = item, EmailNoticeConfigId = (Guid)emailNoticeConfigId });
+
+ }
+
+
+ var entity = await _emailNoticeConfigrepository.UpdateFromDTOAsync(addOrEditEmailNoticeConfig, true);
+
+ return ResponseOutput.Ok(entity.Id.ToString());
+
+
+ }
- return ResponseOutput.Ok(entity.Id.ToString());
}
diff --git a/IRaCIS.Core.Application/Service/Common/_MapConfig.cs b/IRaCIS.Core.Application/Service/Common/_MapConfig.cs
index 4077d674a..bff993ccd 100644
--- a/IRaCIS.Core.Application/Service/Common/_MapConfig.cs
+++ b/IRaCIS.Core.Application/Service/Common/_MapConfig.cs
@@ -20,7 +20,13 @@ namespace IRaCIS.Core.Application.Service
CreateMap().ReverseMap();
CreateMap().ReverseMap();
- CreateMap();
+ var trialId = Guid.Empty;
+ CreateMap().IncludeBase()
+ .ForMember(o => o.IsHaveSelected, t => t.MapFrom(u => u.TrialEmailNoticeConfigList.Any(c => c.TrialId == trialId && c.SysEmailNoticeConfigId == u.Id)))
+ ;
+
+ CreateMap()
+ .ForMember(t => t.EmailNoticeUserList, u => u.MapFrom(c => c.EmailNoticeUserTypeList));
CreateMap();
diff --git a/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs b/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs
index 8ecdc76e8..652d381a6 100644
--- a/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs
+++ b/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs
@@ -36,7 +36,7 @@ namespace IRaCIS.Core.Application.ViewModel
}
- public class EmailUserInfoDto
+ public class EmailUserInfoDto
{
public Guid TrialEmailNoticeConfigId { get; set; }
@@ -77,7 +77,7 @@ namespace IRaCIS.Core.Application.ViewModel
///
/// SMTP绔彛
///
- public int? EmailSMTPServerPort { get; set; }
+ public int EmailSMTPServerPort { get; set; }
///
/// 鏄惁閰嶇疆杩囬偖绠
@@ -87,7 +87,7 @@ namespace IRaCIS.Core.Application.ViewModel
public class SetTrialEmailInDto : GetTrialEmailSetOutDto
{
-
+
}
public class GetTrialEmailSetInDto
{
@@ -100,7 +100,7 @@ namespace IRaCIS.Core.Application.ViewModel
[NotDefault]
public Guid TrialId { get; set; }
- public CommonDocumentBusinessScenario? BusinessScenarioEnum { get; set; }
+ public EmailBusinessScenario? BusinessScenarioEnum { get; set; }
//public CriterionType? CriterionTypeEnum { get; set; }
@@ -117,51 +117,98 @@ namespace IRaCIS.Core.Application.ViewModel
public Guid TrialReadingCriterionId { get; set; }
- public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; }
+ public EmailBusinessScenario BusinessScenarioEnum { get; set; }
}
- /// TrialEmailNoticeConfigAddOrEdit 鍒楄〃鏌ヨ鍙傛暟妯″瀷
- public class TrialEmailNoticeConfigAddOrEdit
+ public class BatchAddTrialEmailNoticeConfig
{
+
+
+
public Guid? Id { get; set; }
- public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; }
+ public EmailBusinessScenario BusinessScenarioEnum { get; set; }
public string Code { get; set; } = string.Empty;
- public Guid? TrialReadingCriterionId { get; set; }
+
public Guid TrialId { get; set; }
- public string AuthorizationCode { get; set; } = string.Empty;
- public string SMTPServerAddress { get; set; } = string.Empty;
-
- public int SMTPServerPort { get; set; }
-
- public CriterionType CriterionTypeEnum { get; set; }
-
- public string FromName { get; set; } = string.Empty;
-
- public string FromEmail { get; set; } = string.Empty;
+ public CriterionType? CriterionTypeEnum { get; set; }
- public List? ToUserTypeList { get; set; }
+ public List ToUserTypeList { get; set; }
public List CopyUserTypeList { get; set; }
-
- public bool IsUrgent { get; set; }
-
+ public bool IsEnable { get; set; }
public bool IsAutoSend { get; set; }
public bool IsReturnRequired { get; set; }
- public string FilePath { get; set; } = string.Empty;
- public string FileName { get; set; } = string.Empty;
+ /// 涓氬姟妯″潡 ///
+ public int BusinessModuleEnum { get; set; }
+
+ /// 涓氬姟灞傜骇 ///
+ public int BusinessLevelEnum { get; set; }
+
+ /// 閭欢绫诲瀷 ///
+ public int EmailTypeEnum { get; set; }
+
+ /// 閭欢鍔犳ョ被鍨 ///
+ public int EmailUrgentEnum { get; set; }
+
+ /// 瀹氭椂鍛ㄦ湡 ///
+ public string EmailCron { get; set; } = string.Empty;
+
+ /// 閭欢涓婚 ///
+ public string EmailTopic { get; set; } = string.Empty;
+
+ public string EmailTopicCN { get; set; } = string.Empty;
+
+ /// 闄勪欢 ///
+ public string AttachPath { get; set; } = string.Empty;
+
+ public string AttachCNPath { get; set; } = string.Empty;
+
+ public string Description { get; set; } = string.Empty;
+
+
+ public string AttachName { get; set; } = string.Empty;
+ public string AttachNameCN { get; set; } = string.Empty;
+
+
+ public string EmailHtmlContent { get; set; } = string.Empty;
+ public string EmailHtmlContentCN { get; set; } = string.Empty;
+
+ }
+
+
+ /// TrialEmailNoticeConfigAddOrEdit 鍒楄〃鏌ヨ鍙傛暟妯″瀷
+ public class TrialEmailNoticeConfigAddOrEdit : BatchAddTrialEmailNoticeConfig
+ {
+
+ public Guid? TrialReadingCriterionId { get; set; }
+
+
+ public string AuthorizationCode { get; set; } = string.Empty;
+
+ public string SMTPServerAddress { get; set; } = string.Empty;
+
+ public int SMTPServerPort { get; set; }
+
+
+ public string FromName { get; set; } = string.Empty;
+
+ public string FromEmail { get; set; } = string.Empty;
+
+ public List BlackUserIdList { get; set; }
+
}
diff --git a/IRaCIS.Core.Application/Service/Document/EmailSendService.cs b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs
new file mode 100644
index 000000000..fae472eec
--- /dev/null
+++ b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs
@@ -0,0 +1,403 @@
+锘縰sing DocumentFormat.OpenXml.EMMA;
+using DocumentFormat.OpenXml.Spreadsheet;
+using IRaCIS.Application.Contracts;
+using IRaCIS.Application.Interfaces;
+using IRaCIS.Core.Application.Contracts;
+using IRaCIS.Core.Application.Helper;
+using IRaCIS.Core.Application.Service.Reading.Dto;
+using IRaCIS.Core.Domain.Models;
+using IRaCIS.Core.Domain.Share;
+using IRaCIS.Core.Infrastructure;
+using MailKit;
+using Microsoft.Extensions.Options;
+using Microsoft.VisualBasic;
+using MimeKit;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Mail;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IRaCIS.Core.Application.Service
+{
+
+ public interface IEmailSendService
+ {
+ Task SendEnrollOrPdEmail(Guid visitTaskId, bool? isEnrollment, bool? isPDConfirm);
+ Task SendTrialImageQCTaskEmailAsync(Guid trialId);
+
+ Task SendTrialQCQuestionEmailAsync(Guid trialId);
+ Task SendTrialImageQuestionAsync(Guid trialId);
+ }
+
+ public class EmailSendService : BaseService, IEmailSendService
+ {
+ private readonly IRepository _trialEmailNoticeConfigRepository;
+
+ private readonly IRepository _emailNoticeConfigRepository;
+
+ private readonly IRepository _trialRepository;
+
+ private readonly IDictionaryService _dictionaryService;
+ private readonly IOptionsMonitor _SystemEmailSendConfig;
+
+ public readonly static string EmailNamePlaceholder = "EmailNamePlaceholder";
+
+ public EmailSendService(IRepository trialEmailNoticeConfigRepository, IRepository emailNoticeConfigRepository, IRepository trialRepository, IOptionsMonitor systemEmailSendConfig, IDictionaryService dictionaryService)
+ {
+ _trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository;
+ _emailNoticeConfigRepository = emailNoticeConfigRepository;
+ _trialRepository = trialRepository;
+ _SystemEmailSendConfig = systemEmailSendConfig;
+ _dictionaryService = dictionaryService;
+ }
+
+ //鍏ョ粍纭/PD纭
+
+ public async Task SendEnrollOrPdEmail(Guid visitTaskId, bool? isEnrollment, bool? isPDConfirm)
+ {
+ EmailBusinessScenario businessScenarioEnum;
+
+ bool? result = null;
+
+ if (isEnrollment != null && isPDConfirm == null)
+ {
+ businessScenarioEnum = EmailBusinessScenario.EnrollConfirmed;
+
+ result = isEnrollment;
+ }
+ else
+ {
+ businessScenarioEnum = EmailBusinessScenario.PDConfirmed;
+
+ result = isPDConfirm;
+ }
+
+ var taskInfo = await _repository.Where(t => t.Id == visitTaskId).Select(t => new
+ {
+ t.Subject.SiteId,
+ t.Trial.ResearchProgramNo,
+ t.Subject.TrialSite.TrialSiteCode,
+ SubjectCode = t.Subject.Code,
+ t.Trial.Sponsor.SponsorName,
+ t.SourceSubjectVisit.VisitName,
+ t.TrialId,
+
+ }).FirstNotNullAsync();
+
+ var isEn_us = _userInfo.IsEn_Us;
+
+ var resultStr = isEn_us ? (result == true ? "Yes" : "No") : (result == true ? "鏄" : "鍚");
+
+ if (isEnrollment == true)
+ {
+ Func topicAndHtmlFunc = trialEmailConfig =>
+ {
+ var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode);
+
+ var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
+ EmailNamePlaceholder, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, resultStr);
+ return (topicStr, htmlBodyStr, isEn_us, null);
+ };
+
+ await SendTrialEmailAsync(taskInfo.TrialId, businessScenarioEnum, topicAndHtmlFunc, taskInfo.SiteId);
+ }
+ else
+ {
+ Func topicAndHtmlFunc = trialEmailConfig =>
+ {
+ var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, taskInfo.VisitName);
+
+ var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
+ EmailNamePlaceholder, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, taskInfo.VisitName, resultStr);
+
+ return (topicStr, htmlBodyStr, isEn_us, null);
+ };
+
+ await SendTrialEmailAsync(taskInfo.TrialId, businessScenarioEnum, topicAndHtmlFunc, taskInfo.SiteId);
+ }
+
+
+ }
+
+ ///
+ /// 褰卞儚璐ㄦ帶
+ ///
+ ///
+ ///
+ public async Task SendTrialImageQCTaskEmailAsync(Guid trialId)
+ {
+ var isEn_us = false;
+ var trialInfo = await _repository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync();
+
+ //鎵惧埌 璇ラ」鐩殑IQC 鐢ㄦ埛Id
+ var userList = await _repository.Where(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.User.FullName }).ToListAsync();
+
+ //鍒ゆ柇鏄惁浠诲姟鍙互棰嗗彇 锛屽彲浠ョ殑璇 鍙戦侀偖浠
+ var userIdList = userList.Select(t => t.UserId).ToList();
+
+ foreach (var user in userList)
+ {
+ var userId = user.UserId;
+
+ //杩囨护椤圭洰 骞朵笖 灏 _userInfo.Id 鎹綅 褰撳墠鍙戦侀偖浠剁殑Id
+ var query = _trialRepository.Where(t => t.Id == trialId)
+ .Where(t => t.QCProcessEnum != TrialQCProcess.NotAudit)
+ .Select(t => new
+ {
+ //寰呴鍙栭噺
+ 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()
+
+ });
+
+ var sendStat = await query.FirstOrDefaultAsync();
+
+ //褰撳墠浜 鏈夊緟棰嗗彇鐨勬垨鑰呮湁寰呭鏍哥殑鎵嶅彂閭欢
+ if (sendStat != null && (sendStat.ToBeClaimedCount > 0 || sendStat.ToBeReviewedCount > 0))
+ {
+
+ Func topicAndHtmlFunc = trialEmailConfig =>
+ {
+ var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
+ var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
+ user.FullName, DateTime.Now, sendStat.ToBeClaimedCount, sendStat.ToBeReviewedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl);
+ return (topicStr, htmlBodyStr, false, userId);
+ };
+
+ await SendTrialEmailAsync(trialId, EmailBusinessScenario.QCTask, topicAndHtmlFunc);
+ }
+ }
+ }
+
+ ///
+ /// QC璐ㄧ枒
+ ///
+ ///
+ ///
+ public async Task SendTrialQCQuestionEmailAsync(Guid trialId)
+ {
+ var isEn_us = false;
+ var trialInfo = _repository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr, t.DeclarationTypeEnumList }).FirstOrDefault();
+
+ //鎵惧埌 璇ラ」鐩殑IQC 鐢ㄦ埛Id
+ var userList = await _repository.Where(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.User.FullName }).ToListAsync();
+
+ //鍒ゆ柇鏄惁浠诲姟鍙互棰嗗彇 锛屽彲浠ョ殑璇 鍙戦侀偖浠
+
+ foreach (var user in userList)
+ {
+ var userId = user.UserId;
+
+ //杩囨护椤圭洰 骞朵笖 灏 _userInfo.Id 鎹綅 褰撳墠鍙戦侀偖浠剁殑Id
+ var query = _trialRepository
+ .Where(t => t.Id == trialId)
+ .Select(t => new
+ {
+ ReUploadTobeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
+ .Where(u => u.CreateUserId == userId && u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && u.ReuploadEnum == QCChanllengeReuploadEnum.CRCRequestReupload).Count(),
+
+ //璐ㄧ枒寰呭鐞 鍙戦侀偖浠剁殑鏃跺 闇瑕佸噺鍘籖eUploadTobeDealedCount
+ ToBeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
+ .Where(u => u.CreateUserId == userId && u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count(),
+ });
+
+ var sendStat = await query.FirstOrDefaultAsync();
+
+ //褰撳墠浜
+ if (sendStat != null && (sendStat.ToBeDealedCount > 0 || sendStat.ReUploadTobeDealedCount > 0))
+ {
+
+ Func topicAndHtmlFunc = trialEmailConfig =>
+ {
+ var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
+ var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
+
+ user.FullName, DateTime.Now, sendStat.ToBeDealedCount - sendStat.ReUploadTobeDealedCount, sendStat.ReUploadTobeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl);
+ return (topicStr, htmlBodyStr, false, userId);
+ };
+
+ await SendTrialEmailAsync(trialId, EmailBusinessScenario.QCQuestion, topicAndHtmlFunc);
+ }
+ }
+ }
+
+ ///
+ /// 褰卞儚璐ㄧ枒
+ ///
+ ///
+ ///
+ public async Task SendTrialImageQuestionAsync(Guid trialId)
+ {
+ var isEn_us = false;
+
+ var trialInfo = _repository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstOrDefault();
+
+ //鎵惧埌 璇ラ」鐩殑CRC 鐢ㄦ埛Id
+ var userList = await _repository.Where(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Select(t => new { t.UserId, t.User.FullName }).ToListAsync();
+
+ //鍒ゆ柇鏄惁浠诲姟鍙互棰嗗彇 锛屽彲浠ョ殑璇 鍙戦侀偖浠
+
+ foreach (var user in userList)
+ {
+ var userId = user.UserId;
+ //杩囨护椤圭洰 骞朵笖 灏 _userInfo.Id 鎹綅 褰撳墠鍙戦侀偖浠剁殑Id
+ var query = _trialRepository.Where(t => t.Id == trialId)
+
+ .Select(t => new
+ {
+ //璐ㄧ枒寰呭鐞
+ ToBeDealedCount = t.SubjectVisitList.Where(t => t.TrialSite.CRCUserList.Any(t => t.UserId == userId)).SelectMany(c => c.QCChallengeList)
+ .Where(u => u.IsClosed == false && (u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC || u.LatestReplyUserId == null)).Count(),
+
+ });
+
+ var sendStat = await query.FirstOrDefaultAsync();
+
+ //褰撳墠浜
+ if (sendStat != null && (sendStat.ToBeDealedCount > 0))
+ {
+
+ Func topicAndHtmlFunc = trialEmailConfig =>
+ {
+ var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
+ var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
+ user.FullName, DateTime.Now, sendStat.ToBeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl);
+ return (topicStr, htmlBodyStr, isEn_us, userId);
+ };
+
+ await SendTrialEmailAsync(trialId, EmailBusinessScenario.ImageQuestion, topicAndHtmlFunc);
+ }
+ }
+ }
+
+
+
+
+ public async Task SendTrialEmailAsync(Guid trialId, EmailBusinessScenario businessScenario, Func 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;
+ }
+ 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(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();
+
+ //鏀朵欢浜 鏈塁RC CRA 锛 CRC CRA鐨勮处鎴疯鎸夌収涓績鍙戦
+ if (siteId == null && toUserTypeEnumList.Any(t => t == UserTypeEnum.ClinicalResearchCoordinator || t == UserTypeEnum.CRA) && onlyToUserId == null)
+ {
+ throw new BusinessValidationFailedException("褰撳墠鍦烘櫙鏀朵欢浜哄寘鍚獵RC CRA,浣嗘槸娌℃湁siteId,璇疯仈绯诲悗绔紑鍙");
+ }
+ if (siteId != null && toUserTypeEnumList.Any(t => t == UserTypeEnum.ClinicalResearchCoordinator || t == UserTypeEnum.CRA))
+ {
+ var curentSiteUserIdList = _repository.Where(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(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));
+
+ }
+ }
+
+ await SendEmailHelper.SendEmailAsync(sendEmailConfig);
+
+ }
+ }
+
+
+ }
+}
diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs
index 5289dea1d..7a68d55ef 100644
--- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs
+++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs
@@ -32,30 +32,41 @@ namespace IRaCIS.Core.Application.Service
{
private readonly IRepository _trialEmailNoticeConfigRepository;
+ private readonly IRepository _trialEmailBlackUserRepository;
+ private readonly IRepository _emailNoticeConfigRepository;
+
private readonly IRepository _trialRepository;
-
private readonly IRepository _taskMedicalReviewRepository;
+ private readonly IRepository _visitTaskRepository;
+ private readonly IRepository _trialUserRepository;
+ private readonly IRepository _subjectRepository;
+ private readonly IRepository _subjectVisitRepository;
- public IRepository _visitTaskRepository { get; }
- public IRepository _trialUserRepository { get; }
- public IRepository _subjectRepository { get; }
- public IRepository _subjectVisitRepository { get; }
- public TrialEmailNoticeConfigService(IRepository trialEmailNoticeConfigRepository, IRepository visitTaskRepository,
+ public TrialEmailNoticeConfigService(
+ IRepository trialEmailNoticeConfigRepository,
+ IRepository visitTaskRepository,
IRepository trialRepository,
- IRepository trialUserRepository, IRepository taskMedicalReviewRepository, IRepository subjectRepository, IRepository subjectVisitRepository)
+ IRepository trialUserRepository,
+ IRepository taskMedicalReviewRepository,
+ IRepository subjectRepository,
+ IRepository subjectVisitRepository,
+ IRepository trialEmailBlackUserRepository,
+ IRepository emailNoticeConfigRepository
+ )
{
_trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository;
_visitTaskRepository = visitTaskRepository;
- this._trialRepository = trialRepository;
+ _trialRepository = trialRepository;
_trialUserRepository = trialUserRepository;
_taskMedicalReviewRepository = taskMedicalReviewRepository;
_subjectRepository = subjectRepository;
-
_subjectVisitRepository = subjectVisitRepository;
+ _trialEmailBlackUserRepository = trialEmailBlackUserRepository;
+ _emailNoticeConfigRepository = emailNoticeConfigRepository;
}
///
@@ -66,7 +77,7 @@ namespace IRaCIS.Core.Application.Service
[HttpPost]
public async Task GetTrialEmail(GetTrialEmailSetInDto inDto)
{
- return await _trialRepository.Where(x => x.Id == inDto.TrialId).Select(x => new GetTrialEmailSetOutDto()
+ return await _trialRepository.Where(x => x.Id == inDto.TrialId, ignoreQueryFilters: true).Select(x => new GetTrialEmailSetOutDto()
{
TrialId = inDto.TrialId,
EmailAuthorizationCode = x.EmailAuthorizationCode,
@@ -76,7 +87,7 @@ namespace IRaCIS.Core.Application.Service
IsConfigureEmail = x.IsConfigureEmail,
EmailSMTPServerPort = x.EmailSMTPServerPort
- }).FirstNotNullAsync();
+ }).FirstOrDefaultAsync();
}
///
@@ -94,7 +105,7 @@ namespace IRaCIS.Core.Application.Service
FromEmail = inDto.EmailFromEmail,
FromName = inDto.EmailFromName,
SMTPServerAddress = inDto.EmailSMTPServerAddress,
- SMTPServerPort = inDto.EmailSMTPServerPort.Value,
+ SMTPServerPort = inDto.EmailSMTPServerPort,
TrialId = inDto.TrialId,
});
@@ -117,7 +128,7 @@ namespace IRaCIS.Core.Application.Service
FromEmail = inDto.EmailFromEmail,
FromName = inDto.EmailFromName,
SMTPServerAddress = inDto.EmailSMTPServerAddress,
- SMTPServerPort = inDto.EmailSMTPServerPort.Value,
+ SMTPServerPort = inDto.EmailSMTPServerPort,
});
await _trialRepository.SaveChangesAsync();
@@ -125,7 +136,7 @@ namespace IRaCIS.Core.Application.Service
}
///
- /// 鍚屾绯荤粺閰嶇疆鐨勬枃妗e埌鎯抽」鐩腑
+ /// 鍚屾绯荤粺閰嶇疆鐨勬枃妗e埌鎯抽」鐩腑 ---搴熷純
///
///
///
@@ -139,7 +150,7 @@ namespace IRaCIS.Core.Application.Service
{
//鍙鏈夌郴缁熸爣鍑嗙殑鏂囨。 璇存槑鍚屾杩囦簡
- var trialDocCount = _trialEmailNoticeConfigRepository.Where(t =>/* t.CriterionTypeEnum == criterionTypeEnum &&*/ t.TrialId == trialId && t.TrialReadingCriterionId != null).Count();
+ var trialDocCount = _trialEmailNoticeConfigRepository.Where(t => t.TrialId == trialId).Count();
if (trialDocCount == 0)
{
@@ -148,7 +159,10 @@ namespace IRaCIS.Core.Application.Service
var confirmedCriterionTypeList = list.Select(t => (CriterionType?)t.CriterionType).ToList();
- var docmentList = _repository.Where(t => confirmedCriterionTypeList.Contains(t.CriterionTypeEnum)).Select(t => new { t.Path, t.Name, t.Code, t.BusinessScenarioEnum, t.CriterionTypeEnum }).ToList();
+ var docmentList = _repository.Where(t => t.BusinessScenarioEnum == EmailBusinessScenario.EnrollConfirmed || t.BusinessScenarioEnum == EmailBusinessScenario.PDConfirmed)
+ //.Where(t => (confirmedCriterionTypeList.Contains(t.CriterionTypeEnum)) || t.CriterionTypeEnum == null).Select(t => new { t.Path, t.Name, t.Code, t.BusinessScenarioEnum, t.CriterionTypeEnum })
+ .ToList();
+
foreach (var item in docmentList)
@@ -157,8 +171,8 @@ namespace IRaCIS.Core.Application.Service
{
TrialId = trialId,
TrialReadingCriterionId = list.Where(t => t.CriterionType == item.CriterionTypeEnum).FirstOrDefault()?.TrialReadingCriterionId,
- FileName = item.Name,
- FilePath = item.Path,
+ //FileName = item.Name,
+ //FilePath = item.Path,
BusinessScenarioEnum = item.BusinessScenarioEnum,
Code = item.Code
});
@@ -176,6 +190,7 @@ namespace IRaCIS.Core.Application.Service
+
private async Task DealMedicalReviewTasKGenerateAndIsSendAsync(Guid trialId, bool? isHandSend, string pdAnswer, List taskIdList, List minUserIdList)
{
@@ -241,7 +256,7 @@ namespace IRaCIS.Core.Application.Service
public async Task BaseBusinessScenarioSendEmailAsync(Guid visitTaskId, bool? isHandSend, EmailStoreSendMode emailStoreMode, string sendFileRelativePath)
{
- CommonDocumentBusinessScenario? businessScenarioEnum = null;
+ EmailBusinessScenario? businessScenarioEnum = null;
#region 浠诲姟鍏宠仈鐨勯」鐩厤缃 鏍囧噯淇℃伅鍙婇厤缃紝subject 淇℃伅
var taskInfo = await _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => new
@@ -309,7 +324,7 @@ namespace IRaCIS.Core.Application.Service
//鍏ョ粍纭鍦烘櫙
if (taskInfo.IsEnrollmentConfirm == true && taskInfo.IsEnrollementQualificationConfirm == true && taskInfo.IsBaseline == true)
{
- businessScenarioEnum = CommonDocumentBusinessScenario.EnrollConfirmed;
+ businessScenarioEnum = EmailBusinessScenario.EnrollConfirmed;
}
@@ -318,7 +333,7 @@ namespace IRaCIS.Core.Application.Service
(taskInfo.PDState == PDStateEnum.PDProgress && taskInfo.SourceSubjectVisitId != null) ||
(taskInfo.SouceReadModuleId != null && taskInfo.MoudulePDState == PDStateEnum.PDProgress))
{
- businessScenarioEnum = CommonDocumentBusinessScenario.PDConfirmed;
+ businessScenarioEnum = EmailBusinessScenario.PDConfirmed;
}
else
{
@@ -344,7 +359,7 @@ namespace IRaCIS.Core.Application.Service
.Include(t => t.TrialEmailNoticeUserList).FirstOrDefaultAsync();
- if (emailConfig == null || (emailConfig.IsAutoSend == false && isHandSend==null))
+ if (emailConfig == null || (emailConfig.IsAutoSend == false && isHandSend == null))
{
//throw new BusinessValidationFailedException("鎵句笉鍒拌椤圭洰鏍囧噯鍦烘櫙涓嬮偖浠剁殑閰嶇疆");
@@ -418,7 +433,7 @@ namespace IRaCIS.Core.Application.Service
#region 纭繚 閭欢Html瀛樺湪
//閭欢闄勪欢
- var path = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, emailConfig.FilePath);
+ var path = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, _userInfo.IsEn_Us ? emailConfig.AttachPath : emailConfig.AttachCNPath);
if (!File.Exists(path))
{
@@ -431,7 +446,7 @@ namespace IRaCIS.Core.Application.Service
+ Path.DirectorySeparatorChar.ToString()
+ "EmailTemplate"
+ Path.DirectorySeparatorChar.ToString()
- //+ "SubjectEnrollConfirmOrPDProgress.html";
+ //+ "SubjectEnrollConfirmOrPDProgress.html";
+ (_userInfo.IsEn_Us ? "SubjectEnrollConfirmOrPDProgress_US.html" : "SubjectEnrollConfirmOrPDProgress.html");
#endregion
@@ -439,7 +454,7 @@ namespace IRaCIS.Core.Application.Service
#region 涓嶅悓鍦烘櫙 Tile 璁剧疆
- if (businessScenarioEnum == CommonDocumentBusinessScenario.EnrollConfirmed)
+ if (businessScenarioEnum == EmailBusinessScenario.EnrollConfirmed)
{
sendEmailConfig.TopicDescription = _localizer["TrialEmailN_EnrollmentConfirmation", taskInfo.ResearchProgramNo, taskInfo.SubjectCode];
@@ -454,7 +469,7 @@ namespace IRaCIS.Core.Application.Service
);
}
}
- else if (businessScenarioEnum == CommonDocumentBusinessScenario.PDConfirmed)
+ else if (businessScenarioEnum == EmailBusinessScenario.PDConfirmed)
{
sendEmailConfig.TopicDescription = _localizer["TrialEmailN_PDReport", taskInfo.ResearchProgramNo, taskInfo.SubjectCode];
@@ -464,7 +479,7 @@ namespace IRaCIS.Core.Application.Service
sendEmailConfig.HtmlBodyStr = string.Format(templateInfo,
- //--- 闄勪欢涓虹柧鐥呰繘灞曠‘璁ゆ姤鍛婏紝璇锋煡鏀
+ //--- 闄勪欢涓虹柧鐥呰繘灞曠‘璁ゆ姤鍛婏紝璇锋煡鏀
_localizer["TrialEmailN_SubjectDiseaseProgression"]
);
}
@@ -486,7 +501,7 @@ namespace IRaCIS.Core.Application.Service
//鍏ョ粍纭 鏍规嵁姣忎釜鏍囧噯閰嶇疆鐨勬槸鍚﹁嚜鍔ㄥ彂閫侊紝鍙戦侀偖浠朵笌鍚
- if (businessScenarioEnum == CommonDocumentBusinessScenario.EnrollConfirmed)
+ if (businessScenarioEnum == EmailBusinessScenario.EnrollConfirmed)
{
if (await _repository.Where().AnyAsync(x => x.VisitTaskId == visitTaskId && x.Answer == TargetState.Exist.GetEnumInt() &&
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State && x.ReadingQuestionTrial.LesionType == LesionType.TargetLesion))
@@ -531,7 +546,7 @@ namespace IRaCIS.Core.Application.Service
}
- else if (businessScenarioEnum == CommonDocumentBusinessScenario.PDConfirmed)
+ else if (businessScenarioEnum == EmailBusinessScenario.PDConfirmed)
{
@@ -629,7 +644,7 @@ namespace IRaCIS.Core.Application.Service
}
else
{
- //---鍙戦丳D 杩涘睍閭欢涓彂鐜颁换鍔℃暟鎹湁闂锛
+ //---鍙戦丳D 杩涘睍閭欢涓彂鐜颁换鍔℃暟鎹湁闂锛
throw new BusinessValidationFailedException(_localizer["TrialEmailN_PDProgressEmailTask"]);
}
@@ -639,13 +654,13 @@ namespace IRaCIS.Core.Application.Service
else
{
- //---鍙岄噸鏈夊簭闃呯墖 娌℃湁瀹氫箟璇ヤ徊瑁佽鍒欏鐞嗛昏緫锛岃鑱旂郴涓氬姟鍜屽悗鍙板紑鍙戞牳鏌ワ紒
+ //---鍙岄噸鏈夊簭闃呯墖 娌℃湁瀹氫箟璇ヤ徊瑁佽鍒欏鐞嗛昏緫锛岃鑱旂郴涓氬姟鍜屽悗鍙板紑鍙戞牳鏌ワ紒
throw new BusinessValidationFailedException(_localizer["TrialEmailN_DoubleBlindedError"]);
}
}
-
+
//灞忚斀鍗曢噸闃呯墖娣诲姞
else
{
@@ -661,7 +676,7 @@ namespace IRaCIS.Core.Application.Service
// if (taskInfo.ArbitrationRule != ArbitrationRule.None)
// {
- //---鍗曢噸鏈夊簭闃呯墖閰嶇疆鏈夎(涓嶅簲璇ユ湁浠茶瀵硅薄閰嶇疆)锛岃鏍告煡锛
+ //---鍗曢噸鏈夊簭闃呯墖閰嶇疆鏈夎(涓嶅簲璇ユ湁浠茶瀵硅薄閰嶇疆)锛岃鏍告煡锛
// throw new BusinessValidationFailedException(_localizer["TrialEmailN_SingleBlindedSet"]);
// }
@@ -687,7 +702,7 @@ namespace IRaCIS.Core.Application.Service
// }
// else
// {
- //---鍗曢噸鏈夊簭闃呯墖 璇ョ被鍨嬬殑浠诲姟涓嶅簲杩涘叆姝ゅ閫昏緫锛岃鑱旂郴鍚庡彴寮鍙戞牳鏌ワ紒
+ //---鍗曢噸鏈夊簭闃呯墖 璇ョ被鍨嬬殑浠诲姟涓嶅簲杩涘叆姝ゅ閫昏緫锛岃鑱旂郴鍚庡彴寮鍙戞牳鏌ワ紒
// throw new BusinessValidationFailedException(_localizer["TrialEmailN_SingleBlindedSequenced"]);
// }
@@ -697,7 +712,7 @@ namespace IRaCIS.Core.Application.Service
//}
//else
//{
- //---鏈夊簭闃呯墖閰嶇疆鏈夎(搴斾负鍗曢噸鎴栬呭弻閲嶉槄鐗)锛岃鏍告煡锛
+ //---鏈夊簭闃呯墖閰嶇疆鏈夎(搴斾负鍗曢噸鎴栬呭弻閲嶉槄鐗)锛岃鏍告煡锛
// throw new BusinessValidationFailedException(_localizer["TrialEmailN_BlindedSequencedReading"]);
//}
@@ -788,7 +803,7 @@ namespace IRaCIS.Core.Application.Service
//鍏堥鍏堢敓鎴愪簡閭欢锛屽彂閫侀鍏堢敓鎴愮殑閭欢
sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig()
{
- FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(emailConfig.FileName)}.pdf",
+ FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(_userInfo.IsEn_Us ? emailConfig.AttachName : emailConfig.AttachNameCN)}.pdf",
FileStream = File.OpenRead(phyPath),
});
@@ -812,7 +827,7 @@ namespace IRaCIS.Core.Application.Service
};
- var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetSubjectEnrollConfirmOrPDEmailPath(_hostEnvironment, Path.GetFileName(path), taskInfo.TrialId, taskInfo.SiteId, taskInfo.SubjectId,true);
+ var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetSubjectEnrollConfirmOrPDEmailPath(_hostEnvironment, Path.GetFileName(path), taskInfo.TrialId, taskInfo.SiteId, taskInfo.SubjectId, true);
if (emailStoreMode == EmailStoreSendMode.StoreLocalSend || emailStoreMode == EmailStoreSendMode.OnlyStoreLocalNotSentEmail)
{
@@ -823,7 +838,7 @@ namespace IRaCIS.Core.Application.Service
MiniSoftware.MiniWord.SaveAsByTemplate(wordMemoryStream, path, value);
- document.LoadFromStream(wordMemoryStream,FileFormat.Docx);
+ document.LoadFromStream(wordMemoryStream, FileFormat.Docx);
document.SaveToFile(serverFilePath, FileFormat.PDF);
@@ -856,7 +871,7 @@ namespace IRaCIS.Core.Application.Service
sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig()
{
- FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(emailConfig.FileName)}.pdf",
+ FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(_userInfo.IsEn_Us ? emailConfig.AttachName : emailConfig.AttachNameCN)}.pdf",
FileStream = pdfMemoryStream
});
@@ -900,19 +915,19 @@ namespace IRaCIS.Core.Application.Service
//鎵惧埌鍏ョ粍纭 鎴栬匬d 杩涘睍 宸茬敓鎴愪换鍔$殑 璁胯
var subjectVisitList = await _subjectVisitRepository.Where(t => t.SubjectId == subjectId & t.CheckState == CheckStateEnum.CVPassed && (t.IsEnrollmentConfirm == true || t.PDState == PDStateEnum.PDProgress)).ToListAsync();
- if (businessScenarioEnum == CommonDocumentBusinessScenario.EnrollConfirmed)
+ if (businessScenarioEnum == EmailBusinessScenario.EnrollConfirmed)
{
if (trialConfig.IsEnrollementQualificationConfirm == false)
{
- //---椤圭洰鏈厤缃叆缁勭‘璁わ紒
+ //---椤圭洰鏈厤缃叆缁勭‘璁わ紒
return ResponseOutput.NotOk(_localizer["TrialEmailN_InCons"]);
}
var exisitBaseline = subjectVisitList.FirstOrDefault(t => t.IsEnrollmentConfirm);
if (exisitBaseline == null)
{
- //---涓嶅瓨鍦ㄩ厤缃簡鍏ョ粍纭鐨勫苟涓旂敓鎴愪换鍔$殑鍩虹嚎璁胯
+ //---涓嶅瓨鍦ㄩ厤缃簡鍏ョ粍纭鐨勫苟涓旂敓鎴愪换鍔$殑鍩虹嚎璁胯
return ResponseOutput.NotOk(_localizer["TrialEmailN_NoBaseLine"]);
}
else
@@ -933,7 +948,7 @@ namespace IRaCIS.Core.Application.Service
if (task == null)
{
- //---鍋氬叆缁勭‘璁ょ殑闃呯墖浜哄熀绾夸换鍔℃病鏈夐槄鐗囧畬锛
+ //---鍋氬叆缁勭‘璁ょ殑闃呯墖浜哄熀绾夸换鍔℃病鏈夐槄鐗囧畬锛
return ResponseOutput.NotOk(_localizer["TrialEmailN_IncompBase"]);
}
else
@@ -942,7 +957,7 @@ namespace IRaCIS.Core.Application.Service
if (string.IsNullOrEmpty(filePath))
{
- //---閭欢鎵嬪姩鐢熸垚澶辫触锛岃鑱旂郴寮鍙戞牳瀹炶鍦烘櫙澶辫触鍘熷洜
+ //---閭欢鎵嬪姩鐢熸垚澶辫触锛岃鑱旂郴寮鍙戞牳瀹炶鍦烘櫙澶辫触鍘熷洜
return ResponseOutput.NotOk(_localizer["TrialEmailN_EmailFail"]);
}
else
@@ -956,7 +971,7 @@ namespace IRaCIS.Core.Application.Service
}
else
{
- //---褰撳墠鏈湁闃呯墖浜鸿瀹屽熀绾夸换鍔★紒
+ //---褰撳墠鏈湁闃呯墖浜鸿瀹屽熀绾夸换鍔★紒
return ResponseOutput.NotOk(_localizer["TrialEmailN_NoReader"]);
}
@@ -967,12 +982,12 @@ namespace IRaCIS.Core.Application.Service
}
}
- else if (businessScenarioEnum == CommonDocumentBusinessScenario.PDConfirmed)
+ else if (businessScenarioEnum == EmailBusinessScenario.PDConfirmed)
{
if (trialConfig.IsPDProgressView == false)
{
- //---椤圭洰鏈厤缃甈D杩涘睍锛
+ //---椤圭洰鏈厤缃甈D杩涘睍锛
return ResponseOutput.NotOk(_localizer["TrialEmailN_NoPDConfig"]);
}
@@ -982,7 +997,7 @@ namespace IRaCIS.Core.Application.Service
if (pdSubjectVisitIdList.Count == 0)
{
- //---涓嶅瓨鍦ㄩ厤缃簡PD杩涘睍鐨勫苟涓旂敓鎴愪换鍔$殑璁胯
+ //---涓嶅瓨鍦ㄩ厤缃簡PD杩涘睍鐨勫苟涓旂敓鎴愪换鍔$殑璁胯
return ResponseOutput.NotOk(_localizer["TrialEmailN_NoPDTasks"]);
}
@@ -1027,7 +1042,7 @@ namespace IRaCIS.Core.Application.Service
}
else
{
- //---褰撳墠鍙楄瘯鑰呮渶鏂癙D璁胯闃呯墖浠诲姟瀹屾垚鐘舵佷笉绗﹀悎鍙戦佹潯浠
+ //---褰撳墠鍙楄瘯鑰呮渶鏂癙D璁胯闃呯墖浠诲姟瀹屾垚鐘舵佷笉绗﹀悎鍙戦佹潯浠
return ResponseOutput.NotOk(_localizer["TrialEmailN_PDNotFinished"]);
}
@@ -1040,7 +1055,7 @@ namespace IRaCIS.Core.Application.Service
if (existReadModule == null)
{
- //---椤圭洰閰嶇疆浜嗛槄鐗囨湡浠茶锛屼絾鏄綋鍓嶅彈璇曡呮渶鏂癙D璁胯娌℃湁褰卞儚瀛﹂槄鐗囨湡
+ //---椤圭洰閰嶇疆浜嗛槄鐗囨湡浠茶锛屼絾鏄綋鍓嶅彈璇曡呮渶鏂癙D璁胯娌℃湁褰卞儚瀛﹂槄鐗囨湡
return ResponseOutput.NotOk(_localizer["TrialEmailN_PDNoImaging"]);
}
else
@@ -1075,7 +1090,7 @@ namespace IRaCIS.Core.Application.Service
else
{
- //---褰撳墠鍙楄瘯鑰呮渶鏂癙D璁胯闃呯墖鏈熶换鍔″畬鎴愮姸鎬佷笉绗﹀悎鍙戦佹潯浠
+ //---褰撳墠鍙楄瘯鑰呮渶鏂癙D璁胯闃呯墖鏈熶换鍔″畬鎴愮姸鎬佷笉绗﹀悎鍙戦佹潯浠
return ResponseOutput.NotOk(_localizer["TrialEmailN_PDPhaseNotFinished"]);
}
}
@@ -1084,7 +1099,7 @@ namespace IRaCIS.Core.Application.Service
}
else
{
- //---鏈畾涔夎浠茶瑙勫垯鍙戦佷笟鍔¢昏緫锛
+ //---鏈畾涔夎浠茶瑙勫垯鍙戦佷笟鍔¢昏緫锛
return ResponseOutput.NotOk(_localizer["TrialEmailN_NoRuleDefined"]);
}
}
@@ -1143,7 +1158,7 @@ namespace IRaCIS.Core.Application.Service
else
{
- //---褰撳墠椤圭洰閰嶇疆锛屼笉婊¤冻鍙岄噸鏈夊簭闃呯墖锛屼笉婊¤冻鍙戦佹潯浠讹紒
+ //---褰撳墠椤圭洰閰嶇疆锛屼笉婊¤冻鍙岄噸鏈夊簭闃呯墖锛屼笉婊¤冻鍙戦佹潯浠讹紒
return ResponseOutput.NotOk(_localizer["TrialEmailN_NoDoubleOrder"]);
}
@@ -1233,7 +1248,7 @@ namespace IRaCIS.Core.Application.Service
//}
else
{
- //---涓嶅簲鏈 闄よ瑙嗐佽鍒ゃ佸叏灞鍏朵粬绫诲瀷鐨勪换鍔¤繘琛屽彂閫侀偖浠讹紝璇锋牳鏌ヤ笟鍔¢昏緫
+ //---涓嶅簲鏈 闄よ瑙嗐佽鍒ゃ佸叏灞鍏朵粬绫诲瀷鐨勪换鍔¤繘琛屽彂閫侀偖浠讹紝璇锋牳鏌ヤ笟鍔¢昏緫
throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidTaskTypeForEmailSending"]);
}
@@ -1273,7 +1288,7 @@ namespace IRaCIS.Core.Application.Service
//}
else
{
- //---涓嶅簲鏈 闄よ瑙嗐佽鍒ゃ佸叏灞鍏朵粬绫诲瀷鐨勪换鍔¤繘琛屽彂閫侀偖浠讹紝璇锋牳鏌ヤ笟鍔¢昏緫
+ //---涓嶅簲鏈 闄よ瑙嗐佽鍒ゃ佸叏灞鍏朵粬绫诲瀷鐨勪换鍔¤繘琛屽彂閫侀偖浠讹紝璇锋牳鏌ヤ笟鍔¢昏緫
throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidTaskTypeForEmailSending"]);
}
@@ -1311,7 +1326,7 @@ namespace IRaCIS.Core.Application.Service
case CriterionType.IMWG2016:
default:
- //---璇ユ爣鍑嗕换鍔¤繕鏈畾涔塒D鑾峰彇閫昏緫锛岃仈绯讳笟鍔″拰鍚庡彴寮鍙戝崗鍟嗗悗琛ュ厖
+ //---璇ユ爣鍑嗕换鍔¤繕鏈畾涔塒D鑾峰彇閫昏緫锛岃仈绯讳笟鍔″拰鍚庡彴寮鍙戝崗鍟嗗悗琛ュ厖
throw new BusinessValidationFailedException(_localizer["TrialEmailN_PDLogicNotDefined"]);
}
@@ -1335,19 +1350,127 @@ namespace IRaCIS.Core.Application.Service
var query = _trialUserRepository.Where(t => t.TrialId == trialId, false, true).IgnoreQueryFilters().Select(t => t.User.UserTypeRole).Distinct()
- .ProjectTo(_mapper.ConfigurationProvider);
+ .ProjectTo(_mapper.ConfigurationProvider);
return await query.ToListAsync();
}
+ ///
+ /// 榛戝悕鍗曠敤鎴稩d 鍒楄〃
+ ///
+ ///
+ ///
+ public async Task> GetTrialUserIdSelectList(Guid trialEmailNoticeConfigId)
+ {
+
+ var trialEmailNoticeConfig = await _trialEmailNoticeConfigRepository.Where(t => t.Id == trialEmailNoticeConfigId).Include(t => t.TrialEmailNoticeUserList).FirstNotNullAsync();
+
+ var trialId = trialEmailNoticeConfig.TrialId;
+
+ var userTypeList = trialEmailNoticeConfig.TrialEmailNoticeUserList.Select(t => t.UserType).ToList();
+
+
+ var query = _trialUserRepository.Where(t => t.TrialId == trialId && userTypeList.Contains(t.User.UserTypeEnum), false, true).IgnoreQueryFilters()
+ .Select(t => new TrialSelectUser()
+ {
+ UserId = t.UserId,
+ UserName = t.User.UserName,
+ RealName = t.User.FullName,
+ UserTypeEnum = t.User.UserTypeEnum
+ }).Distinct();
+
+ return await query.ToListAsync();
+ }
+
+ ///
+ /// 鑾峰彇绯荤粺 閭欢閰嶇疆 鍕鹃夊垪琛
+ ///
+ ///
+ ///
+ public async Task> GetSysEmailNoticeConfigList(EmailNoticeConfigQuery queryEmailNoticeConfig)
+ {
+ var emailNoticeConfigQueryable = _emailNoticeConfigRepository
+ .WhereIf(queryEmailNoticeConfig.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == queryEmailNoticeConfig.BusinessScenarioEnum)
+ .WhereIf(queryEmailNoticeConfig.IsReturnRequired != null, t => t.IsReturnRequired == queryEmailNoticeConfig.IsReturnRequired)
+ .WhereIf(queryEmailNoticeConfig.IsEnable != null, t => t.IsEnable == queryEmailNoticeConfig.IsEnable)
+
+ .ProjectTo(_mapper.ConfigurationProvider, new { trialId = queryEmailNoticeConfig.TrialId });
+
+ return await emailNoticeConfigQueryable.ToPagedListAsync(queryEmailNoticeConfig.PageIndex, queryEmailNoticeConfig.PageSize, queryEmailNoticeConfig.SortField, queryEmailNoticeConfig.Asc);
+ }
+
+ ///
+ /// 鎵归噺鍕鹃 浼犻掑垪琛ㄦ瘡琛屾暟鎹紝鍚庡彴杩涜澶勭悊杞崲锛屽缓绔嬪叧鑱斿叧绯
+ ///
+ ///
+ ///
+ public async Task BatchAddSysEmailConfig(List batchAddList)
+ {
+
+ var first = batchAddList.First();
+ var trialId = first.TrialId;
+
+ var emailConfig = await _trialRepository.Where(t => t.Id == trialId).Select(x => new
+ {
+ TrialId = x.Id,
+ EmailAuthorizationCode = x.EmailAuthorizationCode,
+ EmailSMTPServerAddress = x.EmailSMTPServerAddress,
+ EmailFromEmail = x.EmailFromEmail,
+ EmailFromName = x.EmailFromName,
+ IsConfigureEmail = x.IsConfigureEmail,
+ EmailSMTPServerPort = x.EmailSMTPServerPort
+
+ }).FirstNotNullAsync();
+
+ var list = await _repository.Where(t => t.TrialId == trialId && t.IsConfirm).Select(t => new { t.CriterionType, TrialReadingCriterionId = t.Id }).ToListAsync();
+
+
+ var addList = _mapper.Map>(batchAddList);
+
+
+ foreach (var item in addList)
+ {
+ item.SysEmailNoticeConfigId = item.Id;
+ item.Id = Guid.Empty;
+
+ item.AuthorizationCode = emailConfig.EmailAuthorizationCode;
+ item.FromEmail = emailConfig.EmailFromEmail;
+ item.SMTPServerAddress = emailConfig.EmailSMTPServerAddress;
+ item.FromName = emailConfig.EmailFromName;
+ item.SMTPServerPort = emailConfig.EmailSMTPServerPort;
+ item.IsAutoSend = false;
+ item.IsEnable = false;
+
+ item.TrialReadingCriterionId = list.FirstOrDefault(t => t.CriterionType == item.CriterionTypeEnum)?.TrialReadingCriterionId;
+
+ item.TrialEmailNoticeUserList.AddRange(batchAddList.Where(t => t.Id == item.SysEmailNoticeConfigId)
+ .SelectMany(t => t.ToUserTypeList).Select(t => new TrialEmailNoticeUser() { EmailUserType = EmailUserType.To, UserType = t }));
+
+ item.TrialEmailNoticeUserList.AddRange(batchAddList.Where(t => t.Id == item.SysEmailNoticeConfigId)
+ .SelectMany(t => t.CopyUserTypeList).Select(t => new TrialEmailNoticeUser() { EmailUserType = EmailUserType.Copy, UserType = t }));
+
+
+ await _trialEmailNoticeConfigRepository.AddAsync(item);
+
+ }
+
+ await _trialEmailNoticeConfigRepository.SaveChangesAsync();
+
+ return ResponseOutput.Ok();
+
+
+ }
+
+
[HttpPost]
public async Task> GetTrialEmailNoticeConfigList(TrialEmailNoticeConfigQuery inQuery)
{
- await SyncSystemEmainCofigDocListAsync(inQuery.TrialId);
+ //await SyncSystemEmainCofigDocListAsync(inQuery.TrialId);
var trialEmailNoticeConfigQueryable = _trialEmailNoticeConfigRepository.Where(t => t.TrialId == inQuery.TrialId)
.WhereIf(inQuery.IsDistinguishCriteria == false, t => t.TrialReadingCriterionId == null)
+ .WhereIf(inQuery.IsDistinguishCriteria == true, t => t.CriterionTypeEnum != null)
.WhereIf(inQuery.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
.WhereIf(inQuery.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == inQuery.BusinessScenarioEnum)
.ProjectTo(_mapper.ConfigurationProvider);
@@ -1355,6 +1478,7 @@ namespace IRaCIS.Core.Application.Service
return await trialEmailNoticeConfigQueryable.ToListAsync();
}
+
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
public async Task AddOrUpdateTrialEmailNoticeConfig(TrialEmailNoticeConfigAddOrEdit addOrEditTrialEmailNoticeConfig)
{
@@ -1379,6 +1503,10 @@ namespace IRaCIS.Core.Application.Service
}
+ foreach (var userid in addOrEditTrialEmailNoticeConfig.BlackUserIdList)
+ {
+ entity.TrialEmailBlackUserList.Add(new TrialEmailBlackUser() { UserId = userid });
+ }
await _trialEmailNoticeConfigRepository.AddAsync(entity, true);
@@ -1387,10 +1515,10 @@ namespace IRaCIS.Core.Application.Service
}
else
{
+ var id = (Guid)addOrEditTrialEmailNoticeConfig.Id;
+
await _repository.BatchDeleteAsync(t => t.TrialEmailNoticeConfigId == addOrEditTrialEmailNoticeConfig.Id);
-
-
- var entity = (await _trialEmailNoticeConfigRepository.Where(t => t.Id == addOrEditTrialEmailNoticeConfig.Id, true, true).Include(t => t.TrialEmailNoticeUserList).FirstOrDefaultAsync()).IfNullThrowException();
+ await _repository.BatchDeleteAsync(t => t.TrialEmailNoticeConfigId == addOrEditTrialEmailNoticeConfig.Id);
List trialEmailNoticeUsers = new List();
@@ -1398,31 +1526,51 @@ namespace IRaCIS.Core.Application.Service
foreach (var item in addOrEditTrialEmailNoticeConfig.ToUserTypeList)
{
- trialEmailNoticeUsers.Add(new TrialEmailNoticeUser() { EmailUserType = EmailUserType.To, UserType = item, TrialEmailNoticeConfigId = entity.Id });
+ trialEmailNoticeUsers.Add(new TrialEmailNoticeUser() { EmailUserType = EmailUserType.To, UserType = item, TrialEmailNoticeConfigId = id });
}
foreach (var item in addOrEditTrialEmailNoticeConfig.CopyUserTypeList)
{
- trialEmailNoticeUsers.Add(new TrialEmailNoticeUser() { EmailUserType = EmailUserType.Copy, UserType = item, TrialEmailNoticeConfigId = entity.Id });
+ trialEmailNoticeUsers.Add(new TrialEmailNoticeUser() { EmailUserType = EmailUserType.Copy, UserType = item, TrialEmailNoticeConfigId = id });
}
await _repository.AddRangeAsync(trialEmailNoticeUsers);
+ foreach (var userid in addOrEditTrialEmailNoticeConfig.BlackUserIdList)
+ {
+ await _trialEmailBlackUserRepository.AddAsync(new TrialEmailBlackUser() { UserId = userid, TrialEmailNoticeConfigId = id });
+
+ }
+
await _trialEmailNoticeConfigRepository.UpdateFromDTOAsync(addOrEditTrialEmailNoticeConfig);
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();
}
}
+
+
private async Task TestEmailConfigAsync(TrialEmailNoticeConfigAddOrEdit config)
{
-
+
if (!config.FromEmail.Contains("@") || string.IsNullOrEmpty(config.FromEmail))
{
@@ -1449,7 +1597,7 @@ namespace IRaCIS.Core.Application.Service
throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidSenderEmailConfig"] + ex.Message);
}
-
+
#region 浜哄憳杩樻湭鍔犲叆锛屽彲浠ュ厛閰嶇疆閭欢 鍘嗗彶搴熷純
@@ -1522,6 +1670,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();
diff --git a/IRaCIS.Core.Application/Service/Management/DTO/UserTypeRoleModel.cs b/IRaCIS.Core.Application/Service/Management/DTO/UserTypeRoleModel.cs
index 3a059e4bd..a68328309 100644
--- a/IRaCIS.Core.Application/Service/Management/DTO/UserTypeRoleModel.cs
+++ b/IRaCIS.Core.Application/Service/Management/DTO/UserTypeRoleModel.cs
@@ -12,7 +12,7 @@ namespace IRaCIS.Core.Application.Contracts
public UserTypeEnum UserTypeEnum { get; set; }
public List UserTypeGroupList { get; set; } = new List();
- public new List UserTypeGroupIdList => UserTypeGroupList.Select(t=>t.DictionaryId).ToList();
+ public new List UserTypeGroupIdList => UserTypeGroupList.Select(t => t.DictionaryId).ToList();
}
@@ -22,7 +22,7 @@ namespace IRaCIS.Core.Application.Contracts
public Guid DictionaryId { get; set; }
- public string GroupName { get; set; }=string.Empty;
+ public string GroupName { get; set; } = string.Empty;
public string GroupNameCN { get; set; } = string.Empty;
}
@@ -36,7 +36,7 @@ namespace IRaCIS.Core.Application.Contracts
}
- public class UserTypeMenuAddOrEdit: UserTypeRoleAddOrEdit
+ public class UserTypeMenuAddOrEdit : UserTypeRoleAddOrEdit
{
public UserTypeEnum UserTypeEnum { get; set; }
@@ -64,6 +64,16 @@ namespace IRaCIS.Core.Application.Contracts
}
+ public class TrialSelectUser
+ {
+ public Guid UserId { get; set; }
+
+ public string UserName { get; set; }
+
+ public string RealName { get; set; }
+
+ public UserTypeEnum UserTypeEnum { get; set; }
+ }
public class TrialUserType
{
diff --git a/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs b/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs
index d14ccc540..b46f6ac5c 100644
--- a/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs
+++ b/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs
@@ -34,7 +34,7 @@ namespace IRaCIS.Core.Domain.Share
}
- public enum CommonDocumentBusinessScenario
+ public enum EmailBusinessScenario
{
EnrollConfirmed = 1,
@@ -44,6 +44,12 @@ namespace IRaCIS.Core.Domain.Share
Trial=3,
Reviewer=4,
+
+ QCTask = 5,
+
+ QCQuestion = 6,
+
+ ImageQuestion = 7
}
diff --git a/IRaCIS.Core.Domain/Common/CommonDocument.cs b/IRaCIS.Core.Domain/Common/CommonDocument.cs
index be9a95fa5..451b0f51c 100644
--- a/IRaCIS.Core.Domain/Common/CommonDocument.cs
+++ b/IRaCIS.Core.Domain/Common/CommonDocument.cs
@@ -72,7 +72,7 @@ namespace IRaCIS.Core.Domain.Models
public CriterionType? CriterionTypeEnum { get; set; }
public CommonDocumentFileType FileTypeEnum { get; set; }
- public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; }
+ public EmailBusinessScenario BusinessScenarioEnum { get; set; }
//[Required]
diff --git a/IRaCIS.Core.Domain/Common/EmailNoticeConfig.cs b/IRaCIS.Core.Domain/Common/EmailNoticeConfig.cs
index dd1a99f11..74ab2ac60 100644
--- a/IRaCIS.Core.Domain/Common/EmailNoticeConfig.cs
+++ b/IRaCIS.Core.Domain/Common/EmailNoticeConfig.cs
@@ -16,11 +16,59 @@ namespace IRaCIS.Core.Domain.Models
///EmailNoticeConfig
///
[Table("EmailNoticeConfig")]
- public class EmailNoticeConfig : Entity, IAuditUpdate, IAuditAdd,ISoftDelete
+ public class EmailNoticeConfig : Entity, IAuditUpdate, IAuditAdd, ISoftDelete
{
+ [JsonIgnore]
+ public List TrialEmailNoticeConfigList { get; set; }
+
+ [JsonIgnore]
+ public List EmailNoticeUserTypeList { get; set; } = new List();
public string Code { get; set; } = String.Empty;
- public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; }
+ public EmailBusinessScenario BusinessScenarioEnum { get; set; }
+
+ /// 鏍囧噯绫诲瀷 ///
+ public CriterionType? CriterionTypeEnum { get; set; }
+
+ /// 涓氬姟妯″潡 ///
+ public int BusinessModuleEnum { get; set; }
+
+ /// 涓氬姟灞傜骇 ///
+ public int BusinessLevelEnum { get; set; }
+
+ /// 閭欢绫诲瀷 ///
+ public int EmailTypeEnum { get; set; }
+
+ /// 閭欢鍔犳ョ被鍨 ///
+ public int EmailUrgentEnum { get; set; }
+
+ /// 瀹氭椂鍛ㄦ湡 ///
+ public string EmailCron { get; set; } = string.Empty;
+
+ /// 閭欢涓婚 ///
+ public string EmailTopic { get; set; } = string.Empty;
+
+ public string EmailTopicCN { get; set; } = string.Empty;
+
+ /// 闄勪欢 ///
+ public string AttachPath { get; set; } = string.Empty;
+
+ public string AttachCNPath { get; set; } = string.Empty;
+
+ public string EmailHtmlContent { get; set; } = string.Empty;
+
+ public string EmailHtmlContentCN { get; set; } = string.Empty;
+
+ public string Description { get; set; } = string.Empty;
+
+
+ public string AttachName { get; set; } = string.Empty;
+ public string AttachNameCN { get; set; } = string.Empty;
+
+
+
+
+
///
/// 鏄惁鍖哄垎鏍囧噯
@@ -34,10 +82,6 @@ namespace IRaCIS.Core.Domain.Models
[Required]
public bool IsReturnRequired { get; set; }
-
- [Required]
- public bool IsUrgent { get; set; }
-
public bool IsAutoSend { get; set; }
public bool IsEnable { get; set; }
@@ -61,14 +105,21 @@ namespace IRaCIS.Core.Domain.Models
public Guid? DeleteUserId { get; set; }
-
-
-
-
-
-
-
-
}
+
+ [Table("EmailNoticeUserType")]
+
+ public class EmailNoticeUserType : Entity
+ {
+ [JsonIgnore]
+ public EmailNoticeConfig EmailNoticeConfig { get; set; }
+
+ public Guid EmailNoticeConfigId { get; set; }
+
+
+ public UserTypeEnum UserType { get; set; }
+
+ public EmailUserType EmailUserType { get; set; }
+ }
}
diff --git a/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs b/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs
index 5b3bf06b4..2a221071d 100644
--- a/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs
+++ b/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs
@@ -12,93 +12,138 @@ using System.Linq;
namespace IRaCIS.Core.Domain.Models
{
- ///
- ///TrialEmailNoticeConfig
- ///
- [Table("TrialEmailNoticeConfig")]
- public class TrialEmailNoticeConfig : Entity, IAuditUpdate, IAuditAdd
- {
+ ///
+ ///TrialEmailNoticeConfig
+ ///
+ [Table("TrialEmailNoticeConfig")]
+ public class TrialEmailNoticeConfig : Entity, IAuditUpdate, IAuditAdd, ISoftDelete
+ {
+ [JsonIgnore]
- [Required]
- public Guid TrialId { get; set; }
-
-
- public string SMTPServerAddress { get; set; } = string.Empty;
-
- public int SMTPServerPort { get; set; }
-
- [Required]
- public string AuthorizationCode { get; set; } = string.Empty;
-
-
- public string FromName { get; set; } = string.Empty;
- public List TrialEmailNoticeUserList { get; set; } = new List();
-
-
- //[Required]
-
- //public string ReceiveEmailsStr { get; set; } = string.Empty;
- //public string CopyEmailsStr { get; set; } = string.Empty;
-
- //[NotMapped]
- //public List ReceiveEmailList => ReceiveEmailsStr.Split('|', StringSplitOptions.RemoveEmptyEntries).Where(t => !string.IsNullOrEmpty(t)).Select(t=>t.Trim()).ToList();
-
- //[NotMapped]
- //public List CopyEmailList => CopyEmailsStr.Split('|', StringSplitOptions.RemoveEmptyEntries).Where(t=> !string.IsNullOrEmpty(t)).Select(t => t.Trim()).ToList();
-
-
-
- public string FromEmail { get; set; } = string.Empty;
-
- [Required]
- public bool IsUrgent { get; set; }
-
-
- [Required]
- public string Code { get; set; } = string.Empty;
-
-
-
- [Required]
- public bool IsReturnRequired { get; set; }
-
-
-
- [Required]
- public bool IsAutoSend { get; set; }
-
-
-
- public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; }
-
- public CriterionType? CriterionTypeEnum { get; set; }
-
-
- public Guid? TrialReadingCriterionId { get; set; }
-
- [ForeignKey("TrialReadingCriterionId")]
- [JsonIgnore]
- public ReadingQuestionCriterionTrial TrialReadingCriterion { get; set; }
+ public Trial Trial { get; set; }
[Required]
- public string FilePath { get; set; } = string.Empty;
-
- [Required]
- public string FileName { get; set; } = string.Empty;
-
- [Required]
- public Guid CreateUserId { get; set; }
-
- [Required]
- public DateTime CreateTime { get; set; }
-
- [Required]
- public Guid UpdateUserId { get; set; }
-
- [Required]
- public DateTime UpdateTime { get; set; }
+ public Guid TrialId { get; set; }
- }
+ public string SMTPServerAddress { get; set; } = string.Empty;
-}
+ public int SMTPServerPort { get; set; }
+
+ [Required]
+ public string AuthorizationCode { get; set; } = string.Empty;
+
+
+ public string FromName { get; set; } = string.Empty;
+
+
+ public string FromEmail { get; set; } = string.Empty;
+
+ [JsonIgnore]
+ public List TrialEmailNoticeUserList { get; set; } = new List();
+
+ public List TrialEmailBlackUserList { get; set; } = new List();
+
+
+ /// 涓氬姟妯″潡 ///
+ public int BusinessModuleEnum { get; set; }
+
+ /// 涓氬姟灞傜骇 ///
+ public int BusinessLevelEnum { get; set; }
+
+ /// 閭欢绫诲瀷 ///
+ public int EmailTypeEnum { get; set; }
+
+ /// 閭欢鍔犳ョ被鍨 ///
+ public int EmailUrgentEnum { get; set; }
+
+ /// 瀹氭椂鍛ㄦ湡 ///
+ public string EmailCron { get; set; } = string.Empty;
+
+ /// 閭欢涓婚 ///
+ public string EmailTopic { get; set; } = string.Empty;
+
+ public string EmailTopicCN { get; set; } = string.Empty;
+
+ /// 闄勪欢 ///
+ public string AttachPath { get; set; } = string.Empty;
+
+ public string AttachCNPath { get; set; } = string.Empty;
+
+ public string Description { get; set; } = string.Empty;
+
+
+ public string AttachName { get; set; }
+ public string AttachNameCN { get; set; }
+
+
+ public string EmailHtmlContent { get; set; } = string.Empty;
+ public string EmailHtmlContentCN { get; set; } = string.Empty;
+
+
+
+ [JsonIgnore]
+
+ public EmailNoticeConfig SysEmailNoticeConfig { get; set; }
+ public Guid? SysEmailNoticeConfigId { get; set; }
+
+
+ [Required]
+ public string Code { get; set; } = string.Empty;
+
+ [Required]
+ public bool IsReturnRequired { get; set; }
+ [Required]
+ public bool IsAutoSend { get; set; }
+
+ public bool IsEnable { get; set; }
+
+
+ public EmailBusinessScenario BusinessScenarioEnum { get; set; }
+
+ public CriterionType? CriterionTypeEnum { get; set; }
+
+
+ public Guid? TrialReadingCriterionId { get; set; }
+
+ [ForeignKey("TrialReadingCriterionId")]
+ [JsonIgnore]
+ public ReadingQuestionCriterionTrial TrialReadingCriterion { get; set; }
+
+ [Required]
+ public Guid CreateUserId { get; set; }
+
+ [Required]
+ public DateTime CreateTime { get; set; }
+
+ [Required]
+ public Guid UpdateUserId { get; set; }
+
+ [Required]
+ public DateTime UpdateTime { get; set; }
+
+ public bool IsDeleted { get; set; }
+
+ public DateTime? DeletedTime { get; set; }
+
+ public Guid? DeleteUserId { get; set; }
+
+
+ }
+
+ public class TrialEmailBlackUser : Entity
+ {
+ [JsonIgnore]
+ public TrialEmailNoticeConfig TrialEmailNoticeConfig { get; set; }
+
+ [JsonIgnore]
+ public User User { get; set; }
+
+
+ public Guid TrialEmailNoticeConfigId { get; set; }
+
+
+ public Guid UserId { get; set; }
+ }
+
+}
diff --git a/IRaCIS.Core.Domain/Trial/Trial.cs b/IRaCIS.Core.Domain/Trial/Trial.cs
index 705ca584b..68f77bc56 100644
--- a/IRaCIS.Core.Domain/Trial/Trial.cs
+++ b/IRaCIS.Core.Domain/Trial/Trial.cs
@@ -383,7 +383,7 @@ namespace IRaCIS.Core.Domain.Models
///
/// SMTP端口
///
- public int? EmailSMTPServerPort { get; set; }
+ public int EmailSMTPServerPort { get; set; }
///
/// 是否配置过邮箱
diff --git a/IRaCIS.Core.Domain/_Config/_AppSettings.cs b/IRaCIS.Core.Domain/_Config/_AppSettings.cs
index 4bda63fec..698f8a10b 100644
--- a/IRaCIS.Core.Domain/_Config/_AppSettings.cs
+++ b/IRaCIS.Core.Domain/_Config/_AppSettings.cs
@@ -34,7 +34,9 @@ namespace IRaCIS.Core.Domain.Share
public string FromName { get; set; }
- public string AuthorizationCode { get; set; }
+ public string AuthorizationCode { get; set; }
+
+ public string SiteUrl { get; set; }
}
diff --git a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs
index 3720a409d..b98df40d8 100644
--- a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs
+++ b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs
@@ -513,7 +513,8 @@ namespace IRaCIS.Core.Infra.EFCore
public virtual DbSet UserLog { get; set; }
-
+ public virtual DbSet EmailNoticeUserType { get; set; }
+ public virtual DbSet TrialEmailBlackUser { get; set; }
#region 搴熷純
diff --git a/IRaCIS.Core.Infrastructure/_IRaCIS/Output/ResponseOutput.cs b/IRaCIS.Core.Infrastructure/_IRaCIS/Output/ResponseOutput.cs
index b0ae8448b..0b6e8ea93 100644
--- a/IRaCIS.Core.Infrastructure/_IRaCIS/Output/ResponseOutput.cs
+++ b/IRaCIS.Core.Infrastructure/_IRaCIS/Output/ResponseOutput.cs
@@ -169,7 +169,7 @@ namespace IRaCIS.Core.Infrastructure.Extention
public static IResponseOutput DBNotExistIfNUll(object businessObject)
{
- return new ResponseOutput().NotOk("The business object{businessObject.GetType().Name} does not exist in the database, or was deleted by someone else, or an incorrect parameter query caused");
+ return new ResponseOutput().NotOk($"The business object{businessObject.GetType().Name} does not exist in the database, or was deleted by someone else, or an incorrect parameter query caused");
}