From bb00ac10f868f0e1e1550e058971698718139c49 Mon Sep 17 00:00:00 2001 From: caiyiling <1321909229@qq.com> Date: Tue, 30 Jun 2026 16:00:52 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E7=89=87=E5=AE=8C=E6=88=90=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E4=B8=8Bradio=E6=A0=B7=E5=BC=8F=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=EF=BC=9B=E9=98=85=E7=89=87=E4=B8=AD=E6=8F=90=E4=BA=A4=E5=92=8C?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E4=BC=98=E5=8C=96=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trials-panel/reading/ad-review/index.vue | 51 +++-- .../components/AdditionalAssessment.vue | 19 +- .../dicoms/components/AssessmentFormItem.vue | 5 + .../reading/dicoms/components/DicomViewer.vue | 45 +++-- .../dicoms/components/Fusion/FusionForm.vue | 30 +-- .../dicoms/components/Fusion/QuestionItem.vue | 5 + .../dicoms/components/Fusion/Questions.vue | 15 +- .../components/Fusion/TableQuestionItem.vue | 22 ++- .../components/IRecist/QuestionForm.vue | 33 +++- .../dicoms/components/IVUS/QuestionList.vue | 54 +++-- .../components/IVUS/QuestionTableFormItem.vue | 5 + .../dicoms/components/Lugano/QuestionForm.vue | 46 +++-- .../LuganoWithoutPET/QuestionForm.vue | 46 +++-- .../components/MRIPDFF/QuestionForm.vue | 26 ++- .../MRIPDFFAdvance/QuestionForm.vue | 20 +- .../dicoms/components/OCT/QuestionList.vue | 54 +++-- .../components/OCT/QuestionTableFormItem.vue | 5 + .../reading/dicoms/components/Others.vue | 11 +- .../dicoms/components/PCWG/QuestionForm.vue | 38 +++- .../dicoms/components/QuestionItem.vue | 5 + .../reading/dicoms/components/Questions.vue | 20 +- .../dicoms/components/Recist/QuestionForm.vue | 33 +++- .../components/RecistBM/QuestionForm.vue | 33 +++- .../reading/dicoms/components/ReportPage.vue | 124 +++++++----- .../reading/dicoms/components/WLForm.vue | 11 +- .../components/Recist/QuestionFormItem.vue | 9 +- .../components/Recist/QuestionList.vue | 47 ++++- .../Recist/TableQuestionFormItem.vue | 5 + .../dicoms3D/components/ReportPage.vue | 185 ++++++++++-------- .../components/customize/QuestionFormItem.vue | 15 +- .../components/customize/QuestionList.vue | 91 ++++++--- .../customize/QuestionTableFormItem.vue | 15 +- .../components/customize/ReportPage.vue | 34 +++- .../components/mRecist/QuestionFormItem.vue | 9 +- .../components/mRecist/QuestionList.vue | 36 +++- .../mRecist/TableQuestionFormItem.vue | 5 + .../components/CustomizeTable.vue | 4 +- .../components/EditGlobalForm.vue | 8 +- .../global-review/components/IRecistTable.vue | 6 +- .../global-review/components/LuganoTable.vue | 4 +- .../components/LuganoWithoutPETTable.vue | 4 +- .../global-review/components/MRecistTable.vue | 4 +- .../global-review/components/PCWG3Table.vue | 4 +- .../components/PGWC3EditGlobalForm.vue | 8 +- .../components/RecistBMTable.vue | 6 +- .../global-review/components/RecistTable.vue | 4 +- .../reading/global-review/index.vue | 36 ++-- .../reading/oncology-review/index.vue | 107 +++++----- 48 files changed, 955 insertions(+), 447 deletions(-) diff --git a/src/views/trials/trials-panel/reading/ad-review/index.vue b/src/views/trials/trials-panel/reading/ad-review/index.vue index 0a85c255..d49c283f 100644 --- a/src/views/trials/trials-panel/reading/ad-review/index.vue +++ b/src/views/trials/trials-panel/reading/ad-review/index.vue @@ -208,11 +208,11 @@ {{ $t("trials:readingReport:button:skip") }} - {{ + {{ $t("common:button:save") }} - {{ + {{ $t("common:button:submit") }} @@ -347,7 +347,8 @@ export default { openWindow: null, isFixed: false, images: [], - remark: '' + remark: '', + submitLockAction: '' } }, // watch: { @@ -494,31 +495,43 @@ export default { window.open(routeData.href, '_blank') }, async handleSave() { - const valid = await this.$refs['adForm'].validate() - if (!valid) return + if (this.submitLockAction) return false + this.submitLockAction = 'save' this.loading = true - var paths = [] - this.fileList.map((file) => { - if (file.url) { - paths.push(file.url) - } - }) - this.adForm.judgeResultImagePathList = paths - this.adForm.visitTaskId = this.visitTaskId try { + const valid = await this.$refs['adForm'].validate() + if (!valid) return false + var paths = [] + this.fileList.map((file) => { + if (file.url) { + paths.push(file.url) + } + }) + this.adForm.judgeResultImagePathList = paths + this.adForm.visitTaskId = this.visitTaskId await saveJudgeVisitTaskResult(this.adForm) this.$message.success(this.$t('common:message:savedSuccessfully')) - this.loading = false + return true } catch (e) { + return false + } finally { this.loading = false + this.submitLockAction = '' } }, async handleSubmit() { - const valid = await this.$refs['adForm'].validate() - if (!valid) return - const { ImageAssessmentReportConfirmation } = const_.processSignature - this.signCode = ImageAssessmentReportConfirmation - this.signVisible = true + if (this.submitLockAction) return false + this.submitLockAction = 'submit' + try { + const valid = await this.$refs['adForm'].validate() + if (!valid) return false + const { ImageAssessmentReportConfirmation } = const_.processSignature + this.signCode = ImageAssessmentReportConfirmation + this.signVisible = true + return true + } finally { + this.submitLockAction = '' + } }, // 关闭签名框 closeSignDialog(isSign, signInfo) { diff --git a/src/views/trials/trials-panel/reading/dicoms/components/AdditionalAssessment.vue b/src/views/trials/trials-panel/reading/dicoms/components/AdditionalAssessment.vue index 8725c252..c0522f04 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/AdditionalAssessment.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/AdditionalAssessment.vue @@ -47,7 +47,8 @@ {{ $t('common:button:cancel') }} - + {{ $t('common:button:save') }} @@ -84,7 +85,8 @@ export default { data() { return { form: {}, - isRender: false + isRender: false, + saveLoading: false } }, computed: { @@ -106,10 +108,13 @@ export default { }, methods: { async handleSave() { - const valid = await this.$refs.assessmentForm.validate() - if (!valid) return - const loading = this.$loading({ fullscreen: true }) + if (this.saveLoading) return + this.saveLoading = true + let loading = null try { + const valid = await this.$refs.assessmentForm.validate() + if (!valid) return + loading = this.$loading({ fullscreen: true }) var answers = [] for (const k in this.form) { answers.push({ questionId: k, answer: this.form[k] }) @@ -125,7 +130,9 @@ export default { loading.close() } catch (e) { console.log(e) - loading.close() + } finally { + if (loading) loading.close() + this.saveLoading = false } }, handleCancel() { diff --git a/src/views/trials/trials-panel/reading/dicoms/components/AssessmentFormItem.vue b/src/views/trials/trials-panel/reading/dicoms/components/AssessmentFormItem.vue index db4cf4dc..df595120 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/AssessmentFormItem.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/AssessmentFormItem.vue @@ -113,4 +113,9 @@ export default { .mb { margin-bottom: 0px; } + +::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #428bca; + border-color: #428bca; +} 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 9c301889..f9e51881 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/DicomViewer.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/DicomViewer.vue @@ -556,7 +556,8 @@ {{ $t('trials:readingReport:button:skip') }} - + {{ $t('common:button:submit') }} @@ -617,7 +618,8 @@
- + {{ $t('common:button:confirm') }}
@@ -698,7 +700,8 @@ {{ $t('common:button:cancel') }} - + {{ $t('common:button:confirm') }} @@ -964,6 +967,9 @@ export default { signCode: null, currentUser: zzSessionStorage.getItem('userName'), tmpData: null, + submitLoading: false, + fusionSubmitLoading: false, + keyDocSubmitting: false, AspectRatio: 1, listShow: true, @@ -1234,6 +1240,8 @@ export default { this.$emit('handleReadingChart', e) }, async handleSubmitKeyDoc() { + if (this.keyDocSubmitting) return + this.keyDocSubmitting = true try { let data = { TrialCriterionId: this.$router.currentRoute.query.TrialReadingCriterionId, @@ -1245,6 +1253,8 @@ export default { } } catch (err) { console.log(err) + } finally { + this.keyDocSubmitting = false } }, showPanel(e, toolName) { @@ -2435,6 +2445,8 @@ export default { } }, async submit() { + if (this.submitLoading) return + this.submitLoading = true const loading = this.$loading({ fullscreen: true }) try { const idx = this.visitTaskList.findIndex(i => i.IsCurrentTask) @@ -2449,6 +2461,8 @@ export default { loading.close() } catch (e) { loading.close() + } finally { + this.submitLoading = false } }, // 关闭签名框 @@ -2584,15 +2598,18 @@ export default { this.petSeriesInfo = {} } }, - handleSubmitFusionSeries() { - this.$refs['fusionForm'].validate(async (valid) => { + async handleSubmitFusionSeries() { + if (this.fusionSubmitLoading) return + this.fusionSubmitLoading = true + try { + const valid = await this.$refs['fusionForm'].validate() if (!valid) return if (Object.keys(this.ctSeriesInfo).length === 0 || Object.keys(this.petSeriesInfo).length === 0) { // '请选择序列信息!' - this.$confirm(this.$t('trials:lugano:fusionDialog:message:checkSeries'), this.$t('trials:lugano:fusionDialog:warning'), { + await this.$confirm(this.$t('trials:lugano:fusionDialog:message:checkSeries'), this.$t('trials:lugano:fusionDialog:warning'), { showCancelButton: false, type: 'warning' - }).then(() => { }).catch(() => { }) + }).catch(() => {}) return } if (this.ctSeriesInfo.instanceCount > 400) { @@ -2602,15 +2619,15 @@ export default { var count = Math.abs(this.ctSeriesInfo.instanceCount - this.petSeriesInfo.instanceCount) if (count > 10) { // '选择的两组序列,影像数存在较大差距, 是否继续?' - this.$confirm(this.$t('trials:lugano:fusionDialog:message:validSeries'), this.$t('trials:lugano:fusionDialog:warning'), { + const confirm = await this.$confirm(this.$t('trials:lugano:fusionDialog:message:validSeries'), this.$t('trials:lugano:fusionDialog:warning'), { type: 'warning' - }).then(() => { - this.fusion() - }).catch(() => { }) - } else { - this.fusion() + }).catch(() => false) + if (confirm !== 'confirm') return } - }) + this.fusion() + } finally { + this.fusionSubmitLoading = false + } }, fusion() { // sessionStorage.setItem('ctSeriesInfo', JSON.stringify(this.ctSeriesInfo)) diff --git a/src/views/trials/trials-panel/reading/dicoms/components/Fusion/FusionForm.vue b/src/views/trials/trials-panel/reading/dicoms/components/Fusion/FusionForm.vue index 178822e4..89a8d362 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/Fusion/FusionForm.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/Fusion/FusionForm.vue @@ -141,6 +141,8 @@ {{ $t('common:button:confirm') }} @@ -171,7 +173,8 @@ export default { ctSeries: [], petSeries: [], petctWindow: null, - digitPlaces: 2 + digitPlaces: 2, + submitLoading: false } }, mounted() { @@ -216,29 +219,32 @@ export default { this.$refs.petSeries.toggleRowSelection(this.petSeries[ptSexiesIdx]) }) }, - handleSubmitFusionSeries() { - this.$refs['fusionForm'].validate((valid) => { + async handleSubmitFusionSeries() { + if (this.submitLoading) return + this.submitLoading = true + try { + const valid = await this.$refs['fusionForm'].validate() if (!valid) return if (Object.keys(this.fusionForm.ctSeriesInfo).length === 0 || Object.keys(this.fusionForm.petSeriesInfo).length === 0) { // '请选择序列信息!' - this.$confirm(this.$t('trials:lugano:fusionDialog:message:checkSeries'), this.$t('trials:lugano:fusionDialog:warning'), { + await this.$confirm(this.$t('trials:lugano:fusionDialog:message:checkSeries'), this.$t('trials:lugano:fusionDialog:warning'), { showCancelButton: false, type: 'warning' - }).then(() => {}).catch(() => {}) + }).catch(() => {}) return } var count = Math.abs(this.fusionForm.ctSeriesInfo.instanceCount - this.fusionForm.petSeriesInfo.instanceCount) if (count > 10) { // '选择的两组序列,影像数存在较大差距, 是否继续?' - this.$confirm(this.$t('trials:lugano:fusionDialog:message:validSeries'), this.$t('trials:lugano:fusionDialog:warning'), { + const confirm = await this.$confirm(this.$t('trials:lugano:fusionDialog:message:validSeries'), this.$t('trials:lugano:fusionDialog:warning'), { type: 'warning' - }).then(() => { - this.fusion() - }).catch(() => {}) - } else { - this.fusion() + }).catch(() => false) + if (confirm !== 'confirm') return } - }) + this.fusion() + } finally { + this.submitLoading = false + } }, fusion() { const token = getToken() diff --git a/src/views/trials/trials-panel/reading/dicoms/components/Fusion/QuestionItem.vue b/src/views/trials/trials-panel/reading/dicoms/components/Fusion/QuestionItem.vue index 3e79ae4d..7e07c593 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/Fusion/QuestionItem.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/Fusion/QuestionItem.vue @@ -440,4 +440,9 @@ export default { ::v-deep .el-select.is-disabled .el-input__inner { background-color: #646464a1; } + +::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #428bca; + border-color: #428bca; +} diff --git a/src/views/trials/trials-panel/reading/dicoms/components/Fusion/Questions.vue b/src/views/trials/trials-panel/reading/dicoms/components/Fusion/Questions.vue index 9fd7bc87..c1f549e5 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/Fusion/Questions.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/Fusion/Questions.vue @@ -10,7 +10,7 @@
- {{ $t('common:button:save') }}
@@ -56,7 +56,8 @@ export default { focalFDGId: '', baseLinePET5PS: null, liverRender: true, - lungRender: true + lungRender: true, + saveLoading: false } }, computed: { @@ -242,12 +243,18 @@ export default { }) }, handleSave() { + if (this.saveLoading) return + this.saveLoading = true this.$refs['questions'].validate((valid) => { - if (!valid) return + if (!valid) { + this.saveLoading = false + return + } // 是否有标记未保存 var existUnSave = this.checkAnnotationStatus(this.questions) if (existUnSave) { this.$alert(this.$t('trials:lugano:message:saveWarning1'), this.$t('trials:lugano:fusionDialog:warning')) + this.saveLoading = false return } this.saveQuestionsForm() @@ -277,11 +284,13 @@ export default { window.opener.postMessage({ type: 'petctLesionUpdate' }, window.location) this.loading = false this.questionFormChangeState = false + this.saveLoading = false this.$message({ message: this.$t('common:message:savedSuccessfully'), type: 'success', duration: 2000 }) } } catch (e) { console.log(e) this.loading = false + this.saveLoading = false } }, checkAnnotationStatus(obj) { diff --git a/src/views/trials/trials-panel/reading/dicoms/components/Fusion/TableQuestionItem.vue b/src/views/trials/trials-panel/reading/dicoms/components/Fusion/TableQuestionItem.vue index 9b995844..fd087784 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/Fusion/TableQuestionItem.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/Fusion/TableQuestionItem.vue @@ -157,7 +157,7 @@ {{ $t('common:button:delete') }}
- + {{ $t('common:button:save') }} @@ -238,7 +238,8 @@ export default { pictureBaseStr: '', currentMarkTool: '', firstRenderAnnotation: true, - isInsideVolume: true + isInsideVolume: true, + saveLoading: false } }, mounted() { @@ -738,8 +739,13 @@ export default { return new Blob([bytesCode], { type: imgtype }) }, handleSave() { + if (this.saveLoading) return + this.saveLoading = true this.$refs.measurementForm.validate(async valid => { - if (!valid) return + if (!valid) { + this.saveLoading = false + return + } const loading = this.$loading({ fullscreen: true }) if (!this.isInsideVolume) { // this.$alert('当前标记在图像外,不允许保存!', '提示', { @@ -753,6 +759,7 @@ export default { callback: action => { } }) + this.saveLoading = false return } // 消失、无法评估状态的病灶限制不能测量SUV值 @@ -766,6 +773,7 @@ export default { showCancelButton: false, callback: action => { } }) + this.saveLoading = false return } // suv测量值可以测量为0,但不能与病灶、肝脏、纵隔血池绑定。 @@ -779,6 +787,7 @@ export default { showCancelButton: false, callback: action => { } }) + this.saveLoading = false return } } @@ -856,9 +865,11 @@ export default { this.$message({ message: this.$t('common:message:savedSuccessfully'), type: 'success', duration: 2000 }) } loading.close() + this.saveLoading = false } catch (e) { console.log(e) loading.close() + this.saveLoading = false } }) }) @@ -1054,6 +1065,11 @@ export default { background-color: #646464a1; } + ::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #428bca; + border-color: #428bca; + } + ::v-deep .el-button--mini, .el-button--mini.is-round { padding: 7px 10px; diff --git a/src/views/trials/trials-panel/reading/dicoms/components/IRecist/QuestionForm.vue b/src/views/trials/trials-panel/reading/dicoms/components/IRecist/QuestionForm.vue index 213f3399..626b9349 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/IRecist/QuestionForm.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/IRecist/QuestionForm.vue @@ -148,7 +148,7 @@ + :loading="saveLoading" :disabled="saveLoading" @click="handleSave"> {{ $t('common:button:save') }} @@ -239,7 +239,8 @@ export default { lesionMark: '', deleteInfo: null, pictureBaseStr: '', - currentMarkTool: '' + currentMarkTool: '', + saveLoading: false } }, mounted() { @@ -258,6 +259,11 @@ export default { }, async initForm() { const loading = this.$loading({ fullscreen: true }) + const closeLoading = loading.close.bind(loading) + loading.close = () => { + closeLoading() + this.saveLoading = false + } this.questions.forEach(item => { var val = this.answers[item.Id] if (item.DictionaryCode) { @@ -833,8 +839,20 @@ export default { return new Blob([bytesCode], { type: imgtype }) }, async handleSave() { - const valid = await this.$refs.measurementForm.validate() - if (!valid) return + if (this.saveLoading) return + this.saveLoading = true + let valid = false + try { + valid = await this.$refs.measurementForm.validate() + } catch (e) { + this.saveLoading = false + console.log(e) + return + } + if (!valid) { + this.saveLoading = false + return + } const loading = this.$loading({ fullscreen: true }) var measureData = this.questionForm.MeasureData var lesionState = this.getQuestionVal(7) @@ -1931,9 +1949,11 @@ export default { DicomEvent.$emit('setMeasuredToolsPassive') } loading.close() + this.saveLoading = false } catch (e) { console.log(e) loading.close() + this.saveLoading = false } }) }, @@ -2122,6 +2142,11 @@ export default { background-color: #646464a1; } + ::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #428bca; + border-color: #428bca; + } + ::v-deep .el-button--mini, .el-button--mini.is-round { padding: 7px 10px; diff --git a/src/views/trials/trials-panel/reading/dicoms/components/IVUS/QuestionList.vue b/src/views/trials/trials-panel/reading/dicoms/components/IVUS/QuestionList.vue index c853378f..98890c33 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/IVUS/QuestionList.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/IVUS/QuestionList.vue @@ -173,7 +173,8 @@ @@ -202,7 +203,8 @@ {{ $t('common:button:cancel') }}
- + {{ $t('common:button:save') }} @@ -280,7 +282,9 @@ export default { lumenId: '', sRoiStartDistanceId: '', sRoiEndDistanceId: '', - sRoiDistanceId: '' + sRoiDistanceId: '', + rowSaveLoadingMap: {}, + dialogSaveLoading: false } }, computed: { @@ -611,28 +615,32 @@ export default { } }, async handleSave(index) { + if (this.rowSaveLoadingMap[index]) return const refName = `questions${index}` - const valid = await this.$refs[refName][0].validate() - if (!valid) return - const loading = this.$loading({ fullscreen: true }) - var answers = [] - for (const k in this.questionForm) { - answers.push({ id: k, answer: Array.isArray(this.questionForm[k]) ? JSON.stringify(this.questionForm[k]) : this.questionForm[k] }) - } - var params = { - visitTaskId: this.visitTaskId, - answers: answers - } + this.$set(this.rowSaveLoadingMap, index, true) + let loading = null try { + const valid = await this.$refs[refName][0].validate() + if (!valid) return + loading = this.$loading({ fullscreen: true }) + var answers = [] + for (const k in this.questionForm) { + answers.push({ id: k, answer: Array.isArray(this.questionForm[k]) ? JSON.stringify(this.questionForm[k]) : this.questionForm[k] }) + } + var params = { + visitTaskId: this.visitTaskId, + answers: answers + } await saveTaskQuestion(12, params) this.$message.success(this.$t('common:message:savedSuccessfully')) - loading.close() DicomEvent.$emit('getReportInfo', true) this.refreshQuestions() this.formChanged = false } catch (e) { console.log(e) - loading.close() + } finally { + if (loading) loading.close() + this.$set(this.rowSaveLoadingMap, index, false) } }, getECRFQuestions(obj) { @@ -732,10 +740,13 @@ export default { this.addOrEdit.lesionType = row.LesionType }, async saveFormData() { - const valid = await this.$refs.tableQsForm.validate() - if (!valid) return - const loading = this.$loading({ fullscreen: true }) + if (this.dialogSaveLoading) return + this.dialogSaveLoading = true + let loading = null try { + const valid = await this.$refs.tableQsForm.validate() + if (!valid) return + loading = this.$loading({ fullscreen: true }) var answers = [] var reg = new RegExp(/^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/) for (const k in this.qsForm) { @@ -765,10 +776,11 @@ export default { this.addOrEdit.visible = false this.$message.success(this.$t('common:message:savedSuccessfully')) } - loading.close() } catch (e) { console.log(e) - loading.close() + } finally { + if (loading) loading.close() + this.dialogSaveLoading = false } }, async handleDelete(row, index) { diff --git a/src/views/trials/trials-panel/reading/dicoms/components/IVUS/QuestionTableFormItem.vue b/src/views/trials/trials-panel/reading/dicoms/components/IVUS/QuestionTableFormItem.vue index 175d3b1f..0edbab96 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/IVUS/QuestionTableFormItem.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/IVUS/QuestionTableFormItem.vue @@ -249,4 +249,9 @@ export default { ::v-deep .el-select.is-disabled .el-input__inner { background-color: #646464a1; } + +::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #428bca; + border-color: #428bca; +} diff --git a/src/views/trials/trials-panel/reading/dicoms/components/Lugano/QuestionForm.vue b/src/views/trials/trials-panel/reading/dicoms/components/Lugano/QuestionForm.vue index 1ef29375..3ce18e68 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/Lugano/QuestionForm.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/Lugano/QuestionForm.vue @@ -192,7 +192,7 @@ {{ $t('common:button:delete') }} - + {{ $t('common:button:save') }} @@ -276,7 +276,8 @@ export default { stateDisabled: false, splitLesionTargetPPD: null, splitLesionTargetLDi: null, - splitLesionTargetSDi: null + splitLesionTargetSDi: null, + saveLoading: false } }, mounted() { @@ -1039,21 +1040,25 @@ export default { return new Blob([bytesCode], { type: imgtype }) }, async handleSave() { - const valid = await this.$refs.measurementForm.validate() - if (!valid) { - if (this.lesionType === 0) { - this.$refs['scrollPanel'].scrollTo({ top: 0, behavior: 'smooth' }) + if (this.saveLoading) return + this.saveLoading = true + let loading = null + try { + const valid = await this.$refs.measurementForm.validate() + if (!valid) { + if (this.lesionType === 0) { + this.$refs['scrollPanel'].scrollTo({ top: 0, behavior: 'smooth' }) + } + return } - return - } - const loading = this.$loading({ fullscreen: true }) - var measureData = this.questionForm.MeasureData - var lesionState = this.getQuestionVal(7) - var lesionLength = this.getQuestionVal(0) - var lesionShort = this.getQuestionVal(1) - var lymphNodes = this.getQuestionVal(2) - lymphNodes = (lymphNodes !== null && lymphNodes !== undefined) ? parseInt(lymphNodes) : null - if (this.isBaseLineTask) { + loading = this.$loading({ fullscreen: true }) + var measureData = this.questionForm.MeasureData + var lesionState = this.getQuestionVal(7) + var lesionLength = this.getQuestionVal(0) + var lesionShort = this.getQuestionVal(1) + var lymphNodes = this.getQuestionVal(2) + lymphNodes = (lymphNodes !== null && lymphNodes !== undefined) ? parseInt(lymphNodes) : null + if (this.isBaseLineTask) { // 基线 // 靶病灶且状态为存在(0) if (this.lesionType === 0 && lesionState === 0) { @@ -1529,6 +1534,10 @@ export default { } } } + } + } finally { + if (loading) loading.close() + this.saveLoading = false } DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType, isMarked: !!measureData }, async val => { // 靶病灶状态为0(存在)时,一定存在长径或者长短径(长径、十字线 ) @@ -1803,6 +1812,11 @@ export default { background-color: #646464a1; } + ::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #428bca; + border-color: #428bca; + } + ::v-deep .el-button--mini, .el-button--mini.is-round { padding: 7px 10px; diff --git a/src/views/trials/trials-panel/reading/dicoms/components/LuganoWithoutPET/QuestionForm.vue b/src/views/trials/trials-panel/reading/dicoms/components/LuganoWithoutPET/QuestionForm.vue index 1ef29375..3ce18e68 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/LuganoWithoutPET/QuestionForm.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/LuganoWithoutPET/QuestionForm.vue @@ -192,7 +192,7 @@ {{ $t('common:button:delete') }} - + {{ $t('common:button:save') }} @@ -276,7 +276,8 @@ export default { stateDisabled: false, splitLesionTargetPPD: null, splitLesionTargetLDi: null, - splitLesionTargetSDi: null + splitLesionTargetSDi: null, + saveLoading: false } }, mounted() { @@ -1039,21 +1040,25 @@ export default { return new Blob([bytesCode], { type: imgtype }) }, async handleSave() { - const valid = await this.$refs.measurementForm.validate() - if (!valid) { - if (this.lesionType === 0) { - this.$refs['scrollPanel'].scrollTo({ top: 0, behavior: 'smooth' }) + if (this.saveLoading) return + this.saveLoading = true + let loading = null + try { + const valid = await this.$refs.measurementForm.validate() + if (!valid) { + if (this.lesionType === 0) { + this.$refs['scrollPanel'].scrollTo({ top: 0, behavior: 'smooth' }) + } + return } - return - } - const loading = this.$loading({ fullscreen: true }) - var measureData = this.questionForm.MeasureData - var lesionState = this.getQuestionVal(7) - var lesionLength = this.getQuestionVal(0) - var lesionShort = this.getQuestionVal(1) - var lymphNodes = this.getQuestionVal(2) - lymphNodes = (lymphNodes !== null && lymphNodes !== undefined) ? parseInt(lymphNodes) : null - if (this.isBaseLineTask) { + loading = this.$loading({ fullscreen: true }) + var measureData = this.questionForm.MeasureData + var lesionState = this.getQuestionVal(7) + var lesionLength = this.getQuestionVal(0) + var lesionShort = this.getQuestionVal(1) + var lymphNodes = this.getQuestionVal(2) + lymphNodes = (lymphNodes !== null && lymphNodes !== undefined) ? parseInt(lymphNodes) : null + if (this.isBaseLineTask) { // 基线 // 靶病灶且状态为存在(0) if (this.lesionType === 0 && lesionState === 0) { @@ -1529,6 +1534,10 @@ export default { } } } + } + } finally { + if (loading) loading.close() + this.saveLoading = false } DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType, isMarked: !!measureData }, async val => { // 靶病灶状态为0(存在)时,一定存在长径或者长短径(长径、十字线 ) @@ -1803,6 +1812,11 @@ export default { background-color: #646464a1; } + ::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #428bca; + border-color: #428bca; + } + ::v-deep .el-button--mini, .el-button--mini.is-round { padding: 7px 10px; diff --git a/src/views/trials/trials-panel/reading/dicoms/components/MRIPDFF/QuestionForm.vue b/src/views/trials/trials-panel/reading/dicoms/components/MRIPDFF/QuestionForm.vue index 59beea11..e7fa362f 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/MRIPDFF/QuestionForm.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/MRIPDFF/QuestionForm.vue @@ -139,7 +139,7 @@ @@ -219,7 +219,8 @@ export default { isMeasurableId: '', isExitsMarks: false, isDisabledMeasurableRadio: false, - liverSeg: '' + liverSeg: '', + saveLoading: false } }, mounted() { @@ -698,9 +699,14 @@ export default { return new Blob([bytesCode], { type: imgtype }) }, async handleSave() { + if (this.saveLoading) return + this.saveLoading = true try { const valid = await this.$refs.measurementForm.validate() - if (!valid) return + if (!valid) { + this.saveLoading = false + return + } if (parseInt(this.questionForm[this.isMeasurableId]) === 1) { // 检验是否有标记为保存 const i = this.markList.findIndex(i => i.saveEnum === 0) @@ -708,6 +714,7 @@ export default { // 请先保存标注信息! this.$alert(this.$t('trials:MRIPDFF:message:message1')) // this.$message.warning(this.$t('trials:MRIPDFF:message:message1')) + this.saveLoading = false return } } else { @@ -720,7 +727,10 @@ export default { distinguishCancelAndClose: true } ) - if (confirm !== 'confirm') return + if (confirm !== 'confirm') { + this.saveLoading = false + return + } const l1Id = this.getQuestionId(1101) this.$set(this.questionForm, l1Id, '') const l2Id = this.getQuestionId(1102) @@ -779,12 +789,15 @@ export default { this.$emit('getReadingQuestionAndAnswer') } loading.close() + this.saveLoading = false } catch (e) { console.log(e) loading.close() + this.saveLoading = false } } catch (e) { console.log(e) + this.saveLoading = false } }, async handleClose() { @@ -830,6 +843,11 @@ export default { background-color: #646464a1; } + ::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #428bca; + border-color: #428bca; + } + ::v-deep .el-button--mini, .el-button--mini.is-round { padding: 7px 7px; diff --git a/src/views/trials/trials-panel/reading/dicoms/components/MRIPDFFAdvance/QuestionForm.vue b/src/views/trials/trials-panel/reading/dicoms/components/MRIPDFFAdvance/QuestionForm.vue index c1d750f5..4435745a 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/MRIPDFFAdvance/QuestionForm.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/MRIPDFFAdvance/QuestionForm.vue @@ -145,7 +145,7 @@ {{ $t('trials:reading:button:removeMark') }} --> - + {{ $t('common:button:save') }} @@ -223,7 +223,8 @@ export default { digitPlaces: 2, isMeasurableId: '', isDisabledMeasurableRadio: false, - liverSeg: '' + liverSeg: '', + saveLoading: false } }, mounted() { @@ -555,9 +556,14 @@ export default { DicomEvent.$emit('refreshStudyListMeasureData') }, async handleSave() { + if (this.saveLoading) return + this.saveLoading = true try { const valid = await this.$refs.measurementForm.validate() - if (!valid) return + if (!valid) { + this.saveLoading = false + return + } const loading = this.$loading({ fullscreen: true }) let measureData = this.questionForm.MeasureData if (parseInt(this.questionForm[this.isMeasurableId]) === 0 && measureData) { @@ -613,12 +619,15 @@ export default { this.$emit('getReadingQuestionAndAnswer') } loading.close() + this.saveLoading = false } catch(e) { loading.close() + this.saveLoading = false } }) } catch (e) { console.log(e) + this.saveLoading = false } }, async handleClose() { @@ -664,6 +673,11 @@ export default { background-color: #646464a1; } + ::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #428bca; + border-color: #428bca; + } + ::v-deep .el-button--mini, .el-button--mini.is-round { padding: 7px 7px; diff --git a/src/views/trials/trials-panel/reading/dicoms/components/OCT/QuestionList.vue b/src/views/trials/trials-panel/reading/dicoms/components/OCT/QuestionList.vue index deec77ee..1a7e208b 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/OCT/QuestionList.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/OCT/QuestionList.vue @@ -174,7 +174,8 @@ @@ -202,7 +203,8 @@ {{ $t('common:button:cancel') }} - + {{ $t('common:button:save') }} @@ -281,7 +283,9 @@ export default { avgId: '', sRoiStartDistanceId: '', sRoiEndDistanceId: '', - sRoiDistanceId: '' + sRoiDistanceId: '', + rowSaveLoadingMap: {}, + dialogSaveLoading: false } }, computed: { @@ -607,28 +611,32 @@ export default { } }, async handleSave(index) { + if (this.rowSaveLoadingMap[index]) return const refName = `questions${index}` - const valid = await this.$refs[refName][0].validate() - if (!valid) return - const loading = this.$loading({ fullscreen: true }) - var answers = [] - for (const k in this.questionForm) { - answers.push({ id: k, answer: Array.isArray(this.questionForm[k]) ? JSON.stringify(this.questionForm[k]) : this.questionForm[k] }) - } - var params = { - visitTaskId: this.visitTaskId, - answers: answers - } + this.$set(this.rowSaveLoadingMap, index, true) + let loading = null try { + const valid = await this.$refs[refName][0].validate() + if (!valid) return + loading = this.$loading({ fullscreen: true }) + var answers = [] + for (const k in this.questionForm) { + answers.push({ id: k, answer: Array.isArray(this.questionForm[k]) ? JSON.stringify(this.questionForm[k]) : this.questionForm[k] }) + } + var params = { + visitTaskId: this.visitTaskId, + answers: answers + } await saveTaskQuestion(12, params) this.$message.success(this.$t('common:message:savedSuccessfully')) - loading.close() DicomEvent.$emit('getReportInfo', true) this.refreshQuestions() this.formChanged = false } catch (e) { console.log(e) - loading.close() + } finally { + if (loading) loading.close() + this.$set(this.rowSaveLoadingMap, index, false) } }, getECRFQuestions(obj) { @@ -748,10 +756,13 @@ export default { this.addOrEdit.lesionType = row.LesionType }, async saveFormData() { - const valid = await this.$refs.tableQsForm.validate() - if (!valid) return - const loading = this.$loading({ fullscreen: true }) + if (this.dialogSaveLoading) return + this.dialogSaveLoading = true + let loading = null try { + const valid = await this.$refs.tableQsForm.validate() + if (!valid) return + loading = this.$loading({ fullscreen: true }) var answers = [] var reg = new RegExp(/^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/) for (const k in this.qsForm) { @@ -785,10 +796,11 @@ export default { this.addOrEdit.visible = false this.$message.success(this.$t('common:message:savedSuccessfully')) } - loading.close() } catch (e) { console.log(e) - loading.close() + } finally { + if (loading) loading.close() + this.dialogSaveLoading = false } }, async handleDelete(row, index) { diff --git a/src/views/trials/trials-panel/reading/dicoms/components/OCT/QuestionTableFormItem.vue b/src/views/trials/trials-panel/reading/dicoms/components/OCT/QuestionTableFormItem.vue index 9b00ff69..d9c075b3 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/OCT/QuestionTableFormItem.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/OCT/QuestionTableFormItem.vue @@ -267,4 +267,9 @@ export default { ::v-deep .el-select.is-disabled .el-input__inner { background-color: #646464a1; } + +::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #428bca; + border-color: #428bca; +} diff --git a/src/views/trials/trials-panel/reading/dicoms/components/Others.vue b/src/views/trials/trials-panel/reading/dicoms/components/Others.vue index 3c3408ac..25ba6621 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/Others.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/Others.vue @@ -22,7 +22,7 @@ @@ -64,18 +64,19 @@ export default { } }, async handleSave() { - const valid = await this.$refs.otherForm.validate() - if (!valid) return + if (this.loading) return this.loading = true try { + const valid = await this.$refs.otherForm.validate() + if (!valid) return let params = Object.assign(this.form, {imageToolType: this.imageToolType}) const res = await setAutoCutNextTask(params) if (res.IsSuccess) { this.$message.success(this.$t('common:message:savedSuccessfully')) } - this.loading = false } catch (e) { - this.loading = false + } finally { + this.loading = false } } } diff --git a/src/views/trials/trials-panel/reading/dicoms/components/PCWG/QuestionForm.vue b/src/views/trials/trials-panel/reading/dicoms/components/PCWG/QuestionForm.vue index 661182db..69fe2a93 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/PCWG/QuestionForm.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/PCWG/QuestionForm.vue @@ -116,7 +116,7 @@ {{ $t('common:button:delete') }} - + {{ $t('common:button:save') }} @@ -198,7 +198,8 @@ export default { pictureBaseStr: '', digitPlaces: 0, focusQs: null, - currentMarkTool: '' + currentMarkTool: '', + saveLoading: false } }, @@ -563,8 +564,20 @@ export default { return new Blob([bytesCode], { type: imgtype }) }, async handleSave() { - const valid = await this.$refs.measurementForm.validate() - if (!valid) return + if (this.saveLoading) return + this.saveLoading = true + let valid = false + try { + valid = await this.$refs.measurementForm.validate() + } catch (e) { + this.saveLoading = false + console.log(e) + return + } + if (!valid) { + this.saveLoading = false + return + } var lesionState = this.getQuestionVal(7) var measureData = this.questionForm.MeasureData // 非基线 @@ -578,7 +591,7 @@ export default { showCancelButton: false, callback: action => { } }) - loading.close() + this.saveLoading = false return } } @@ -591,7 +604,7 @@ export default { showCancelButton: false, callback: action => { } }) - loading.close() + this.saveLoading = false return } } @@ -603,7 +616,7 @@ export default { showCancelButton: false, callback: action => { } }) - loading.close() + this.saveLoading = false return } } @@ -615,7 +628,7 @@ export default { showCancelButton: false, callback: action => { } }) - loading.close() + this.saveLoading = false return } } @@ -627,7 +640,7 @@ export default { showCancelButton: false, callback: action => { } }) - loading.close() + this.saveLoading = false return } } @@ -690,10 +703,12 @@ export default { DicomEvent.$emit('getReportInfo', true) DicomEvent.$emit('setMeasuredToolsPassive') loading.close() + this.saveLoading = false } } catch (e) { console.log(e) loading.close() + this.saveLoading = false } }) }, @@ -858,6 +873,11 @@ export default { background-color: #646464a1; } + ::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #428bca; + border-color: #428bca; + } + .el-form-item__content .el-select { width: 100%; } diff --git a/src/views/trials/trials-panel/reading/dicoms/components/QuestionItem.vue b/src/views/trials/trials-panel/reading/dicoms/components/QuestionItem.vue index f97dbbcc..fb54ae11 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/QuestionItem.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/QuestionItem.vue @@ -447,4 +447,9 @@ export default { ::v-deep .el-select.is-disabled .el-input__inner { background-color: #646464a1; } + +::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: #428bca; + border-color: #428bca; +} diff --git a/src/views/trials/trials-panel/reading/dicoms/components/Questions.vue b/src/views/trials/trials-panel/reading/dicoms/components/Questions.vue index 19d7fcd9..d9a08683 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/Questions.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/Questions.vue @@ -10,7 +10,8 @@