diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index 66580badf..9d2cb6003 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -267,7 +267,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,Guid studyMonitorId, + 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, @@ -301,9 +301,9 @@ namespace IRaCIS.Core.API.Controllers { _provider.Set($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromMinutes(30)); } - - - + + + //if (_provider.Exists($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}")) //{ // //---当前已有人正在上传和归档该检查! @@ -406,7 +406,7 @@ namespace IRaCIS.Core.API.Controllers studyMonitor.IsSuccess = true; } - + } catch (Exception e) { @@ -423,7 +423,7 @@ namespace IRaCIS.Core.API.Controllers studyMonitor.StudyCode = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.StudyCode; studyMonitor.ArchiveFinishedTime = DateTime.Now; - await _studyMonitorRepository.SaveChangesAsync(); + await _studyMonitorRepository.SaveChangesAsync(); } @@ -671,24 +671,43 @@ namespace IRaCIS.Core.API.Controllers + public class UploadNoneDicomFileCommand + { + public Guid TrialId { get; set; } + public Guid SubjectVisitId { get; set; } + public Guid NoneDicomStudyId { get; set; } + public Guid StudyMonitorId { get; set; } + + + public List UploadedFileList { get; set; } = new List(); + + + public class OSSFileDTO + { + public string FilePath { get; set; } + public string FileName { get; set; } + public int FileFize { get; set; } + } + } + /// /// 上传非Dicom 文件 支持压缩包 多文件上传 /// - /// - /// - /// - /// /// /// //[DisableRequestSizeLimit] - [RequestSizeLimit(1_073_741_824)] - [HttpPost("NoneDicomStudy/UploadNoneDicomFile/{trialId:guid}/{subjectVisitId:guid}/{noneDicomStudyId:guid}/{studyMonitorId:guid}")] + [HttpPost("NoneDicomStudy/UploadNoneDicomFile")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] //[Authorize(Policy = IRaCISPolicy.CRC)] - public async Task UploadNoneDicomFile(IFormCollection formCollection, Guid subjectVisitId, Guid noneDicomStudyId, Guid studyMonitorId, + public async Task UploadNoneDicomFile(UploadNoneDicomFileCommand incommand, [FromServices] IRepository _noneDicomStudyRepository, [FromServices] IRepository _studyMonitorRepository) { + var subjectVisitId = incommand.SubjectVisitId; + var studyMonitorId=incommand.StudyMonitorId; + var noneDicomStudyId=incommand.NoneDicomStudyId; + + 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(); @@ -697,33 +716,24 @@ namespace IRaCIS.Core.API.Controllers studyMonitor.UploadFinishedTime = DateTime.Now; - await FileUploadAsync(async (fileName) => + foreach (var item in incommand.UploadedFileList) { + await _repository.AddAsync(new NoneDicomStudyFile() { FileName = item.FileName, Path = item.FilePath, NoneDicomStudyId = noneDicomStudyId }); - var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetNoneDicomFilePath(_hostEnvironment, fileName, sv.TrialId, sv.SiteId, sv.SubjectId, subjectVisitId); - - await _repository.AddAsync(new NoneDicomStudyFile() { FileName = fileRealName, Path = relativePath, NoneDicomStudyId = noneDicomStudyId }); - - return serverFilePath; - }); - + } var uploadFinishedTime = DateTime.Now; - - //// 上传非Dicom 后 将状态改为待提交 分为普通上传 和QC后重传 普通上传时才改为待提交 - //await _repository.UpdatePartialFromQueryAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.None, u => new SubjectVisit() { SubmitState = SubmitStateEnum.ToSubmit }); - var noneDicomStudy = await _noneDicomStudyRepository.FirstOrDefaultAsync((t => t.Id == noneDicomStudyId)); - noneDicomStudy.FileCount = noneDicomStudy.FileCount + formCollection.Files.Count; + noneDicomStudy.FileCount = noneDicomStudy.FileCount + incommand.UploadedFileList.Count; - studyMonitor.FileCount = formCollection.Files.Count; - studyMonitor.FileSize = formCollection.Files.Sum(t => t.Length); + studyMonitor.FileCount = incommand.UploadedFileList.Count; + studyMonitor.FileSize = incommand.UploadedFileList.Sum(t => t.FileFize); studyMonitor.IsDicom = false; studyMonitor.IsDicomReUpload = false; studyMonitor.StudyId = noneDicomStudyId; studyMonitor.StudyCode = noneDicomStudy.StudyCode; - studyMonitor.ArchiveFinishedTime = DateTime.Now; + studyMonitor.ArchiveFinishedTime = DateTime.Now; studyMonitor.IP = _userInfo.IP; await _repository.SaveChangesAsync(); @@ -752,7 +762,7 @@ namespace IRaCIS.Core.API.Controllers if (!fileName.EndsWith(".xlsx") && !fileName.EndsWith(".csv") && !fileName.EndsWith(".xls")) { - //---支持.xlsx、.xls、.csv格式的文件上传。 + //---支持.xlsx、.xls、.csv格式的文件上传。 throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_SupportedFormats")); } @@ -910,11 +920,11 @@ namespace IRaCIS.Core.API.Controllers var dt = DateTime.Now; - etcCheckList = etcCheckList.Where(t => !(t.Modality == string.Empty || t.SiteCode == string.Empty || t.SubjectCode == string.Empty || t.VisitName == string.Empty || t.StudyDate == string.Empty ||! DateTime.TryParse(t.StudyDate, out dt))).ToList(); + etcCheckList = etcCheckList.Where(t => !(t.Modality == string.Empty || t.SiteCode == string.Empty || t.SubjectCode == string.Empty || t.VisitName == string.Empty || t.StudyDate == string.Empty || !DateTime.TryParse(t.StudyDate, out dt))).ToList(); if (etcCheckList.Count == 0) { - //---请保证上传数据符合模板文件中的样式,且存在有效数据。 + //---请保证上传数据符合模板文件中的样式,且存在有效数据。 return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_InvalidData")); } @@ -994,7 +1004,7 @@ namespace IRaCIS.Core.API.Controllers - + } #endregion diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.xml b/IRaCIS.Core.API/IRaCIS.Core.API.xml index fc2558ece..659916ddf 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.xml +++ b/IRaCIS.Core.API/IRaCIS.Core.API.xml @@ -266,14 +266,10 @@ - + 上传非Dicom 文件 支持压缩包 多文件上传 - - - - diff --git a/IRaCIS.Core.Application/BackGroundJob/CancelTaskQuartZJob.cs b/IRaCIS.Core.Application/BackGroundJob/CancelTaskQuartZJob.cs index fdb402ecb..37e7293d1 100644 --- a/IRaCIS.Core.Application/BackGroundJob/CancelTaskQuartZJob.cs +++ b/IRaCIS.Core.Application/BackGroundJob/CancelTaskQuartZJob.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.Logging; using Quartz; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Application.ViewModel; +using IRaCIS.Core.Application.Contracts; namespace IRaCIS.Application.Services.BackGroundJob { @@ -40,9 +41,12 @@ namespace IRaCIS.Application.Services.BackGroundJob if (isInOrder) { - Guid id = (Guid)dataMap.Get("SubjectId"); + Guid subjectId = (Guid)dataMap.Get("SubjectId"); + + Guid trialReadingCriterionId = (Guid)dataMap.Get("TrialReadingCriterionId"); + + await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == subjectId && t.TrialReadingCriterionId==trialReadingCriterionId, u => new VisitTask() { SubjectCriterionClaimUserId = null }); - await _subjectRepository.UpdatePartialFromQueryAsync(t => t.Id ==id, u => new Subject() { ClaimUserId = null }, true); } else { diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index ea09fd8d1..097325b62 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -11841,6 +11841,14 @@ + + + 前端 仅仅释放的时候使用,领取是后端调用该方法 + + + + + 签名提交任务修改状态 diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs index 8767e26a1..6835c7495 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs @@ -894,6 +894,8 @@ namespace IRaCIS.Core.Application.ViewModel public Guid? VisitTaskId { get; set; } + public Guid TrialReadingCriterionId { get; set; } + public Guid SubejctId { get; set; } public bool IsClaim { get; set; } diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index c4b6776aa..d5498f96f 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -17,6 +17,7 @@ using IRaCIS.Core.Infra.EFCore.Common; using System.Linq.Expressions; using IRaCIS.Core.Domain.Share.Reading; using IRaCIS.Core.Application.Service.Reading.Dto; +using IRaCIS.Core.Application.Contracts; namespace IRaCIS.Core.Application.Service { @@ -608,6 +609,7 @@ namespace IRaCIS.Core.Application.Service foreach (var trialReadingCriterionConfig in trialReadingCriterionConfigList) { + var trialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId; if (trialReadingCriterionConfig.IsAutoCreate == true) { @@ -615,8 +617,8 @@ namespace IRaCIS.Core.Application.Service var blindTaskName = string.Empty; - var isNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList); - var isClinicalDataSign = IsClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList, subjectVisit.Id, trialId); + var isNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionId, clinicalDataConfirmList); + var isClinicalDataSign = IsClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionId, clinicalDataConfirmList, subjectVisit.Id, trialId); if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0) @@ -677,7 +679,7 @@ namespace IRaCIS.Core.Application.Service if (trialReadingCriterionConfig.IsReadingTaskViewInOrder) { //之前有回退到影像上传的访视 那么当前访视一致性核查通过的时候,当前访视生成但是不分配出去(排除失访的) - var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); + var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.TrialReadingCriterionId== trialReadingCriterionId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); if (beforeBackVisitTask == null) @@ -686,11 +688,11 @@ namespace IRaCIS.Core.Application.Service singleTask.SuggesteFinishedTime = GetSuggessFinishTime(true, UrgentType.NotUrget); - var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); + var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); //存在退回访视1 又退回基线 这种情况 生成任务 考虑基线先一致性核查通过,但是访视1还未通过时 生成任务 var followVisitTaskList = await _visitTaskRepository - .Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.ReadingCategory == ReadingCategory.Visit && t.IsAnalysisCreate == false, true) + .Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.VisitTaskNum > subjectVisit.VisitNum && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.ReadingCategory == ReadingCategory.Visit && t.IsAnalysisCreate == false, true) .WhereIf(followBackVisitTask != null, t => t.VisitTaskNum < followBackVisitTask.VisitTaskNum) .ToListAsync(); diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index a70e5a2c8..4e4181763 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -609,11 +609,11 @@ namespace IRaCIS.Core.Application.Service.Allocation //PI 读基线的时候,subject 如果PI基线没阅片完,SR就不能看 .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline, - t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect)) + t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect && c.TrialReadingCriterionId==trialReadingCriterionId)) //PI 读随访的时候, subject 如果SR基线没阅片完,PI就不能看 .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllVisit, - t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect)) + t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect && c.TrialReadingCriterionId == trialReadingCriterionId)) @@ -652,13 +652,14 @@ namespace IRaCIS.Core.Application.Service.Allocation .WhereIf(!string.IsNullOrEmpty(inDto.SubjectCode), t => (t.Subject.Code.Contains(inDto.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(inDto.SubjectCode) && t.IsAnalysisCreate)); - var visitGroupQuery = visitQuery.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode, x.Subject.ClaimUserId ,x.Subject.ClaimUser.UserName }); + var visitGroupQuery = visitQuery.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode, x.SubjectCriterionClaimUserId ,x.SubjectCriterionClaimUser.UserName }); var visitTaskQuery = visitGroupQuery.Select(x => new IRUnReadSubjectView() { SubjectId = x.Key.SubjectId, SubjectCode = x.Key.BlindSubjectCode == string.Empty ? x.Key.Code : x.Key.BlindSubjectCode, - ClaimUserId = x.Key.ClaimUserId, + + ClaimUserId = x.Key.SubjectCriterionClaimUserId, ClaimUserName=x.Key.UserName, SuggesteFinishedTime = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned).Min(x => x.SuggesteFinishedTime), diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomInstanceModel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomInstanceModel.cs index b5fe095f1..b25b34119 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomInstanceModel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomInstanceModel.cs @@ -30,6 +30,8 @@ namespace IRaCIS.Core.Application.Contracts public bool IsDeleted { get; set; } public bool IsReading { get; set; } = true; + public string ImageResizePath { get; set; } + } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs index e9a16ca10..a9062fd24 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs @@ -41,7 +41,7 @@ public string WindowCenter { get; set; } = string.Empty; public string WindowWidth { get; set; } = string.Empty; - public string IamgeResizePath { get; set; } + public string ImageResizePath { get; set; } } public class DicomSeriesWithLabelDTO : DicomSeriesDTO diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs index 42c9c3a71..75f6d7d81 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs @@ -280,7 +280,7 @@ namespace IRaCIS.Core.Application.Contracts public string AcquisitionNumber { get; set; } = string.Empty; public string TriggerTime { get; set; } = string.Empty; - public string IamgeResizePath { get; set; }=string.Empty; + public string ImageResizePath { get; set; }=string.Empty; public List InstanceList { get; set; } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/InstanceService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/InstanceService.cs index 7a1912366..0ac5eab09 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/InstanceService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/InstanceService.cs @@ -23,11 +23,15 @@ namespace IRaCIS.Core.Application.Services /// 指定资源Id,获取Dicom序列所属的实例信息列表 /// Dicom序列的Id [HttpGet("{seriesId:guid}")] - public async Task> List(Guid seriesId) + public async Task> > List(Guid seriesId) { - return await _instanceRepository.Where(s => s.SeriesId == seriesId).OrderBy(s => s.InstanceNumber). + var list= await _instanceRepository.Where(s => s.SeriesId == seriesId).OrderBy(s => s.InstanceNumber). ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + + var imageResizePath = await _instanceRepository.Where(s => s.SeriesId == seriesId).Select(t=>t.DicomSerie.ImageResizePath).FirstOrDefaultAsync(); + + return ResponseOutput.Ok(list, new { ImageResizePath = imageResizePath }); } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/Interface/IInstanceService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/Interface/IInstanceService.cs index 24a3f6307..792923e3a 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/Interface/IInstanceService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/Interface/IInstanceService.cs @@ -6,7 +6,7 @@ namespace IRaCIS.Core.Application.Services public interface IInstanceService { Task Content(Guid instanceId); - Task> List(Guid seriesId); + Task>> List(Guid seriesId); IEnumerable List(Guid seriesId, string tpCode, bool? key); Task Preview(Guid instanceId); } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs index 3283be4b5..173c643f1 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs @@ -214,6 +214,10 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc foreach (var instanceItem in seriesItem.InstanceList) { var isntance = _mapper.Map(instanceItem); + + Guid instanceId = IdentifierHelper.CreateGuid(study.StudyInstanceUid, series.SeriesInstanceUid, isntance.SopInstanceUid, study.TrialId.ToString()); + + isntance.Id = instanceId; isntance.StudyId = study.Id; isntance.SeriesId = series.Id; @@ -830,6 +834,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc _provider.Set($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30)); } } + else + { + lock (lockObj) + { + _provider.Remove($"StudyUid_{trialId}_{studyInstanceUid}"); + } + } return result; } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs index 0166cdc2a..ef437c37a 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs @@ -14,7 +14,8 @@ namespace IRaCIS.Core.Application.Service { CreateMap() .ForMember(d => d.SeriesList, u => u.Ignore()); - CreateMap(); + CreateMap() + .ForMember(d => d.DicomInstanceList, u => u.Ignore()); CreateMap(); CreateMap(); diff --git a/IRaCIS.Core.Application/Service/QC/DTO/NoneDicomStudyFileViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/NoneDicomStudyFileViewModel.cs index 5ac67cd5b..9766dd9eb 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/NoneDicomStudyFileViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/NoneDicomStudyFileViewModel.cs @@ -20,7 +20,7 @@ namespace IRaCIS.Core.Application.Contracts public string FullFilePath => Path; - public string PreviewPath => "/Common/LocalFilePreview?relativePath=" + Path; + public string PreviewPath => Path; } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index d0b2994b8..ca805601f 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -624,7 +624,7 @@ namespace IRaCIS.Application.Services throw new BusinessValidationFailedException(_localizer["ReadingImage_BeSigned"]); } - if(await _visitTaskRepository.AnyAsync(x=> x.Id == visitTaskid && x.DoctorUserId != _userInfo.Id && x.Subject.ClaimUserId != _userInfo.Id)) + if(await _visitTaskRepository.AnyAsync(x=> x.Id == visitTaskid && x.DoctorUserId != _userInfo.Id && x.SubjectCriterionClaimUserId != _userInfo.Id)) { throw new BusinessValidationFailedException("当前任务领取人不是你,不允许提交签名"); } @@ -2290,7 +2290,7 @@ namespace IRaCIS.Application.Services if (task != null) { // 有序 自动领取该Subject - await ClaimOrCancelSubjectAsync(new ClaimSubjectDto() { IsClaim = true, SubejctId = task.SubjectId, VisitTaskId=task.VisitTaskId, IsInOrder = true }); + await ClaimOrCancelSubjectAsync(new ClaimSubjectDto() { IsClaim = true, SubejctId = task.SubjectId, TrialReadingCriterionId=task.TrialReadingCriterionId, VisitTaskId=task.VisitTaskId, IsInOrder = true }); } } else @@ -2315,8 +2315,8 @@ namespace IRaCIS.Application.Services if (task != null) { - // 无序 自动领取该Subject - await ClaimOrCancelSubjectAsync(new ClaimSubjectDto() { IsClaim = true, VisitTaskId = task.VisitTaskId, IsInOrder = false }); + // 无序 + await ClaimOrCancelSubjectAsync(new ClaimSubjectDto() { IsClaim = true, VisitTaskId = task.VisitTaskId, IsInOrder = false }); } } @@ -2448,26 +2448,34 @@ namespace IRaCIS.Application.Services } - + /// + /// 前端 仅仅释放的时候使用,领取是后端调用该方法 + /// + /// + /// + /// [HttpPost] public async Task ClaimOrCancelSubjectAsync(ClaimSubjectDto claimSubjectDto) { IScheduler scheduler = await _schedulerFactory.GetScheduler(); + //有序 用SubjectCriterionClaimUserId 某个标准的所有任务,该字段保持一致 if (claimSubjectDto.IsInOrder) { if (claimSubjectDto.IsClaim) { - - if(_subjectRepository.Any(t=>t.Id== claimSubjectDto.SubejctId && t.ClaimUserId != _userInfo.Id && t.ClaimUserId!=null)) + //每个subject 每个标准的领取放在 任务上 免得加表 + if(_visitTaskRepository.Any(t=>t.Id== claimSubjectDto.SubejctId && t.TrialReadingCriterionId==claimSubjectDto.TrialReadingCriterionId + && t.SubjectCriterionClaimUserId != _userInfo.Id && t.SubjectCriterionClaimUserId != null)) { throw new BusinessValidationFailedException("当前任务已被其他人领取,请进行其他的阅片任务"); } else { - await _subjectRepository.UpdatePartialFromQueryAsync(t => t.Id == claimSubjectDto.SubejctId, u => new Subject() { ClaimUserId = _userInfo.Id }, true); + await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == claimSubjectDto.SubejctId && t.TrialReadingCriterionId == claimSubjectDto.TrialReadingCriterionId , u => new VisitTask() { SubjectCriterionClaimUserId = _userInfo.Id }); + //列表可以看到当前阅片人是谁 await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.Id == claimSubjectDto.VisitTaskId, u => new VisitTask() { DoctorUserId = _userInfo.Id }); } @@ -2478,6 +2486,7 @@ namespace IRaCIS.Application.Services IJobDetail job = JobBuilder.Create() .UsingJobData("SubjectId", claimSubjectDto.SubejctId) // 传递GUID参数给任务 + .UsingJobData("TrialReadingCriterionId", claimSubjectDto.TrialReadingCriterionId) .UsingJobData("IsInOrder", claimSubjectDto.IsInOrder) .Build(); @@ -2494,9 +2503,10 @@ namespace IRaCIS.Application.Services } else { - await _subjectRepository.UpdatePartialFromQueryAsync(t => t.Id == claimSubjectDto.SubejctId, u => new Subject() { ClaimUserId = null }, true); + await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == claimSubjectDto.SubejctId && t.TrialReadingCriterionId == claimSubjectDto.TrialReadingCriterionId , u => new VisitTask() { SubjectCriterionClaimUserId = null }); } } + //无序 直接用DoctorUserId 当做领取人 else { if (claimSubjectDto.IsClaim) diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index 458705231..54a486acc 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -180,11 +180,11 @@ namespace IRaCIS.Application.Services [AllowAnonymous] public async Task GetEnvironmentName([FromServices] IWebHostEnvironment env) { - var a = IdentifierHelper.CreateGuid("123456"); + var a = IdentifierHelper.CreateGuid("1.2.840.113619.2.416.3358551739363725609857319676326094825431.2.840.113619.2.80.2338912612.50499.1563432834.1.4.11.2.840.113619.2.80.2338912612.50499.1563432835.4b8340000-3e2c-0016-fbdd-08db883b137f"); - var k = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes("123456")); - var c = MD5Helper.Md5("123456"); + var c = MD5Helper.Md5("1.2.840.113619.2.416.3358551739363725609857319676326094825431.2.840.113619.2.80.2338912612.50499.1563432834.1.4.11.2.840.113619.2.80.2338912612.50499.1563432835.4b8340000-3e2c-0016-fbdd-08db883b137f"); + //update DicomInstance set Path = '/IRaCISData/TrialData/' + cast(DicomInstance.TrialId as varchar) + '/' + DicomInstance.SiteId + '/' + DicomInstance.SubjectId + '/' + DicomInstance.SubjectVisitId + '/Dicom/' + DicomInstance.StudyId + '/' + DicomInstance.Id + '.dcm' diff --git a/IRaCIS.Core.Application/Triggers/VisitTaskIAfterSignTrigger.cs b/IRaCIS.Core.Application/Triggers/VisitTaskIAfterSignTrigger.cs index 70c90c2f3..95f5e3954 100644 --- a/IRaCIS.Core.Application/Triggers/VisitTaskIAfterSignTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/VisitTaskIAfterSignTrigger.cs @@ -31,13 +31,15 @@ namespace IRaCIS.Core.Application.Triggers { var visitTask = context.Entity; - + if (visitTask.SignTime != null && visitTask.ReadingTaskState == ReadingTaskState.HaveSigned - && _subjectRepository.Where(t=>t.Id==visitTask.SubjectId).SelectMany(c=>c.SubjectVisitList) - .Any(t=>t.Id==visitTask.SourceSubjectVisitId && t.IsBaseLine)) - { - await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTask.SubjectId , t=>new Subject() { ClaimUserId=null}); + //&& _subjectRepository.Where(t=>t.Id==visitTask.SubjectId).SelectMany(c=>c.SubjectVisitList) + //.Any(t=>t.Id==visitTask.SourceSubjectVisitId && t.IsBaseLine) + ) + { + //任务阅片完成 自动释放 + await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == visitTask.SubjectId && t.TrialReadingCriterionId==visitTask.TrialReadingCriterionId , t=>new VisitTask() { SubjectCriterionClaimUserId=null}); } diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index 44acec4a6..1135e0088 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -469,6 +469,10 @@ namespace IRaCIS.Core.Domain.Models public Guid? LatestReplyUserId { get;set; } public DateTime? LatestReplyTime { get; set; } + public User SubjectCriterionClaimUser { get; set; } + + public Guid? SubjectCriterionClaimUserId { get; set; } + } /// diff --git a/IRaCIS.Core.Domain/Image/DicomSeries.cs b/IRaCIS.Core.Domain/Image/DicomSeries.cs index dda7cab73..cf4544e3e 100644 --- a/IRaCIS.Core.Domain/Image/DicomSeries.cs +++ b/IRaCIS.Core.Domain/Image/DicomSeries.cs @@ -57,7 +57,7 @@ namespace IRaCIS.Core.Domain.Models public bool IsDeleted {get;set;} public bool IsReading { get; set; } = true; - public string IamgeResizePath { get; set; }=string.Empty; + public string ImageResizePath { get; set; }=string.Empty; } } diff --git a/IRaCIS.Core.Domain/Visit/Subject.cs b/IRaCIS.Core.Domain/Visit/Subject.cs index ce75c64dc..9b1d0c066 100644 --- a/IRaCIS.Core.Domain/Visit/Subject.cs +++ b/IRaCIS.Core.Domain/Visit/Subject.cs @@ -116,11 +116,6 @@ namespace IRaCIS.Core.Domain.Models public List ClinicalFormList { get; set; } - public Guid? ClaimUserId { get; set; } - - [JsonIgnore] - public User ClaimUser { get; set;} - //是否分配了读片医生 //public bool IsAssignDoctorUser{get;set;} }