diff --git a/IRaCIS.Core.API/Program.cs b/IRaCIS.Core.API/Program.cs index 7cd490da1..a3bb05fd6 100644 --- a/IRaCIS.Core.API/Program.cs +++ b/IRaCIS.Core.API/Program.cs @@ -9,6 +9,8 @@ using IRaCIS.Core.Application.MediatR.Handlers; using System.Threading.Tasks; using MassTransit; using MassTransit.NewIdProviders; +using System.IO; +using IRaCIS.Core.Domain.Share; namespace IRaCIS.Core.API { @@ -56,14 +58,20 @@ namespace IRaCIS.Core.API + //// Serilog SerilogExtension.AddSerilogSetup(enviromentName, host.Services); //缓存项目的状态 匿名化数据 await InitCache(host); + WatchJsonFile(Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, "en-US.json") ); + + WatchJsonFile(Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, "zh-CN.json")); + + host.Run(); Log.Logger.Warning($"当前环境:{enviromentName}"); @@ -154,5 +162,45 @@ namespace IRaCIS.Core.API await _mediator.Send(new TrialStateCacheRequest()); } + + + private static void LoadJsonFile(string filePath) + { + + IConfigurationBuilder builder = new ConfigurationBuilder() + .AddJsonFile(filePath); + + IConfigurationRoot enConfiguration = builder.Build(); + + + + foreach (IConfigurationSection section in enConfiguration.GetChildren()) + { + if (filePath.Contains("en-US.json") ) + { + StaticData.En_US_Dic[section.Key] = section.Value; + + } + else + { + StaticData.Zh_CN_Dic[section.Key] = section.Value; + } + } + + + + + + + } + public static void WatchJsonFile(string filePath) + { + FileSystemWatcher watcher = new FileSystemWatcher(Path.GetDirectoryName(filePath), Path.GetFileName(filePath)); + watcher.Changed += (sender, e) => LoadJsonFile(filePath); + watcher.EnableRaisingEvents = true; + + LoadJsonFile(filePath); + } + } } diff --git a/IRaCIS.Core.Application/Service/Common/SystemMonitor.cs b/IRaCIS.Core.Application/Service/Common/SystemMonitor.cs index caa897bd6..72e260849 100644 --- a/IRaCIS.Core.Application/Service/Common/SystemMonitor.cs +++ b/IRaCIS.Core.Application/Service/Common/SystemMonitor.cs @@ -64,7 +64,7 @@ namespace IRaCIS.Core.Application.Service.Common catch (Exception e) { - throw new BusinessValidationFailedException("瑙f瀽Json鏂囦欢閰嶇疆鍑虹幇闂"); + throw new BusinessValidationFailedException("瑙f瀽Json鏂囦欢閰嶇疆鍑虹幇闂:"+e.Message); } //榛樿瀛樺偍鐨勮矾寰 @@ -88,7 +88,6 @@ namespace IRaCIS.Core.Application.Service.Common if (bestDrive == null || ((double)(defaultDrive.TotalSize - defaultDrive.TotalFreeSpace) / defaultDrive.TotalSize) * 100 < switchingRatio) { bestStoreRootFolder = defaultStoreRootFolder; - } else { diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs index 9ae6ac8a3..da81b29a2 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs @@ -176,6 +176,24 @@ namespace IRaCIS.Core.Application.Contracts } + public class PreArchiveDicomStudyCommand + { + [NotDefault] + public Guid TrialId { get; set; } + [NotDefault] + public Guid SiteId { get; set; } + [NotDefault] + public Guid SubjectId { get; set; } + [NotDefault] + public Guid SubjectVisitId { get; set; } + + public int FailedFileCount { get; set; } + public decimal FileSize { get; set; } + + + public int FileCount { get; set; } + } + public class NewArchiveStudyCommand { [NotDefault] @@ -186,6 +204,8 @@ namespace IRaCIS.Core.Application.Contracts public Guid SubjectId { get; set; } [NotDefault] public Guid SubjectVisitId { get; set; } + [NotDefault] + public Guid StudyMonitorId { get; set; } public bool IsAdd { get; set; } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs index 9f5b4312c..422b5e8cb 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs @@ -9,6 +9,10 @@ using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Infrastructure; using DocumentFormat.OpenXml.Presentation; using IRaCIS.Core.Domain.Models; +using IRaCIS.Core.Application.Filter; +using IRaCIS.Core.Application.MediatR.Handlers; +using Microsoft.AspNetCore.Http; +using Newtonsoft.Json; namespace IRaCIS.Core.Application.Service.ImageAndDoc { @@ -26,10 +30,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc private readonly IRepository _dicomstudyRepository; private readonly IRepository _dictionaryRepository; + private readonly IRepository _studyMonitorRepository; + + public StudyService(IEasyCachingProvider provider , IRepository subjectVisitRepository, IRepository dicomInstanceRepository, - IRepository dicomSeriesRepository, IRepository dicomstudyRepository, IRepository dictionaryRepository) + IRepository dicomSeriesRepository, IRepository dicomstudyRepository, IRepository dictionaryRepository, IRepository studyMonitorRepository) { _provider = provider; _subjectVisitRepository = subjectVisitRepository; @@ -37,6 +44,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc _dicomSeriesRepository = dicomSeriesRepository; _dicomstudyRepository = dicomstudyRepository; _dictionaryRepository = dictionaryRepository; + _studyMonitorRepository = studyMonitorRepository; } @@ -75,9 +83,52 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc #endregion } + + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] + + public async Task PreArchiveDicomStudy(PreArchiveDicomStudyCommand preArchiveStudyCommand) + { + + + + + var studyMonitor = new StudyMonitor() + { + TrialId = preArchiveStudyCommand.TrialId, + SiteId = preArchiveStudyCommand.SiteId, + SubjectId = preArchiveStudyCommand.SubjectId, + SubjectVisitId = preArchiveStudyCommand.SubjectVisitId, + + IsSuccess = false, + UploadStartTime = DateTime.Now, + IsDicom = true, + IP = _userInfo.IP, + + FileSize = preArchiveStudyCommand.FileSize, + FileCount = preArchiveStudyCommand.FileCount, + FailedFileCount = preArchiveStudyCommand.FailedFileCount, + + }; + + + var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true); + + return ResponseOutput.Ok(addEntity.Id); + + } + + + [UnitOfWork] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] public async Task AddOrUpdateArchiveStudy(NewArchiveStudyCommand incommand) { var trialId = incommand.TrialId; + + var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == incommand.StudyMonitorId); + studyMonitor.UploadFinishedTime = DateTime.Now; + studyMonitor.ArchiveFinishedTime = DateTime.Now; + studyMonitor.IsDicomReUpload = !incommand.IsAdd; + if (incommand.IsAdd) { var study = _mapper.Map(incommand.Study); @@ -148,6 +199,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc + studyMonitor.StudyId = study.Id; + studyMonitor.StudyCode = study.StudyCode; } else { @@ -168,7 +221,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { var series = _mapper.Map(seriesItem); - series.Id = IdentifierHelper.CreateGuid(series.StudyInstanceUid, series.SeriesInstanceUid, trialId.ToString()); + series.Id = IdentifierHelper.CreateGuid(series.StudyInstanceUid, series.SeriesInstanceUid, trialId.ToString()); series.StudyId = study.Id; series.TrialId = incommand.TrialId; @@ -181,7 +234,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc foreach (var instanceItem in incommand.InstanceList) { var insntance = _mapper.Map(instanceItem); - insntance.Id= IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString()); + insntance.Id = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString()); insntance.StudyId = study.Id; insntance.SeriesId = series.Id; @@ -199,6 +252,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc //鏌愪釜搴忓垪涓嬪皯浜唅nstance } + + + await _dicomstudyRepository.SaveChangesAsync(); return ResponseOutput.Ok(); @@ -207,8 +263,6 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc - - [HttpPost] public async Task> GetDicomAndNoneDicomStudyList(StudyQuery studyQuery) { diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs index 99f6436b3..6d583a687 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs @@ -640,24 +640,21 @@ namespace IRaCIS.Core.Application AdditionalAssessment additional = new AdditionalAssessment(); var addTypeList = additional.GetSystemDefeaultAdditionalAssessmentList(updateItem.CriterionType, updateItem.AdditionalAssessmentType); - foreach (var addType in addTypeList) + if(! await _readingQuestionTrialRepository.AnyAsync(t => t.ReadingQuestionCriterionTrialId == updateItem.TrialReadingCriterionId && t.IsAdditional==true)) { - foreach (var question in addType.AdditionalQuestionList) + foreach (var addType in addTypeList) { - question.ReadingQuestionCriterionTrialId = updateItem.TrialReadingCriterionId; - question.TrialId = trialId; + foreach (var question in addType.AdditionalQuestionList) + { + question.ReadingQuestionCriterionTrialId = updateItem.TrialReadingCriterionId; + question.TrialId = trialId; - await _readingQuestionTrialRepository.AddAsync(question); + await _readingQuestionTrialRepository.AddAsync(question); + } } - } + } } - else - { - //鍒犻櫎闄勫姞闂 - - await _readingQuestionTrialRepository.BatchDeleteNoTrackingAsync(t => t.ReadingQuestionCriterionTrialId == updateItem.TrialReadingCriterionId && t.IsAdditional == true); - } - + await _trialCriterionAdditionalAssessmentTypeRepository.UpdatePartialFromQueryAsync(updateItem.Id, t => new TrialCriterionAdditionalAssessmentType() { IsSelected = updateItem.IsSelected }); } } diff --git a/IRaCIS.Core.Domain/_Config/_StaticData.cs b/IRaCIS.Core.Domain/_Config/_StaticData.cs index 41f9c6dee..a6d0b10a6 100644 --- a/IRaCIS.Core.Domain/_Config/_StaticData.cs +++ b/IRaCIS.Core.Domain/_Config/_StaticData.cs @@ -1,8 +1,14 @@ -锘縩amespace IRaCIS.Core.Domain.Share; +锘縰sing System.Collections.Generic; + +namespace IRaCIS.Core.Domain.Share; public static class StaticData { + public static Dictionary En_US_Dic = new Dictionary(); + + public static Dictionary Zh_CN_Dic = new Dictionary(); + #region 瀛楀吀琛ㄩ」鍥哄畾鍊 @@ -19,6 +25,8 @@ public static class StaticData public static class Folder { + + public static readonly string Resources = "Resources"; public static readonly string IRaCISDataFolder = "IRaCISData"; public static readonly string TrialDataFolder = "TrialData";