From cc02fee7cb4969966f89d1245b75cf9d1eb051a0 Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 28 Aug 2025 14:53:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=B3=E9=94=AE=E5=BA=8F=E5=88=97=E5=9C=A8?= =?UTF-8?q?=E6=A0=87=E8=AE=B0=E5=AE=8C=E6=88=90=E5=90=8E=E7=AB=8B=E5=8D=B3?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/modules/reading.js | 113 ++++++- .../reading/dicoms/components/DicomCanvas.vue | 22 +- .../reading/dicoms/components/DicomViewer.vue | 311 +++++++++++++++++- .../components/IRecist/QuestionForm.vue | 4 + .../components/MRecist/QuestionForm.vue | 4 + .../dicoms/components/PCWG/QuestionForm.vue | 3 + .../dicoms/components/Recist/QuestionForm.vue | 4 + .../components/RecistBM/QuestionForm.vue | 4 + .../reading/dicoms/components/StudyList.vue | 254 ++++++++------ 9 files changed, 600 insertions(+), 119 deletions(-) diff --git a/src/store/modules/reading.js b/src/store/modules/reading.js index 4a41142..0387d5a 100644 --- a/src/store/modules/reading.js +++ b/src/store/modules/reading.js @@ -908,7 +908,118 @@ const actions = { } }) }, - + getKeySeries({ state }, obj) { + return new Promise(resolve => { + console.log('getKeySeries') + let { study, idx, visitTaskId } = obj + let data = null + var index = state.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId) + var keyImages = [] + if (study) { + data = {} + const series = study.SeriesList && study.SeriesList + series.map(i => { + i.InstanceInfoList.map(k => { + keyImages.push({ instanceId: k.Id }) + }) + }) + data.StudyId = study.StudyId + data.StudyCode = study.StudyCode + data.Modalities = study.Modalities + data.SeriesCount = study.SeriesCount + data.InstanceCount = study.InstanceCount + data.InstanceCount = study.InstanceCount + data.IsDicom = study.IsDicom + data.PreviewImageCount = 0 + data.IsCriticalSequence = study.IsCriticalSequence + var seriesList = [] + study.SeriesList.forEach((series, seriesIndex) => { + const imageIds = [] + const instanceList = [] + series.InstanceInfoList.forEach(instance => { + if (instance.NumberOfFrames && instance.NumberOfFrames > 1) { + if (study.IsCriticalSequence && instance.KeyFramesList.length > 0) { + instance.KeyFramesList.map(i => { + const imageId = `wadouri:${localStorage.getItem('location') !== 'USA' ? Vue.prototype.OSSclientConfig.basePath : Vue.prototype.OSSclientConfig.basePath}${instance.Path}?frame=${i}&instanceId=${instance.Id}&visitTaskId=${obj.visitTaskId}&idx=${idx}|${seriesIndex}|${index}` + imageIds.push(imageId) + }) + } else { + for (let i = 0; i < instance.NumberOfFrames; i++) { + const imageId = `wadouri:${localStorage.getItem('location') !== 'USA' ? Vue.prototype.OSSclientConfig.basePath : Vue.prototype.OSSclientConfig.basePath}${instance.Path}?frame=${i}&instanceId=${instance.Id}&visitTaskId=${obj.visitTaskId}&idx=${idx}|${seriesIndex}|${index}` + imageIds.push(imageId) + } + } + instance.ImageId = `wadouri:${localStorage.getItem('location') !== 'USA' ? Vue.prototype.OSSclientConfig.basePath : Vue.prototype.OSSclientConfig.basePath}${instance.Path}?frame=${0}&instanceId=${instance.Id}&visitTaskId=${obj.visitTaskId}&idx=${idx}|${seriesIndex}|${index}` + } else { + const imageId = `wadouri:${localStorage.getItem('location') !== 'USA' ? Vue.prototype.OSSclientConfig.basePath : Vue.prototype.OSSclientConfig.basePath}${instance.Path}?instanceId=${instance.Id}&visitTaskId=${obj.visitTaskId}&idx=${idx}|${seriesIndex}|${index}` + imageIds.push(imageId) + instance.ImageId = imageId + } + if (!study.IsCriticalSequence && series.IsBeMark) { + const i = keyImages.findIndex(i => i.instanceId === instance.Id) + if (i > -1) { + keyImages[i].idx = idx + keyImages[i].seriesIndex = seriesIndex + } + } + instanceList.push(instance.Id) + }) + seriesList.push({ + isDicom: study.IsDicom, + imageIds: imageIds, + instanceInfoList: series.InstanceInfoList, + instanceList: instanceList, + seriesId: series.Id, + imageIdIndex: 0, + seriesUid: series.SeriesInstanceUid, + seriesNumber: series.SeriesNumber, + sliceThickness: series.SliceThickness, + modality: series.Modality, + description: series.Description, + previewImageUrl: study.IsDicom ? series.ImageResizePath ? Vue.prototype.OSSclientConfig.basePath + series.ImageResizePath : `/api/series/preview/${series.Id}` : Vue.prototype.OSSclientConfig.basePath + `${series.NoneDicomFileFirstFile}`, + instanceCount: series.InstanceCount, + instanceHtmlPathList: series.InstanceHtmlPathList, + prefetchInstanceCount: 0, + loadStatus: false, + imageloadedArr: series.InstanceInfoList, + studyId: study.StudyId, + studyIndex: idx, + seriesIndex: seriesIndex, + studyCode: study.StudyCode, + taskBlindName: state.visitTaskList[index].TaskBlindName, + visitTaskId: obj.visitTaskId, + readingTaskState: state.visitTaskList[index].ReadingTaskState, + isBaseLineTask: state.visitTaskList[index].IsBaseLineTask, + isCurrentTask: state.visitTaskList[index].IsCurrentTask, + isExistsClinicalData: state.visitTaskList[index].IsExistsClinicalData, + isLoading: false, + isBeMark: series.IsBeMark, + ww: series.WindowWidth, + wc: series.WindowCenter, + isExistMutiFrames: series.IsExistMutiFrames + }) + }) + data.SeriesList = seriesList + } + let stateIndex = state.visitTaskList[index].StudyList.findIndex(item => item.IsCriticalSequence) + console.log(stateIndex, 'stateIndex') + if (data) { + if (!!~stateIndex) { + state.visitTaskList[index].StudyList.splice(stateIndex, 1, data) + } else { + state.visitTaskList[index].StudyList.unshift(data) + } + } else { + if (!!~stateIndex) { + state.visitTaskList[index].StudyList.splice(stateIndex, 1) + } + } + state.visitTaskList[index].studyListInit = true + state.visitTaskList[index].KeyImages = keyImages + // sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '') + resolve(data) + }) + }, updateStudyList({ state }, obj) { return new Promise(resolve => { var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId) diff --git a/src/views/trials/trials-panel/reading/dicoms/components/DicomCanvas.vue b/src/views/trials/trials-panel/reading/dicoms/components/DicomCanvas.vue index 8bb2e1a..dae838b 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/DicomCanvas.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/DicomCanvas.vue @@ -292,7 +292,8 @@ export default { ], scrollSyncInfo: { offset: 0 }, - hideMeasureArr: [] + hideMeasureArr: [], + IsCriticalSequence: false } }, @@ -542,7 +543,7 @@ export default { mouseUp(e) { // console.log('mouseUp') - if (this.readingTaskState >= 2) return + if (this.readingTaskState >= 2 || this.IsCriticalSequence) return this.image = e.detail.image this.getToolStateInfo(e) }, @@ -566,6 +567,10 @@ export default { e.stopPropagation() e.preventDefault() } + } else if (this.IsCriticalSequence) { + e.stopImmediatePropagation() + e.stopPropagation() + e.preventDefault() } }, pointNearTool(e) { @@ -909,7 +914,7 @@ export default { }) }, setMeasureDataVisible() { - if (this.readingTaskState >= 2) return + if (this.readingTaskState >= 2 || this.IsCriticalSequence) return var element = cornerstone.getEnabledElement(this.canvas) var { imageId } = element.image const imageInfo = this.getInstanceInfo(imageId) @@ -974,6 +979,7 @@ export default { } }, mouseClick(e) { + if (this.IsCriticalSequence) return false const { element, currentPoints, image, viewport } = e.detail var imageId = image.imageId const imageInfo = this.getInstanceInfo(imageId) @@ -1031,6 +1037,12 @@ export default { }, loadImageStack(dicomSeries) { return new Promise(resolve => { + var idx = this.visitTaskList.findIndex(item => item.VisitTaskId === dicomSeries.visitTaskId) + if (!!~idx) { + this.IsCriticalSequence = this.visitTaskList[idx].StudyList[dicomSeries.studyIndex].IsCriticalSequence + } else { + this.IsCriticalSequence = false + } this.isCurrentTask = dicomSeries.isCurrentTask this.isBaseline = dicomSeries.isBaseLineTask this.readingTaskState = dicomSeries.readingTaskState @@ -1329,7 +1341,7 @@ export default { this.setMarkers() }, onMeasurementcompleted(e) { - if (this.readingTaskState >= 2) return + if (this.readingTaskState >= 2 || this.IsCriticalSequence) return var element = cornerstone.getEnabledElement(this.canvas) var viewport = element.viewport @@ -1453,7 +1465,7 @@ export default { onMeasurementmodified(e) { // 移动 // console.log('modified') - if (this.readingTaskState >= 2) return + if (this.readingTaskState >= 2 || this.IsCriticalSequence) return const { measurementData, toolType } = e.detail var element = cornerstone.getEnabledElement(this.canvas) var viewport = element.viewport diff --git a/src/views/trials/trials-panel/reading/dicoms/components/DicomViewer.vue b/src/views/trials/trials-panel/reading/dicoms/components/DicomViewer.vue index 65b2d88..09294b5 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/DicomViewer.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/DicomViewer.vue @@ -280,6 +280,18 @@