diff --git a/IRaCIS.Core.Application/Service/QC/DTO/NoneDicomStudyViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/NoneDicomStudyViewModel.cs index 3afe667e2..3de24e669 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/NoneDicomStudyViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/NoneDicomStudyViewModel.cs @@ -61,7 +61,7 @@ namespace IRaCIS.Core.Application.Contracts public DateTime ImageDate { get; set; } public string Description { get; set; } = string.Empty; - public int? Code { get; set; } + public int Code { get; set; } } diff --git a/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs b/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs index e76e0651b..d20983c4d 100644 --- a/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs +++ b/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs @@ -29,7 +29,7 @@ namespace IRaCIS.Core.Application.Contracts private readonly IInspectionService _inspectionService; private readonly IRepository _noneDicomStudyFileRepository; - + private readonly AsyncLock _mutex = new AsyncLock(); @@ -40,7 +40,7 @@ namespace IRaCIS.Core.Application.Contracts IRepository noneDicomStudyFileRepository) { _noneDicomStudyRepository = noneDicomStudyRepository; - + this._httpContext = httpContext; this._hostEnvironment = hostEnvironment; this._inspectionService = inspectionService; @@ -62,54 +62,57 @@ namespace IRaCIS.Core.Application.Contracts [TypeFilter(typeof(TrialResourceFilter))] public async Task> AddOrUpdateNoneDicomStudy(NoneDicomStudyAddOrEdit addOrEditNoneDicomStudy) { + + NoneDicomStudy optEntity = null; using (await _mutex.LockAsync()) { - if (addOrEditNoneDicomStudy.Id == Guid.Empty|| addOrEditNoneDicomStudy.Id==null) + if (addOrEditNoneDicomStudy.Id == Guid.Empty || addOrEditNoneDicomStudy.Id == null) { - var code = _noneDicomStudyRepository.Where(t => t.TrialId == addOrEditNoneDicomStudy.TrialId).MaxOrDefault(x=>x.Code); + //默认会是0 + var code = await _noneDicomStudyRepository.Where(t => t.TrialId == addOrEditNoneDicomStudy.TrialId).Select(x => x.Code).DefaultIfEmpty().MaxAsync(); + addOrEditNoneDicomStudy.Code = code + 1; + + optEntity = await _noneDicomStudyRepository.InsertFromDTOAsync(addOrEditNoneDicomStudy); + + optEntity.StudyCode = "NST" + optEntity.Code.ToString("D5"); + } + else + { + optEntity = await _noneDicomStudyRepository.UpdateFromDTOAsync(addOrEditNoneDicomStudy); } - addOrEditNoneDicomStudy.Code = addOrEditNoneDicomStudy.Code ?? 0; - - var entity = await _noneDicomStudyRepository.InsertOrUpdateAsync(addOrEditNoneDicomStudy, false); - - - - entity.StudyCode = "NST" + entity.Code.ToString("D5"); - await _repository.SaveChangesAsync(); - - var svTime = _repository.Where(t => t.Id == addOrEditNoneDicomStudy.SubjectVisitId).Select(t => new - { - DicomStudyMinStudyTime = t.StudyList.Min(t => (DateTime?)t.StudyTime), - DicomStudyMaxStudyTime = t.StudyList.Max(t => (DateTime?)t.StudyTime), - NoneDicomStudyMinStudyTime = t.NoneDicomStudyList.Min(t => (DateTime?)t.ImageDate), - NoneDicomStudyMaxStudyTime = t.NoneDicomStudyList.Max(t => (DateTime?)t.ImageDate) - }).FirstOrDefault().IfNullThrowException(); - - var minArray = new DateTime?[] { svTime.DicomStudyMinStudyTime, svTime.NoneDicomStudyMinStudyTime, addOrEditNoneDicomStudy.ImageDate }; - var maxArray = new DateTime?[] { svTime.DicomStudyMaxStudyTime, svTime.NoneDicomStudyMaxStudyTime, addOrEditNoneDicomStudy.ImageDate }; - - await _repository.BatchUpdateAsync(t => t.Id == addOrEditNoneDicomStudy.SubjectVisitId, u => new SubjectVisit() - { - VisitExecuted = VisitExecutedEnum.Executed, - - EarliestScanDate = minArray.Min(), - - LatestScanDate = maxArray.Max() - }); - - await _repository.SaveChangesAsync(); - - NoneDicomStudyAddReturnDto noneDicom = new NoneDicomStudyAddReturnDto() - { - StudyCode = entity.StudyCode, - Id = entity.Id - }; - return ResponseOutput.Ok(noneDicom); + await _noneDicomStudyRepository.SaveChangesAsync(); } - + var svTime = _repository.Where(t => t.Id == addOrEditNoneDicomStudy.SubjectVisitId).Select(t => new + { + DicomStudyMinStudyTime = t.StudyList.Min(t => (DateTime?)t.StudyTime), + DicomStudyMaxStudyTime = t.StudyList.Max(t => (DateTime?)t.StudyTime), + NoneDicomStudyMinStudyTime = t.NoneDicomStudyList.Min(t => (DateTime?)t.ImageDate), + NoneDicomStudyMaxStudyTime = t.NoneDicomStudyList.Max(t => (DateTime?)t.ImageDate) + }).FirstOrDefault().IfNullThrowException(); + + var minArray = new DateTime?[] { svTime.DicomStudyMinStudyTime, svTime.NoneDicomStudyMinStudyTime, addOrEditNoneDicomStudy.ImageDate }; + var maxArray = new DateTime?[] { svTime.DicomStudyMaxStudyTime, svTime.NoneDicomStudyMaxStudyTime, addOrEditNoneDicomStudy.ImageDate }; + + await _repository.BatchUpdateAsync(t => t.Id == addOrEditNoneDicomStudy.SubjectVisitId, u => new SubjectVisit() + { + VisitExecuted = VisitExecutedEnum.Executed, + + EarliestScanDate = minArray.Min(), + + LatestScanDate = maxArray.Max() + }); + + await _repository.SaveChangesAsync(); + + NoneDicomStudyAddReturnDto noneDicom = new NoneDicomStudyAddReturnDto() + { + StudyCode = optEntity.StudyCode, + Id = optEntity.Id + }; + return ResponseOutput.Ok(noneDicom); } @@ -162,7 +165,7 @@ namespace IRaCIS.Core.Application.Contracts [HttpDelete("{noneDicomStudyFileId:guid}")] public async Task DeleteNoneDicomStudyFile(Guid noneDicomStudyFileId) { - var subjectVisitId = await _noneDicomStudyFileRepository.Where(t=>t.Id== noneDicomStudyFileId).Select(t => t.NoneDicomStudy.SubjectVisitId).FirstOrDefaultAsync(); + var subjectVisitId = await _noneDicomStudyFileRepository.Where(t => t.Id == noneDicomStudyFileId).Select(t => t.NoneDicomStudy.SubjectVisitId).FirstOrDefaultAsync(); var success = await _noneDicomStudyFileRepository.BatchDeleteAsync(t => t.Id == noneDicomStudyFileId); @@ -217,17 +220,17 @@ namespace IRaCIS.Core.Application.Contracts /// 上传非Dicom 文件 支持压缩包 /// [HttpPost] - public async Task NewUploadNoneDicomFile([FromForm]UploadNoneDicomFileDto fileDto) + public async Task NewUploadNoneDicomFile([FromForm] UploadNoneDicomFileDto fileDto) { var file = this._httpContext.HttpContext?.Request.Form; - var result= await UploadNoneDicomFile(file, fileDto.subjectVisitId, fileDto.noneDicomStudyId); + var result = await UploadNoneDicomFile(file, fileDto.subjectVisitId, fileDto.noneDicomStudyId); if (result.IsSuccess) { var data = JsonConvert.DeserializeObject(fileDto.AuditInfo); data.GeneralId = fileDto.noneDicomStudyId; await _inspectionService.AddInspectionRecordAsync(data); - var subvisit =await _repository.GetQueryable().FirstOrDefaultAsync(x => x.Id == fileDto.subjectVisitId); + var subvisit = await _repository.GetQueryable().FirstOrDefaultAsync(x => x.Id == fileDto.subjectVisitId); List datas = new List(); datas.Add(new DataInspection() @@ -246,7 +249,7 @@ namespace IRaCIS.Core.Application.Contracts await _inspectionService.AddListInspectionRecordAsync(datas); } - + return result; } @@ -259,9 +262,9 @@ namespace IRaCIS.Core.Application.Contracts /// /// /// - //[DisableRequestSizeLimit] - [RequestSizeLimit(1_073_741_824)] - [HttpPost("{noneDicomStudyId:guid}/{subjectVisitId:guid}")] + //[DisableRequestSizeLimit] + [RequestSizeLimit(1_073_741_824)] + [HttpPost("{noneDicomStudyId:guid}/{subjectVisitId:guid}")] public async Task UploadNoneDicomFile(IFormCollection formCollection, Guid subjectVisitId, Guid noneDicomStudyId) { var rootPath = Directory.GetParent(_hostEnvironment.ContentRootPath.TrimEnd('\\')).IfNullThrowException().FullName; @@ -269,7 +272,7 @@ namespace IRaCIS.Core.Application.Contracts //上传根路径 var _fileStorePath = Path.Combine(rootPath, StaticData.TrialDataFolder); - var sv = await _repository.Where(t => t.Id == subjectVisitId).Select(t => new { t.TrialId, t.SiteId, t.SubjectId }).FirstOrDefaultAsync().IfNullThrowConvertException(); + var sv = await _repository.Where(t => t.Id == subjectVisitId).Select(t => new { t.TrialId, t.SiteId, t.SubjectId }).FirstOrDefaultAsync().IfNullThrowConvertException(); string uploadFolderPath = Path.Combine(_fileStorePath, sv.TrialId.ToString(), sv.SiteId.ToString(), sv.SubjectId.ToString(), subjectVisitId.ToString(), StaticData.NoneDicomFolder); @@ -317,12 +320,15 @@ namespace IRaCIS.Core.Application.Contracts await _repository.AddAsync(new StudyMonitor() { - FileCount = formCollection.Files.Count, - FileSize = formCollection.Files.Sum(t => t.Length), IsDicom = false, - IsDicomReUpload = false, + FileCount = formCollection.Files.Count, + FileSize = formCollection.Files.Sum(t => t.Length), + IsDicom = false, + IsDicomReUpload = false, StudyId = noneDicomStudyId, - - UploadStartTime = startTime, UploadFinishedTime = DateTime.Now, IP = _userInfo.IP, + + UploadStartTime = startTime, + UploadFinishedTime = DateTime.Now, + IP = _userInfo.IP, //TotalMillisecondsInterval = (DateTime.Now - startTime).TotalMilliseconds, TrialId = sv.TrialId, SiteId = sv.SiteId, @@ -364,7 +370,7 @@ namespace IRaCIS.Core.Application.Contracts } - await _repository.AddAsync(new NoneDicomStudyFile() { FileName = fileName, Path = relativePath, NoneDicomStudyId = noneDicomStudyId }); + await _repository.AddAsync(new NoneDicomStudyFile() { FileName = fileName, Path = relativePath, NoneDicomStudyId = noneDicomStudyId }); } } diff --git a/IRaCIS.Core.Infra.EFCore/Context/ValueGenerator/UploadTotalMillisecondsIntervalGenerator.cs b/IRaCIS.Core.Infra.EFCore/Context/ValueGenerator/UploadTotalMillisecondsIntervalGenerator.cs index 5c2aba700..9a9a3b640 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/ValueGenerator/UploadTotalMillisecondsIntervalGenerator.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/ValueGenerator/UploadTotalMillisecondsIntervalGenerator.cs @@ -1,10 +1,15 @@ using System; using IRaCIS.Core.Domain.Models; +using IRaCIS.Core.Domain.Share; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.ValueGeneration; namespace IRaCIS.Core.Infra.EFCore.ValueGenerator { + + /// + /// 上传监控 时间间隔存储 需要按照这个字段进行排序 + /// public class UploadTotalMillisecondsInterval : ValueGenerator { @@ -13,7 +18,6 @@ namespace IRaCIS.Core.Infra.EFCore.ValueGenerator //modelBuilder.Entity().Property(e => e.TestInterval).ValueGeneratedOnAddOrUpdate().HasDefaultValueSql("datediff(MS,UploadStartTime,UploadFinishedTime)"); - public override int Next(EntityEntry entry) { if (entry.Entity is StudyMonitor entity)