From 4a8b1da09463069a77db76c8e17e498003917b63 Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 30 Apr 2026 09:12:03 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E9=83=A8=E5=88=86=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trials-panel/reading/dicoms3D/components/ReadPage.vue | 5 +++-- .../trials-panel/reading/dicoms3D/components/SegmentForm.vue | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue index f91f24e8..a4e18cea 100644 --- a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue @@ -2981,9 +2981,9 @@ export default { }, // 重置视口 async resetViewport() { - this.setToolsPassive() const renderingEngine = getRenderingEngine(renderingEngineId) if (this.isFusion) { + this.setToolsPassive() const fusionViewportIds = ['viewport-fusion-0', 'viewport-fusion-1', 'viewport-fusion-2', 'viewport-fusion-3'] const fusionAllViewportIds = [...fusionViewportIds, 'viewport-fusion-hidden-sag'] for (const id of fusionAllViewportIds) { @@ -3049,6 +3049,7 @@ export default { return this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setFullScreen(index) } + this.setToolsPassive() if (this.readingTool === 3 && this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].series.Modality === 'PT') { viewport.setProperties({ voiRange: { upper: 5, lower: 0 } }) } @@ -3524,7 +3525,7 @@ export default { if (!obj.IsDicom) { return this.previewNoneDicoms(obj) } - this.activeViewportIndex = 0 + // this.activeViewportIndex = 0 this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setSeriesInfo(obj) this.clipPlaying = false this.fps = 15 diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/SegmentForm.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/SegmentForm.vue index 198f45c0..3276bb1a 100644 --- a/src/views/trials/trials-panel/reading/dicoms3D/components/SegmentForm.vue +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/SegmentForm.vue @@ -145,6 +145,7 @@ export default { } }, async handleChange(e, key) { + this.handleClear(e, key) if (key === 'study') { this.seriesList = this.studyList.find(item => item.StudyId === this.form.studyId).SeriesArr } From 128cdc0f7568a9f9a668679e7ff361c3d658ccbf Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 30 Apr 2026 11:23:31 +0800 Subject: [PATCH 02/13] =?UTF-8?q?=E3=80=90dicom=E5=88=86=E5=89=B2=E3=80=91?= =?UTF-8?q?=E7=9B=B4=E6=96=B9=E5=9B=BEx=E8=BD=B4=E5=9D=90=E6=A0=87?= =?UTF-8?q?=E5=BA=94=E8=AF=A5=E6=98=AF=E4=BB=8E=E5=B0=8F=E5=88=B0=E5=A4=A7?= =?UTF-8?q?=EF=BC=8C=E7=8E=B0=E5=9C=A8=E5=9D=90=E6=A0=87=E6=95=B0=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reading/dicoms3D/components/histogram.vue | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/histogram.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/histogram.vue index 7653d6b9..2aaa968e 100644 --- a/src/views/trials/trials-panel/reading/dicoms3D/components/histogram.vue +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/histogram.vue @@ -221,6 +221,7 @@ export default { Object.keys(this.seriesData).forEach(key => { if (key !== 'default' || this.isNeedDefault) seriesData.push(this.seriesData[key]) }) + seriesData = this.formatSeriesData(seriesData) this.chart.clear(); const option = { useUTC: true, @@ -287,6 +288,27 @@ export default { }; this.chart.setOption(option); }, + formatSeriesData(seriesData) { + let arr = [] + seriesData.forEach(serie => { + serie.data.forEach(item => { + if (!arr.includes(item[0])) arr.push(item[0]) + }) + }) + arr = arr.sort((a, b) => a - b) + seriesData.forEach(serie => { + let data = [] + arr.forEach(item => { + if (serie.objKey[item]) { + data.push([item, serie.objKey[item]]) + } else { + data.push([item, 0]) + } + }) + serie.data = data + }) + return seriesData + }, async generateData(annotation) { var seriesData = []; var min = null; @@ -297,10 +319,8 @@ export default { } else { res = await this.getCurrentSliceValuesFromVoxelManager(this.renderingEngineId, `${this.viewportKey}-${this.activeViewportIndex}`) } + let obj = {} if (res) { - let obj = { - - } res.values.forEach(item => { if (obj[item]) { obj[item]++ @@ -327,7 +347,8 @@ export default { seriesData: { type: 'line', symbolSize: 0, - data: seriesData + data: seriesData, + objKey: obj }, min: min, max: max From d88535b75eafdda4253150e65b438ed0bf37480c Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 30 Apr 2026 11:46:57 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E3=80=90dicom=E5=88=86=E5=89=B2=E3=80=91?= =?UTF-8?q?=E6=9C=89=E7=9A=84=E5=BD=B1=E5=83=8F=E6=97=A0=E6=B3=95=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=EF=BC=8C=E9=9C=80=E8=A6=81=E5=A2=9E=E5=8A=A0=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reading/dicoms3D/components/ReadPage.vue | 1 - .../reading/dicoms3D/components/StudyList.vue | 11 ++++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue index a4e18cea..7f652434 100644 --- a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue @@ -1052,7 +1052,6 @@ export default { let imageId = imageIds[0] const imagePixelModule = metaData.get('imagePixelModule', imageId); const photometricInterpretation = imagePixelModule?.photometricInterpretation; - console.log(photometricInterpretation, 'photometricInterpretation') if (photometricInterpretation && photometricInterpretation !== 'MONOCHROME1' && photometricInterpretation !== 'MONOCHROME2') return this.$confirm(this.$t('trials:histogram:confirm:photometricInterpretationNotSupported')) this.histogramVisible = true this.setToolsPassive() diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/StudyList.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/StudyList.vue index b5595516..a498954d 100644 --- a/src/views/trials/trials-panel/reading/dicoms3D/components/StudyList.vue +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/StudyList.vue @@ -74,9 +74,11 @@ #{{ series.SeriesNumber }} -
+
{{ series.Description }} -
+

