RECIST1.1标准阅片时,对于非DICOM图像可以画标记并创建病灶,升级后的工具不能画标记了
continuous-integration/drone/push Build is passing Details

main
wangxiaoshuang 2025-07-04 16:06:43 +08:00
parent dff6de546c
commit 035e46bacc
3 changed files with 225 additions and 203 deletions

View File

@ -570,7 +570,7 @@ export default {
end: { x: e.offsetX, y: e.offsetY } end: { x: e.offsetX, y: e.offsetY }
}, },
remark: this.lesionName, remark: this.lesionName,
uuid: `${this.imgId}-${this.lesionName}`, uuid: `${this.imgId}-${this.lesionName ? this.lesionName : Date.now()}`,
toolName: 'ArrowAnnotate', toolName: 'ArrowAnnotate',
toolType: 'ArrowAnnotate' toolType: 'ArrowAnnotate'
} }
@ -601,7 +601,7 @@ export default {
end: { x: e.offsetX, y: e.offsetY } end: { x: e.offsetX, y: e.offsetY }
}, },
remark: this.lesionName, remark: this.lesionName,
uuid: `${this.imgId}-${this.lesionName}`, uuid: `${this.imgId}-${this.lesionName ? this.lesionName : Date.now()}`,
toolName: 'RectangleRoi', toolName: 'RectangleRoi',
toolType: 'RectangleRoi' toolType: 'RectangleRoi'
} }

View File

