From 38b9775ad26a0bd95a58be6e18a2edaa590abf02 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 2 Mar 2023 11:47:43 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/UploadDownLoadController.cs | 91 +++++++++++-------- .../Helper/ExcelExportHelper.cs | 2 +- .../IRaCIS.Core.Application.xml | 38 ++++++++ .../Service/Common/ExcelExportService.cs | 40 +++++++- .../Document/TrialEmailNoticeConfigService.cs | 2 +- .../ImageAndDoc/DTO/UnionStudyViewDodel.cs | 8 +- .../ImageAndDoc/DicomArchiveService.cs | 3 + .../Service/ImageAndDoc/StudyService.cs | 3 + .../Service/Visit/DTO/VisitPointViewModel.cs | 11 ++- .../Allocation/TaskMedicalReview.cs | 2 +- IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs | 7 +- 11 files changed, 162 insertions(+), 45 deletions(-) diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index 78789fad1..37b8d6fdd 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 6df8e9b3a..84a8f7dc8 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 6044df4f3..ad48de767 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 9050c4ea3..b8bd9aa2a 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 abff1e364..5f7641a7e 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 73b21e964..42b470942 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 559964f1b..f852be365 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 d1c7fdbfb..bb29487b5 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 7ba3e36d1..6af699737 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 5e02d6a2a..4ee122c21 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 2996b8e72..9af0a20ab 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; } From 271fa2bccc1ab769f1f823c88cae0455bcc86a73 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 2 Mar 2023 11:58:47 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/UploadDownLoadController.cs | 39 ++++++++----------- .../Service/Visit/DTO/VisitPointViewModel.cs | 2 + 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index 37b8d6fdd..75866346f 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -246,7 +246,7 @@ namespace IRaCIS.Core.API.Controllers IsSuccess = false, UploadStartTime = DateTime.Now, - IsDicom = true, + IsDicom = preArchiveStudyCommand.IsDicom, IP = _userInfo.IP }; @@ -269,7 +269,6 @@ namespace IRaCIS.Core.API.Controllers [FromServices] IStudyService _studyService, [FromServices] IHubContext _uploadHub, [FromServices] IDicomArchiveService _dicomArchiveService, - [FromServices] IRepository _repository, [FromServices] IRepository _studyMonitorRepository ) { @@ -634,20 +633,25 @@ namespace IRaCIS.Core.API.Controllers /// /// /// + /// + /// /// //[DisableRequestSizeLimit] [RequestSizeLimit(1_073_741_824)] - [HttpPost("NoneDicomStudy/UploadNoneDicomFile/{trialId:guid}/{subjectVisitId:guid}/{noneDicomStudyId:guid}")] + [HttpPost("NoneDicomStudy/UploadNoneDicomFile/{trialId:guid}/{subjectVisitId:guid}/{noneDicomStudyId:guid}/{studyMonitorId:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] [Authorize(Policy = IRaCISPolicy.CRC)] - public async Task UploadNoneDicomFile(IFormCollection formCollection, Guid subjectVisitId, Guid noneDicomStudyId, [FromServices] IRepository _noneDicomStudyRepository) + public async Task UploadNoneDicomFile(IFormCollection formCollection, Guid subjectVisitId, Guid noneDicomStudyId, Guid studyMonitorId, + [FromServices] IRepository _noneDicomStudyRepository, [FromServices] IRepository _studyMonitorRepository) { - var startTime = DateTime.Now; await QCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId); var sv = (await _repository.Where(t => t.Id == subjectVisitId).Select(t => new { t.TrialId, t.SiteId, t.SubjectId }).FirstOrDefaultAsync()).IfNullThrowConvertException(); + var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == studyMonitorId); + + studyMonitor.UploadFinishedTime = DateTime.Now; await FileUploadAsync(async (fileName) => { @@ -669,23 +673,14 @@ namespace IRaCIS.Core.API.Controllers noneDicomStudy.FileCount = noneDicomStudy.FileCount + formCollection.Files.Count; - await _repository.AddAsync(new StudyMonitor() - { - FileCount = formCollection.Files.Count, - FileSize = formCollection.Files.Sum(t => t.Length), - IsDicom = false, - IsDicomReUpload = false, - StudyId = noneDicomStudyId, - StudyCode = noneDicomStudy.StudyCode, - UploadStartTime = startTime, - UploadFinishedTime = uploadFinishedTime, - ArchiveFinishedTime=DateTime.Now, - IP = _userInfo.IP, - TrialId = sv.TrialId, - SiteId = sv.SiteId, - SubjectId = sv.SubjectId, - SubjectVisitId = subjectVisitId, - }); + studyMonitor.FileCount = formCollection.Files.Count; + studyMonitor.FileSize = formCollection.Files.Sum(t => t.Length); + studyMonitor.IsDicom = false; + studyMonitor.IsDicomReUpload = false; + studyMonitor.StudyId = noneDicomStudyId; + studyMonitor.StudyCode = noneDicomStudy.StudyCode; + studyMonitor.ArchiveFinishedTime = DateTime.Now; + studyMonitor.IP = _userInfo.IP; await _repository.SaveChangesAsync(); diff --git a/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs b/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs index 6af699737..a38b10eca 100644 --- a/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs +++ b/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs @@ -223,6 +223,8 @@ namespace IRaCIS.Core.Application.Contracts { public Guid SubjectVisitId { get; set; } + public bool IsDicom { get; set; } + } From 7cbede45070e016f84bee2fe04a52066dc26eea1 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 2 Mar 2023 12:34:02 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=92=8C=E5=BD=92=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/UploadDownLoadController.cs | 2 + IRaCIS.Core.API/IRaCIS.Core.API.xml | 6 +- .../Service/Common/ExcelExportService.cs | 1 - .../ImageAndDoc/DTO/UnionStudyViewDodel.cs | 29 +++++++++- .../Service/ImageAndDoc/StudyService.cs | 1 - .../Service/QC/DTO/QCListViewModel.cs | 7 +-- IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs | 2 +- .../Context/IRaCISDBContext.cs | 1 - ...ploadTotalMillisecondsIntervalGenerator.cs | 56 +++++++++---------- .../StudyMonitorConfigration.cs | 4 +- 10 files changed, 66 insertions(+), 43 deletions(-) diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index 75866346f..e699edec4 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -45,6 +45,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using Path = System.IO.Path; namespace IRaCIS.Core.API.Controllers { @@ -225,6 +226,7 @@ namespace IRaCIS.Core.API.Controllers _repository = repository; } + [HttpPost, Route("Study/PreArchiveStudy")] public async Task PreArchiveStudy(PreArchiveStudyCommand preArchiveStudyCommand, [FromServices] IStudyService _studyService, [FromServices] IRepository _studyMonitorRepository) diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.xml b/IRaCIS.Core.API/IRaCIS.Core.API.xml index 2731afbfe..e10bb49b8 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.xml +++ b/IRaCIS.Core.API/IRaCIS.Core.API.xml @@ -230,7 +230,7 @@ 流式上传 Dicom上传 - + Dicom 归档 @@ -280,13 +280,15 @@ - + 上传非Dicom 文件 支持压缩包 多文件上传 + + diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index b8bd9aa2a..2bd0d10b8 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -385,7 +385,6 @@ namespace IRaCIS.Core.Application.Service.Common UploadFinishedTime = t.UploadFinishedTime, - TotalMillisecondsInterval = t.TotalMillisecondsInterval, UploadTime = t.CreateTime, diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs index 42b470942..20f7aba41 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs @@ -59,7 +59,26 @@ namespace IRaCIS.Core.Application.Contracts public string ArchiveFinishedTimeStr => ArchiveFinishedTime?.ToString("yyyy-MM-dd HH:mm:ss.fff"); - public double TotalMillisecondsInterval { get; set; } + public string UploadIntervalStr + { + get + { + var uploadTimeSpan = UploadFinishedTime - UploadStartTime; + + return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}"; + } + } + + public string ArchiveIntervalStr + { + get + { + var uploadTimeSpan = ArchiveFinishedTime - UploadFinishedTime; + + return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}"; + } + } + public string TimeInterval @@ -67,9 +86,11 @@ namespace IRaCIS.Core.Application.Contracts get { - var uploadTimeSpan = UploadFinishedTime - UploadStartTime; + var uploadTimeSpan = ArchiveFinishedTime - UploadStartTime; - return $" {uploadTimeSpan.Hours}:{uploadTimeSpan.Minutes}:{uploadTimeSpan.Seconds}.{uploadTimeSpan.Milliseconds}"; + return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}"; + + #region 废弃 //if (uploadTimeSpan.Seconds == 0 && uploadTimeSpan.Minutes==0 && uploadTimeSpan.Hours == 0) //{ // return $"{uploadTimeSpan.Milliseconds}毫秒"; @@ -86,6 +107,8 @@ namespace IRaCIS.Core.Application.Contracts //{ // return $" {uploadTimeSpan.Hours} 小时 {uploadTimeSpan.Minutes} 分钟 {uploadTimeSpan.Seconds} 秒 {uploadTimeSpan.Milliseconds}毫秒"; //} + #endregion + } } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs index bb29487b5..647d5a2c5 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs @@ -192,7 +192,6 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc - TotalMillisecondsInterval = t.TotalMillisecondsInterval, IsDicomReUpload = t.IsDicomReUpload, StudyId = t.Id, diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index 6a914a8f0..b51509a00 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -473,10 +473,9 @@ namespace IRaCIS.Core.Application.Contracts public string IsDicomStr => IsDicom ? "DICOM" : "Non-DICOM"; 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 double TotalMillisecondsInterval { get; set; } public string TimeInterval @@ -486,14 +485,14 @@ namespace IRaCIS.Core.Application.Contracts var uploadTimeSpan = UploadFinishedTime - UploadStartTime; - return $" {uploadTimeSpan.Hours}:{uploadTimeSpan.Minutes}:{uploadTimeSpan.Seconds}.{uploadTimeSpan.Milliseconds}"; + return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}"; } } public DateTime UploadStartTime { get; set; } - public DateTime UploadFinishedTime { get; set; } + public DateTime? UploadFinishedTime { get; set; } public decimal FileSize { get; set; } diff --git a/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs b/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs index 9af0a20ab..23d605e5b 100644 --- a/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs +++ b/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs @@ -31,7 +31,7 @@ namespace IRaCIS.Core.Domain.Models - public int TotalMillisecondsInterval { get; set; } + //public int TotalMillisecondsInterval { get; set; } public DateTime UploadStartTime { get; set; } diff --git a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs index 65049292a..a1c877d09 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs @@ -10,7 +10,6 @@ using Microsoft.EntityFrameworkCore.ChangeTracking; using System.Reflection; using EntityFramework.Exceptions.SqlServer; using IRaCIS.Core.Domain.Share; -using IRaCIS.Core.Infra.EFCore.ValueGenerator; using MassTransit; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; diff --git a/IRaCIS.Core.Infra.EFCore/Context/ValueGenerator/UploadTotalMillisecondsIntervalGenerator.cs b/IRaCIS.Core.Infra.EFCore/Context/ValueGenerator/UploadTotalMillisecondsIntervalGenerator.cs index 18f4519d4..a50964821 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/ValueGenerator/UploadTotalMillisecondsIntervalGenerator.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/ValueGenerator/UploadTotalMillisecondsIntervalGenerator.cs @@ -1,34 +1,34 @@ -using System; -using IRaCIS.Core.Domain.Models; -using Microsoft.EntityFrameworkCore.ChangeTracking; -using Microsoft.EntityFrameworkCore.ValueGeneration; +//using System; +//using IRaCIS.Core.Domain.Models; +//using Microsoft.EntityFrameworkCore.ChangeTracking; +//using Microsoft.EntityFrameworkCore.ValueGeneration; -namespace IRaCIS.Core.Infra.EFCore.ValueGenerator -{ - /// - /// 上传监控 时间间隔存储 需要按照这个字段进行排序 - /// - public class UploadTotalMillisecondsInterval : ValueGenerator - { +//namespace IRaCIS.Core.Infra.EFCore.ValueGenerator +//{ +// /// +// /// 上传监控 时间间隔存储 需要按照这个字段进行排序 +// /// +// public class UploadTotalMillisecondsInterval : ValueGenerator +// { - //code first must migration dbfirst must config in db and also need config in code - //modelBuilder.Entity().Property(e => e.TotalMillisecondsInterval).HasComputedColumnSql("datediff(MS,UploadStartTime,UploadFinishedTime)"); +// //code first must migration dbfirst must config in db and also need config in code +// //modelBuilder.Entity().Property(e => e.TotalMillisecondsInterval).HasComputedColumnSql("datediff(MS,UploadStartTime,UploadFinishedTime)"); - //modelBuilder.Entity().Property(e => e.TestInterval).ValueGeneratedOnAddOrUpdate().HasDefaultValueSql("datediff(MS,UploadStartTime,UploadFinishedTime)"); +// //modelBuilder.Entity().Property(e => e.TestInterval).ValueGeneratedOnAddOrUpdate().HasDefaultValueSql("datediff(MS,UploadStartTime,UploadFinishedTime)"); - public override int Next(EntityEntry entry) - { - if (entry.Entity is StudyMonitor entity) - { - return (entity.UploadFinishedTime - entity.UploadStartTime).Milliseconds; - } - else - { - throw new ArgumentException("ValueGenerator用在了不适合的实体"); +// public override int Next(EntityEntry entry) +// { +// if (entry.Entity is StudyMonitor entity) +// { +// return (entity.UploadFinishedTime - entity.UploadStartTime)?.Milliseconds; +// } +// else +// { +// throw new ArgumentException("ValueGenerator用在了不适合的实体"); - } - } - public override bool GeneratesTemporaryValues => false; - } +// } +// } +// public override bool GeneratesTemporaryValues => false; +// } -} \ No newline at end of file +//} \ No newline at end of file diff --git a/IRaCIS.Core.Infra.EFCore/EntityConfigration/StudyMonitorConfigration.cs b/IRaCIS.Core.Infra.EFCore/EntityConfigration/StudyMonitorConfigration.cs index 142e4a78e..b60f29acc 100644 --- a/IRaCIS.Core.Infra.EFCore/EntityConfigration/StudyMonitorConfigration.cs +++ b/IRaCIS.Core.Infra.EFCore/EntityConfigration/StudyMonitorConfigration.cs @@ -1,5 +1,5 @@ using IRaCIS.Core.Domain.Models; -using IRaCIS.Core.Infra.EFCore.ValueGenerator; +//using IRaCIS.Core.Infra.EFCore.ValueGenerator; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; @@ -18,7 +18,7 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration //.HasForeignKey(s => new { s.TrialId, s.SiteId }) //.HasPrincipalKey(c => new { c.TrialId, c.SiteId }); - builder.Property(e => e.TotalMillisecondsInterval).HasValueGenerator().ValueGeneratedOnAdd(); + //builder.Property(e => e.TotalMillisecondsInterval).HasValueGenerator().ValueGeneratedOnAdd(); builder From 492963f298ab1670e24ee6acef7b275d3dfd6c4f Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 2 Mar 2023 13:41:03 +0800 Subject: [PATCH 4/9] x --- IRaCIS.Core.API/Controllers/UploadDownLoadController.cs | 6 ++++-- IRaCIS.Core.API/IRaCIS.Core.API.xml | 2 +- .../Service/Visit/DTO/VisitPointViewModel.cs | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index e699edec4..3d27ed9a2 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -227,6 +227,7 @@ namespace IRaCIS.Core.API.Controllers } [HttpPost, Route("Study/PreArchiveStudy")] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] public async Task PreArchiveStudy(PreArchiveStudyCommand preArchiveStudyCommand, [FromServices] IStudyService _studyService, [FromServices] IRepository _studyMonitorRepository) @@ -265,7 +266,7 @@ namespace IRaCIS.Core.API.Controllers [DisableFormValueModelBinding] [DisableRequestSizeLimit] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - public async Task ArchiveStudyNew(/*[FromForm] ArchiveStudyCommand archiveStudyCommand,*/ Guid trialId, Guid subjectVisitId, string studyInstanceUid, Guid? abandonStudyId, + public async Task ArchiveStudyNew(/*[FromForm] ArchiveStudyCommand archiveStudyCommand,*/ Guid trialId, Guid subjectVisitId, string studyInstanceUid, Guid? abandonStudyId,Guid studyMonitorId, [FromServices] ILogger _logger, [FromServices] IEasyCachingProvider _provider, [FromServices] IStudyService _studyService, @@ -289,6 +290,7 @@ namespace IRaCIS.Core.API.Controllers var archiveStudyCommand = new ArchiveStudyCommand() { AbandonStudyId = abandonStudyId, StudyInstanceUid = studyInstanceUid, SubjectVisitId = subjectVisitId }; + //archiveStudyCommand.StudyMonitorId = studyMonitorId; string studycode = string.Empty; @@ -305,7 +307,7 @@ namespace IRaCIS.Core.API.Controllers //到了接口,代表上传结束了 - var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == archiveStudyCommand.StudyMonitorId); + var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == studyMonitorId); studyMonitor.UploadFinishedTime = DateTime.Now; diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.xml b/IRaCIS.Core.API/IRaCIS.Core.API.xml index e10bb49b8..439dccf46 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.xml +++ b/IRaCIS.Core.API/IRaCIS.Core.API.xml @@ -230,7 +230,7 @@ 流式上传 Dicom上传 - + Dicom 归档 diff --git a/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs b/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs index a38b10eca..084ed14f7 100644 --- a/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs +++ b/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs @@ -230,8 +230,8 @@ namespace IRaCIS.Core.Application.Contracts public class ArchiveStudyCommand { - [NotDefault] - public Guid StudyMonitorId { get; set; } + //[NotDefault] + //public Guid StudyMonitorId { get; set; } public Guid? AbandonStudyId { get; set; } From af2f2f468e5903f1a1c23f5f45727c04d607582c Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 2 Mar 2023 14:04:14 +0800 Subject: [PATCH 5/9] x --- IRaCIS.Core.API/Controllers/UploadDownLoadController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index 3d27ed9a2..be513d29c 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -290,8 +290,6 @@ namespace IRaCIS.Core.API.Controllers var archiveStudyCommand = new ArchiveStudyCommand() { AbandonStudyId = abandonStudyId, StudyInstanceUid = studyInstanceUid, SubjectVisitId = subjectVisitId }; - //archiveStudyCommand.StudyMonitorId = studyMonitorId; - string studycode = string.Empty; var startTime = DateTime.Now; @@ -412,6 +410,8 @@ namespace IRaCIS.Core.API.Controllers studyMonitor.StudyId = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.Id ?? Guid.Empty; studyMonitor.StudyCode = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.StudyCode; studyMonitor.ArchiveFinishedTime = DateTime.Now; + + await _studyMonitorRepository.SaveChangesAsync(); } From 298efa20b35587dd632fabbdb71c528e427f9b8b Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 2 Mar 2023 14:54:16 +0800 Subject: [PATCH 6/9] x --- .../Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs index 20f7aba41..476951f05 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs @@ -130,7 +130,7 @@ namespace IRaCIS.Core.Application.Contracts public int FileCount { get; set; } - public bool IsSuccess = true; + public bool IsSuccess { get; set; } public string Note = string.Empty; From 4d017bb55b3f7632de228ab38d0dc07123a14f1d Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 2 Mar 2023 15:14:39 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Document/TrialEmailNoticeConfigService.cs | 336 +++++++++--------- IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs | 2 +- 2 files changed, 169 insertions(+), 169 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs index 5f7641a7e..73ae4175a 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -181,7 +181,7 @@ namespace IRaCIS.Core.Application.Service var isNeedSend = true; //手动发送的时候,也有可能答案是是 此时是 这里不发送,发送已经生成的文件 - if (pdAnswer == "是" && isHandSend==null) + if (pdAnswer == "是" && isHandSend == null) { isNeedSend = true; @@ -196,9 +196,16 @@ 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.Distinct()) - },true); + await _taskMedicalReviewRepository.AddAsync(new TaskMedicalReview() + { + TrialId = trialId, + VisitTaskId = taskId, + MedicalManagerUserId = minUserIdList.FirstOrDefault(), + AllocateTime = DateTime.Now + , + IsAutoGenerate = true, + PDRelationTaskIdListStr = string.Join('|', taskIdList.Distinct()) + }, true); } } @@ -470,7 +477,7 @@ namespace IRaCIS.Core.Application.Service 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 = "是"; + answer = "是"; } @@ -478,13 +485,13 @@ namespace IRaCIS.Core.Application.Service //入组确认一直交给第一个人,如果第一个人重阅 还未做完,第二个人先做完了,此时不发 - 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(); + 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) &&(taskInfo.DoctorUserId != existFirstEnrollTask.DoctorUserId) ) - { - isNeedSend = false; + if ((existFirstEnrollTask != null) && (taskInfo.DoctorUserId != existFirstEnrollTask.DoctorUserId)) + { + isNeedSend = false; } else { @@ -506,7 +513,7 @@ namespace IRaCIS.Core.Application.Service } - + } @@ -520,48 +527,9 @@ namespace IRaCIS.Core.Application.Service { - //单重 - if (taskInfo.ReadingType == ReadingMethod.Single) - { - //仲裁在访视上 或者在阅片期 - if (taskInfo.ArbitrationRule != ArbitrationRule.None) - { - - throw new BusinessValidationFailedException("单重有序阅片配置有误(不应该有仲裁对象配置),请核查!"); - } - - - //要求PD 确认的访视 是截止访视 还是非截止访视(根据该访视有没有配置阅片期来判断) - - if (taskInfo.ReadingCategory == ReadingCategory.Visit) - { - //存在阅片期 那么就是截止访视 - if (await _repository.Where(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.SubjectVisitId == taskInfo.SourceSubjectVisitId && t.ReadingSetType == ReadingSetType.ImageReading).AnyAsync()) - { - isNeedSend = false; - } - else//非截止访视 在访视读完后,发送 - { - answer = await TranslatePdStateAsync(visitTaskId, ReadingCategory.Visit, taskInfo.CriterionType); - } - } - //截止访视 在访视读完,并完成全局阅片后发送全局的结果 - else if (taskInfo.ReadingCategory == ReadingCategory.Global) - { - answer = await TranslatePdStateAsync(visitTaskId, ReadingCategory.Global, taskInfo.CriterionType); - } - else - { - throw new BusinessValidationFailedException("单重有序阅片 该类型的任务不应进入此处逻辑,请联系后台开发核查!"); - } - - isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, new List() { visitTaskId }, minUserIdList); - - - } //双重 - else if (taskInfo.ReadingType == ReadingMethod.Double) + if (taskInfo.ReadingType == ReadingMethod.Double) { @@ -590,7 +558,7 @@ namespace IRaCIS.Core.Application.Service var judgeResultId = taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).First().JudgeResultTaskId.Value; answer = await TranslatePdStateAsync(judgeResultId, ReadingCategory.Visit, taskInfo.CriterionType); - isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Where(t=>t.ReadingCategory==ReadingCategory.Judge).Select(t => t.Id).ToList(), minUserIdList); + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).Select(t => t.Id).ToList(), minUserIdList); } else @@ -657,100 +625,128 @@ namespace IRaCIS.Core.Application.Service { throw new BusinessValidationFailedException("双重有序阅片 没有定义该仲裁规则处理逻辑,请联系业务和后台开发核查!"); - - ////只发第一个人 - //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)) - //{ - // isNeedSend = false; - //} - //else - //{ - - // answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); - //} } } + + //屏蔽单重阅片添加 else { - throw new BusinessValidationFailedException("有序阅片配置有误(应为单重或者双重阅片),请核查!"); + isNeedSend = false; + return string.Empty; } + #region 发邮件屏蔽单重的 + ////单重 + //else if (taskInfo.ReadingType == ReadingMethod.Single) + //{ + // //仲裁在访视上 或者在阅片期 + // if (taskInfo.ArbitrationRule != ArbitrationRule.None) + // { + + // throw new BusinessValidationFailedException("单重有序阅片配置有误(不应该有仲裁对象配置),请核查!"); + // } + + + // //要求PD 确认的访视 是截止访视 还是非截止访视(根据该访视有没有配置阅片期来判断) + + // if (taskInfo.ReadingCategory == ReadingCategory.Visit) + // { + // //存在阅片期 那么就是截止访视 + // if (await _repository.Where(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.SubjectVisitId == taskInfo.SourceSubjectVisitId && t.ReadingSetType == ReadingSetType.ImageReading).AnyAsync()) + // { + // isNeedSend = false; + // } + // else//非截止访视 在访视读完后,发送 + // { + // answer = await TranslatePdStateAsync(visitTaskId, ReadingCategory.Visit, taskInfo.CriterionType); + // } + // } + // //截止访视 在访视读完,并完成全局阅片后发送全局的结果 + // else if (taskInfo.ReadingCategory == ReadingCategory.Global) + // { + // answer = await TranslatePdStateAsync(visitTaskId, ReadingCategory.Global, taskInfo.CriterionType); + // } + // else + // { + // throw new BusinessValidationFailedException("单重有序阅片 该类型的任务不应进入此处逻辑,请联系后台开发核查!"); + // } + + // isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, new List() { visitTaskId }, minUserIdList); + + + //} + //else + //{ + // throw new BusinessValidationFailedException("有序阅片配置有误(应为单重或者双重阅片),请核查!"); + //} + + #endregion + + + } - //无序 + //屏蔽无序阅片添加 else { - //单重 - - - if (taskInfo.ReadingType == ReadingMethod.Single && taskInfo.ArbitrationRule == ArbitrationRule.None) - { - answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); - - 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(); - - //这里要求 到这里已经如果有裁判 已经生成裁判了保存数据库 - if (taskList.Count == 2 && taskList.Count(t => t.ReadingTaskState == ReadingTaskState.HaveSigned && t.ReadingCategory == ReadingCategory.Visit) == 2) - { - - answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); - - 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); - - isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).Select(t => t.Id).ToList(), minUserIdList); - - - } - else - { - isNeedSend = false; - } - - } - else - { - throw new BusinessValidationFailedException("无序阅片配置有误(应为单重无仲裁对象,双重针对访视仲裁),请核查!"); - - - ////只发第一个人 - //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)) - //{ - // isNeedSend = false; - //} - //else - //{ - - // answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); - //} - - } - + isNeedSend = false; + return string.Empty; } + #region 发送邮件屏蔽无序的 + // //无序 + //else + //{ + // //单重 + // if (taskInfo.ReadingType == ReadingMethod.Single && taskInfo.ArbitrationRule == ArbitrationRule.None) + // { + // answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); + + // 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(); + + // //这里要求 到这里已经如果有裁判 已经生成裁判了保存数据库 + // if (taskList.Count == 2 && taskList.Count(t => t.ReadingTaskState == ReadingTaskState.HaveSigned && t.ReadingCategory == ReadingCategory.Visit) == 2) + // { + + // answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); + + // 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); + + // isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).Select(t => t.Id).ToList(), minUserIdList); + // } + // else + // { + // isNeedSend = false; + // } + // } + // else + // { + // throw new BusinessValidationFailedException("无序阅片配置有误(应为单重无仲裁对象,双重针对访视仲裁),请核查!"); + // } + //} + #endregion } else { @@ -824,7 +820,7 @@ namespace IRaCIS.Core.Application.Service sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig() { - FileName =$"{taskInfo.SubjectCode}_{emailConfig.FileName}" , + FileName = $"{taskInfo.SubjectCode}_{emailConfig.FileName}", FileStream = memoryStream }); @@ -887,12 +883,12 @@ namespace IRaCIS.Core.Application.Service //找到最早签名的 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(); + && 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 + 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(); //如果存在做完的该任务 @@ -914,10 +910,10 @@ namespace IRaCIS.Core.Application.Service { return ResponseOutput.NotOk("当前未有阅片人读完基线任务!"); } - - + + } } @@ -946,7 +942,7 @@ namespace IRaCIS.Core.Application.Service { TrialReadingCriterionId = t.Id, t.ReadingType, t.IsReadingTaskViewInOrder, t.CriterionType, t.ArbitrationRule }).FirstNotNullAsync(); // 项目双重 - if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double) + if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double && trialReadingCriterionConfig.IsReadingTaskViewInOrder) { //仲裁在访视上面 if (trialReadingCriterionConfig.ArbitrationRule == ArbitrationRule.Visit) @@ -1037,58 +1033,62 @@ namespace IRaCIS.Core.Application.Service return ResponseOutput.NotOk("未定义该仲裁规则发送业务逻辑!"); } } - // 项目单重 判断最新的Pd 访视是否完成 是否有阅片期即可 - else if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Single) - { + + #region 发送邮件屏蔽单重阅片情况 + //// 项目单重 判断最新的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(); + // 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 - { - //存在阅片期 那么就是截止访视 + // 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 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(); + // 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); + // 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("当前受试者阅片期任务未阅片完成"); - } + // 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); + // } + // else//非截止访视 在访视读完后,发送 + // { + // var filePath = await BaseBusinessScenarioSendEmailAsync(task.Id, true, EmailStoreSendMode.OnlyStoreLocalNotSentEmail, string.Empty); - return ResponseOutput.Ok(new { RelativePath = filePath, TaskName = task.TaskName, VisitTaskId = task.Id }); - } - } + // return ResponseOutput.Ok(new { RelativePath = filePath, TaskName = task.TaskName, VisitTaskId = task.Id }); + // } + // } - } + //} + #endregion + else { - return ResponseOutput.NotOk("当前项目配置,未定义单双重外发送业务逻辑!"); + return ResponseOutput.NotOk("当前项目配置,不满足双重有序阅片,不满足发送条件!"); } } @@ -1127,7 +1127,7 @@ namespace IRaCIS.Core.Application.Service /// 是否是全局产生(区分裁判任务) /// /// - private async Task TranslatePdStateAsync(Guid visitTaskId, ReadingCategory readingCategory, CriterionType criterionType, bool? IsGlobalGenerate=null) + private async Task TranslatePdStateAsync(Guid visitTaskId, ReadingCategory readingCategory, CriterionType criterionType, bool? IsGlobalGenerate = null) { var answer = string.Empty; diff --git a/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs b/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs index 23d605e5b..9d6a6579f 100644 --- a/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs +++ b/IRaCIS.Core.Domain/Image/DicomStudyMonitor.cs @@ -88,7 +88,7 @@ namespace IRaCIS.Core.Domain.Models public User Uploader { get; set; } - public bool IsSuccess = true; + public bool IsSuccess { get; set; } public string Note = string.Empty; From 8c743f5b7b1be0ef0d94306427eee0fb46cff99b Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 2 Mar 2023 16:16:35 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=BC=E8=A1=A8?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Common/ExcelExportService.cs | 2 ++ .../Service/QC/DTO/QCListViewModel.cs | 26 ++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index 2bd0d10b8..94470861c 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -385,6 +385,8 @@ namespace IRaCIS.Core.Application.Service.Common UploadFinishedTime = t.UploadFinishedTime, + ArchiveFinishedTime=t.ArchiveFinishedTime, + UploadTime = t.CreateTime, diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index b51509a00..cea16a571 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -475,7 +475,27 @@ 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 ArchiveFinishedTimeStr => ArchiveFinishedTime?.ToString("yyyy-MM-dd HH:mm:ss.fff"); + public string UploadIntervalStr + { + get + { + var uploadTimeSpan = UploadFinishedTime - UploadStartTime; + + return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}"; + } + } + + public string ArchiveIntervalStr + { + get + { + var uploadTimeSpan = ArchiveFinishedTime - UploadFinishedTime; + + return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}"; + } + } public string TimeInterval @@ -483,7 +503,7 @@ namespace IRaCIS.Core.Application.Contracts get { - var uploadTimeSpan = UploadFinishedTime - UploadStartTime; + var uploadTimeSpan = ArchiveFinishedTime - UploadStartTime; return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}"; } @@ -491,7 +511,7 @@ namespace IRaCIS.Core.Application.Contracts public DateTime UploadStartTime { get; set; } - + public DateTime? ArchiveFinishedTime { get; set; } public DateTime? UploadFinishedTime { get; set; } @@ -508,7 +528,7 @@ namespace IRaCIS.Core.Application.Contracts public int FileCount { get; set; } [DictionaryTranslateAttribute("YesOrNo")] - public bool IsSuccess { get; set; } = true; + public bool IsSuccess { get; set; } public string Note = string.Empty; From 4b07a9f6b955a843083b75d3ea52340e4147a300 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 2 Mar 2023 17:36:08 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B4=A8=E7=96=91?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E7=BB=B4=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.Application/Service/QC/QCOperationService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index 3ee7141bb..40b077555 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -1589,7 +1589,7 @@ namespace IRaCIS.Core.Application.Image.QA } - await _qcChallengeRepository.BatchUpdateNoTrackingAsync(t => t.IsClosed == false, u => new QCChallenge() { IsClosed = true, CloseResonEnum = QCChallengeCloseEnum.Unresolvable }); + await _qcChallengeRepository.UpdatePartialFromQueryAsync(t => t.IsClosed == false&& t.SubjectVisitId==dbSubjectVisit.Id, u => new QCChallenge() { IsClosed = true, ClosedTime=DateTime.Now, CloseResonEnum = QCChallengeCloseEnum.Unresolvable }); }