From f997cec4fb24059dfbe06e45ee0f2e6ec9f5623b Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 15 Jan 2026 16:02:19 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E9=9D=9EDICOM=E9=98=85=E7=89=87=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=94=AF=E6=8C=81=E6=B5=8B=E9=87=8F=E4=B8=8E=E6=A0=87?= =?UTF-8?q?=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reading/dicoms3D/components/toolConfig.js | 37 ++++++++++------ .../visit-review/components/FileViewer.vue | 43 ++++++++++++++++++- 2 files changed, 64 insertions(+), 16 deletions(-) diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/toolConfig.js b/src/views/trials/trials-panel/reading/dicoms3D/components/toolConfig.js index b92ed1c8..9dd68cc1 100644 --- a/src/views/trials/trials-panel/reading/dicoms3D/components/toolConfig.js +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/toolConfig.js @@ -313,6 +313,15 @@ const config = { 'isDisabled': false, 'disabledReason': '' }, + { + 'name': '长短径测量工具', + 'icon': 'bidirection', + 'toolName': 'Bidirectional', + 'props': ['length', 'width'], + 'i18nKey': 'trials:reading:button:bidirectional', + 'isDisabled': false, + 'disabledReason': '' + }, { 'name': '矩形工具', 'icon': 'rectangle', @@ -322,15 +331,6 @@ const config = { 'isDisabled': false, 'disabledReason': '' }, - { - 'name': '箭头工具', - 'icon': 'arrow', - 'toolName': 'ArrowAnnotate', - 'props': [], - 'i18nKey': 'trials:reading:button:arrowAnnotate', - 'isDisabled': false, - 'disabledReason': '' - }, { 'name': '圆形工具', 'icon': 'oval', @@ -349,6 +349,15 @@ const config = { 'isDisabled': false, 'disabledReason': '' }, + { + 'name': '自由曲线', + 'icon': 'polygon', + 'toolName': 'PlanarFreehandROI', + 'props': ['area', 'mean', 'max', 'stdDev', 'perimeter'], + 'i18nKey': 'trials:reading:button:planarFreehandROI', + 'isDisabled': false, + 'disabledReason': '' + }, { 'name': '角度工具', 'icon': 'angle', @@ -359,11 +368,11 @@ const config = { 'disabledReason': '' }, { - 'name': '自由曲线', - 'icon': 'polygon', - 'toolName': 'PlanarFreehandROI', - 'props': ['area', 'mean', 'max', 'stdDev', 'perimeter'], - 'i18nKey': 'trials:reading:button:planarFreehandROI', + 'name': '箭头工具', + 'icon': 'arrow', + 'toolName': 'ArrowAnnotate', + 'props': [], + 'i18nKey': 'trials:reading:button:arrowAnnotate', 'isDisabled': false, 'disabledReason': '' }, diff --git a/src/views/trials/trials-panel/reading/visit-review/components/FileViewer.vue b/src/views/trials/trials-panel/reading/visit-review/components/FileViewer.vue index a874ede7..1ddbf378 100644 --- a/src/views/trials/trials-panel/reading/visit-review/components/FileViewer.vue +++ b/src/views/trials/trials-panel/reading/visit-review/components/FileViewer.vue @@ -308,7 +308,8 @@ const { LengthTool, EllipticalROITool, CircleROITool, - AngleTool + AngleTool, + BidirectionalTool, // cursors } = cornerstoneTools const { MouseBindings, Events: toolsEvents } = csToolsEnums @@ -607,7 +608,7 @@ export default { cornerstoneTools.addTool(EraserTool) cornerstoneTools.addTool(LengthTool) cornerstoneTools.addTool(LengthscaleTool) - + cornerstoneTools.addTool(BidirectionalTool) viewportIds.forEach((viewportId, i) => { const toolGroupId = `canvas-${i}` const toolGroup = ToolGroupManager.createToolGroup(toolGroupId) @@ -635,6 +636,10 @@ export default { cachedStats: false, getTextLines: this.getRectangleROIToolTextLines }) + toolGroup.addTool(BidirectionalTool.toolName, { + // cachedStats: true + getTextLines: this.getBidirectionalToolTextLines + }) toolGroup.addTool(EllipticalROITool.toolName, { cachedStats: false, getTextLines: this.getEllipticalROIToolTextLines @@ -684,6 +689,7 @@ export default { toolGroup.setToolPassive(SplineROITool.toolName) toolGroup.setToolPassive(LengthTool.toolName) toolGroup.setToolPassive(LengthscaleTool.toolName) + toolGroup.setToolPassive(BidirectionalTool.toolName) } else { toolGroup.setToolEnabled(ArrowAnnotateTool.toolName) toolGroup.setToolEnabled(RectangleROITool.toolName) @@ -694,6 +700,7 @@ export default { toolGroup.setToolEnabled(SplineROITool.toolName) toolGroup.setToolEnabled(LengthTool.toolName) toolGroup.setToolEnabled(LengthscaleTool.toolName) + toolGroup.setToolEnabled(BidirectionalTool.toolName) } toolGroup.setToolPassive(EraserTool.toolName) }) @@ -1430,6 +1437,38 @@ export default { } return textLines }, + // 长短径工具注释 + getBidirectionalToolTextLines(data, targetId) { + const { cachedStats, label } = data + const { length, width, unit } = cachedStats[targetId] + let ps = null + const path = targetId.split(`web:${this.OSSclientConfig.basePath}`)[1] + const i = this.psArr.findIndex(i => i.Path === path) + if (i > -1 && this.psArr[i].PS) { + ps = parseFloat(this.psArr[i].PS).toFixed(3) + } + const textLines = [] + if (label) { + textLines.push(data.status ? `${label}(${data.status})` : label) + } + if (length === undefined) { + return textLines + } + if (ps) { + textLines.push( + `L: ${this.reRound(csUtils.roundNumber(length * ps), this.digitPlaces)} mm`, + `S: ${this.reRound(csUtils.roundNumber(width * ps), this.digitPlaces)} mm` + ) + } else { + textLines.push( + `L: ${this.reRound(csUtils.roundNumber(length), this.digitPlaces)} ${unit || unit}`, + `S: ${this.reRound(csUtils.roundNumber(length), this.digitPlaces)} ${unit}` + ) + } + + + return textLines + }, // 直线工具注释 getLengthToolTextLines(data, targetId) { const cachedVolumeStats = data.cachedStats[targetId] From 46fdee6c016d36d1b67b2d30915973f592f2475b Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 15 Jan 2026 16:10:58 +0800 Subject: [PATCH 2/6] =?UTF-8?q?SPM=E5=8F=91=E9=80=81=E6=9C=89=E9=99=90?= =?UTF-8?q?=E8=AE=A9=E4=B8=AD=E5=BF=83=E4=BA=BA=E5=91=98=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E4=BF=A1=E6=81=AF=EF=BC=8C=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E7=9A=84=E9=82=AE=E4=BB=B6=E4=B8=AD=E8=BF=9B?= =?UTF-8?q?=E5=85=A5=E4=B8=AD=E5=BF=83=E8=B0=83=E7=A0=94=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E4=BA=A4=E4=BA=92=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/research/login.vue | 10 +++++++--- src/views/trials/trials-panel/site/index.vue | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/views/research/login.vue b/src/views/research/login.vue index 8009844c..9981902b 100644 --- a/src/views/research/login.vue +++ b/src/views/research/login.vue @@ -42,8 +42,8 @@ {{ $t('trials:researchForm:button:updateQsForm') }} - - + + {{ $t('trials:researchForm:button:cancelUpdateQsForm') }} @@ -214,7 +214,11 @@ export default { let { email, oldEMail, trialSiteId } = this.$route.query if (trialSiteId) this.form.TrialSiteId = trialSiteId if (oldEMail) this.form.ReplaceUserEmailOrPhone = oldEMail - if (email) this.form.EmailOrPhone = email + if (email && email !== 'null') { + this.form.EmailOrPhone = email + } else { + this.form.EmailOrPhone = oldEMail + } } }, methods: { diff --git a/src/views/trials/trials-panel/site/index.vue b/src/views/trials/trials-panel/site/index.vue index 6a3fa3f0..6c37f5b1 100644 --- a/src/views/trials/trials-panel/site/index.vue +++ b/src/views/trials/trials-panel/site/index.vue @@ -193,7 +193,7 @@ {{ $t('common:button:confirm') }} - + {{ $t('common:button:cancel') }} From 95aa3e0be75f37556d027947b46c601f198fd857 Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 15 Jan 2026 16:12:51 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E3=80=90=E5=8F=97=E8=AF=95=E8=80=85?= =?UTF-8?q?=E3=80=91=E5=8F=97=E8=AF=95=E8=80=85-=E5=8F=97=E8=AF=95?= =?UTF-8?q?=E8=80=85=E9=A1=B5=E9=9D=A2=EF=BC=8C=E6=93=8D=E4=BD=9C=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E8=B6=8B=E5=8A=BF=E5=9B=BE=E6=82=AC=E6=B5=AE=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E8=AF=AD=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/trials/trials-panel/subject/subject-list/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/trials/trials-panel/subject/subject-list/index.vue b/src/views/trials/trials-panel/subject/subject-list/index.vue index 957ab68f..5ec8e551 100644 --- a/src/views/trials/trials-panel/subject/subject-list/index.vue +++ b/src/views/trials/trials-panel/subject/subject-list/index.vue @@ -141,7 +141,7 @@ :title="$t('trials:subject:title:report')" @click="handleMessage(scope.row)" /> + circle :title="$t('trials:subject:title:chart')" @click="handleopenSubjectChart(scope.row)" /> From 20ad1c894a91f9c44038de9c1fa9340a65b063df Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 15 Jan 2026 16:16:54 +0800 Subject: [PATCH 4/6] =?UTF-8?q?DICOM=E4=B8=8A=E4=BC=A0=E5=BD=B1=E5=83=8F?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=A2=84=E8=A7=88=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E5=BD=B1=E5=83=8F=E7=9A=84=E9=A1=B5=E9=9D=A2=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../visit/crc-upload/components/uploadDicomFiles2.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue b/src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue index b6a2d28f..bab309bb 100644 --- a/src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue +++ b/src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue @@ -423,7 +423,7 @@ + :title="$t('trials:uploadDicoms:title:previewLocalImage')" append-to-body> From 785ca4ad47e1f24b52c6dddb1bdc7a6308214e5e Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 15 Jan 2026 16:54:29 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E9=9D=9Edicom=E9=98=85=E7=89=87=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E9=83=A8=E4=BD=8D=E7=BF=BB=E8=AF=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../visit-review/components/StudyList.vue | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/views/trials/trials-panel/reading/visit-review/components/StudyList.vue b/src/views/trials/trials-panel/reading/visit-review/components/StudyList.vue index 1616a5d4..0ee5ef3e 100644 --- a/src/views/trials/trials-panel/reading/visit-review/components/StudyList.vue +++ b/src/views/trials/trials-panel/reading/visit-review/components/StudyList.vue @@ -20,7 +20,7 @@ study.StudyName }}
- {{ study.BodyPart }} + {{ getBodyPart(study.BodyPart, study.BodyPartForEditOther) }} {{ study.Modality }}
@@ -74,18 +74,40 @@ export default { activeFileIndex: -1, taskInfo: null, studyList: [], - pdf + pdf, + BodyPart: {} } }, - mounted() { + async mounted() { this.taskInfo = JSON.parse(localStorage.getItem('taskInfo')) this.studyList = this.visitTaskInfo.StudyList if (this.studyList.length === 0) return this.$nextTick(() => { this.activeStudy(this.studyList[0].Id) }) + this.BodyPart.Bodypart = await this.$getBodyPart(this.$route.query.trialId) }, methods: { + getBodyPart(bodyPart, other) { + if (!bodyPart && !other) return '' + var separator = ',' + if (bodyPart.indexOf('|') > -1) { + separator = '|' + } else if (bodyPart.indexOf(',') > -1) { + separator = ',' + } else if (bodyPart.indexOf(',') > -1) { + separator = ',' + } + var arr = bodyPart.split(separator) + var newArr = arr.map((i) => { + return this.$fd('Bodypart', i.trim(), 'Code', this.BodyPart, 'Name') + }) + if (other) { + newArr.push(other) + } + newArr = newArr.filter(Boolean) + return newArr.join(' | ') + }, // 设置初始化激活文件 setInitActiveFile() { if (this.studyList.length === 0) return From 0f845df8dd1b5b08784cdf07460c9f51cde4c006 Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Fri, 16 Jan 2026 10:29:57 +0800 Subject: [PATCH 6/6] =?UTF-8?q?CRC=E5=9C=A8=E5=BD=B1=E5=83=8F=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E6=97=B6=E5=BD=95=E5=85=A5=E7=9A=84=E6=98=AF=E8=8B=B1?= =?UTF-8?q?=E6=96=87=E7=9A=84=E9=83=A8=E4=BD=8D=EF=BC=8C=E4=BD=86=E6=98=AF?= =?UTF-8?q?=E5=9C=A8Study=E9=A1=B5=E9=9D=A2=E5=92=8CReading=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=98=BE=E7=A4=BA=E7=9A=84=E9=83=A8=E4=BD=8D=E5=8D=B4?= =?UTF-8?q?=E4=B8=BA=E4=B8=AD=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/trials/trials-panel/study/index.vue | 273 ++++++------------ 1 file changed, 95 insertions(+), 178 deletions(-) diff --git a/src/views/trials/trials-panel/study/index.vue b/src/views/trials/trials-panel/study/index.vue index 65d26fad..da4ca5bd 100644 --- a/src/views/trials/trials-panel/study/index.vue +++ b/src/views/trials/trials-panel/study/index.vue @@ -5,18 +5,9 @@ - - + + @@ -25,19 +16,9 @@ - - + + {{ item.VisitName }} @@ -45,12 +26,7 @@ - + @@ -60,11 +36,7 @@ {{ $t("common:button:search") }}
- + {{ $t("common:button:reset") }} @@ -73,42 +45,22 @@ - + - - - + + + - + - + @@ -327,30 +237,17 @@
- 复制链接及提取码 + 复制链接及提取码
- -
- + +
+
@@ -411,16 +308,36 @@ export default { trialId: this.$route.query.trialId, tokenKey: getToken(), openWindow: null, - bp: [], + BodyPart: {} }; }, async mounted() { - this.bp = await this.$getBodyPart(this.$route.query.trialId); + this.BodyPart.Bodypart = await this.$getBodyPart(this.$route.query.trialId) this.getSite(); this.getVisitPlanOptions(); this.getList(); }, methods: { + getBodyPart(bodyPart, other) { + if (!bodyPart && !other) return '' + var separator = ',' + if (bodyPart.indexOf('|') > -1) { + separator = '|' + } else if (bodyPart.indexOf(',') > -1) { + separator = ',' + } else if (bodyPart.indexOf(',') > -1) { + separator = ',' + } + var arr = bodyPart.split(separator) + var newArr = arr.map((i) => { + return this.$fd('Bodypart', i.trim(), 'Code', this.BodyPart, 'Name') + }) + if (other) { + newArr.push(other) + } + newArr = newArr.filter(Boolean) + return newArr.join(' | ') + }, // 获取检查列表数据 getList() { this.loading = true; @@ -550,28 +467,28 @@ export default { this.loading = false; }); }, - getBodyPart(bodyPart) { - if (!bodyPart) return ""; - var separator = ","; - if (bodyPart.indexOf("|") > -1) { - separator = "|"; - } else if (bodyPart.indexOf(",") > -1) { - separator = ","; - } else if (bodyPart.indexOf(",") > -1) { - separator = ","; - } - var arr = bodyPart.split(separator); - var newArr = arr.map((i) => { - return this.$fd( - "Bodypart", - i.trim(), - "Code", - { Bodypart: this.bp }, - "Name" - ); - }); - return newArr.join(" | "); - }, + // getBodyPart(bodyPart) { + // if (!bodyPart) return ""; + // var separator = ","; + // if (bodyPart.indexOf("|") > -1) { + // separator = "|"; + // } else if (bodyPart.indexOf(",") > -1) { + // separator = ","; + // } else if (bodyPart.indexOf(",") > -1) { + // separator = ","; + // } + // var arr = bodyPart.split(separator); + // var newArr = arr.map((i) => { + // return this.$fd( + // "Bodypart", + // i.trim(), + // "Code", + // { Bodypart: this.bp }, + // "Name" + // ); + // }); + // return newArr.join(" | "); + // }, // 复制 copyCode() { this.$copyText(`链接: ${this.shareLink} 提取码: ${this.extractionCode}`)