diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index cc66071dc..9b350c142 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -238,33 +238,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) - { - var savedInfo = _studyService.GetSaveToDicomInfo(preArchiveStudyCommand.SubjectVisitId); - - var studyMonitor = new StudyMonitor() - { - TrialId = savedInfo.TrialId, - SubjectId = savedInfo.SubjectId, - SubjectVisitId = savedInfo.SubjectVisitId, - - IsSuccess = false, - UploadStartTime = DateTime.Now, - IsDicom = preArchiveStudyCommand.IsDicom, - IP = _userInfo.IP - }; - - - var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true); - - return ResponseOutput.Ok(addEntity.Id); - - } /// Dicom 归档 @@ -446,7 +420,33 @@ namespace IRaCIS.Core.API.Controllers public string FileType { get; set; } } } + [HttpPost, Route("Study/PreArchiveStudy")] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] + public async Task PreArchiveStudy(PreArchiveStudyCommand preArchiveStudyCommand, + [FromServices] IStudyService _studyService, + [FromServices] IRepository _studyMonitorRepository) + { + var savedInfo = _studyService.GetSaveToDicomInfo(preArchiveStudyCommand.SubjectVisitId); + + var studyMonitor = new StudyMonitor() + { + TrialId = savedInfo.TrialId, + SubjectId = savedInfo.SubjectId, + SubjectVisitId = savedInfo.SubjectVisitId, + + IsSuccess = false, + UploadStartTime = DateTime.Now, + IsDicom = preArchiveStudyCommand.IsDicom, + IP = _userInfo.IP + }; + + + var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true); + + return ResponseOutput.Ok(addEntity.Id); + + } /// /// 上传非Dicom 文件 支持压缩包 多文件上传 /// diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs index a3eb2f0fe..412809334 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs @@ -103,12 +103,12 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc } [HttpGet] - public async Task DicomUploadInProgress(Guid trialId, string studyInstanceUid,Guid? visitTaskId) + public async Task DicomUploadInProgress(Guid trialId, string studyInstanceUid, Guid? visitTaskId) { - if(visitTaskId != null) + if (visitTaskId != null) { var cacheValue = _fusionCache.GetOrDefault(CacheKeys.TrialTaskStudyUidUploading(trialId, visitTaskId.Value, studyInstanceUid)); - if (cacheValue != Guid.Empty && cacheValue !=_userInfo.Id) + if (cacheValue != Guid.Empty && cacheValue != _userInfo.Id) { //---当前已有人正在上传和归档该检查! return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_ArchiveInProgress")); @@ -134,11 +134,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] public async Task AddOrUpdateArchiveStudy(NewArchiveStudyCommand incommand) { - //总数为0的检查不允许提交 - if (incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Count() == 0) - { - return ResponseOutput.NotOk("Study_InstanceCountZero"); - } + var @uploadLock = _distributedLockProvider.CreateLock($"UploadDicom"); @@ -163,7 +159,6 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { var trialId = incommand.TrialId; - var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == incommand.StudyMonitorId); studyMonitor.UploadFinishedTime = DateTime.Now; studyMonitor.ArchiveFinishedTime = DateTime.Now; @@ -171,10 +166,36 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc studyMonitor.IsSuccess = incommand.FailedFileCount == 0; studyMonitor.RecordPath = incommand.RecordPath; + var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString()); + var findStudy = await _dicomstudyRepository.FirstOrDefaultAsync(t => t.Id == studyId); + + studyMonitor.StudyId = studyId; + studyMonitor.StudyCode = findStudy?.StudyCode??""; + + + if (incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Count() == 0) + { + await _studyMonitorRepository.SaveChangesAsync(); + + return ResponseOutput.Ok(); + } + //上传 if (studyMonitor.IsDicomReUpload == false) { - var study = _mapper.Map(incommand.Study); + + //如果因为意外情况,连续点击两次,导致第一次插入了,第二次进来也会插入,在此判断一下 + if (findStudy != null) + { + + await _studyMonitorRepository.SaveChangesAsync(); + + //直接返回 + return ResponseOutput.Ok(); + } + + + var addStudy = _mapper.Map(incommand.Study); var @lock = _distributedLockProvider.CreateLock($"StudyCode"); @@ -188,42 +209,34 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1; - study.Code = currentNextCodeInt; + addStudy.Code = currentNextCodeInt; - study.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy)); + addStudy.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy)); - await _fusionCache.SetAsync(CacheKeys.TrialStudyMaxCode(trialId), study.Code, TimeSpan.FromMinutes(30)); + await _fusionCache.SetAsync(CacheKeys.TrialStudyMaxCode(trialId), addStudy.Code, TimeSpan.FromMinutes(30)); } - study.Id = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString()); - study.TrialId = incommand.TrialId; - study.SubjectId = incommand.SubjectId; - study.SubjectVisitId = incommand.SubjectVisitId; - study.IsFromPACS = false; + addStudy.Id = studyId; + addStudy.TrialId = incommand.TrialId; + addStudy.SubjectId = incommand.SubjectId; + addStudy.SubjectVisitId = incommand.SubjectVisitId; + addStudy.IsFromPACS = false; - //如果因为意外情况,连续点击两次,导致第一次插入了,第二次进来也会插入,在此判断一下 - var findStudy = await _dicomstudyRepository.FirstOrDefaultAsync(t => t.Id == study.Id); - - if (findStudy != null) - { - //直接返回 - return ResponseOutput.Ok(); - } //特殊处理逻辑 - study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Distinct()); - SpecialArchiveStudyDeal(study); - modalitys = study.Modalities; + addStudy.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Distinct()); + SpecialArchiveStudyDeal(addStudy); + modalitys = addStudy.Modalities; - await _dicomstudyRepository.AddAsync(study); + await _dicomstudyRepository.AddAsync(addStudy); - studyMonitor.StudyId = study.Id; - studyMonitor.StudyCode = study.StudyCode; + + studyMonitor.StudyCode = addStudy.StudyCode; foreach (var seriesItem in incommand.Study.SeriesList) @@ -231,7 +244,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var series = _mapper.Map(seriesItem); series.Id = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, incommand.TrialId.ToString()); - series.StudyId = study.Id; + series.StudyId = addStudy.Id; series.TrialId = incommand.TrialId; series.SubjectId = incommand.SubjectId; @@ -246,10 +259,10 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { var isntance = _mapper.Map(instanceItem); - Guid instanceId = IdentifierHelper.CreateGuid(study.StudyInstanceUid, series.SeriesInstanceUid, isntance.SopInstanceUid, study.TrialId.ToString()); + Guid instanceId = IdentifierHelper.CreateGuid(addStudy.StudyInstanceUid, series.SeriesInstanceUid, isntance.SopInstanceUid, addStudy.TrialId.ToString()); isntance.Id = instanceId; - isntance.StudyId = study.Id; + isntance.StudyId = addStudy.Id; isntance.SeriesId = series.Id; isntance.TrialId = incommand.TrialId; @@ -260,26 +273,15 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc } } - - - } else { - var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString()); ; - - var study = await _dicomstudyRepository.FirstOrDefaultAsync(t => t.Id == studyId); - - //重传的时候也要赋值检查Id - studyMonitor.StudyId = study.Id; - studyMonitor.StudyCode = study.StudyCode; - //特殊处理逻辑 - study.IsFromPACS = false; - study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(study.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct()); - SpecialArchiveStudyDeal(study); - modalitys = study.Modalities; + findStudy.IsFromPACS = false; + findStudy.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(findStudy.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct()); + SpecialArchiveStudyDeal(findStudy); + modalitys = findStudy.Modalities; // 少了整个序列 @@ -297,7 +299,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var series = _mapper.Map(seriesItem); series.Id = seriesId; - series.StudyId = study.Id; + series.StudyId = findStudy.Id; series.TrialId = incommand.TrialId; series.SubjectId = incommand.SubjectId; @@ -307,7 +309,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc dicomSeries = await _dicomSeriesRepository.AddAsync(series); //新的序列 那么 检查的序列数量+1 - study.SeriesCount += 1; + findStudy.SeriesCount += 1; } else { @@ -319,7 +321,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { var insntance = _mapper.Map(instanceItem); insntance.Id = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString()); - insntance.StudyId = study.Id; + insntance.StudyId = findStudy.Id; insntance.SeriesId = dicomSeries.Id; insntance.TrialId = incommand.TrialId; @@ -331,7 +333,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc // 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加 - study.InstanceCount += seriesItem.InstanceList.Count; + findStudy.InstanceCount += seriesItem.InstanceList.Count; } diff --git a/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs b/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs index ee4383ff0..a6483c556 100644 --- a/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs +++ b/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs @@ -251,10 +251,8 @@ namespace IRaCIS.Core.Application.Services HtmlPath = k.HtmlPath, Path = k.Path, InstanceNumber = k.InstanceNumber, - }).ToList(); } - ); //设置为阅片与否 不更改数据库检查 的instance数量 和 SeriesCount 所以这里要实时统计