diff --git a/IRaCIS.Core.API/_PipelineExtensions/Hangfire/HangfireConfig.cs b/IRaCIS.Core.API/_PipelineExtensions/Hangfire/HangfireConfig.cs index 5c588303..48423534 100644 --- a/IRaCIS.Core.API/_PipelineExtensions/Hangfire/HangfireConfig.cs +++ b/IRaCIS.Core.API/_PipelineExtensions/Hangfire/HangfireConfig.cs @@ -31,7 +31,7 @@ namespace IRaCIS.Core.API //周期性任务,1天执行一次 - RecurringJob.AddOrUpdate(t => t.MemoryCacheTrialStatus(), Cron.Daily); + RecurringJob.AddOrUpdate(t => t.ProjectStartCache(), Cron.Daily); #endregion diff --git a/IRaCIS.Core.Application/BackGroundJob/IRaCISCacheHangfireJob.cs b/IRaCIS.Core.Application/BackGroundJob/IRaCISCacheHangfireJob.cs index 577c2615..80a3d16a 100644 --- a/IRaCIS.Core.Application/BackGroundJob/IRaCISCacheHangfireJob.cs +++ b/IRaCIS.Core.Application/BackGroundJob/IRaCISCacheHangfireJob.cs @@ -1,5 +1,6 @@ using EasyCaching.Core; using IRaCIS.Core.Domain.Share; +using Microsoft.EntityFrameworkCore.SqlServer.Query.Internal; using Microsoft.Extensions.Logging; namespace IRaCIS.Application.Services.BackGroundJob @@ -7,7 +8,13 @@ namespace IRaCIS.Application.Services.BackGroundJob public interface IIRaCISCacheHangfireJob { + + Task ProjectStartCache(); Task MemoryCacheTrialStatus(); + + Task MemoryCacheAnonymizeData(); + + Task CacheUserTypePermission(Guid? cacheUserTypeId); } public class IRaCISCacheHangfireJob: IIRaCISCacheHangfireJob { @@ -16,50 +23,77 @@ namespace IRaCIS.Application.Services.BackGroundJob private readonly ILogger _logger; private readonly IRepository _systemAnonymizationRepository; - public IRaCISCacheHangfireJob(IRepository trialRepository, IRepository systemAnonymizationRepository, IEasyCachingProvider provider,ILogger logger) + private readonly IRepository _userTypeMenuRepository; + + public IRaCISCacheHangfireJob(IRepository trialRepository, + IRepository systemAnonymizationRepository, IRepository userTypeMenuRepository, + IEasyCachingProvider provider,ILogger logger) { _trialRepository = trialRepository; _provider = provider; _logger = logger; _systemAnonymizationRepository = systemAnonymizationRepository; + _userTypeMenuRepository = userTypeMenuRepository; } - public async Task MemoryCacheTrialStatus() + + + public async Task ProjectStartCache() { - _logger.LogInformation("hangfire 定时任务开始~"); + _logger.LogInformation("hangfire 定时缓存项目状态任务开始~"); try { - await CacheTrialStatusAsync(); + await MemoryCacheTrialStatus(); - await CacheAnonymizeAsync(); + await MemoryCacheAnonymizeData(); + + await CacheUserTypePermission(); } catch (Exception e) { - _logger.LogError("hangfire 定时任务执行失败"+e.Message); + _logger.LogError("hangfire 定时任务执行失败" + e.Message); } - - _logger.LogInformation("hangfire 定时任务执行结束"); + _logger.LogInformation("hangfire 定时任务执行结束"); } - - - private async Task CacheTrialStatusAsync() + public async Task MemoryCacheTrialStatus() { - var list = await _trialRepository.Select(t => new { TrialId = t.Id, TrialStatusStr = t.TrialStatusStr }) + var list = await _trialRepository.Select(t => new { TrialId = t.Id, TrialStatusStr = t.TrialStatusStr }) .ToListAsync(); list.ForEach(t => _provider.Set(t.TrialId.ToString(), t.TrialStatusStr, TimeSpan.FromDays(7))); + } - private async Task CacheAnonymizeAsync() + + + + + + + public async Task MemoryCacheAnonymizeData() { - var systemAnonymizationList = await _systemAnonymizationRepository.Where(t => t.IsEnable).ToListAsync(); + var systemAnonymizationList = await _systemAnonymizationRepository.Where(t => t.IsEnable).ToListAsync(); _provider.Set(StaticData.Anonymize.Anonymize_AddFixedFiled, systemAnonymizationList.Where(t => t.IsAdd && t.IsFixed).ToList(), TimeSpan.FromDays(7)); _provider.Set(StaticData.Anonymize.Anonymize_AddIRCInfoFiled, systemAnonymizationList.Where(t => t.IsAdd && t.IsFixed == false).ToList(), TimeSpan.FromDays(7)); _provider.Set(StaticData.Anonymize.Anonymize_FixedField, systemAnonymizationList.Where(t => t.IsAdd == false && t.IsFixed).ToList(), TimeSpan.FromDays(7)); _provider.Set(StaticData.Anonymize.Anonymize_IRCInfoField, systemAnonymizationList.Where(t => t.IsAdd == false && t.IsFixed == false).ToList(), TimeSpan.FromDays(7)); } + + public async Task CacheUserTypePermission(Guid? cacheUserTypeId=null) + { + + var permissionList = await _userTypeMenuRepository.Where(t => t.Menu.MenuType == "F") + .WhereIf(cacheUserTypeId != null, t => t.UserTypeId == cacheUserTypeId.Value).Select(t => new { t.UserTypeId, t.Menu.PermissionStr }).ToListAsync(); + + foreach (var userTypeGroup in permissionList.GroupBy(t => t.UserTypeId)) + { + _provider.Set($"{StaticData.CacheKey.UserTypeId}_{userTypeGroup.Key}", userTypeGroup.Select(t => t.PermissionStr).ToList(), TimeSpan.FromDays(7)); + } + } + + } } \ No newline at end of file diff --git a/IRaCIS.Core.Application/Helper/FileStoreHelper.cs b/IRaCIS.Core.Application/Helper/FileStoreHelper.cs index 0656f480..e64c16be 100644 --- a/IRaCIS.Core.Application/Helper/FileStoreHelper.cs +++ b/IRaCIS.Core.Application/Helper/FileStoreHelper.cs @@ -409,6 +409,26 @@ public static class FileStoreHelper return (serverFilePath, relativePath, fileRealName); } + // 获取 入组确认 PD 进展发送邮件Word|PDF 存放路径 + + public static (string PhysicalPath, string RelativePath, string FileRealName) GetSubjectEnrollConfirmOrPDEmailPath(IWebHostEnvironment _hostEnvironment, string fileName, Guid trialId, Guid siteId, Guid subjectId) + { + var rootPath = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment); + + string uploadFolderPath = Path.Combine(rootPath, StaticData.Folder.TrialDataFolder, trialId.ToString(), siteId.ToString(), subjectId.ToString()); + + if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath); + + var (trustedFileNameForFileStorage, fileRealName) = FileStoreHelper.GetStoreFileName(fileName); + + + var relativePath = $"/{StaticData.Folder.IRaCISDataFolder}/{StaticData.Folder.TrialDataFolder}/{trialId}/{siteId}/{subjectId}/{trustedFileNameForFileStorage}"; + + var serverFilePath = Path.Combine(uploadFolderPath, trustedFileNameForFileStorage); + + return (serverFilePath, relativePath, fileRealName); + } + public static string GetSubjectVisitDicomFolderPhysicalPath(IWebHostEnvironment _hostEnvironment,Guid trialId, Guid siteId, Guid subjectId, Guid subjectVisitId) { diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 8c8cc49d..6044df4f 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -602,12 +602,40 @@ - + - 测试邮件 带附件 填充word --前端不需要用 + 测试邮件 带附件 填充word --前端不需 - + 为空 代表 正常任务自动发送,为true 代表医学审核手动发送 为false 代表医学审核自动发送 + + + + + + + + 手动生成入组确认 或者PD 进展的邮件 如果能发送,会返回文件的路径,否则会给出提示 + + + + + + + 手动发送邮件 + + + + + + + + + + 任务Id + 任务类型 + 标准类型 + 是否是全局产生(区分裁判任务) diff --git a/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs b/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs index a789b269..7cd8ad0a 100644 --- a/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs +++ b/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs @@ -108,6 +108,16 @@ namespace IRaCIS.Core.Application.ViewModel } + + public class GenerateEmailCommand + { + public Guid SubjectId { get; set; } + + public Guid TrialReadingCriterionId { get; set; } + + public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; } + } + /// TrialEmailNoticeConfigAddOrEdit 列表查询参数模型 public class TrialEmailNoticeConfigAddOrEdit { diff --git a/IRaCIS.Core.Application/Service/Document/Interface/ITrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/Interface/ITrialEmailNoticeConfigService.cs index 4fb10d3e..b30ba64f 100644 --- a/IRaCIS.Core.Application/Service/Document/Interface/ITrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/Interface/ITrialEmailNoticeConfigService.cs @@ -6,23 +6,31 @@ using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Domain.Share.Common; namespace IRaCIS.Core.Application.Interfaces -{ +{ /// /// ITrialEmailNoticeConfigService /// public interface ITrialEmailNoticeConfigService - { + { - - Task> GetTrialEmailNoticeConfigList(TrialEmailNoticeConfigQuery inQuery); - - Task AddOrUpdateTrialEmailNoticeConfig(TrialEmailNoticeConfigAddOrEdit addOrEditTrialEmailNoticeConfig); - Task DeleteTrialEmailNoticeConfig(Guid trialEmailNoticeConfigId); + Task> GetTrialEmailNoticeConfigList(TrialEmailNoticeConfigQuery inQuery); - Task BaseBusinessScenarioSendEmailAsync( Guid visitTaskId, bool? isMedicalReviewAndSuggestApplyReReading = null); + Task AddOrUpdateTrialEmailNoticeConfig(TrialEmailNoticeConfigAddOrEdit addOrEditTrialEmailNoticeConfig); + + Task DeleteTrialEmailNoticeConfig(Guid trialEmailNoticeConfigId); + + Task BaseBusinessScenarioSendEmailAsync(Guid visitTaskId, bool? isMedicalReviewAndSuggestApplyReReading = null, EmailStoreSendMode emailStoreMode = EmailStoreSendMode.StoreLocalSend, string sendFileRelativePath=""); } -} + + public class EmailStoreSendDto + { + public EmailStoreSendMode EmailStoreSendMode { get; set; } = EmailStoreSendMode.StoreLocalSend; + + public string SendFileRelativePath { get; set; } + } +} diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs index 0ba787b5..dd5efbb0 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -17,6 +17,9 @@ using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Filter; using MiniSoftware; using IRaCIS.Core.Application.Service.Reading.Dto; +using IRaCIS.Core.Domain.Share.Common; +using System.IO; +using System.Linq; namespace IRaCIS.Core.Application.Service { @@ -36,15 +39,22 @@ namespace IRaCIS.Core.Application.Service public IRepository _visitTaskRepository { get; } public IRepository _trialUserRepository { get; } + public IRepository _subjectRepository { get; } + + public IRepository _subjectVisitRepository { get; } + public TrialEmailNoticeConfigService(IRepository trialEmailNoticeConfigRepository, IRepository visitTaskRepository, IRepository trialRepository, - IRepository trialUserRepository, IRepository taskMedicalReviewRepository) + IRepository trialUserRepository, IRepository taskMedicalReviewRepository, IRepository subjectRepository, IRepository subjectVisitRepository) { _trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository; _visitTaskRepository = visitTaskRepository; this._trialRepository = trialRepository; _trialUserRepository = trialUserRepository; _taskMedicalReviewRepository = taskMedicalReviewRepository; + _subjectRepository = subjectRepository; + + _subjectVisitRepository = subjectVisitRepository; } /// @@ -165,20 +175,21 @@ namespace IRaCIS.Core.Application.Service - private async Task DealMedicalReviewTasKGenerateAndIsSendAsync(Guid trialId, bool? isMedicalReviewAndSuggestApplyReReading,string pdAnswer, List taskIdList, List minUserIdList) + private async Task DealMedicalReviewTasKGenerateAndIsSendAsync(Guid trialId, bool? isHandSend, string pdAnswer, List taskIdList, List minUserIdList) { var isNeedSend = true; - if (pdAnswer == "是") + //手动发送的时候,也有可能答案是是 此时是 这里不发送,发送已经生成的文件 + if (pdAnswer == "是" && isHandSend==null) { isNeedSend = true; } else { - - if (isMedicalReviewAndSuggestApplyReReading == null) + //正常阅片为否的 + if (isHandSend == null) { isNeedSend = false; @@ -189,7 +200,7 @@ namespace IRaCIS.Core.Application.Service } } - else if (isMedicalReviewAndSuggestApplyReReading == true) + else if (isHandSend == true) { //手动发送 isNeedSend = false; @@ -202,20 +213,22 @@ namespace IRaCIS.Core.Application.Service } - + return isNeedSend; } /// - /// 测试邮件 带附件 填充word --前端不需要用 + /// 测试邮件 带附件 填充word --前端不需 /// /// - /// + /// 为空 代表 正常任务自动发送,为true 代表医学审核手动发送 为false 代表医学审核自动发送 + /// + /// /// /// - public async Task BaseBusinessScenarioSendEmailAsync(Guid visitTaskId, bool? isMedicalReviewAndSuggestApplyReReading) + public async Task BaseBusinessScenarioSendEmailAsync(Guid visitTaskId, bool? isHandSend, EmailStoreSendMode emailStoreMode, string sendFileRelativePath) { CommonDocumentBusinessScenario? businessScenarioEnum = null; @@ -249,6 +262,7 @@ namespace IRaCIS.Core.Application.Service t.SubjectId, t.Subject.SiteId, + t.DoctorUserId, t.ReadingTaskState, t.ReadingCategory, t.SignTime, @@ -292,7 +306,7 @@ namespace IRaCIS.Core.Application.Service } else { - return; + return string.Empty; } } @@ -317,7 +331,7 @@ namespace IRaCIS.Core.Application.Service { //throw new BusinessValidationFailedException("找不到该项目标准场景下邮件的配置"); - return; + return string.Empty; } @@ -382,7 +396,6 @@ namespace IRaCIS.Core.Application.Service } #endregion - #region 确保 邮件Html存在 //邮件附件 @@ -403,55 +416,21 @@ namespace IRaCIS.Core.Application.Service #endregion - var answer = "否"; - var isNeedSend = true; - var minUserIdList = _trialUserRepository.Where(t => t.User.UserTypeEnum == Domain.Share.UserTypeEnum.MIM && t.TrialId == taskInfo.TrialId).Select(t => t.UserId).ToList(); + #region 不同场景 Tile 设置 - //入组确认 根据每个标准配置的是否自动发送,发送邮件与否 if (businessScenarioEnum == CommonDocumentBusinessScenario.EnrollConfirmed) { - //如果其他阅片人已经做了,说明发送了入组确认报告,第二个人做完就不发送了 - if (await _visitTaskRepository.AnyAsync(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && - t.Id != visitTaskId && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId)) + sendEmailConfig.TopicDescription = $"【入组确认报告】关于{taskInfo.ResearchProgramNo}项目{taskInfo.SubjectCode}受试者"; + + using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) { - isNeedSend = false; + var templateInfo = SourceReader.ReadToEnd(); + + + sendEmailConfig.HtmlBodyStr = string.Format(templateInfo, + $" 附件为入组确认报告,请查收 " + ); } - else - { - sendEmailConfig.TopicDescription = $"【入组确认报告】关于{taskInfo.ResearchProgramNo}项目{taskInfo.SubjectCode}受试者"; - - using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) - { - var templateInfo = SourceReader.ReadToEnd(); - - - sendEmailConfig.HtmlBodyStr = string.Format(templateInfo, - $" 附件为入组确认报告,请查收 " - ); - } - - - if (await _repository.Where().AnyAsync(x => x.VisitTaskId == visitTaskId && x.Answer == TargetState.Exist.GetEnumInt() && - x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State && x.ReadingQuestionTrial.LesionType == LesionType.TargetLesion)) - { - - answer = "是"; - - //把另外一个人的任务设置为不加急(如果项目加急是否 subject 加急是否) - var urgent = _repository.Where(t => t.Id == taskInfo.SourceSubjectVisitId).Select(t => new { IsSubjectUrgent = t.Subject.IsUrgent, t.Trial.IsUrgent }).FirstOrDefault(); - - if (urgent?.IsUrgent == false || urgent?.IsSubjectUrgent == false) - { - await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && - t.Id != visitTaskId && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId, u => new VisitTask() { IsUrgent = false }); - } - - } - isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, new List() { visitTaskId }, minUserIdList); - - } - - } else if (businessScenarioEnum == CommonDocumentBusinessScenario.PDConfirmed) { @@ -466,6 +445,91 @@ namespace IRaCIS.Core.Application.Service $" 附件为疾病进展确认报告,请查收 " ); } + } + else + { + // + } + + #endregion + + + #region 不同标准 不同项目配置 发送邮件的时机 处理具体逻辑 + + var answer = "否"; + var isNeedSend = true; + var minUserIdList = _trialUserRepository.Where(t => t.User.UserTypeEnum == Domain.Share.UserTypeEnum.MIM && t.TrialId == taskInfo.TrialId).Select(t => t.UserId).ToList(); + + + + //入组确认 根据每个标准配置的是否自动发送,发送邮件与否 + if (businessScenarioEnum == CommonDocumentBusinessScenario.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)) + { + answer = "是"; + } + + + //如果其他阅片人已经做了,说明发送了入组确认报告,第二个人做完就不发送了 + + //入组确认一直交给第一个人,如果第一个人重阅 还未做完,第二个人先做完了,此时不发 + + var existFirstEnrollTask= await _visitTaskRepository.Where(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.IsAnalysisCreate == false + && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId).OrderBy(t=>t.SignTime).FirstOrDefaultAsync(); + + //入组确认的医生已确定 + if(existFirstEnrollTask!= null) + { + if(taskInfo.DoctorUserId==existFirstEnrollTask.DoctorUserId) + { + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, new List() { visitTaskId }, minUserIdList); + + if (answer == "是") + { + //把另外一个人的任务设置为不加急(如果项目加急是否 subject 加急是否) + var urgent = _repository.Where(t => t.Id == taskInfo.SourceSubjectVisitId).Select(t => new { IsSubjectUrgent = t.Subject.IsUrgent, t.Trial.IsUrgent }).FirstOrDefault(); + + if (urgent?.IsUrgent == false || urgent?.IsSubjectUrgent == false) + { + await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && + t.Id != visitTaskId && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId, u => new VisitTask() { IsUrgent = false }); + } + } + } + else + { + isNeedSend = false; + } + } + else + { + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, new List() { visitTaskId }, minUserIdList); + + + if (answer == "是") + { + //把另外一个人的任务设置为不加急(如果项目加急是否 subject 加急是否) + var urgent = _repository.Where(t => t.Id == taskInfo.SourceSubjectVisitId).Select(t => new { IsSubjectUrgent = t.Subject.IsUrgent, t.Trial.IsUrgent }).FirstOrDefault(); + + if (urgent?.IsUrgent == false || urgent?.IsSubjectUrgent == false) + { + await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && + t.Id != visitTaskId && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId, u => new VisitTask() { IsUrgent = false }); + } + } + + + } + + + + + } + else if (businessScenarioEnum == CommonDocumentBusinessScenario.PDConfirmed) + { + //有序 @@ -509,7 +573,7 @@ namespace IRaCIS.Core.Application.Service throw new BusinessValidationFailedException("单重有序阅片 该类型的任务不应进入此处逻辑,请联系后台开发核查!"); } - isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, new List() { visitTaskId }, minUserIdList); + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, new List() { visitTaskId }, minUserIdList); } @@ -534,16 +598,16 @@ namespace IRaCIS.Core.Application.Service answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); - isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); - + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); + } //双人 产生裁判,并且裁判完成 发 else if (taskList.Count == 3 && taskList.Count(t => t.ReadingTaskState == ReadingTaskState.HaveSigned) == 3 && taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).Count() == 1) { + var judgeResultId = taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).First().JudgeResultTaskId.Value; + answer = await TranslatePdStateAsync(judgeResultId, ReadingCategory.Visit, taskInfo.CriterionType); - answer = await TranslatePdStateAsync(taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).First().Id, ReadingCategory.Judge, taskInfo.CriterionType); - - isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); } else @@ -580,15 +644,16 @@ namespace IRaCIS.Core.Application.Service answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); - isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); } //双人全局产生裁判 else if (taskList.Count == 3 && taskList.Count(t => t.ReadingTaskState == ReadingTaskState.HaveSigned) == 3 && taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).Count() == 1 && taskList.Where(t => t.ReadingCategory == ReadingCategory.Global).Count() == 2) { - answer = await TranslatePdStateAsync(taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).First().Id, ReadingCategory.Judge, taskInfo.CriterionType); + var judgeResultId = taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).First().JudgeResultTaskId.Value; + answer = await TranslatePdStateAsync(judgeResultId, ReadingCategory.Global, taskInfo.CriterionType); - isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); } else @@ -642,14 +707,15 @@ namespace IRaCIS.Core.Application.Service { answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); - isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, new List() { visitTaskId }, minUserIdList); + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, new List() { visitTaskId }, minUserIdList); } //双重 截止访视只在阅片期的时候存在 要求PD确认的访视 肯定是非截止访视 else if (taskInfo.ReadingType == ReadingMethod.Double && taskInfo.ArbitrationRule == ArbitrationRule.Visit) { //在两位阅片人读完访视后,如果有裁判者等裁判读完,如果无裁判则等第二个人的读完 - var taskList = await _visitTaskRepository.Where(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Judge)).ToListAsync(); + var taskList = await _visitTaskRepository.Where(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect + && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Judge)).ToListAsync(); //这里要求 到这里已经如果有裁判 已经生成裁判了保存数据库 if (taskList.Count == 2 && taskList.Count(t => t.ReadingTaskState == ReadingTaskState.HaveSigned && t.ReadingCategory == ReadingCategory.Visit) == 2) @@ -657,13 +723,14 @@ namespace IRaCIS.Core.Application.Service answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); - isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); } else if (taskList.Count == 3 && taskList.Count(t => t.ReadingTaskState == ReadingTaskState.HaveSigned) == 3 && taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).Count() == 1) { + var judgeResultId = taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).First().JudgeResultTaskId.Value; + answer = await TranslatePdStateAsync(judgeResultId, ReadingCategory.Visit, taskInfo.CriterionType); - answer = await TranslatePdStateAsync(taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).First().Id, ReadingCategory.Judge, taskInfo.CriterionType); - isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); } @@ -699,7 +766,7 @@ namespace IRaCIS.Core.Application.Service - + } else @@ -707,21 +774,64 @@ namespace IRaCIS.Core.Application.Service isNeedSend = false; } + #endregion + + #region MiniWord 组织字典 发送 + + + if (emailStoreMode == EmailStoreSendMode.NotStoreLocalOnlySentEmail) + { + + var phyPath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, sendFileRelativePath); + + //先预先生成了邮件,发送预先生成的邮件 + sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig() + { + FileName = $"{taskInfo.SubjectCode}_{emailConfig.FileName}", + + FileStream = File.OpenRead(phyPath), + }); + + + await SendEmailHelper.SendEmailAsync(sendEmailConfig); + + return string.Empty; + } + + var value = new Dictionary() + { + ["SponsorName"] = taskInfo.SponsorName, + ["ResearchProgramNo"] = taskInfo.ResearchProgramNo, + ["TrialSiteCode"] = taskInfo.TrialSiteCode, + ["SubjectCode"] = taskInfo.SubjectCode, + ["VisitName"] = taskInfo.SourceSubjectVisitId != null ? taskInfo.VisitName : taskInfo.ModuleVisitName, + ["EarliestScanDate"] = taskInfo.SourceSubjectVisitId != null ? taskInfo.VisitEarliestScanDate : taskInfo.ModuleEarliestScanDate, + ["SignTime"] = taskInfo.SignTime, + ["Result"] = answer + + }; + + var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetSubjectEnrollConfirmOrPDEmailPath(_hostEnvironment, Path.GetFileName(path), taskInfo.TrialId, taskInfo.SiteId, taskInfo.SubjectId); + + if (emailStoreMode == EmailStoreSendMode.StoreLocalSend || emailStoreMode == EmailStoreSendMode.OnlyStoreLocalNotSentEmail) + { + MiniSoftware.MiniWord.SaveAsByTemplate(serverFilePath, path, value); + + } + //手动生成发送的邮件内容,但是并不发送 + if (emailStoreMode == EmailStoreSendMode.OnlyStoreLocalNotSentEmail) + { + isNeedSend = false; + + return relativePath; + } + + + //正常的即时生成邮件 并发送邮件 if (isNeedSend) { - var value = new Dictionary() - { - ["SponsorName"] = taskInfo.SponsorName, - ["ResearchProgramNo"] = taskInfo.ResearchProgramNo, - ["TrialSiteCode"] = taskInfo.TrialSiteCode, - ["SubjectCode"] = taskInfo.SubjectCode, - ["VisitName"] = taskInfo.SourceSubjectVisitId != null ? taskInfo.VisitName : taskInfo.ModuleVisitName, - ["EarliestScanDate"] = taskInfo.SourceSubjectVisitId != null ? taskInfo.VisitEarliestScanDate : taskInfo.ModuleEarliestScanDate, - ["SignTime"] = taskInfo.SignTime, - ["Result"] = answer - }; MemoryStream memoryStream = new MemoryStream(); @@ -731,7 +841,7 @@ namespace IRaCIS.Core.Application.Service sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig() { - FileName = emailConfig.FileName, + FileName =$"{taskInfo.SubjectCode}_{emailConfig.FileName}" , FileStream = memoryStream }); @@ -740,6 +850,15 @@ namespace IRaCIS.Core.Application.Service await SendEmailHelper.SendEmailAsync(sendEmailConfig); } + + + + return string.Empty; + + + + + #endregion @@ -747,8 +866,285 @@ namespace IRaCIS.Core.Application.Service + /// + /// 手动生成入组确认 或者PD 进展的邮件 如果能发送,会返回文件的路径,否则会给出提示 + /// + /// - private async Task TranslatePdStateAsync(Guid visitTaskId, ReadingCategory readingCategory, CriterionType criterionType) + /// + [HttpPost] + public async Task ManualGenerateEmailFile(GenerateEmailCommand generateEmailCommand) + { + var subjectId = generateEmailCommand.SubjectId; + var businessScenarioEnum = generateEmailCommand.BusinessScenarioEnum; + var trialReadingCriterionId = generateEmailCommand.TrialReadingCriterionId; + + + var trialConfig = await _subjectRepository.Where(t => t.Id == subjectId).Select(t => new { t.Trial.IsEnrollementQualificationConfirm, t.Trial.IsPDProgressView }).FirstNotNullAsync(); + + //找到入组确认 或者Pd 进展 已生成任务的 访视 + 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 (trialConfig.IsEnrollementQualificationConfirm == false) + { + return ResponseOutput.NotOk("项目未配置入组确认!"); + + } + var exisitBaseline = subjectVisitList.FirstOrDefault(t => t.IsEnrollmentConfirm); + if (exisitBaseline == null) + { + return ResponseOutput.NotOk("不存在配置了入组确认的并且生成任务的基线访视"); + } + else + { + //入组确认不用管项目的 有序 无序 单重 双重 阅片 + + //找到最早签名的 + var firstSignTask = await _visitTaskRepository.Where(t => t.SourceSubjectVisitId == exisitBaseline.Id /*&& t.TaskState == TaskState.Effect*/ && t.IsAnalysisCreate == false + && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.TrialReadingCriterionId == trialReadingCriterionId).OrderBy(t=>t.SignTime).FirstOrDefaultAsync(); + + + if (firstSignTask != null) + { + var task = await _visitTaskRepository.Where(t => t.SourceSubjectVisitId == exisitBaseline.Id && t.TaskState == TaskState.Effect && t.DoctorUserId== firstSignTask.DoctorUserId && t.IsAnalysisCreate == false + && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.TrialReadingCriterionId == trialReadingCriterionId).OrderBy(t => t.SignTime).FirstOrDefaultAsync(); + + //如果存在做完的该任务 + + if (task == null) + { + return ResponseOutput.NotOk("做入组确认的阅片人基线任务没有阅片完!"); + } + else + { + var filePath = await BaseBusinessScenarioSendEmailAsync(task.Id, true, EmailStoreSendMode.OnlyStoreLocalNotSentEmail, string.Empty); + + return ResponseOutput.Ok(new { RelativePath = filePath, TaskName = task.TaskName, VisitTaskId = task.Id }); + + + } + } + else + { + return ResponseOutput.NotOk("当前未有阅片人读完基线任务!"); + } + + + + + + } + } + + else if (businessScenarioEnum == CommonDocumentBusinessScenario.PDConfirmed) + { + + if (trialConfig.IsPDProgressView == false) + { + return ResponseOutput.NotOk("项目未配置PD进展!"); + } + + //是否是截止访视 截止访视在全局发 否则就在当前访视发 + + var pdSubjectVisitIdList = subjectVisitList.Where(t => t.PDState == PDStateEnum.PDProgress).OrderBy(t => t.VisitNum).Select(t => (Guid?)t.Id).ToList(); + + if (pdSubjectVisitIdList.Count == 0) + { + return ResponseOutput.NotOk("不存在配置了PD进展的并且生成任务的访视"); + } + + + var currentLatestPdVisitId = pdSubjectVisitIdList.Last(); + //标准配置 + var trialReadingCriterionConfig = await _repository.Where(t => t.Id == trialReadingCriterionId).Select(t => new + { TrialReadingCriterionId = t.Id, t.ReadingType, t.IsReadingTaskViewInOrder, t.CriterionType, t.ArbitrationRule }).FirstNotNullAsync(); + + // 项目双重 + if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double) + { + //仲裁在访视上面 + if (trialReadingCriterionConfig.ArbitrationRule == ArbitrationRule.Visit) + { + //在两位阅片人读完访视后,如果有裁判者等裁判读完,如果无裁判则等第二个人的读完 + + var taskList = await _visitTaskRepository.Where(t => t.SourceSubjectVisitId == currentLatestPdVisitId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false + && t.TaskState == TaskState.Effect && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Judge)).ToListAsync(); + + var totalTaskCount = taskList.Count; + var finishedCount = taskList.Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned).Count(); + + + //发送随访的 + if (totalTaskCount == 2 && totalTaskCount == finishedCount) + { + var task = taskList.FirstOrDefault(t => t.ReadingCategory == ReadingCategory.Visit); + + var filePath = await BaseBusinessScenarioSendEmailAsync(task.Id, true, EmailStoreSendMode.OnlyStoreLocalNotSentEmail, string.Empty); + + return ResponseOutput.Ok(new { RelativePath = filePath, TaskName = task.TaskName, VisitTaskId = task.Id }); + } + //发送全局 + else if (totalTaskCount == 3 && totalTaskCount == finishedCount) + { + var task = taskList.FirstOrDefault(t => t.ReadingCategory == ReadingCategory.Judge); + + var filePath = await BaseBusinessScenarioSendEmailAsync(task.Id, true, EmailStoreSendMode.OnlyStoreLocalNotSentEmail, string.Empty); + + return ResponseOutput.Ok(new { RelativePath = filePath, TaskName = task.TaskName, VisitTaskId = task.Id }); + } + else + { + return ResponseOutput.NotOk("当前受试者最新PD访视阅片任务完成状态不符合发送条件"); + } + + } + //仲裁在阅片期上 + else if (trialReadingCriterionConfig.ArbitrationRule == ArbitrationRule.Reading) + { + var existReadModule = await _repository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == currentLatestPdVisitId && t.ReadingSetType == ReadingSetType.ImageReading) + .FirstOrDefaultAsync(); + + if (existReadModule == null) + { + return ResponseOutput.NotOk("项目配置了阅片期仲裁,但是当前受试者最新PD访视没有影像学阅片期"); + } + else + { + var taskList = await _visitTaskRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect && t.SouceReadModuleId == existReadModule.Id + && (t.ReadingCategory == ReadingCategory.Global || t.ReadingCategory == ReadingCategory.Judge)).ToListAsync(); + + var totalTaskCount = taskList.Count; + var finishedCount = taskList.Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned).Count(); + + + + //发送全局的 + if (totalTaskCount == 2 && totalTaskCount == finishedCount) + { + var task = taskList.FirstOrDefault(t => t.ReadingCategory == ReadingCategory.Global); + + var filePath = await BaseBusinessScenarioSendEmailAsync(task.Id, true, EmailStoreSendMode.OnlyStoreLocalNotSentEmail, string.Empty); + + return ResponseOutput.Ok(new { RelativePath = filePath, TaskName = task.TaskName, VisitTaskId = task.Id }); + } + //发送全局裁判的 + else if (totalTaskCount == 3 && totalTaskCount == finishedCount) + { + var task = taskList.FirstOrDefault(t => t.ReadingCategory == ReadingCategory.Judge); + + var filePath = await BaseBusinessScenarioSendEmailAsync(task.Id, true, EmailStoreSendMode.OnlyStoreLocalNotSentEmail, string.Empty); + + return ResponseOutput.Ok(new { RelativePath = filePath, TaskName = task.TaskName, VisitTaskId = task.Id }); + } + + + else + { + return ResponseOutput.NotOk("当前受试者最新PD访视阅片期任务完成状态不符合发送条件"); + } + } + + + } + else + { + return ResponseOutput.NotOk("未定义该仲裁规则发送业务逻辑!"); + } + } + // 项目单重 判断最新的Pd 访视是否完成 是否有阅片期即可 + else if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Single) + { + + + + var task = await _visitTaskRepository.Where(t => t.SourceSubjectVisitId == currentLatestPdVisitId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false + && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.TrialReadingCriterionId == trialReadingCriterionId).FirstOrDefaultAsync(); + + + if (task == null) + { + return ResponseOutput.NotOk("当前受试者最新PD访视任务未阅片完成"); + } + else + { + //存在阅片期 那么就是截止访视 + + var existReadModule = await _repository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == currentLatestPdVisitId && t.ReadingSetType == ReadingSetType.ImageReading) + .FirstOrDefaultAsync(); + if (existReadModule != null) + { + + var global = await _visitTaskRepository.Where(t => t.SouceReadModuleId == currentLatestPdVisitId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false + && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.TrialReadingCriterionId == trialReadingCriterionId).FirstOrDefaultAsync(); + + + if (global != null) + { + var filePath = await BaseBusinessScenarioSendEmailAsync(global.Id, true, EmailStoreSendMode.OnlyStoreLocalNotSentEmail, string.Empty); + + return ResponseOutput.Ok(new { RelativePath = filePath, TaskName = task.TaskName, VisitTaskId = task.Id }); + } + else + { + return ResponseOutput.NotOk("当前受试者阅片期任务未阅片完成"); + } + + } + else//非截止访视 在访视读完后,发送 + { + var filePath = await BaseBusinessScenarioSendEmailAsync(task.Id, true, EmailStoreSendMode.OnlyStoreLocalNotSentEmail, string.Empty); + + return ResponseOutput.Ok(new { RelativePath = filePath, TaskName = task.TaskName, VisitTaskId = task.Id }); + } + } + + + } + else + { + return ResponseOutput.NotOk("当前项目配置,未定义单双重外发送业务逻辑!"); + } + + } + + else + { + return ResponseOutput.NotOk("当前项目配置,未定义发送业务逻辑!"); + } + + + + + } + + /// + /// 手动发送邮件 + /// + /// + /// + /// + [HttpPut] + public async Task ManualSendEmail(Guid visitTaskId, string sendFileRelativePath) + { + var filePath = await BaseBusinessScenarioSendEmailAsync(visitTaskId, true, EmailStoreSendMode.NotStoreLocalOnlySentEmail, sendFileRelativePath); + + return ResponseOutput.Ok(); + + } + + /// + /// + /// + /// 任务Id + /// 任务类型 + /// 标准类型 + /// 是否是全局产生(区分裁判任务) + /// + /// + private async Task TranslatePdStateAsync(Guid visitTaskId, ReadingCategory readingCategory, CriterionType criterionType, bool? IsGlobalGenerate=null) { var answer = string.Empty; @@ -786,15 +1182,15 @@ namespace IRaCIS.Core.Application.Service } } - else if (readingCategory == ReadingCategory.Judge) - { - //var judgeResultTaskId = await _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => t.JudgeResultTaskId).FirstNotNullAsync(); + //else if (readingCategory == ReadingCategory.Judge) + //{ + // var judgeResultTaskId = await _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => t.JudgeResultTaskId).FirstNotNullAsync(); - var questionAnsewer = await _repository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstNotNullAsync(); + // var questionAnsewer = await _repository.Where(t => t.VisitTaskId == judgeResultTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstNotNullAsync(); - answer = questionAnsewer.Answer; - } + // answer = questionAnsewer.Answer; + //} else { throw new BusinessValidationFailedException("不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑"); @@ -826,14 +1222,14 @@ namespace IRaCIS.Core.Application.Service answer = questionAnsewer.Answer; } - else if (readingCategory == ReadingCategory.Judge) - { - //var judgeResultTaskId = await _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => t.JudgeResultTaskId).FirstNotNullAsync(); + //else if (readingCategory == ReadingCategory.Judge) + //{ + // //var judgeResultTaskId = await _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => t.JudgeResultTaskId).FirstNotNullAsync(); - var questionAnsewer = await _repository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); + // var questionAnsewer = await _repository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); - answer = questionAnsewer.Answer; - } + // answer = questionAnsewer.Answer; + //} else { throw new BusinessValidationFailedException("不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑"); diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs index b335fa5e..559964f1 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs @@ -209,6 +209,21 @@ namespace IRaCIS.Core.Application.Services var dicModalityList = _dictionaryRepository.Where(t => t.Code == "Modality").SelectMany(t => t.ChildList.Select(c => c.Value)).ToList(); + var modalityForEdit = dicModalityList.Contains(modality) ? modality : String.Empty; + + if (modality == "MR") + { + modalityForEdit = "MRI"; + } + + if (modality == "PT") + { + modalityForEdit = "PET"; + } + if(modality== "PT、CT") + { + modalityForEdit = "PET-CT"; + } dicomStudy = new DicomStudy { @@ -217,7 +232,7 @@ namespace IRaCIS.Core.Application.Services /* StudyTime = dataset.GetSingleValueOrDefault(DicomTag.StudyDate, DateTime.Now).Add(dataset.GetSingleValueOrDefault(DicomTag.StudyTime, DateTime.Now).TimeOfDay),*///dataset.GetDateTime(DicomTag.StudyDate, DicomTag.StudyTime), StudyTime = dataset.GetSingleValueOrDefault(DicomTag.StudyDate, string.Empty) == string.Empty ? null : dataset.GetSingleValue(DicomTag.StudyDate).Add(dataset.GetSingleValueOrDefault(DicomTag.StudyTime, string.Empty) == string.Empty ? TimeSpan.Zero : dataset.GetSingleValue(DicomTag.StudyTime).TimeOfDay), Modalities = modality, - ModalityForEdit = modality == "MR" ? "MRI": (dicModalityList.Contains(modality) ? modality : String.Empty), + ModalityForEdit = modalityForEdit, Description = dataset.GetSingleValueOrDefault(DicomTag.StudyDescription, string.Empty), InstitutionName = dataset.GetSingleValueOrDefault(DicomTag.InstitutionName, string.Empty), PatientId = dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty), diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index fef04e65..720724c3 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -1335,11 +1335,9 @@ namespace IRaCIS.Core.Application.Image.QA } //非基线设置为PD的话 或者设置为末次访视 根据配置自动生成阅片期 - if (!dbSubjectVisit.IsBaseLine && dbSubjectVisit.PDState == PDStateEnum.PDProgress && dbSubjectVisit.IsFinalVisit) + if (!dbSubjectVisit.IsBaseLine && (dbSubjectVisit.PDState == PDStateEnum.PDProgress || dbSubjectVisit.IsFinalVisit) ) { - - //该标准需要添加阅片期 foreach (var trialReadingCriterionId in trialReadingCriterionIdList) { diff --git a/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs b/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs index 12c128eb..39f86256 100644 --- a/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs +++ b/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs @@ -684,7 +684,7 @@ namespace IRaCIS.Core.Application.Service }); - await _trialEmailNoticeConfigService.BaseBusinessScenarioSendEmailAsync(medicalReviewInfo.VisitTaskId, true&& medicalReviewInfo.IsApplyHeavyReading); + await _trialEmailNoticeConfigService.BaseBusinessScenarioSendEmailAsync(medicalReviewInfo.VisitTaskId, true&& medicalReviewInfo.IsApplyHeavyReading); var result = await _taskMedicalReviewRepository.SaveChangesAsync(); return ResponseOutput.Result(result); diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs index 80dcbd86..e94290fb 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs @@ -11,6 +11,7 @@ using Newtonsoft.Json; using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.Filter; +using IRaCIS.Core.Domain.Models; namespace IRaCIS.Application.Services { @@ -451,6 +452,8 @@ namespace IRaCIS.Application.Services // 创建任务关联关系 await this.CreateTaskRelated(inDto.VisitTaskId); + + await _trialEmailNoticeConfigService.BaseBusinessScenarioSendEmailAsync(inDto.VisitTaskId); return ResponseOutput.Ok(result); } diff --git a/IRaCIS.Core.Domain.Share/Common/EmailStoreMode.cs b/IRaCIS.Core.Domain.Share/Common/EmailStoreMode.cs new file mode 100644 index 00000000..7ea28611 --- /dev/null +++ b/IRaCIS.Core.Domain.Share/Common/EmailStoreMode.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IRaCIS.Core.Domain.Share.Common +{ + + + public enum EmailStoreSendMode + { + //不存储本地 发送 + NotStoreLocalSend = 0, + + //存储本地发送 + StoreLocalSend = 1, + + //存储本地不发送 + OnlyStoreLocalNotSentEmail = 2, + + //不存储本地 发送 + NotStoreLocalOnlySentEmail = 3, + + } + +} diff --git a/IRaCIS.Core.Domain/Management/UserTypeMenu.cs b/IRaCIS.Core.Domain/Management/UserTypeMenu.cs index b32311ee..017cf37a 100644 --- a/IRaCIS.Core.Domain/Management/UserTypeMenu.cs +++ b/IRaCIS.Core.Domain/Management/UserTypeMenu.cs @@ -15,6 +15,7 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] [ForeignKey("UserTypeId")] public UserType UserType { get; set; } + } } diff --git a/IRaCIS.Core.Domain/_Config/_StaticData.cs b/IRaCIS.Core.Domain/_Config/_StaticData.cs index ac9372d2..41f9c6de 100644 --- a/IRaCIS.Core.Domain/_Config/_StaticData.cs +++ b/IRaCIS.Core.Domain/_Config/_StaticData.cs @@ -72,6 +72,9 @@ public static class StaticData public static string StudyMaxCode = "StudyMaxCode"; public static string TaskMaxCode = "TaskMaxCode"; + + public const string UserTypeId = "UserTypeId"; + }