{{ $t('trials:ptData:title') }}

@@ -198,6 +200,9 @@ export default { }, methods: { activeSeries(series, seriesIndex, studyIndex) { + const photometricInterpretation = series?.InstanceInfoList[0]?.PhotometricInterpretation; + if (!photometricInterpretation || (photometricInterpretation !== 'MONOCHROME1' && photometricInterpretation !== 'MONOCHROME2')) + return this.$confirm(this.$t('trials:histogram:confirm:activeSeriesPhotometricInterpretationNotSupported')) this.activeStudyIndex = studyIndex this.activeSeriesIndex = seriesIndex this.$emit('activeSeries', series) @@ -286,7 +291,7 @@ export default { line-height: 18px; } -.patient-info-popper .patient-info-row + .patient-info-row { +.patient-info-popper .patient-info-row+.patient-info-row { margin-top: 4px; } From 192f7a3316f47651539fe9d3d869de42fcd6b2e6 Mon Sep 17 00:00:00 2001 From: caiyiling <1321909229@qq.com> Date: Thu, 30 Apr 2026 13:35:52 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=82=BF=E7=98=A4=E5=AD=A6=E9=98=85=E7=89=87=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/AddSubjectRP.vue | 2 +- .../subject/reading-period/index.vue | 25 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/views/trials/trials-panel/subject/reading-period/components/AddSubjectRP.vue b/src/views/trials/trials-panel/subject/reading-period/components/AddSubjectRP.vue index c2fe98bf..52875a57 100644 --- a/src/views/trials/trials-panel/subject/reading-period/components/AddSubjectRP.vue +++ b/src/views/trials/trials-panel/subject/reading-period/components/AddSubjectRP.vue @@ -138,7 +138,7 @@ export default { addReadModule(this.form).then(res => { this.btnLoading = false this.$emit('getList') - this.$emit('close') + this.$emit('close', {visitStageId: this.form.VisitStageId}) this.form.Name = null this.form.VisitStageId = null this.$message.success(this.$t('common:message:savedSuccessfully')) diff --git a/src/views/trials/trials-panel/subject/reading-period/index.vue b/src/views/trials/trials-panel/subject/reading-period/index.vue index 8fa374b5..b3d03a84 100644 --- a/src/views/trials/trials-panel/subject/reading-period/index.vue +++ b/src/views/trials/trials-panel/subject/reading-period/index.vue @@ -382,7 +382,7 @@ + @close="subjectPeriodClose" @getList="getList" /> Date: Thu, 30 Apr 2026 14:25:48 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E9=98=85=E7=89=87=E6=9C=9F=E4=B8=B4?= =?UTF-8?q?=E5=BA=8A=E6=95=B0=E6=8D=AE=E6=B7=BB=E5=8A=A0=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/trials.js | 9 ++++ .../components/ClinicalData.vue | 41 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/api/trials.js b/src/api/trials.js index 3c367114..717ce7c0 100644 --- a/src/api/trials.js +++ b/src/api/trials.js @@ -4457,4 +4457,13 @@ export function amendmentPatientInfo(data) { method: 'post', data }) +} + +//修改临床数据后 将签名状态变更为未签名 +export function updateReadModuleClinicalData(data) { + return request({ + url: `/ReadingClinicalData/updateReadModuleClinicalData`, + method: 'post', + data + }) } \ No newline at end of file diff --git a/src/views/trials/trials-panel/subject/reading-period/components/ClinicalData.vue b/src/views/trials/trials-panel/subject/reading-period/components/ClinicalData.vue index 7c2a0024..97d6ea6e 100644 --- a/src/views/trials/trials-panel/subject/reading-period/components/ClinicalData.vue +++ b/src/views/trials/trials-panel/subject/reading-period/components/ClinicalData.vue @@ -143,6 +143,15 @@ scope.row.IsSign || scope.row.UploadRole === 0 " @click="handleDelete(scope.row)" /> + + @@ -285,6 +294,15 @@ scope.row.IsSign || scope.row.UploadRole === 0 " @click="handleDelete(scope.row)" /> + + @@ -328,6 +346,7 @@ import { getTrialClinicalDataSelect, getConsistencyAnalysisReadingClinicalDataList, signConsistencyAnalysisReadingClinicalData, + updateReadModuleClinicalData } from '@/api/trials' import AddOrEditCD from './AddOrEditCD' import Verification from './Verification' @@ -658,6 +677,28 @@ export default { }) .catch(() => { }) }, + async handleUpdateStatus(row) { + try { + const confirm = await this.$confirm(this.$t('trials:readingPeriod:cd:message:updateCDStatus'), { + type: 'warning', + distinguishCancelAndClose: true, + }) + if (confirm === 'confirm') { + this.loading = true + let res = await updateReadModuleClinicalData({readingClinicalDataId: row.Id}) + this.loading = false + if (res.IsSuccess) { + this.getList() + this.$message.success(this.$t('common:message:savedSuccessfully')) + } + } else { + this.subjectPeriod.visible = true + } + } catch(e) { + this.loading = false + console.log(e) + } + }, handleSign(from) { // this.currentData = { ...row } this.currentData.IsBlind = from.IsBlind From 4f16060a46ddb62a5fb92b596c70f13a28161132 Mon Sep 17 00:00:00 2001 From: caiyiling <1321909229@qq.com> Date: Thu, 30 Apr 2026 14:35:17 +0800 Subject: [PATCH 06/13] =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E6=9C=AA=E9=9A=94?= =?UTF-8?q?=E7=A6=BB=E5=AF=BC=E8=87=B4=E9=98=85=E7=89=87=E4=BA=BA=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E9=A1=B5=EF=BC=8C=E5=8F=B3=E4=BE=A7=E6=8E=92=E7=89=88?= =?UTF-8?q?=E9=94=99=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Dicom/DicomViewer.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Dicom/DicomViewer.vue b/src/components/Dicom/DicomViewer.vue index 8eefb5dd..9b916af2 100644 --- a/src/components/Dicom/DicomViewer.vue +++ b/src/components/Dicom/DicomViewer.vue @@ -1218,7 +1218,7 @@ export default { -.btnBox { +.dicom-tools .btnBox { display: inline-block; width: 80px; text-align: center; From c12da4de3e2820d5db52b00d38229b4f91bd3515 Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 30 Apr 2026 14:54:16 +0800 Subject: [PATCH 07/13] =?UTF-8?q?=E5=88=86=E5=89=B2=E9=83=A8=E5=88=86?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dicoms3D/components/MPRViewport.vue | 14 ++- .../reading/dicoms3D/components/ReadPage.vue | 2 +- .../dicoms3D/components/Segmentations.vue | 10 +- .../components/helpers/segmentations.js | 111 +++++++++--------- 4 files changed, 77 insertions(+), 60 deletions(-) diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue index 0caaa393..8a74b534 100644 --- a/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue @@ -120,6 +120,10 @@ export default { type: Boolean, default: false }, + isMPR: { + type: Boolean, + default: false + }, actionConfiguration: { type: Object, default: () => { @@ -251,6 +255,7 @@ export default { }, SegmentConfig: { handler() { + if (!this.isMPR) return false if (!this.segmentationId) return false if (!this.series.TaskInfo) return false readingSegmentByConfig(this.series, this.series.TaskInfo, this.viewportId, this.segmentationId, this.SegmentConfig) @@ -258,11 +263,13 @@ export default { deep: true }, segmentIndex() { + if (!this.isMPR) return false if (this.curSegSeries.Id !== this.series.Id || this.curSegSeries.VisitTaskId !== this.series.VisitTaskId) return false if (this.segmentIndex <= 0) return false selectSegment(this.viewportId, this.segmentationId, this.segmentIndex) }, segmentationId() { + if (!this.isMPR) return false if (this.curSegSeries.Id !== this.series.Id || this.curSegSeries.VisitTaskId !== this.series.VisitTaskId) return false if (!this.segmentationId) return false selectSegmentation(this.viewportId, this.segmentationId) @@ -665,8 +672,11 @@ export default { renderingEngine.render() }, 100) } - await renderSegmentation(this.series, this.series.TaskInfo, this.viewportId, this.SegmentConfig, this.renderingEngineId, null, this.actionConfiguration, this.segmentationId, this.segmentIndex) - DicomEvent.$emit('SegmentationLoading', this.viewportId) + if (this.isMPR) { + await renderSegmentation(this.series, this.series.TaskInfo, this.viewportId, this.SegmentConfig, this.renderingEngineId, null, this.actionConfiguration, this.segmentationId, this.segmentIndex) + DicomEvent.$emit('SegmentationLoading', this.viewportId) + } + let volume = cache.getVolume(this.volumeId) // console.log(volume, 'volume') if (this.series.orientation === 'AXIAL' && this.series.curIndex) return this.setFullScreen(this.series.curIndex) diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue index 7f652434..b933a348 100644 --- a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue @@ -344,7 +344,7 @@ :viewport-index="index" :histogramVisible="histogramVisible" :actionConfiguration="actionConfiguration" :SegmentConfig="SegmentConfig" :segmentationId.sync="segId" :segmentIndex.sync="segIndex" :curSegSeries.sync="curSegSeries" - :MPRInfo="MPRInfo" @activeViewport="activeViewport" @setMPRInfo="setMPRInfo" + :isMPR="isMPR" :MPRInfo="MPRInfo" @activeViewport="activeViewport" @setMPRInfo="setMPRInfo" @toggleTaskByViewport="toggleTaskByViewport" @previewCD="previewCD" @renderAnnotations="renderAnnotations" @contentMouseup="contentMouseup" @resetHistogram="resetHistogram" v-resize="(e) => handleSizeChange(e, `viewport-MPR-${index}`)" /> diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue index d5b2b0c1..9b437ab9 100644 --- a/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue @@ -127,7 +127,7 @@ {{ $t('trials:reading:Segmentations:title:InactiveSegmentationsShow') - }} + }}