From c4e53d5654f44e51de184c5599aea5ac56b11ee8 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 9 Oct 2023 11:27:35 +0800 Subject: [PATCH] =?UTF-8?q?study-=E9=82=AE=E4=BB=B6=E5=8F=91=E9=80=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9-=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.API/IRaCIS.Core.API.csproj | 4 +- .../Properties/launchSettings.json | 17 +- IRaCIS.Core.API/Startup.cs | 4 +- .../Hangfire/HangfireConfig.cs | 40 -- .../_PipelineExtensions/HangfireConfig.cs | 66 +++ .../_ServiceExtensions/hangfireSetup.cs | 16 +- .../appsettings.CenterImageDev.json | 35 -- .../appsettings.CertificateApply.json | 33 -- IRaCIS.Core.API/appsettings.Development.json | 4 +- IRaCIS.Core.API/appsettings.Production.json | 3 +- IRaCIS.Core.API/appsettings.Staging.json | 3 +- .../Helper/HangfireJobHelper.cs | 92 ++++ .../IRaCIS.Core.Application.csproj | 4 +- .../IRaCIS.Core.Application.xml | 83 +++- .../Common/DTO/CommonDocumentViewModel.cs | 4 +- .../Common/DTO/EmailNoticeConfigViewModel.cs | 87 +++- .../Common/EmailNoticeConfigService.cs | 58 ++- .../Service/Common/_MapConfig.cs | 8 +- .../DTO/TrialEmailNoticeConfigViewModel.cs | 97 +++-- .../Service/Document/EmailSendService.cs | 403 ++++++++++++++++++ .../Document/TrialEmailNoticeConfigService.cs | 283 +++++++++--- .../Management/DTO/UserTypeRoleModel.cs | 16 +- .../Common/EmailScenarioEnum.cs | 8 +- IRaCIS.Core.Domain/Common/CommonDocument.cs | 2 +- .../Common/EmailNoticeConfig.cs | 79 +++- .../Document/TrialEmailNoticeConfig.cs | 213 +++++---- IRaCIS.Core.Domain/Trial/Trial.cs | 2 +- IRaCIS.Core.Domain/_Config/_AppSettings.cs | 4 +- .../Context/IRaCISDBContext.cs | 3 +- .../_IRaCIS/Output/ResponseOutput.cs | 2 +- 30 files changed, 1314 insertions(+), 359 deletions(-) delete mode 100644 IRaCIS.Core.API/_PipelineExtensions/Hangfire/HangfireConfig.cs create mode 100644 IRaCIS.Core.API/_PipelineExtensions/HangfireConfig.cs delete mode 100644 IRaCIS.Core.API/appsettings.CenterImageDev.json delete mode 100644 IRaCIS.Core.API/appsettings.CertificateApply.json create mode 100644 IRaCIS.Core.Application/Helper/HangfireJobHelper.cs create mode 100644 IRaCIS.Core.Application/Service/Document/EmailSendService.cs 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"); }