diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index 78789fad..37b8d6fd 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -1,4 +1,5 @@ using AutoMapper; +using DocumentFormat.OpenXml.Drawing; using EasyCaching.Core; using ExcelDataReader; using IRaCIS.Application.Contracts; @@ -12,6 +13,7 @@ using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.MediatR.CommandAndQueries; using IRaCIS.Core.Application.MediatR.Handlers; using IRaCIS.Core.Application.Service; +using IRaCIS.Core.Application.Service.ImageAndDoc; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; @@ -223,6 +225,38 @@ namespace IRaCIS.Core.API.Controllers _repository = repository; } + public async Task PreArchiveStudy(PreArchiveStudyCommand preArchiveStudyCommand, + [FromServices] IStudyService _studyService, + [FromServices] IRepository _studyMonitorRepository) + { + + if (_provider.Get>(StaticData.Anonymize.Anonymize_AddFixedFiled).Value == null) + { + await _mediator.Send(new AnonymizeCacheRequest()); + } + + var savedInfo = _studyService.GetSaveToDicomInfo(preArchiveStudyCommand.SubjectVisitId); + + var studyMonitor = new StudyMonitor() + { + TrialId = savedInfo.TrialId, + SiteId = savedInfo.SiteId, + SubjectId = savedInfo.SubjectId, + SubjectVisitId = savedInfo.SubjectVisitId, + + IsSuccess = false, + UploadStartTime = DateTime.Now, + IsDicom = true, + IP = _userInfo.IP + }; + + + var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true); + + return ResponseOutput.Ok(addEntity.Id); + + } + /// Dicom 归档 [HttpPost, Route("Study/ArchiveStudy")] @@ -235,17 +269,15 @@ namespace IRaCIS.Core.API.Controllers [FromServices] IStudyService _studyService, [FromServices] IHubContext _uploadHub, [FromServices] IDicomArchiveService _dicomArchiveService, - [FromServices] IRepository _repository + [FromServices] IRepository _repository, + [FromServices] IRepository _studyMonitorRepository ) { - if (_provider.Get>(StaticData.Anonymize.Anonymize_AddFixedFiled).Value == null) - { - await _mediator.Send(new AnonymizeCacheRequest()); - } - //_logger.LogError("请求到达接口"); + + if (!HttpContext.Request.HasFormContentType || !MediaTypeHeaderValue.TryParse(HttpContext.Request.ContentType, out var mediaTypeHeader) || @@ -270,6 +302,13 @@ namespace IRaCIS.Core.API.Controllers _provider.Set($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromMinutes(30)); } + //到了接口,代表上传结束了 + + var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == archiveStudyCommand.StudyMonitorId); + + studyMonitor.UploadFinishedTime = DateTime.Now; + + var (archiveResult, archivedStudyIds) = (new DicomArchiveResult(), new List()); @@ -332,23 +371,12 @@ namespace IRaCIS.Core.API.Controllers throw new BusinessValidationFailedException("请求异常,请重试!"); } + studyMonitor.FileSize = (decimal)HttpContext.Request.ContentLength; + studyMonitor.FileCount = archiveResult.ReceivedFileCount; + studyMonitor.FailedFileCount = archiveResult.ErrorFiles.Count; + studyMonitor.IsDicomReUpload = archiveStudyCommand.AbandonStudyId != null; + studyMonitor.Note = JsonConvert.SerializeObject(archiveResult); - var studyMonitor = new StudyMonitor() - { - TrialId = savedInfo.TrialId, - SiteId = savedInfo.SiteId, - SubjectId = savedInfo.SubjectId, - SubjectVisitId = savedInfo.SubjectVisitId, - - - - UploadStartTime = startTime, - FileSize = (decimal)HttpContext.Request.ContentLength, - FileCount = archiveResult.ReceivedFileCount, - IsDicom = true, - IsDicomReUpload = archiveStudyCommand.AbandonStudyId != null, - IP = _userInfo.IP - }; try { @@ -365,21 +393,12 @@ namespace IRaCIS.Core.API.Controllers studyMonitor.IsSuccess = true; } - else - { - studyMonitor.IsSuccess = false; - studyMonitor.Note = JsonConvert.SerializeObject(archiveResult); - } - - - + } catch (Exception e) { - studyMonitor.IsSuccess = false; studyMonitor.Note = JsonConvert.SerializeObject(new { Message = e.Message, Result = archiveResult }); - _logger.LogError(e.Message + e.StackTrace); } @@ -389,9 +408,7 @@ namespace IRaCIS.Core.API.Controllers studyMonitor.StudyId = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.Id ?? Guid.Empty; studyMonitor.StudyCode = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.StudyCode; - studyMonitor.UploadFinishedTime = DateTime.Now; - await _repository.AddAsync(studyMonitor, true); - + studyMonitor.ArchiveFinishedTime = DateTime.Now; } @@ -642,6 +659,7 @@ namespace IRaCIS.Core.API.Controllers return serverFilePath; }); + var uploadFinishedTime = DateTime.Now; //// 上传非Dicom 后 将状态改为待提交 分为普通上传 和QC后重传 普通上传时才改为待提交 @@ -660,7 +678,8 @@ namespace IRaCIS.Core.API.Controllers StudyId = noneDicomStudyId, StudyCode = noneDicomStudy.StudyCode, UploadStartTime = startTime, - UploadFinishedTime = DateTime.Now, + UploadFinishedTime = uploadFinishedTime, + ArchiveFinishedTime=DateTime.Now, IP = _userInfo.IP, TrialId = sv.TrialId, SiteId = sv.SiteId, diff --git a/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs b/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs index 6df8e9b3..84a8f7dc 100644 --- a/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs +++ b/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs @@ -31,7 +31,7 @@ public static class ExcelExportHelper //一个值 对应不同的字典翻译 var needTranslatePropertyList = translateType.GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), true)) .SelectMany(c => - c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false).Select(f => (DictionaryTranslateAttribute?)f).Where(t => t.CriterionType == criterionType || t.CriterionType == null) + c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false).Select(f => (DictionaryTranslateAttribute?)f).Where(t => t?.CriterionType == criterionType || t?.CriterionType == null) .Select(k => new { c.Name, k.DicParentCode ,k.IsTranslateDenpendOtherProperty, k.DependPropertyName,k.DependPropertyValueStr}) ).ToList(); diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 6044df4f..ad48de76 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -458,6 +458,9 @@ 质疑列表 + + + @@ -465,6 +468,9 @@ 受试者信息导出表 + + + @@ -492,6 +498,9 @@ 阅片期信息表 + + + @@ -499,6 +508,9 @@ 一致性核查 检查信息表 + + + @@ -506,6 +518,10 @@ 一致性核查记录表 + + + + @@ -513,6 +529,9 @@ PM阅片跟踪 + + + @@ -520,6 +539,9 @@ PM 重阅追踪 + + + @@ -527,6 +549,9 @@ PM 医学审核(挑选任务生成后的列表) + + + @@ -534,12 +559,19 @@ 自身一致性分析(仅做了resist1.1) + + + 组件一致性分析(仅做了resist1.1) + + + + @@ -555,6 +587,9 @@ 整体肿瘤评估 (目前仅仅 RECIST1.1 多个标准一个接口 Excel 列是一样的 ) + + + @@ -573,6 +608,9 @@ 评估病灶明细表 (目前仅仅 RECIST1.1 RECIST1.1 PGW3 表都是不同的) + + + diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index 9050c4ea..b8bd9aa2 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -86,6 +86,9 @@ namespace IRaCIS.Core.Application.Service.Common /// 质疑列表 /// /// + /// + /// + /// /// [HttpPost] [AllowAnonymous] @@ -128,6 +131,9 @@ namespace IRaCIS.Core.Application.Service.Common /// 受试者信息导出表 /// /// + /// + /// + /// /// [HttpPost] public async Task GetSubjectList_Export(SubjectQueryParam param, @@ -409,6 +415,9 @@ namespace IRaCIS.Core.Application.Service.Common /// 阅片期信息表 /// /// + /// + /// + /// /// [HttpPost] public async Task GetReadingPeriodList_Export(ReadPeriodQuery param, @@ -435,6 +444,9 @@ namespace IRaCIS.Core.Application.Service.Common /// 一致性核查 检查信息表 /// /// + /// + /// + /// /// [HttpPost] @@ -519,6 +531,10 @@ namespace IRaCIS.Core.Application.Service.Common /// 一致性核查记录表 /// /// + /// + /// + /// + /// /// [HttpPost] public async Task GetConsistencyVerificationList_Export(CheckQuery checkQuery, @@ -555,6 +571,9 @@ namespace IRaCIS.Core.Application.Service.Common /// PM阅片跟踪 /// /// + /// + /// + /// /// [HttpPost] public async Task GetReadingTaskList_Export(VisitTaskQuery queryVisitTask, @@ -602,6 +621,9 @@ namespace IRaCIS.Core.Application.Service.Common /// PM 重阅追踪 /// /// + /// + /// + /// /// [HttpPost] public async Task GetReReadingTaskList_Export(VisitTaskQuery queryVisitTask, @@ -648,6 +670,9 @@ namespace IRaCIS.Core.Application.Service.Common /// PM 医学审核(挑选任务生成后的列表) /// /// + /// + /// + /// /// [HttpPost] public async Task GetMedicalReviewTaskList_Export(TaskMedicalReviewQuery inQuery, @@ -686,6 +711,9 @@ namespace IRaCIS.Core.Application.Service.Common /// 自身一致性分析(仅做了resist1.1) /// /// + /// + /// + /// /// [HttpPost] public async Task GetSelfAnalysisTaskList_Export(VisitTaskQuery queryVisitTask, @@ -763,6 +791,10 @@ namespace IRaCIS.Core.Application.Service.Common /// /// 组件一致性分析(仅做了resist1.1) /// + /// + /// + /// + /// /// /// [HttpPost] @@ -923,6 +955,9 @@ namespace IRaCIS.Core.Application.Service.Common /// 整体肿瘤评估 (目前仅仅 RECIST1.1 多个标准一个接口 Excel 列是一样的 ) /// /// + /// + /// + /// /// [HttpPost] public async Task GetOverallTumorEvaluationList_Export(VisitTaskQuery queryVisitTask, @@ -935,7 +970,7 @@ namespace IRaCIS.Core.Application.Service.Common //每次查询必须是单标准的 - var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstOrDefaultAsync(); + var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstNotNullAsync(); if (criterion.CriterionType != CriterionType.RECIST1Pointt1 && criterion.CriterionType != CriterionType.PCWG3) { @@ -1040,6 +1075,9 @@ namespace IRaCIS.Core.Application.Service.Common /// 评估病灶明细表 (目前仅仅 RECIST1.1 RECIST1.1 PGW3 表都是不同的) /// /// + /// + /// + /// /// [HttpPost] public async Task GetDetailedOfEvaluatedLesion_Export(VisitTaskQuery queryVisitTask, diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs index abff1e36..5f7641a7 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -197,7 +197,7 @@ namespace IRaCIS.Core.Application.Service foreach (var taskId in taskIdList) { await _taskMedicalReviewRepository.AddAsync(new TaskMedicalReview() { TrialId = trialId, VisitTaskId = taskId, MedicalManagerUserId = minUserIdList.FirstOrDefault(), AllocateTime = DateTime.Now - ,IsAutoGenerate=true,PDRelationTaskIdListStr=string.Join('|', taskIdList) + ,IsAutoGenerate=true,PDRelationTaskIdListStr=string.Join('|', taskIdList.Distinct()) },true); } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs index 73b21e96..42b47094 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs @@ -54,7 +54,9 @@ namespace IRaCIS.Core.Application.Contracts public string UploadStartTimeStr => UploadStartTime.ToString("yyyy-MM-dd HH:mm:ss.fff"); - public string UploadFinishedTimeStr => UploadFinishedTime.ToString("yyyy-MM-dd HH:mm:ss.fff"); + public string UploadFinishedTimeStr => UploadFinishedTime?.ToString("yyyy-MM-dd HH:mm:ss.fff"); + + public string ArchiveFinishedTimeStr => ArchiveFinishedTime?.ToString("yyyy-MM-dd HH:mm:ss.fff"); public double TotalMillisecondsInterval { get; set; } @@ -90,7 +92,9 @@ namespace IRaCIS.Core.Application.Contracts public DateTime UploadStartTime { get; set; } - public DateTime UploadFinishedTime { get; set; } + public DateTime? UploadFinishedTime { get; set; } + + public DateTime? ArchiveFinishedTime { get; set; } public decimal FileSize { get; set; } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs index 559964f1..f852be36 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs @@ -50,6 +50,9 @@ namespace IRaCIS.Core.Application.Services return success; } + + + public async Task<(Guid StudyId, string StudyCode)> ArchiveDicomStreamAsync(Stream dicomStream, DicomTrialSiteSubjectInfo addtionalInfo, List seriesInstanceUidList, List instanceUidList) { diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs index d1c7fdbf..bb29487b 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs @@ -188,6 +188,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc FileSize = t.FileSize, UploadFinishedTime = t.UploadFinishedTime, UploadStartTime = t.UploadStartTime, + ArchiveFinishedTime=t.ArchiveFinishedTime, + + TotalMillisecondsInterval = t.TotalMillisecondsInterval, diff --git a/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs b/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs index 7ba3e36d..6af69973 100644 --- a/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs +++ b/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs @@ -219,10 +219,17 @@ namespace IRaCIS.Core.Application.Contracts public List SeriesList { get; set; } = new List(); } + public class PreArchiveStudyCommand + { + public Guid SubjectVisitId { get; set; } + + + } + public class ArchiveStudyCommand { - - + [NotDefault] + public Guid StudyMonitorId { get; set; } public Guid? AbandonStudyId { get; set; } diff --git a/IRaCIS.Core.Domain/Allocation/TaskMedicalReview.cs b/IRaCIS.Core.Domain/Allocation/TaskMedicalReview.cs index 5e02d6a2..4ee122c2 100644 --- a/IRaCIS.Core.Domain/Allocation/TaskMedicalReview.cs +++ b/IRaCIS.Core.Domain/Allocation/TaskMedicalReview.cs @@ -200,7 +200,7 @@ namespace IRaCIS.Core.Domain.Models public bool IsAutoGenerate { get; set; } // | 分割 - public string PDRelationTaskIdListStr { get; set; } + public string PDRelationTaskIdListStr { get; set; }=string.Empty; [NotMapped] public List PDRelationTaskIdList=> PDRelationTaskIdListStr.Split('|',StringSplitOptions.RemoveEmptyEntries).Select(t=> Guid.Parse(t) ).ToList(); diff --git a/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs b/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs index 2996b8e7..9af0a20a 100644 --- a/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs +++ b/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs @@ -37,7 +37,12 @@ namespace IRaCIS.Core.Domain.Models public DateTime UploadStartTime { get; set; } - public DateTime UploadFinishedTime { get; set; } + public DateTime? UploadFinishedTime { get; set; } + + + public DateTime? ArchiveFinishedTime { get; set; } + + public int FailedFileCount { get; set; } public decimal FileSize { get; set; }