diff --git a/IRaCIS.Core.Application/Service/Document/EmailSendService.cs b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs index e674d76c3..b6a9d4be4 100644 --- a/IRaCIS.Core.Application/Service/Document/EmailSendService.cs +++ b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs @@ -36,17 +36,20 @@ namespace IRaCIS.Core.Application.Service _trialRepository = trialRepository; } - - public async Task TrialImageQCTaskEmail(Guid trialId) + /// + /// 影像质控 + /// + /// + /// + public async Task SendTrialImageQCTaskEmail(Guid trialId) { var trialInfo = _repository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).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(); //判断是否任务可以领取 ,可以的话 发送邮件 + var userIdList=userList.Select(t=>t.UserId).ToList(); foreach (var user in userList) { @@ -54,7 +57,6 @@ namespace IRaCIS.Core.Application.Service //过滤项目 并且 将 _userInfo.Id 换位 当前发送邮件的Id var query = _trialRepository.Where(t => t.Id == trialId) - .Where(t => t.TrialUserList.Any(t => t.UserId == userId)) .Where(t => t.QCProcessEnum != TrialQCProcess.NotAudit) .Select(t => new { @@ -84,7 +86,105 @@ namespace IRaCIS.Core.Application.Service } } + /// + /// QC质疑 + /// + /// + /// + public async Task SendTrialQCQuestionEmail(Guid trialId) + { + var trialInfo = _repository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).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 + .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(), + + //质疑待处理 + 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(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo); + var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, user.FullName, DateTime.Now, sendStat.ToBeDealedCount, sendStat.ReUploadTobeDealedCount); + return (topicStr, htmlBodyStr); + }; + + await SendTrialEmailAsync(trialId, CommonDocumentBusinessScenario.QCQuestion, topicAndHtmlFunc); + } + } + } + + /// + /// 影像质疑 + /// + /// + /// + public async Task SendTrialImageQuestino(Guid trialId) + { + 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 + .Select(t => new + { + //质疑待处理 + ToBeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList) + .Where(u => u.CreateUserId == userId && u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC).Count(), + + }); + + var sendStat = await query.FirstOrDefaultAsync(); + + //当前人 + if (sendStat != null && (sendStat.ToBeDealedCount > 0 )) + { + + Func topicAndHtmlFunc = trialEmailConfig => + { + var topicStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo); + var htmlBodyStr = string.Format(_userInfo.IsEn_Us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, user.FullName, DateTime.Now, sendStat.ToBeDealedCount); + return (topicStr, htmlBodyStr); + }; + + await SendTrialEmailAsync(trialId, CommonDocumentBusinessScenario.QCQuestion, topicAndHtmlFunc); + } + } + } + + + //临床数据质询 + public async Task SendClinicalDataQuestion(Guid trialId,Guid visitTaskId,string content) + { + + } public async Task SendTrialEmailAsync(Guid trialId, CommonDocumentBusinessScenario businessScenario, Func topicAndHtmlFunc, Guid? trialReadingCriterionId = null, Guid? subjectId = null) diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs index 7ac89fe3a..0d142fef9 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -77,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, @@ -87,7 +87,7 @@ namespace IRaCIS.Core.Application.Service IsConfigureEmail = x.IsConfigureEmail, EmailSMTPServerPort = x.EmailSMTPServerPort - }).FirstNotNullAsync(); + }).FirstOrDefaultAsync(); } /// diff --git a/IRaCIS.Core.Test/DbHelper.ttinclude b/IRaCIS.Core.Test/DbHelper.ttinclude index 19d633448..24c236c0c 100644 --- a/IRaCIS.Core.Test/DbHelper.ttinclude +++ b/IRaCIS.Core.Test/DbHelper.ttinclude @@ -1,10 +1,10 @@ <#+ public class config { - public static readonly string ConnectionString = "Server=123.56.94.154,1433\\MSSQLSERVER;Database=IRaCIS_New_Tet;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true"; - public static readonly string DbDatabase = "CenterImage_Test"; + public static readonly string ConnectionString = "Server=123.56.94.154,1433\\MSSQLSERVER;Database=Test.Study;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true"; + public static readonly string DbDatabase = "Test.Study"; //ַ,ƴ - public static readonly string TableName = "PIAudit"; + public static readonly string TableName = "SubjectVisitClinicalDialog"; //ļ service Ƿҳ } #> @@ -21,10 +21,10 @@ } string sql = string.Format(@"SELECT obj.name tablename - from {0}.sys.objects obj - inner join {0}.dbo.sysindexes idx on obj.object_id=idx.id and idx.indid<=1 - INNER JOIN {0}.sys.schemas schem ON obj.schema_id=schem.schema_id - left join {0}.sys.extended_properties g ON (obj.object_id = g.major_id AND g.minor_id = 0 AND g.name= 'MS_Description') + from sys.objects obj + inner join dbo.sysindexes idx on obj.object_id=idx.id and idx.indid<=1 + INNER JOIN sys.schemas schem ON obj.schema_id=schem.schema_id + left join sys.extended_properties g ON (obj.object_id = g.major_id AND g.minor_id = 0 AND g.name= 'MS_Description') where type='U' {1} order by obj.name", database,tables); DataTable dt = GetDataTable(connectionString, sql); @@ -50,9 +50,9 @@ ELSE 0 END AS BIT) HasPrimaryKey - from {0}.sys.objects obj - inner join {0}.dbo.sysindexes idx on obj.object_id=idx.id and idx.indid<=1 - INNER JOIN {0}.sys.schemas schem ON obj.schema_id=schem.schema_id + from sys.objects obj + inner join dbo.sysindexes idx on obj.object_id=idx.id and idx.indid<=1 + INNER JOIN sys.schemas schem ON obj.schema_id=schem.schema_id where type='U' {1} order by obj.name", database, tables); #endregion @@ -79,8 +79,8 @@ ic.column_id, ic.index_column_id, ic.object_id - FROM {0}.sys.indexes idx - INNER JOIN {0}.sys.index_columns ic ON idx.index_id = ic.index_id AND idx.object_id = ic.object_id + FROM sys.indexes idx + INNER JOIN sys.index_columns ic ON idx.index_id = ic.index_id AND idx.object_id = ic.object_id WHERE idx.object_id =OBJECT_ID(@tableName) AND idx.is_primary_key=1 ) select @@ -102,14 +102,14 @@ cast(colm.precision as int) Precision, cast(colm.scale as int) Scale, prop.value Remark - from {0}.sys.columns colm - inner join {0}.sys.types systype on colm.system_type_id=systype.system_type_id and colm.user_type_id=systype.user_type_id - left join {0}.sys.extended_properties prop on colm.object_id=prop.major_id and colm.column_id=prop.minor_id + from sys.columns colm + inner join sys.types systype on colm.system_type_id=systype.system_type_id and colm.user_type_id=systype.user_type_id + left join sys.extended_properties prop on colm.object_id=prop.major_id and colm.column_id=prop.minor_id LEFT JOIN indexCTE ON colm.column_id=indexCTE.column_id AND colm.object_id=indexCTE.object_id where colm.object_id=OBJECT_ID(@tableName) order by colm.column_id", database); #endregion - SqlParameter param = new SqlParameter("@tableName", SqlDbType.NVarChar, 100) { Value = string.Format("{0}.{1}.{2}", database, schema, tableName) }; + SqlParameter param = new SqlParameter("@tableName", SqlDbType.NVarChar, 100) { Value = string.Format("{1}.{2}", database, schema, tableName) }; DataTable dt = GetDataTable(connectionString, sql, param); return dt.Rows.Cast().Select(row => new DbColumn() { diff --git a/irc_api.drone.yml b/irc_api.drone.yml index 5a9d7c9e7..7fc06efa3 100644 --- a/irc_api.drone.yml +++ b/irc_api.drone.yml @@ -14,7 +14,7 @@ steps: commands: - date +%H:%M:%S - pwd - - docker build -t Test.Study . + - docker build -t Test_Study . - date +%H:%M:%S - name: docker-deploy @@ -28,13 +28,13 @@ steps: commands: - date +%H:%M:%S - docker rm -f test-study-container - - docker run -itd -e TZ=Asia/Shanghai -e ASPNETCORE_ENVIRONMENT=Test_Study --restart=always --name test-study-container -p 8030:80 Test.Study + - docker run -itd -e TZ=Asia/Shanghai -e ASPNETCORE_ENVIRONMENT=Test_Study --restart=always --name test-study-container -p 8030:80 Test_Study - date +%H:%M:%S volumes: - name: cached_nuget_packages host: - path: /mnt/f/docker_publish/nuget_packages + path: /mnt/d/docker_publish/nuget_packages - name: dockersock host: path: /var/run/docker.sock