@ -1405,7 +1405,7 @@ export default {
if (taskIdx === -1) return if (taskIdx === -1) return
const annotations = this.visitTaskList[taskIdx].Annotations const annotations = this.visitTaskList[taskIdx].Annotations
annotations.map(i => { annotations.map(i => {
if (i.MeasureData) { if (i.MeasureData && !Object.hasOwn(i.MeasureData, 'isDicomReading')) {
const annotation = i.MeasureData const annotation = i.MeasureData
annotation.highlighted = false annotation.highlighted = false
cornerstoneTools.annotation.state.addAnnotation(annotation) cornerstoneTools.annotation.state.addAnnotation(annotation)

View File

@ -8,35 +8,24 @@
<span style="margin-left:5px;">{{ visitInfo.TaskBlindName }}</span> <span style="margin-left:5px;">{{ visitInfo.TaskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
<i placement="bottom">
class="el-icon-refresh-left" <i class="el-icon-refresh-left" @click="resetForm" />
@click="resetForm"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
<!-- 影像质量评估 --> <!-- 影像质量评估 -->
<div v-if="outerQuestions.length > 0" class="outer_form_wrapper"> <div v-if="outerQuestions.length > 0" class="outer_form_wrapper">
<el-form <el-form ref="outerForm" size="small" :model="outerForm">
ref="outerForm" <question-form-item v-for="outerQs in outerQuestions" :key="outerQs.Id" :question="outerQs"
size="small" :question-form="outerForm" :reading-task-state="readingTaskState" :visit-task-id="visitTaskId"
:model="outerForm" @resetFormItemData="resetOuterFormItemData" @setFormItemData="setOuterFormItemData" />
>
<question-form-item
v-for="outerQs in outerQuestions"
:key="outerQs.Id"
:question="outerQs"
:question-form="outerForm"
:reading-task-state="readingTaskState"
:visit-task-id="visitTaskId"
@resetFormItemData="resetOuterFormItemData"
@setFormItemData="setOuterFormItemData"
/>
<el-form-item v-if="readingTaskState < 2"> <el-form-item v-if="readingTaskState < 2">
<div class="outer_form-footer"> <div class="outer_form-footer">
<i class="el-icon-warning feedback-icon" :style="{color: taskInfo && taskInfo.IsExistUnprocessedFeedback ? '#ffeb3b' : '#fff'}" @click="openFeedBackTable" /> <i class="el-icon-warning feedback-icon"
:style="{ color: taskInfo && taskInfo.IsExistUnprocessedFeedback ? '#ffeb3b' : '#fff' }"
@click="openFeedBackTable" />
<el-button size="mini" @click="saveOuterForm">{{ $t('common:button:save') }}</el-button> <el-button size="mini" @click="saveOuterForm">{{ $t('common:button:save') }}</el-button>
</div> </div>
</el-form-item> </el-form-item>
@ -44,146 +33,116 @@
</div> </div>
<!-- 病灶评估 --> <!-- 病灶评估 -->
<template v-if="tableQuestions.length > 0 && criterionType !== 10"> <template v-if="tableQuestions.length > 0 && criterionType !== 10">
<div <div v-for="(qs, index) in tableQuestions" :key="index" class="lesions lesions_wrapper">
v-for="(qs,index) in tableQuestions" <h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;">
:key="index" {{ language === 'en' ? qs.GroupEnName : qs.GroupName }}
class="lesions lesions_wrapper"
>
<h4
v-if="qs.Type === 'group'"
style="color: #ddd;padding: 5px 0px;margin: 0;"
>
{{ language==='en'?qs.GroupEnName:qs.GroupName }}
</h4> </h4>
<div class="lesion_list"> <div class="lesion_list">
<div <div v-for="table in qs.Childrens" v-show="!(isBaseLineTask && table.LesionType === 2)" :key="table.Id">
v-for="table in qs.Childrens" <div v-if="table.Type === 'table'" class="flex-row" style="margin:3px 0;">
v-show="!(isBaseLineTask && table.LesionType === 2)"
:key="table.Id"
>
<div
v-if="table.Type === 'table'"
class="flex-row"
style="margin:3px 0;"
>
<div class="title">{{ table.QuestionName }}</div> <div class="title">{{ table.QuestionName }}</div>
<div <div v-if="readingTaskState < 2 && (isBaseLineTask || table.LesionType === 2)" class="add-icon"
v-if="readingTaskState<2 && (isBaseLineTask || table.LesionType === 2)" @click.prevent="addTarget(table)">
class="add-icon"
@click.prevent="addTarget(table)"
>
<i class="el-icon-plus" /> <i class="el-icon-plus" />
</div> </div>
</div> </div>
<el-collapse <el-collapse v-if="table.Type === 'table' && table.TableQuestions" v-model="activeName" accordion
v-if="table.Type === 'table' && table.TableQuestions" @change="handleCollapseChange">
v-model="activeName" <el-collapse-item v-for="(answer, i) in table.TableQuestions.Answers"
accordion :key="`${table.Id}_${answer.RowIndex}`" :name="`${table.Id}_${answer.RowIndex}`"
@change="handleCollapseChange" @contextmenu.prevent.native="collapseRightClick($event, table.Id, answer.RowIndex)">
>
<el-collapse-item
v-for="(answer,i) in table.TableQuestions.Answers"
:key="`${table.Id}_${answer.RowIndex}`"
:name="`${table.Id}_${answer.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event, table.Id, answer.RowIndex)"
>
<template slot="title"> <template slot="title">
<div <div style="width:340px;position: relative;"
style="width:340px;position: relative;" :style="{ color: (activeName === table.Id + answer.RowIndex ? '#ffeb3b' : '#fff') }">
:style="{color:(activeName===table.Id+answer.RowIndex?'#ffeb3b':'#fff')}" {{ getLesionName(table.OrderMark, answer.RowIndex) }}
>
{{ getLesionName(table.OrderMark,answer.RowIndex) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].SaveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].SaveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 信息不完整 --> <!-- 信息不完整 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].SaveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].SaveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;left: 50px;top: 2px;"> <div style="position: absolute;left: 50px;top: 2px;">
<div style="font-size: 11px;width:220px;height: 30px;"> <div style="font-size: 11px;width:220px;height: 30px;">
<div <div v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart"
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart"
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px" style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
:title="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart" :title="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart">
>
{{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart }} {{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart }}
</div> </div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px"> <div
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
<span v-if="table.LesionType === 0"> <span v-if="table.LesionType === 0">
{{ $fd('TargetState',parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState)) }} {{
$fd('TargetState', parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))
}}
</span> </span>
<span v-else-if="table.LesionType === 1"> <span v-else-if="table.LesionType === 1">
{{ $fd('NoTargetState',parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState)) }} {{
$fd('NoTargetState',
parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))
}}
</span> </span>
<span v-else> <span v-else>
{{ $fd('NewLesionState',parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState)) }} {{
$fd('NewLesionState',
parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))
}}
</span> </span>
</div> </div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px"> <div
<template v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].IsLymphLesion && !isNaN(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionShort))"> style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px">
<template
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].IsLymphLesion && !isNaN(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionShort))">
{{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionShort }}mm {{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionShort }}mm
</template> </template>
<template v-else-if="!innerFormData[`${table.Id}_${answer.RowIndex}`].IsLymphLesion && !isNaN(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionLength))"> <template
v-else-if="!innerFormData[`${table.Id}_${answer.RowIndex}`].IsLymphLesion && !isNaN(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionLength))">
{{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionLength }}mm {{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionLength }}mm
</template> </template>
</div> </div>
</div> </div>
</div> </div>
<!-- 分裂 --> <!-- 分裂 -->
<div v-if="((table.LesionType === 0 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0) || (table.LesionType === 1 && [0,1].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))) || (table.LesionType === 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0)) && innerFormData[`${table.Id}_${answer.RowIndex}`].IsCurrentTaskAdd === 'False'" style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);"> <div
<el-tooltip v-show="readingTaskState<2 && !!innerFormData[`${table.Id}_${answer.RowIndex}`].RowId && !isBaseLineTask && innerFormData[`${table.Id}_${answer.RowIndex}`].IsDicomReading !== false" class="table" :content="$t('trials:reading:button:split')" placement="left"> v-if="((table.LesionType === 0 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0) || (table.LesionType === 1 && [0, 1].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))) || (table.LesionType === 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0)) && innerFormData[`${table.Id}_${answer.RowIndex}`].IsCurrentTaskAdd === 'False'"
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="lesionSplit(table.Id, innerFormData[`${table.Id}_${answer.RowIndex}`].RowId)" /> style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<el-tooltip
v-show="readingTaskState < 2 && !!innerFormData[`${table.Id}_${answer.RowIndex}`].RowId && !isBaseLineTask && innerFormData[`${table.Id}_${answer.RowIndex}`].IsDicomReading !== false"
class="table" :content="$t('trials:reading:button:split')" placement="left">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
@click.stop="lesionSplit(table.Id, innerFormData[`${table.Id}_${answer.RowIndex}`].RowId)" />
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
</template> </template>
<el-form <el-form :ref="`${table.Id}_${answer.RowIndex}`" size="small"
:ref="`${table.Id}_${answer.RowIndex}`" :model="innerFormData[`${table.Id}_${answer.RowIndex}`]">
size="small" <table-question-form-item :ref="`form_${table.Id}_${answer.RowIndex}`" :table-info="table"
:model="innerFormData[`${table.Id}_${answer.RowIndex}`]" :answer="answer" :question-form="innerFormData[`${table.Id}_${answer.RowIndex}`]"
> :reading-task-state="readingTaskState" :organs="organs" :is-base-line-task="isBaseLineTask"
<table-question-form-item :is-current-task="isCurrentTask" @update="innerFormDataUpdate" @close="closeInnerForm"
:ref="`form_${table.Id}_${answer.RowIndex}`" @lesionTypeChange="lesionTypeChange" />
:table-info="table" <div v-if="readingTaskState < 2" style="text-align:right;margin-top:10px;">
:answer="answer"
:question-form="innerFormData[`${table.Id}_${answer.RowIndex}`]"
:reading-task-state="readingTaskState"
:organs="organs"
:is-base-line-task="isBaseLineTask"
:is-current-task="isCurrentTask"
@update="innerFormDataUpdate"
@close="closeInnerForm"
@lesionTypeChange="lesionTypeChange"
/>
<div
v-if="readingTaskState<2"
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button <el-button v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].MeasureData" size="mini"
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].MeasureData" @click="clearMeasureData(table, answer.RowIndex)">
size="mini"
@click="clearMeasureData(table, answer.RowIndex)"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button v-if="table.TableQuestions.Answers[i].IsCurrentTaskAdd !== 'False'" size="mini"
v-if="table.TableQuestions.Answers[i].IsCurrentTaskAdd !== 'False'" @click="deleteLesion(table, answer.RowIndex)">
size="mini"
@click="deleteLesion(table, answer.RowIndex)"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button size="mini" @click="saveLesion(table, answer.RowIndex)">
size="mini"
@click="saveLesion(table, answer.RowIndex)"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -212,6 +171,7 @@ import { resetReadingTask, setSkipReadingCache } from '@/api/reading'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import QuestionFormItem from './QuestionFormItem' import QuestionFormItem from './QuestionFormItem'
import TableQuestionFormItem from './TableQuestionFormItem' import TableQuestionFormItem from './TableQuestionFormItem'
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
export default { export default {
name: 'QuestionList', name: 'QuestionList',
components: { components: {
@ -283,6 +243,7 @@ export default {
this.getOrganList() this.getOrganList()
this.getOuterQuestions() this.getOuterQuestions()
this.getTableQuestions() this.getTableQuestions()
window.addEventListener('message', this.receiveMsg)
}, },
methods: { methods: {
// //
@ -344,7 +305,7 @@ export default {
this.$set(this.outerForm, v, null) this.$set(this.outerForm, v, null)
}, },
setOuterFormItemData(obj) { setOuterFormItemData(obj) {
}, },
// //
async getTableQuestions() { async getTableQuestions() {
@ -468,7 +429,7 @@ export default {
} }
}, },
setAnnotation(obj) { setAnnotation(obj) {
const annotation = Object.assign({}, obj.annotation) const annotation = Object.assign({}, !Object.hasOwn(obj, 'isDicomReading') ? obj.annotation : obj)
if (this.activeName) { if (this.activeName) {
// //
const tableId = this.activeName.split('_')[0] const tableId = this.activeName.split('_')[0]
@ -493,6 +454,13 @@ export default {
child => child.Id === tableId child => child.Id === tableId
) )
if (typeof targetTable !== 'object') return if (typeof targetTable !== 'object') return
if (Object.hasOwn(annotation, 'isDicomReading') && !annotation.isDicomReading) {
// dicom
annotation.data.remark = innerForm.LesionName
annotation.markTool = annotation.data.toolName
DicomEvent.$emit('addNoneDicomMeasureData', annotation)
this.$set(this.innerFormData[`${tableId}_${rowIndex}`], 'IsDicomReading', false)
}
this.$set(this.innerFormData[`${tableId}_${rowIndex}`], 'MeasureData', annotation) this.$set(this.innerFormData[`${tableId}_${rowIndex}`], 'MeasureData', annotation)
let length = null let length = null
let short = null let short = null
@ -544,7 +512,7 @@ export default {
} }
this.$set(this.innerFormData[`${tableId}_${rowIndex}`], 'SaveTypeEnum', innerForm.RowId ? 1 : 0) this.$set(this.innerFormData[`${tableId}_${rowIndex}`], 'SaveTypeEnum', innerForm.RowId ? 1 : 0)
this.setMarkName(this.innerFormData[`${tableId}_${rowIndex}`].LesionType, this.innerFormData[`${tableId}_${rowIndex}`][stateId], this.innerFormData[`${tableId}_${rowIndex}`].LesionName, annotation) this.setMarkName(this.innerFormData[`${tableId}_${rowIndex}`].LesionType, this.innerFormData[`${tableId}_${rowIndex}`][stateId], this.innerFormData[`${tableId}_${rowIndex}`].LesionName, annotation)
} }
} else { } else {
if (this.isBaseLineTask) { if (this.isBaseLineTask) {
@ -656,7 +624,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
return return
} }
@ -667,7 +635,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
return return
} }
@ -676,10 +644,16 @@ export default {
answer.RowId = '' answer.RowId = ''
const maxIndex = this.getMaxRowIndex(tableInfo.TableQuestions.Answers) const maxIndex = this.getMaxRowIndex(tableInfo.TableQuestions.Answers)
answer.RowIndex = `${maxIndex + 1}.00` answer.RowIndex = `${maxIndex + 1}.00`
answer.IsDicomReading = true answer.IsDicomReading = annotation && Object.hasOwn(annotation, 'isDicomReading') ? annotation.isDicomReading : true
answer.SaveTypeEnum = 0 answer.SaveTypeEnum = 0
answer.LesionType = tableInfo.LesionType answer.LesionType = tableInfo.LesionType
answer.LesionName = this.getLesionName(tableInfo.OrderMark, answer.RowIndex) answer.LesionName = this.getLesionName(tableInfo.OrderMark, answer.RowIndex)
if (!answer.IsDicomReading) {
// dicom
annotation.data.remark = answer.LesionName
annotation.markTool = annotation.data.toolName
DicomEvent.$emit('addNoneDicomMeasureData', annotation)
}
let state = null let state = null
if (this.isBaseLineTask && tableInfo.LesionType === 0) { if (this.isBaseLineTask && tableInfo.LesionType === 0) {
state = 0 state = 0
@ -693,14 +667,14 @@ export default {
tableInfo.TableQuestions.Answers.push(answer) tableInfo.TableQuestions.Answers.push(answer)
if (typeof annotation === 'object') { if (typeof annotation === 'object') {
answer.MeasureData = annotation answer.MeasureData = annotation
if (annotation.metadata.toolName === 'Length') { if (annotation.metadata?.toolName === 'Length') {
const referencedImageId = annotation.metadata.referencedImageId const referencedImageId = annotation.metadata.referencedImageId
let length = annotation.data.cachedStats[`imageId:${referencedImageId}`].length let length = annotation.data.cachedStats[`imageId:${referencedImageId}`].length
length = length ? parseFloat(length).toFixed(this.digitPlaces) : length length = length ? parseFloat(length).toFixed(this.digitPlaces) : length
const lengthId = this.getQuestionId(0, tableInfo.TableQuestions.Questions) const lengthId = this.getQuestionId(0, tableInfo.TableQuestions.Questions)
answer.LesionLength = length answer.LesionLength = length
answer[lengthId] = length answer[lengthId] = length
} else if (annotation.metadata.toolName === 'Bidirectional') { } else if (annotation.metadata?.toolName === 'Bidirectional') {
const referencedImageId = annotation.metadata.referencedImageId const referencedImageId = annotation.metadata.referencedImageId
let length = annotation.data.cachedStats[`imageId:${referencedImageId}`].length let length = annotation.data.cachedStats[`imageId:${referencedImageId}`].length
length = length ? parseFloat(length).toFixed(this.digitPlaces) : length length = length ? parseFloat(length).toFixed(this.digitPlaces) : length
@ -775,7 +749,11 @@ export default {
this.$set(this.innerFormData[`${table.Id}_${rowIndex}`], 'LesionState', null) this.$set(this.innerFormData[`${table.Id}_${rowIndex}`], 'LesionState', null)
const obj = Object.assign({}, innerForm.MeasureData) const obj = Object.assign({}, innerForm.MeasureData)
// //
this.$emit('removeAnnotation', obj) if (innerForm.IsDicomReading && innerForm.IsDicomReading !== 'False') {
this.$emit('removeAnnotation', obj)
} else {
DicomEvent.$emit('removeNoneDicomMeasureData', obj)
}
// //
this.$set(this.innerFormData[`${table.Id}_${rowIndex}`], 'MeasureData', null) this.$set(this.innerFormData[`${table.Id}_${rowIndex}`], 'MeasureData', null)
// //
@ -806,7 +784,11 @@ export default {
if (innerForm.MeasureData) { if (innerForm.MeasureData) {
// //
const obj = Object.assign({}, innerForm.MeasureData) const obj = Object.assign({}, innerForm.MeasureData)
this.$emit('removeAnnotation', obj) if (innerForm.IsDicomReading && innerForm.IsDicomReading !== 'False') {
this.$emit('removeAnnotation', obj)
} else {
DicomEvent.$emit('removeNoneDicomMeasureData', obj)
}
} }
// //
await this.getTableQuestions() await this.getTableQuestions()
@ -819,7 +801,11 @@ export default {
if (innerForm.MeasureData) { if (innerForm.MeasureData) {
// //
const obj = Object.assign({}, innerForm.MeasureData) const obj = Object.assign({}, innerForm.MeasureData)
this.$emit('removeAnnotation', obj) if (innerForm.IsDicomReading && innerForm.IsDicomReading !== 'False') {
this.$emit('removeAnnotation', obj)
} else {
DicomEvent.$emit('removeNoneDicomMeasureData', obj)
}
} }
// //
this.removeAnswer(table.Id, rowIndex) this.removeAnswer(table.Id, rowIndex)
@ -857,7 +843,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg19'), { this.$confirm(this.$t('trials:reading:warnning:msg19'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -869,7 +855,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg20'), { this.$confirm(this.$t('trials:reading:warnning:msg20'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -886,7 +872,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg21'), { this.$confirm(this.$t('trials:reading:warnning:msg21'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -898,7 +884,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg22'), { this.$confirm(this.$t('trials:reading:warnning:msg22'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -916,7 +902,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg23'), { this.$confirm(this.$t('trials:reading:warnning:msg23'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -928,7 +914,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg24'), { this.$confirm(this.$t('trials:reading:warnning:msg24'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -944,7 +930,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg25'), { this.$confirm(this.$t('trials:reading:warnning:msg25'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -961,7 +947,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg26'), { this.$confirm(this.$t('trials:reading:warnning:msg26'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -983,7 +969,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg27'), { this.$confirm(this.$t('trials:reading:warnning:msg27'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -995,7 +981,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg28'), { this.$confirm(this.$t('trials:reading:warnning:msg28'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1011,7 +997,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg29'), { this.$confirm(this.$t('trials:reading:warnning:msg29'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1023,7 +1009,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg30'), { this.$confirm(this.$t('trials:reading:warnning:msg30'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1045,7 +1031,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg31'), { this.$confirm(this.$t('trials:reading:warnning:msg31'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1057,7 +1043,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg32'), { this.$confirm(this.$t('trials:reading:warnning:msg32'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1074,7 +1060,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg33'), { this.$confirm(this.$t('trials:reading:warnning:msg33'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1086,7 +1072,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg34'), { this.$confirm(this.$t('trials:reading:warnning:msg34'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1103,7 +1089,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg35'), { this.$confirm(this.$t('trials:reading:warnning:msg35'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1115,7 +1101,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg36'), { this.$confirm(this.$t('trials:reading:warnning:msg36'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1132,7 +1118,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg37'), { this.$confirm(this.$t('trials:reading:warnning:msg37'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1144,7 +1130,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg38'), { this.$confirm(this.$t('trials:reading:warnning:msg38'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1161,7 +1147,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg39'), { this.$confirm(this.$t('trials:reading:warnning:msg39'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1173,7 +1159,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg40'), { this.$confirm(this.$t('trials:reading:warnning:msg40'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1190,7 +1176,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg41'), { this.$confirm(this.$t('trials:reading:warnning:msg41'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1202,7 +1188,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg42'), { this.$confirm(this.$t('trials:reading:warnning:msg42'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1219,7 +1205,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg43'), { this.$confirm(this.$t('trials:reading:warnning:msg43'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1231,7 +1217,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg44'), { this.$confirm(this.$t('trials:reading:warnning:msg44'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1248,7 +1234,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg45'), { this.$confirm(this.$t('trials:reading:warnning:msg45'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1260,7 +1246,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg46'), { this.$confirm(this.$t('trials:reading:warnning:msg46'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
loading.close() loading.close()
return return
@ -1390,7 +1376,7 @@ export default {
if (annotation) { if (annotation) {
this.setMarkName(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`].LesionType, obj.val, this.innerFormData[`${obj.tableId}_${obj.rowIndex}`].LesionName, annotation) this.setMarkName(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`].LesionType, obj.val, this.innerFormData[`${obj.tableId}_${obj.rowIndex}`].LesionName, annotation)
} }
} }
if (obj.questionMark === 8) { if (obj.questionMark === 8) {
this.$set(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`], 'LesionPart', obj.val) this.$set(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`], 'LesionPart', obj.val)
@ -1448,7 +1434,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
return return
} }
@ -1551,7 +1537,7 @@ export default {
type: 'imgfail', type: 'imgfail',
trialId: this.$route.query.trialId, trialId: this.$route.query.trialId,
visitTaskId: this.visitTaskId, visitTaskId: this.visitTaskId,
callBack: async() => { callBack: async () => {
const confirm = await this.$confirm( const confirm = await this.$confirm(
this.$t('trials:reading:confirm:feedbackmsg'), this.$t('trials:reading:confirm:feedbackmsg'),
{ {
@ -1588,7 +1574,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
this.$set(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`], 'LesionType', innerForm.LesionType) this.$set(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`], 'LesionType', innerForm.LesionType)
return return
@ -1605,7 +1591,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
this.$set(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`], 'LesionType', innerForm.LesionType) this.$set(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`], 'LesionType', innerForm.LesionType)
return return
@ -1616,7 +1602,7 @@ export default {
this.$confirm(this.$t(' trials:reading:warnning:msg15'), { this.$confirm(this.$t(' trials:reading:warnning:msg15'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
this.$set(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`], 'LesionType', innerForm.LesionType) this.$set(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`], 'LesionType', innerForm.LesionType)
return return
@ -1694,7 +1680,11 @@ export default {
// //
if (innerForm.MeasureData) { if (innerForm.MeasureData) {
const obj = Object.assign({}, innerForm.MeasureData) const obj = Object.assign({}, innerForm.MeasureData)
this.$emit('removeAnnotation', obj) if (innerForm.IsDicomReading && innerForm.IsDicomReading !== 'False') {
this.$emit('removeAnnotation', obj)
} else {
DicomEvent.$emit('removeNoneDicomMeasureData', obj)
}
} }
// //
this.activeName = '' this.activeName = ''
@ -1819,28 +1809,42 @@ export default {
} else { } else {
return { isCanActiveTool: true, reason: '' } return { isCanActiveTool: true, reason: '' }
} }
},
receiveMsg(event) {
if (event.data.type === 'isCanActiveNoneDicomTool') {
let obj = { isCanActiveTool: true, lesionName: '', reason: '', toolName: event.data.toolName }
let { isCanActiveTool, reason } = this.validTool(event.data.toolName)
obj.isCanActiveTool = isCanActiveTool
obj.reason = reason
DicomEvent.$emit('isCanActiveNoneDicomTool', obj)
} else if (event.data.type === 'setMeasurement') {
this.setAnnotation(event.data.data)
}
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.questionList-wrapper{ .questionList-wrapper {
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
// overflow: hidden; // overflow: hidden;
.container{ .container {
padding: 10px; padding: 10px;
.basic-info{
.basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3{
h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i{
i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
font-weight: bold; font-weight: bold;
@ -1848,64 +1852,75 @@ export default {
} }
} }
} }
.outer_form_wrapper{
::v-deep .el-form-item__label{ .outer_form_wrapper {
::v-deep .el-form-item__label {
color: #c3c3c3; color: #c3c3c3;
text-align: left; text-align: left;
} }
::v-deep .el-input__inner{
background-color: transparent; ::v-deep .el-input__inner {
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-textarea__inner{
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item{ ::v-deep .el-textarea__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
flex-wrap: wrap; flex-wrap: wrap;
} }
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
::v-deep .el-form-item__content
.el-select{ ::v-deep .el-form-item__content .el-select {
width: 100%; width: 100%;
} }
.outer_form-footer{
.outer_form-footer {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-end; justify-content: flex-end;
align-items: center; align-items: center;
.feedback-icon{
.feedback-icon {
padding: 0 10px; padding: 0 10px;
color: #fff; color: #fff;
font-weight: 400; font-weight: 400;
font-size: 22px; font-size: 22px;
cursor: pointer; cursor: pointer;
&:hover{
&:hover {
color: #68a2d5; color: #68a2d5;
} }
} }
} }
} }
.title{
.title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
color: #ddd; color: #ddd;
font-size: 15px; font-size: 15px;
} }
.add-icon{
.add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
color: #ddd; color: #ddd;
@ -1914,42 +1929,49 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
.flex-row{ .flex-row {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
background-color: #424242; background-color: #424242;
} }
.lesion_list{
.lesion_list {
position: relative; position: relative;
} }
.el-collapse{
border-bottom:none; .el-collapse {
border-top:none; border-bottom: none;
::v-deep .el-collapse-item{ border-top: none;
background-color: #000!important;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header{
background-color: #000!important; ::v-deep .el-collapse-item__header {
background-color: #000 !important;
color: #ddd; color: #ddd;
border-bottom-color:#5a5a5a; border-bottom-color: #5a5a5a;
padding-left: 5px; padding-left: 5px;
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap{
background-color: #000!important; ::v-deep .el-collapse-item__wrap {
background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content{
width:260px; ::v-deep .el-collapse-item__content {
width: 260px;
position: absolute; position: absolute;
top: 0px; top: 0px;
right: 0px; right: 0px;
@ -1958,7 +1980,7 @@ export default {
z-index: 1; z-index: 1;
color: #ddd; color: #ddd;
padding: 5px; padding: 5px;
background-color:#1e1e1e; background-color: #1e1e1e;
} }
} }