部分问题修复
continuous-integration/drone/push Build is passing Details

main
wangxiaoshuang 2025-12-02 17:12:49 +08:00
parent cc5ac4c2a9
commit c2cb5b1999
14 changed files with 630 additions and 839 deletions

View File

@ -214,56 +214,25 @@
<!-- @dblclick.native="reloadViewport('CT_AXIAL')" --> <!-- @dblclick.native="reloadViewport('CT_AXIAL')" -->
<div ref="dicomContainer" class="dicom-container box box_2_2" style="position: relative;" <div ref="dicomContainer" class="dicom-container box box_2_2" style="position: relative;"
@dblclick="reloadViewport"> @dblclick="reloadViewport">
<Viewport <Viewport ref="CT_AXIAL" :index="1" :active-index="activeIndex"
ref="CT_AXIAL" :is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="ctSeries"
:index="1" :rendering-engine-id="renderingEngineId" viewport-id="CT_AXIAL" :volume="ctVolume"
:active-index="activeIndex" :measure-datas="measureDatas" :style="1 === activeIndex ? viewportStyle : {}"
:is-reading-show-subject-info="isReadingShowSubjectInfo" @upperRangeChange="upperRangeChange" />
:series-info="ctSeries" <Viewport ref="PT_AXIAL" :index="2" :active-index="activeIndex"
:rendering-engine-id="renderingEngineId" :is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries"
viewport-id="CT_AXIAL" :volume="ctVolume" :rendering-engine-id="renderingEngineId" viewport-id="PT_AXIAL" :volume="ptVolume"
:measure-datas="measureDatas" :measure-datas="measureDatas" :style="2 === activeIndex ? viewportStyle : {}"
:style="1 === activeIndex ? viewportStyle : {}" @upperRangeChange="upperRangeChange" />
@upperRangeChange="upperRangeChange" <Viewport ref="FUSION_AXIAL" :index="3" :active-index="activeIndex"
/> :is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries"
<Viewport :rendering-engine-id="renderingEngineId" viewport-id="FUSION_AXIAL" :volume="ptVolume"
ref="PT_AXIAL" :measure-datas="measureDatas" :rgb-preset-name="rgbPresetName" :style="3 === activeIndex ? viewportStyle : {}"
:index="2" @upperRangeChange="upperRangeChange" />
:active-index="activeIndex" <Viewport ref="PET_MIP_CORONAL" :index="4" :active-index="activeIndex"
:is-reading-show-subject-info="isReadingShowSubjectInfo" :is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries"
:series-info="petSeries" :rendering-engine-id="renderingEngineId" viewport-id="PET_MIP_CORONAL" :measure-datas="measureDatas"
:rendering-engine-id="renderingEngineId" :style="4 === activeIndex ? viewportStyle : {}" @upperRangeChange="upperRangeChange" />
viewport-id="PT_AXIAL"
:volume="ptVolume"
:measure-datas="measureDatas"
:style="2 === activeIndex ? viewportStyle : {}"
@upperRangeChange="upperRangeChange"
/>
<Viewport
ref="FUSION_AXIAL"
:index="3"
:active-index="activeIndex"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
:series-info="petSeries"
:rendering-engine-id="renderingEngineId"
viewport-id="FUSION_AXIAL"
:volume="ptVolume"
:measure-datas="measureDatas"
:rgb-preset-name="rgbPresetName"
:style="3 === activeIndex ? viewportStyle : {}"
@upperRangeChange="upperRangeChange"
/>
<Viewport
ref="PET_MIP_CORONAL"
:index="4"
:active-index="activeIndex"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
:series-info="petSeries"
:rendering-engine-id="renderingEngineId"
viewport-id="PET_MIP_CORONAL" :measure-datas="measureDatas"
:style="4 === activeIndex ? viewportStyle : {}"
@upperRangeChange="upperRangeChange"
/>
</div> </div>
<!-- 表单 --> <!-- 表单 -->
<div class="form-container" style="overflow-y: auto;"> <div class="form-container" style="overflow-y: auto;">
@ -273,19 +242,22 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<TableQuestions ref="tableQuestions" /> <TableQuestions ref="tableQuestions" @handleReadingChart="handleReadingChart" />
<Questions ref="questions" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" /> <Questions ref="questions" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
@handleReadingChart="handleReadingChart" />
</div> </div>
</div> </div>
</div> </div>
<el-dialog v-if="customWwc.visible" :visible.sync="customWwc.visible" :close-on-click-modal="false" <el-dialog v-if="customWwc.visible" :visible.sync="customWwc.visible" :close-on-click-modal="false"
:title="customWwc.title" width="400px" custom-class="base-dialog-wrapper"> :title="customWwc.title" width="400px" custom-class="base-dialog-wrapper">
<custom-wwwc-form :ww="activeCanvasWW" :wc="activeCanvasWC" @close="customWwc.visible = false" @setWwwc="setWwwc" /> <custom-wwwc-form :ww="activeCanvasWW" :wc="activeCanvasWC" @close="customWwc.visible = false"
@setWwwc="setWwwc" />
</el-dialog> </el-dialog>
<el-dialog :visible.sync="fusion.visible" :close-on-click-modal="false" :title="$t('trials:lugano:button:record')" <el-dialog :visible.sync="fusion.visible" :close-on-click-modal="false" :title="$t('trials:lugano:button:record')"
width="850px"> width="850px">
<fusion-form @close="fusion.visible = false" /> <fusion-form @close="fusion.visible = false" />
</el-dialog> </el-dialog>
<readingChart ref="readingChart" />
</div> </div>
</template> </template>
<script> <script>
@ -333,6 +305,7 @@ import vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunc
// import vtkOrientationMarkerWidget from '@kitware/vtk.js/Interaction/Widgets/OrientationMarkerWidget' // import vtkOrientationMarkerWidget from '@kitware/vtk.js/Interaction/Widgets/OrientationMarkerWidget'
import { mat4, vec3 } from 'gl-matrix' import { mat4, vec3 } from 'gl-matrix'
import html2canvas from 'html2canvas' import html2canvas from 'html2canvas'
import readingChart from '@/components/readingChart'
// import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction' // import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'
// import vtkMath from '@kitware/vtk.js/Common/Core/Math' // import vtkMath from '@kitware/vtk.js/Common/Core/Math'
// import CircleROITool from './tools/CircleROITool' // import CircleROITool from './tools/CircleROITool'
@ -420,7 +393,8 @@ export default {
Questions, Questions,
TableQuestions, TableQuestions,
CustomWwwcForm, CustomWwwcForm,
FusionForm FusionForm,
readingChart
}, },
data() { data() {
return { return {
@ -582,6 +556,7 @@ export default {
this.screenshotWindow = window.open(routeData.href, '_blank') this.screenshotWindow = window.open(routeData.href, '_blank')
}) })
window.addEventListener('beforeunload', e => { this.beforeUnloadHandler(e) }) window.addEventListener('beforeunload', e => { this.beforeUnloadHandler(e) })
document.addEventListener("click", this.foo);
}, },
beforeDestroy() { beforeDestroy() {
if (this.screenshotWindow) { if (this.screenshotWindow) {
@ -604,7 +579,21 @@ export default {
window.removeEventListener('beforeunload', e => { this.beforeUnloadHandler(e) }) window.removeEventListener('beforeunload', e => { this.beforeUnloadHandler(e) })
}, },
methods: { methods: {
handleReadingChart(row) {
let { e, data } = row
let obj = Object.assign({}, data)
obj.TrialId = this.$route.query.trialId
obj.VisitTaskId = this.$route.query.visitTaskId
let zIndex = 9
if (obj.RowIndex) {
zIndex = 9999
}
this.$refs.readingChart.init(e, obj, zIndex)
},
foo() {
if (!this.$refs.readingChart) return false
this.$refs.readingChart.foo()
},
initPage() { initPage() {
const resizeObserver = new ResizeObserver(() => { const resizeObserver = new ResizeObserver(() => {
if (element_ct.style.width) { if (element_ct.style.width) {
@ -1715,7 +1704,7 @@ export default {
}, },
voiChange(v) { voiChange(v) {
let viewportIds = ['FUSION_AXIAL', 'PT_AXIAL', 'PET_MIP_CORONAL'] let viewportIds = ['FUSION_AXIAL', 'PT_AXIAL', 'PET_MIP_CORONAL']
viewportIds.map(viewportId=>{ viewportIds.map(viewportId => {
// const volumeId = viewportId === 'viewportId' ? ptVolumeId : ctVolumeId // const volumeId = viewportId === 'viewportId' ? ptVolumeId : ctVolumeId
const volumeId = ptVolumeId const volumeId = ptVolumeId
const voiRange = { lower: 0, upper: v } const voiRange = { lower: 0, upper: v }
@ -1738,14 +1727,14 @@ export default {
// console.log(vp.id) // console.log(vp.id)
// }) // })
}) })
}, },
async setColorMap(rgbPresetName) { async setColorMap(rgbPresetName) {
this.rgbPresetName = rgbPresetName this.rgbPresetName = rgbPresetName
let viewports = ['FUSION_AXIAL', 'PT_AXIAL', 'PET_MIP_CORONAL'] let viewports = ['FUSION_AXIAL', 'PT_AXIAL', 'PET_MIP_CORONAL']
viewports.map(v=>{ viewports.map(v => {
this.$refs[v].setPreset(this.rgbPresetName) this.$refs[v].setPreset(this.rgbPresetName)
this.$refs[v].renderColorBar(this.rgbPresetName) this.$refs[v].renderColorBar(this.rgbPresetName)
this.createColorBar(this.rgbPresetName, 'colorBarCanvas', 256, 15) this.createColorBar(this.rgbPresetName, 'colorBarCanvas', 256, 15)
const renderingEngine = getRenderingEngine(renderingEngineId) const renderingEngine = getRenderingEngine(renderingEngineId)
@ -1862,8 +1851,8 @@ export default {
const renderingEngine = getRenderingEngine(renderingEngineId) const renderingEngine = getRenderingEngine(renderingEngineId)
const viewport = renderingEngine.getViewport(viewporId) const viewport = renderingEngine.getViewport(viewporId)
const { invert } = viewport.getProperties() const { invert } = viewport.getProperties()
if ( this.isFusion ) { if (this.isFusion) {
viewport.setProperties({ invert: !invert }, volumeId ) viewport.setProperties({ invert: !invert }, volumeId)
} }
viewport.setProperties({ invert: !invert }) viewport.setProperties({ invert: !invert })
viewport.render() viewport.render()
@ -1987,7 +1976,7 @@ export default {
const viewport = renderingEngine.getViewport(viewportId) const viewport = renderingEngine.getViewport(viewportId)
const lower = v.wc - v.ww / 2 const lower = v.wc - v.ww / 2
const upper = v.wc + v.ww / 2 - 1 const upper = v.wc + v.ww / 2 - 1
viewport.setProperties({ voiRange: { upper: upper, lower: lower }}) viewport.setProperties({ voiRange: { upper: upper, lower: lower } })
viewport.render() viewport.render()
this.customWwc.visible = false this.customWwc.visible = false
}, },

View File

@ -1,305 +1,219 @@
<template> <template>
<div> <div>
<div <div v-if="!!question.GroupName && question.Type === 'group'">
v-if="!!question.GroupName && question.Type==='group'"
>
<h4 style="color: #ddd;padding: 5px 0px;margin: 0;"> <h4 style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language==='en'?question.GroupEnName:question.GroupName }} {{ language === 'en' ? question.GroupEnName : question.GroupName }}
</h4> </h4>
</div> </div>
<template v-else-if="((question.QuestionType === 56) && question.IsBaseLineTask)" /> <template v-else-if="((question.QuestionType === 56) && question.IsBaseLineTask)" />
<template v-else> <template v-else>
<el-form-item <el-form-item
v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0" v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0"
:label="`${question.QuestionName}`" :label="`${question.QuestionName}`" :prop="question.Id" :rules="[
:prop="question.Id" {
:rules="[ required: (question.IsRequired === 0 || (question.IsRequired === 1 && question.RelevanceId && (questionForm[question.RelevanceId] === question.RelevanceValue))) && question.Type !== 'group' && question.Type !== 'summary',
{ required: (question.IsRequired === 0 || (question.IsRequired ===1 && question.RelevanceId && (questionForm[question.RelevanceId] === question.RelevanceValue))) && question.Type!=='group' && question.Type!=='summary', message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']}, },
]" ]" :class="[question.Type === 'group' ? 'mb' : question.Type === 'upload' ? 'uploadWrapper' : '']">
:class="[question.Type==='group'?'mb':question.Type==='upload'?'uploadWrapper':'']"
>
<template v-if="question.QuestionType === 51 || question.QuestionType === 52"> <template v-if="question.QuestionType === 51 || question.QuestionType === 52">
<!-- question.QuestionType === 51 || question.QuestionType === 52 --> <!-- question.QuestionType === 51 || question.QuestionType === 52 -->
<div style="display: flex;flex-direction: row;justify-content: flex-start;"> <div style="display: flex;flex-direction: row;justify-content: flex-start;">
<el-input <div style="display: flex;justify-content: space-between;" v-if="question.Type === 'calculation'">
v-if="question.Type==='calculation'" <el-input v-model="questionForm[question.Id]" disabled style="width: 120px;">
v-model="questionForm[question.Id]" <template v-if="question.Unit" slot="append">
disabled {{ $fd('ValueUnit', parseInt(question.Unit)) }}
style="width: 120px;" </template>
> <svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart"
<template v-if="question.Unit" slot="append"> class="svg-icon svg-readingChart" @click.stop="(e) => handleReadingChart({
{{ $fd('ValueUnit', parseInt(question.Unit)) }} e,
</template> data: {
</el-input> QuestionId: question.Id,
RowIndex: questionForm.RowIndex,
QuestionName: question.QuestionName
}
})" />
</el-input>
</div>
<!-- 测量 --> <!-- 测量 -->
<el-button v-if="(!questionForm[question.Id] && ((question.QuestionType === 51 && liverIsInsideVolume) || (question.QuestionType === 52 && lungIsInsideVolume)) && readingTaskState!== 2)" size="mini" type="text" @click="addAnnotation(question)">{{ $t('trials:lugano:button:addAnnotation') }}</el-button> <el-button
v-if="(!questionForm[question.Id] && ((question.QuestionType === 51 && liverIsInsideVolume) || (question.QuestionType === 52 && lungIsInsideVolume)) && readingTaskState !== 2)"
size="mini" type="text" @click="addAnnotation(question)">{{ $t('trials:lugano:button:addAnnotation')
}}</el-button>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button v-if="(questionForm[question.Id] || (question.QuestionType === 51 && !liverIsInsideVolume) || (question.QuestionType === 52 && !lungIsInsideVolume)) && readingTaskState!== 2" size="mini" type="text" style="padding: 7px 5px;margin-left:5px;" @click="removeAnnotation(question)">{{ $t('trials:lugano:button:clearAnnotation') }}</el-button> <el-button
v-if="(questionForm[question.Id] || (question.QuestionType === 51 && !liverIsInsideVolume) || (question.QuestionType === 52 && !lungIsInsideVolume)) && readingTaskState !== 2"
size="mini" type="text" style="padding: 7px 5px;margin-left:5px;" @click="removeAnnotation(question)">{{
$t('trials:lugano:button:clearAnnotation') }}</el-button>
<!-- 定位 --> <!-- 定位 -->
<el-button <el-button
v-if="(questionForm[question.Id] || (question.QuestionType === 51 && !liverIsInsideVolume) || (question.QuestionType === 52 && !lungIsInsideVolume))" v-if="(questionForm[question.Id] || (question.QuestionType === 51 && !liverIsInsideVolume) || (question.QuestionType === 52 && !lungIsInsideVolume))"
size="mini" size="mini" type="text" style="padding: '7px 5px';margin-left:-5px;"
type="text" @click="locateAnnotation(question)">{{
style="padding: '7px 5px';margin-left:-5px;" $t('trials:lugano:button:locateAnnotation') }}</el-button>
@click="locateAnnotation(question)"
>{{ $t('trials:lugano:button:locateAnnotation') }}</el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button v-if="readingTaskState!== 2 && question.SaveEnum === 1" size="mini" type="text" style="padding: '7px 5px';margin-left:-5px;" @click="saveAnnotation(question)"> <el-button v-if="readingTaskState !== 2 && question.SaveEnum === 1" size="mini" type="text"
style="padding: '7px 5px';margin-left:-5px;" @click="saveAnnotation(question)">
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom"> <el-tooltip 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>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
<el-button v-if="!question.IsBaseLineTask" size="mini" type="text" style="padding: '7px 5px';margin-left:-5px;" @click="viewAnnotations(question)">{{ $t('trials:lugano:button:suvscreenshot') }}</el-button> <el-button v-if="!question.IsBaseLineTask" size="mini" type="text"
style="padding: '7px 5px';margin-left:-5px;" @click="viewAnnotations(question)">{{
$t('trials:lugano:button:suvscreenshot') }}</el-button>
</div> </div>
</template> </template>
<template v-else-if="question.QuestionType === 53"> <template v-else-if="question.QuestionType === 53">
<el-input <div style="display: flex;justify-content: space-between;" v-if="question.Type === 'calculation'">
v-if="question.Type==='calculation'" <el-input v-model="questionForm[question.Id]" disabled>
v-model="questionForm[question.Id]" <template v-if="question.Unit" slot="append">
disabled {{ $fd('ValueUnit', parseInt(question.Unit)) }}
> </template>
<template v-if="question.Unit" slot="append"> </el-input>
{{ $fd('ValueUnit', parseInt(question.Unit)) }} <svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
</template> @click.stop="(e) => handleReadingChart({
</el-input> e,
data: {
QuestionId: question.Id,
RowIndex: questionForm.RowIndex,
QuestionName: question.QuestionName
}
})" />
</div>
</template> </template>
<template v-else-if="question.QuestionType === 55"> <template v-else-if="question.QuestionType === 55">
<el-select <el-select v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2" clearable
v-model="questionForm[question.Id]" @change="((val) => { formItemChange(val, question) })">
:disabled="readingTaskState >= 2 "
clearable
@change="((val)=>{formItemChange(val, question)})"
>
<el-option-group <el-option-group
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode,parseFloat(question.LastTaskAnswer))}` : ''" :label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode, parseFloat(question.LastTaskAnswer))}` : ''">
>
<template> <template>
<el-option <el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
v-for="item of $d[question.DictionaryCode]" :label="item.label" />
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</el-select> </el-select>
</template> </template>
<template v-else-if="question.QuestionType === 56"> <template v-else-if="question.QuestionType === 56">
<el-select <el-select v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2" clearable
v-model="questionForm[question.Id]" @change="((val) => { formItemChange(val, question) })">
:disabled="readingTaskState >= 2 "
clearable
@change="((val)=>{formItemChange(val, question)})"
>
<el-option-group <el-option-group
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${parseFloat(question.LastTaskAnswer) === 5 ? 'NA' : $fd(question.DictionaryCode,parseFloat(question.LastTaskAnswer))}` : ''" :label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${parseFloat(question.LastTaskAnswer) === 5 ? 'NA' : $fd(question.DictionaryCode, parseFloat(question.LastTaskAnswer))}` : ''">
> <template v-if="pet5PS * 1 === -1">
<template v-if="pet5PS*1=== -1"> <el-option v-for="item of $d[question.DictionaryCode]" v-show="item.value !== 4" :key="item.id"
<el-option :value="String(item.value)" :label="item.label" />
v-for="item of $d[question.DictionaryCode]"
v-show="item.value !== 4"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
v-for="item of $d[question.DictionaryCode]" :label="item.label" />
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</el-select> </el-select>
</template> </template>
<template v-else-if="question.QuestionType === 57"> <template v-else-if="question.QuestionType === 57">
<el-select <el-select v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2" clearable
v-model="questionForm[question.Id]" @change="((val) => { formItemChange(val, question) })">
:disabled="readingTaskState >= 2 "
clearable
@change="((val)=>{formItemChange(val, question)})"
>
<el-option-group <el-option-group
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode,parseFloat(question.LastTaskAnswer))}` : ''" :label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode, parseFloat(question.LastTaskAnswer))}` : ''">
> <template v-if="pet5PS * 1 === -1">
<template v-if="pet5PS*1=== -1"> <el-option v-for="item of $d[question.DictionaryCode]" v-show="item.value !== 1" :key="item.id"
<el-option :value="String(item.value)" :label="item.label" />
v-for="item of $d[question.DictionaryCode]"
v-show="item.value !== 1"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
v-for="item of $d[question.DictionaryCode]" :label="item.label" />
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</el-select> </el-select>
</template> </template>
<!-- 输入框 --> <!-- 输入框 -->
<el-input <el-input v-else-if="question.Type === 'input'" v-model="questionForm[question.Id]"
v-else-if="question.Type==='input'" :disabled="readingTaskState >= 2" />
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
/>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input <el-input v-else-if="question.Type === 'textarea'" v-model="questionForm[question.Id]" type="textarea"
v-else-if="question.Type==='textarea'" :autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2" />
v-model="questionForm[question.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="readingTaskState >= 2"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select v-else-if="question.Type === 'select'" v-model="questionForm[question.Id]"
v-else-if="question.Type==='select'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode) || question.QuestionType === 50" :disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode) || question.QuestionType === 50"
clearable clearable @change="((val) => { formItemChange(val, question) })">
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.TableQuestionType === 1"> <template v-if="question.TableQuestionType === 1">
<el-option <el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
v-for="item in organList" :value="item[question.DataTableColumn]" />
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
</template> </template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3"> <template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option <el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
v-for="item of $d[question.DictionaryCode]" :label="item.label" />
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode"> <template
<el-option v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
v-for="item of $d[question.DictionaryCode]" <el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
:key="item.id" :label="item.label" />
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val" />
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group <el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]"
v-else-if="question.Type==='radio'" :disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })">
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.DictionaryCode"> <template v-if="question.DictionaryCode">
<el-radio <el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)">
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="String(item.value)"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</template> </template>
<template v-else-if="question.TypeValue"> <template v-else-if="question.TypeValue">
<el-radio <el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</template> </template>
</el-radio-group> </el-radio-group>
<!-- 复选框 --> <!-- 复选框 -->
<el-checkbox-group <el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]"
v-else-if="question.Type==='checkbox'" :disabled="readingTaskState >= 2">
v-model="questionForm[question.Id]" <el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
:disabled="readingTaskState >= 2"
>
<el-checkbox
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
<!-- 数值 --> <!-- 数值 -->
<el-input-number
v-else-if="question.Type==='number'" <div style="display: flex;justify-content: space-between;"
v-model="questionForm[question.Id]" v-else-if="question.Type === 'calculation' || question.Type === 'number'">
:disabled="readingTaskState >= 2" <el-input-number v-if="question.Type === 'number'" v-model="questionForm[question.Id]"
/> :disabled="readingTaskState >= 2" />
<el-input <el-input v-model="questionForm[question.Id]" disabled v-else />
v-else-if="question.Type==='calculation'" <svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
v-model="questionForm[question.Id]" @click.stop="(e) => handleReadingChart({
disabled e,
/> data: {
QuestionId: question.Id,
RowIndex: questionForm.RowIndex,
QuestionName: question.QuestionName
}
})" />
</div>
<!-- 上传图像 --> <!-- 上传图像 -->
<el-upload <el-upload v-if="question.Type === 'upload'" action :accept="accept" :limit="question.ImageCount"
v-if="question.Type==='upload'" :on-preview="handlePictureCardPreview" :before-upload="handleBeforeUpload" :http-request="uploadScreenshot"
action list-type="picture-card" :on-remove="handleRemove" :file-list="fileList"
:accept="accept" :class="{ disabled: fileList.length >= question.ImageCount }" :disabled="readingTaskState >= 2">
:limit="question.ImageCount"
:on-preview="handlePictureCardPreview"
:before-upload="handleBeforeUpload"
:http-request="uploadScreenshot"
list-type="picture-card"
:on-remove="handleRemove"
:file-list="fileList"
:class="{disabled:fileList.length >= question.ImageCount}"
:disabled="readingTaskState >= 2"
>
<i slot="default" class="el-icon-plus" /> <i slot="default" class="el-icon-plus" />
<div slot="file" slot-scope="{file}"> <div slot="file" slot-scope="{file}">
<img <img class="el-upload-list__item-thumbnail" :src="OSSclientConfig.basePath + file.url" alt="">
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
alt=""
>
<span class="el-upload-list__item-actions"> <span class="el-upload-list__item-actions">
<span <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
class="el-upload-list__item-preview"
@click="handlePictureCardPreview(file)"
>
<i class="el-icon-zoom-in" /> <i class="el-icon-zoom-in" />
</span> </span>
<span <span v-if="readingTaskState < 2" class="el-upload-list__item-delete" @click="handleRemove(file)">
v-if="readingTaskState < 2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete" /> <i class="el-icon-delete" />
</span> </span>
</span> </span>
</div> </div>
</el-upload> </el-upload>
<el-dialog <el-dialog v-if="question.Type === 'upload'" append-to-body :visible.sync="imgVisible" width="600px">
v-if="question.Type==='upload'"
append-to-body
:visible.sync="imgVisible"
width="600px"
>
<el-image :src="imageUrl" width="100%"> <el-image :src="imageUrl" width="100%">
<div slot="placeholder" class="image-slot"> <div slot="placeholder" class="image-slot">
加载中<span class="dot">...</span> 加载中<span class="dot">...</span>
@ -309,19 +223,11 @@
</el-form-item> </el-form-item>
</template> </template>
<template v-for="item of question.Childrens"> <template v-for="item of question.Childrens">
<QuestionItem <QuestionItem v-if="item.QuestionClassify === 0" :key="item.Id" :question="item"
v-if="item.QuestionClassify === 0" :reading-task-state="readingTaskState" :question-form="questionForm" :visit-task-id="visitTaskId"
:key="item.Id" :pet5p-s="pet5PS" :lung-is-inside-volume="lungIsInsideVolume" :liver-is-inside-volume="liverIsInsideVolume"
:question="item" @setFormItemData="setFormItemData" @resetFormItemData="resetFormItemData"
:reading-task-state="readingTaskState" @handleReadingChart="handleReadingChart" />
:question-form="questionForm"
:visit-task-id="visitTaskId"
:pet5p-s="pet5PS"
:lung-is-inside-volume="lungIsInsideVolume"
:liver-is-inside-volume="liverIsInsideVolume"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
</template> </template>
</div> </div>
</template> </template>
@ -406,6 +312,9 @@ export default {
} }
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
formItemChange(v, question) { formItemChange(v, question) {
if (question.QuestionType === 55) { if (question.QuestionType === 55) {
this.$emit('setFormItemData', { key: question.Id, val: v }) this.$emit('setFormItemData', { key: question.Id, val: v })
@ -441,7 +350,7 @@ export default {
.then(() => { .then(() => {
FusionEvent.$emit('removeAnnotation', question) FusionEvent.$emit('removeAnnotation', question)
}) })
.catch(() => {}) .catch(() => { })
}, },
locateAnnotation(question) { locateAnnotation(question) {
FusionEvent.$emit('locateAnnotation', question) FusionEvent.$emit('locateAnnotation', question)
@ -503,26 +412,32 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.mb{ .mb {
margin-bottom: 0px; margin-bottom: 0px;
} }
.disabled{
.disabled {
::v-deep .el-upload--picture-card { ::v-deep .el-upload--picture-card {
display: none; display: none;
} }
} }
.uploadWrapper{
.uploadWrapper {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
} }
::v-deep .el-input.is-disabled .el-input__inner{
background-color: #646464a1; ::v-deep .el-input.is-disabled .el-input__inner {
} background-color: #646464a1;
::v-deep .el-input-group__append, .el-input-group__prepend{ }
padding: 0 5px;
} ::v-deep .el-input-group__append,
::v-deep .el-select.is-disabled .el-input__inner{ .el-input-group__prepend {
background-color: #646464a1; padding: 0 5px;
} }
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1;
}
</style> </style>

View File

@ -1,29 +1,17 @@
<template> <template>
<div v-loading="loading" class="ecrf-wrapper"> <div v-loading="loading" class="ecrf-wrapper">
<el-form <el-form v-if="questions.length > 0" ref="questions" size="small" :model="questionForm">
v-if="questions.length > 0"
ref="questions"
size="small"
:model="questionForm"
>
<template v-for="question of questions"> <template v-for="question of questions">
<QuestionItem <QuestionItem v-if="question.QuestionClassify === 0" :key="question.Id" :question="question"
v-if="question.QuestionClassify === 0" :question-form="questionForm" :reading-task-state="readingTaskState" :visit-task-id="visitTaskId"
:key="question.Id" :pet5p-s="questionForm[pet5PSId]" :lung-is-inside-volume="lungIsInsideVolume"
:question="question" :liver-is-inside-volume="liverIsInsideVolume" @setFormItemData="setFormItemData"
:question-form="questionForm" @resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart" />
:reading-task-state="readingTaskState"
:visit-task-id="visitTaskId"
:pet5p-s="questionForm[pet5PSId]"
:lung-is-inside-volume="lungIsInsideVolume"
:liver-is-inside-volume="liverIsInsideVolume"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
</template> </template>
<el-form-item v-if="readingTaskState < 2"> <el-form-item v-if="readingTaskState < 2">
<div style="text-align:right"> <div style="text-align:right">
<el-button :disabled="!questionFormChangeState" :type="questionFormChangeState ? 'primary' : null" size="mini" @click="handleSave">{{ $t('common:button:save') }}</el-button> <el-button :disabled="!questionFormChangeState" :type="questionFormChangeState ? 'primary' : null" size="mini"
@click="handleSave">{{ $t('common:button:save') }}</el-button>
</div> </div>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -132,6 +120,9 @@ export default {
FusionEvent.$off('locateAnnotation') FusionEvent.$off('locateAnnotation')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
getQuestions1() { getQuestions1() {
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId) var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
@ -139,17 +130,17 @@ export default {
this.readingTaskState = this.visitTaskList[idx].ReadingTaskState this.readingTaskState = this.visitTaskList[idx].ReadingTaskState
var questions = this.visitTaskList[idx].Questions var questions = this.visitTaskList[idx].Questions
this.questions = this.questions =
questions.map((v) => { questions.map((v) => {
if (v.QuestionClassify === 0) { if (v.QuestionClassify === 0) {
if (v.Type === 'group' && v.Childrens.length === 0) return if (v.Type === 'group' && v.Childrens.length === 0) return
if (!v.IsPage && v.Type !== 'group' && v.Type !== 'summary') { if (!v.IsPage && v.Type !== 'group' && v.Type !== 'summary') {
this.$set(this.questionForm, v.Id, v.Answer ? v.Answer : null) this.$set(this.questionForm, v.Id, v.Answer ? v.Answer : null)
}
if (v.Childrens.length > 0) {
this.setChild(v.Childrens)
}
} }
if (v.Childrens.length > 0) { })
this.setChild(v.Childrens)
}
}
})
this.questions = questions this.questions = questions
} }
}, },
@ -185,7 +176,7 @@ export default {
this.setChild(v.Childrens) this.setChild(v.Childrens)
} }
}) })
console.log(this.questionForm,questions) console.log(this.questionForm, questions)
this.questions = questions this.questions = questions
this.setPet5PSCommentDisplay() this.setPet5PSCommentDisplay()
this.measurements = [] this.measurements = []
@ -759,39 +750,43 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.ecrf-wrapper{ .ecrf-wrapper {
::v-deep .el-form-item__label{ ::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; background-color: transparent;
border: 1px solid #5e5e5e; color: #ddd;
} border: 1px solid #5e5e5e;
::v-deep .el-textarea__inner{ }
background-color: transparent;
color: #ddd; ::v-deep .el-textarea__inner {
border: 1px solid #5e5e5e; background-color: transparent;
} color: #ddd;
::v-deep .el-form-item{ border: 1px solid #5e5e5e;
display: flex; }
flex-direction: row;
justify-content: flex-start; ::v-deep .el-form-item {
flex-wrap: wrap; display: flex;
} flex-direction: row;
::v-deep .el-form-item__content{ justify-content: flex-start;
flex: 1; flex-wrap: wrap;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-form-item__content {
flex: 1;
}
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
.el-form-item__content
.el-select{ .el-form-item__content .el-select {
width: 100%; width: 100%;
}
} }
}
</style> </style>

View File

@ -1,12 +1,6 @@
<template> <template>
<el-form <el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
v-if="isRender" class="measurement-form">
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -19,184 +13,151 @@
</div> </div>
</div> </div>
<el-form-item <el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
:label="$t('trials:reading:title:lesionType')" { required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
prop="LesionType" ]">
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select v-model="questionForm.LesionType" filterable
v-model="questionForm.LesionType" :disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask"
filterable @change="((val) => { lesionTypeChange(val) })">
:disabled="!isCurrentTask || readingTaskState>=2 || !isBaseLineTask"
@change="((val)=>{lesionTypeChange(val)})"
>
<el-option <el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
v-for="item of $d.LesionType" :value="item.value" :label="item.label" />
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<template v-for="qs in questions"> <template v-for="qs in questions">
<el-form-item <el-form-item v-if="qs.ShowQuestion !== 2 && qs.QuestionClassify === 0" :key="qs.Id"
v-if="qs.ShowQuestion!==2 && qs.QuestionClassify === 0" :label="`${qs.QuestionName}`" :prop="qs.Id" :rules="[
:key="qs.Id" {
:label="`${qs.QuestionName}`" required: (qs.IsRequired === 0 || (qs.IsRequired === 1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type !== 'group' && qs.Type !== 'summary',
:prop="qs.Id" message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
:rules="[ },
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type!=='group' && qs.Type!=='summary', ]">
message:['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur','change']},
]"
>
<!-- {{ isCurrentTaskAdd }} <!-- {{ isCurrentTaskAdd }}
{{ questionForm.IsCanEditPosition }} --> {{ questionForm.IsCanEditPosition }} -->
<!-- 输入框 --> <!-- 输入框 -->
<template v-if="qs.Type==='input' || qs.Type==='number'"> <template v-if="qs.Type === 'input' || qs.Type === 'number'">
<!-- {{ ((qs.QuestionMark === 6 && isCurrentTaskAdd === 'False') || (qs.QuestionMark === 6 && isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition)) }} --> <div style="display: flex;justify-content: space-between;">
<el-input <!-- {{ ((qs.QuestionMark === 6 && isCurrentTaskAdd === 'False') || (qs.QuestionMark === 6 && isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition)) }} -->
v-if="qs.Type==='input' || qs.Type==='number'" <el-input v-if="qs.Type === 'input' || qs.Type === 'number'" v-model="questionForm[qs.Id]"
v-model="questionForm[qs.Id]" :disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName))"
:disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName))" @change="((val) => { formItemChange(val, qs) })">
@change="((val)=>{formItemChange(val, qs)})" <template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
> {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append"> </template>
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} <svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
</template> @click.stop="(e) => handleReadingChart({
</el-input> e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex,
QuestionName: qs.QuestionName
}
})" />
</el-input>
</div>
</template> </template>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input <el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
v-if="qs.Type==='textarea'" :autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="!isCurrentTask || readingTaskState >= 2"
v-model="questionForm[qs.Id]" @change="((val) => { formItemChange(val, qs) })" />
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select v-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
:placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')" :placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')"
:disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False'|| !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))" :disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))"
@change="((val)=>{formItemChange(val, qs)})" @change="((val) => { formItemChange(val, qs) })">
>
<template v-if="qs.QuestionMark === 8" #prefix> <template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;"> <span style="padding-left: 5px;">
<i class="el-icon-search" /> <i class="el-icon-search" />
</span> </span>
</template> </template>
<template v-if="qs.TableQuestionType === 1"> <template v-if="qs.TableQuestionType === 1">
<el-option <el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
v-for="item in organList" :value="item[qs.DataTableColumn]" />
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group <el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
v-if="qs.Type==='radio'" :disabled="!isCurrentTask || readingTaskState >= 2">
v-model="questionForm[qs.id]" <el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
<template v-if="qs.QuestionMark === 20 && qs.Type==='calculation'"> <template v-if="qs.QuestionMark === 20 && qs.Type === 'calculation'">
<div style="display: flex;flex-direction: row;justify-content: flex-start;"> <div style="display: flex;flex-direction: row;justify-content: flex-start;">
<el-input <div style="display: flex;justify-content: space-between;">
v-if="qs.Type==='calculation'" <el-input v-if="qs.Type === 'calculation'" v-model="questionForm[qs.Id]" disabled style="width:120px;">
v-model="questionForm[qs.Id]" <template v-if="qs.Unit" slot="append">
disabled {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
style="width:120px;" </template>
> </el-input>
<template v-if="qs.Unit" slot="append"> <svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} @click.stop="(e) => handleReadingChart({
</template> e,
</el-input> data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex,
QuestionName: qs.QuestionName
}
})" />
</div>
<!-- <span style="color:#409eff;cursor: pointer" @click="previewImages(answers.RowId)"> <!-- <span style="color:#409eff;cursor: pointer" @click="previewImages(answers.RowId)">
{{ $t('trials:lugano:button:suvscreenshot') }} {{ $t('trials:lugano:button:suvscreenshot') }}
</span> --> </span> -->
<el-button v-if="!isBaseLineTask" type="text" @click="previewImages(answers.RowId)">{{ $t('trials:lugano:button:suvscreenshot') }}</el-button> <el-button v-if="!isBaseLineTask" type="text" @click="previewImages(answers.RowId)">{{
$t('trials:lugano:button:suvscreenshot') }}</el-button>
</div> </div>
</template> </template>
<el-input <div style="display: flex;justify-content: space-between;"
v-else-if="qs.Type==='calculation' && qs.QuestionMark !== 20" v-else-if="qs.Type === 'calculation' && qs.QuestionMark !== 20">
v-model="questionForm[qs.Id]" <el-input v-model="questionForm[qs.Id]" disabled>
disabled <template v-if="qs.Unit" slot="append">
> {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
<template v-if="qs.Unit" slot="append"> </template>
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} </el-input>
</template> <svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
</el-input> @click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex,
QuestionName: qs.QuestionName
}
})" />
</div>
</el-form-item> </el-form-item>
</template> </template>
</div> </div>
<div <div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
v-if="isCurrentTask && readingTaskState<2" style="text-align:right;margin-top:10px;">
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button <el-button v-if="questionForm.OtherMeasureData" size="mini" @click="handleDeleteMeasureData">
v-if="questionForm.OtherMeasureData"
size="mini"
@click="handleDeleteMeasureData"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete">
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button size="mini" @click="handleSave">
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -288,6 +249,9 @@ export default {
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initForm(isRerender = false) { async initForm(isRerender = false) {
const loading = this.$loading({ fullscreen: true }) const loading = this.$loading({ fullscreen: true })
this.questions.forEach(item => { this.questions.forEach(item => {
@ -341,7 +305,7 @@ export default {
await this.setMeasureData(this.answers.measureObj, true) await this.setMeasureData(this.answers.measureObj, true)
} else { } else {
if (this.questionForm.MeasureData) { if (this.questionForm.MeasureData) {
// 线 // 线
// if (this.answers.MarkTool === 'Bidirectional') { // if (this.answers.MarkTool === 'Bidirectional') {
// this.organList = [] // this.organList = []
// await this.getOrganInfoList(1) // await this.getOrganInfoList(1)
@ -446,8 +410,8 @@ export default {
type: 'warning', type: 'warning',
distinguishCancelAndClose: true distinguishCancelAndClose: true
}) })
.then(() => {}) .then(() => { })
.catch(() => {}) .catch(() => { })
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType) this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return return
} }
@ -459,7 +423,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType) this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return return
@ -786,7 +750,7 @@ export default {
this.$confirm(this.$t('trials:reading:lugano:warnning:outsideVolume'), { this.$confirm(this.$t('trials:reading:lugano:warnning:outsideVolume'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
return return
@ -800,7 +764,7 @@ export default {
this.$confirm(this.$t('trials:reading:lugano:warnning:cannotMeasuredSUV'), { this.$confirm(this.$t('trials:reading:lugano:warnning:cannotMeasuredSUV'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
return return
} }
@ -813,7 +777,7 @@ export default {
this.$confirm(this.$t('trials:reading:lugano:warnning:suvis0'), { this.$confirm(this.$t('trials:reading:lugano:warnning:suvis0'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
return return
} }
@ -1054,47 +1018,57 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.measurement-form{ .measurement-form {
::v-deep .el-form-item__label{ ::v-deep .el-form-item__label {
color: #c3c3c3; color: #c3c3c3;
// text-align: left; // text-align: left;
} }
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__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-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-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-input-group__append, .el-input-group__prepend{
::v-deep .el-input-group__append,
.el-input-group__prepend {
padding: 0 10px; padding: 0 10px;
} }
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::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;
} }
.el-form-item__content
.el-select{ .el-form-item__content .el-select {
width: 100%; width: 100%;
} }
.input-width1{
width: calc(100% - 60px)!important; .input-width1 {
width: calc(100% - 60px) !important;
} }
.input-width2{
.input-width2 {
width: 100% !important; width: 100% !important;
} }
} }
</style> </style>

View File

@ -3,75 +3,88 @@
<div class="container"> <div class="container">
<!-- 测量问题 --> <!-- 测量问题 -->
<template v-for="(qs,index) in questions"> <template v-for="(qs, index) in questions">
<div v-if="qs.QuestionClassify === 0" :key="index" v-loading="loading" class="lesions lesions_wrapper"> <div v-if="qs.QuestionClassify === 0" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language==='en'?qs.GroupEnName:qs.GroupName }} {{ language === 'en' ? qs.GroupEnName : qs.GroupName }}
</h4> </h4>
<div class="lesion_list"> <div class="lesion_list">
<template v-for="item in qs.Childrens"> <template v-for="item in qs.Childrens">
<div v-if="item.QuestionClassify === 0 && !(isBaseLineTask && item.LesionType === 2)" :key="item.Id"> <div v-if="item.QuestionClassify === 0 && !(isBaseLineTask && item.LesionType === 2)" :key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;"> <div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div> <div class="title">{{ item.QuestionName }}
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)"> <svg-icon v-if="item.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0,
QuestionName: item.QuestionName
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" /> <i class="el-icon-plus" />
</div> </div>
</div> </div>
<!-- @change="handleCollapseChange(qs.Childrens,item)" --> <!-- @change="handleCollapseChange(qs.Childrens,item)" -->
<el-collapse <el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
v-if="item.Type === 'table' && item.TableQuestions" @change="handleCollapseChange">
v-model="activeName" <el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)" @contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
>
<template slot="title"> <template slot="title">
<div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}"> <div style="width:300px;position: relative;"
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
{{ getLesionName(item.OrderMark,q.RowIndex) }} {{ getLesionName(item.OrderMark, q.RowIndex) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].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(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].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;">
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; --> <!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
<div style="font-size: 11px;width:220px;height: 30px;"> <div style="font-size: 11px;width:220px;height: 30px;">
<div <div v-if="item.TableQuestions.Answers[i].lesionPart"
v-if="item.TableQuestions.Answers[i].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" <el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark"
> :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<span>{{ item.TableQuestions.Answers[i].lesionPart }}</span> <span>{{ item.TableQuestions.Answers[i].lesionPart }}</span>
</el-tooltip> </el-tooltip>
</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="item.LesionType === 0"> <span v-if="item.LesionType === 0">
{{ $fd('TargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
<span v-else-if="item.LesionType === 1"> <span v-else-if="item.LesionType === 1">
{{ $fd('NoTargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NoTargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
<span v-else> <span v-else>
{{ $fd('NewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
</div> </div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px;color:red;"> <div
<template v-if="item.TableQuestions.Answers[i].suvMax && !isNaN(parseFloat(item.TableQuestions.Answers[i].suvMax))"> style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px;color:red;">
<template
v-if="item.TableQuestions.Answers[i].suvMax && !isNaN(parseFloat(item.TableQuestions.Answers[i].suvMax))">
{{ item.TableQuestions.Answers[i].suvMax }} SUV {{ item.TableQuestions.Answers[i].suvMax }} SUV
</template> </template>
</div> </div>
</div> </div>
</div> </div>
<div v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0,1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'" style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);"> <div
v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0, 1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'"
style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<!-- 分裂 --> <!-- 分裂 -->
<!-- <el-tooltip v-show="readingTaskState<2 && !!item.TableQuestions.Answers[i].RowId && !isBaseLineTask" class="item" :content="$t('trials:reading:button:split')" placement="left"> <!-- <el-tooltip v-show="readingTaskState<2 && !!item.TableQuestions.Answers[i].RowId && !isBaseLineTask" class="item" :content="$t('trials:reading:button:split')" placement="left">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" /> <i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" />
@ -81,25 +94,14 @@
</div> </div>
</template> </template>
<QuestionForm <QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:ref="`${item.Id}_${q.RowIndex}`" :answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:questions="item.TableQuestions.Questions" :order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
:answers="item.TableQuestions.Answers[i]" :question-name="item.QuestionName" :parent-qs-id="item.Id" :visit-task-id="visitTaskId"
:lesion-type="item.LesionType" :is-current-task="isCurrentTask" :reading-task-state="readingTaskState"
:order-mark="item.OrderMark" :is-base-line-task="isBaseLineTask" @changeLesionType="changeLesionType"
:table-questions="tableQuestions" @resetQuestions="resetQuestions" @determineExistsUnsavedLession="determineExistsUnsavedLession"
:row-index="String(q.RowIndex)" @close="close" @handleReadingChart="handleReadingChart" />
:question-name="item.QuestionName"
:parent-qs-id="item.Id"
:visit-task-id="visitTaskId"
:is-current-task="isCurrentTask"
:reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask"
@changeLesionType="changeLesionType"
@resetQuestions="resetQuestions"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@close="close"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -170,6 +172,9 @@ export default {
beforeDestroy() { beforeDestroy() {
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
initList(isRerender = false) { initList(isRerender = false) {
this.loading = true this.loading = true
this.activeName = '' this.activeName = ''
@ -345,7 +350,7 @@ export default {
.then(() => { .then(() => {
this.split(rowId, questionId) this.split(rowId, questionId)
}) })
.catch(() => {}) .catch(() => { })
} else { } else {
// //
this.$confirm(this.$t('trials:reading:warnning:msg4'), { this.$confirm(this.$t('trials:reading:warnning:msg4'), {
@ -355,7 +360,7 @@ export default {
.then(() => { .then(() => {
this.split(rowId, questionId) this.split(rowId, questionId)
}) })
.catch(() => {}) .catch(() => { })
} }
} }
} }
@ -429,7 +434,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
return return
} }
@ -439,7 +444,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
} else { } else {
// saveTypeEnum: 0 // saveTypeEnum: 0
@ -582,7 +587,7 @@ export default {
// await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId }) // await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId })
this.questions = this.findQuestionAndRemoveLesion(this.questions, { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex }) this.questions = this.findQuestionAndRemoveLesion(this.questions, { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex })
// saveTypeEnum: 0 // saveTypeEnum: 0
var lesionObj = { } var lesionObj = {}
var questionObj = questionsObj.questionForm var questionObj = questionsObj.questionForm
// //
var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType) var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType)
@ -817,19 +822,20 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.measurement-wrapper{ .measurement-wrapper {
// .container{ // .container{
// padding: 10px; // padding: 10px;
// } // }
.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;
@ -838,42 +844,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;
@ -882,7 +895,7 @@ export default {
z-index: 1; z-index: 1;
color: #ddd; color: #ddd;
padding: 5px; padding: 5px;
background-color:#1e1e1e; background-color: #1e1e1e;
} }
} }

View File

@ -31,7 +31,16 @@
v-show="!(isBaseLineTask && item.LesionType === 2) && !(isBaseLineTask && item.LesionType === 3)" v-show="!(isBaseLineTask && item.LesionType === 2) && !(isBaseLineTask && item.LesionType === 3)"
:key="item.Id"> :key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;"> <div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div> <div class="title">{{ item.QuestionName }}
<svg-icon v-if="item.LesionType === 4" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0,
QuestionName: item.QuestionName
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" <div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)"> @click.prevent="handleAdd(item)">
<i class="el-icon-plus" /> <i class="el-icon-plus" />

View File

@ -737,7 +737,7 @@ export default {
line-height: 25px; line-height: 25px;
text-align: center; text-align: center;
border: 1px solid #607d8b; border: 1px solid #607d8b;
top: 65px; top: 45px;
right: -25px; right: -25px;
z-index: 99; z-index: 99;
color: #d5d5d5; color: #d5d5d5;

View File

@ -42,14 +42,14 @@
:style="{ color: ((scope.row.isLymphNodes === 1 && scope.row.QuestionMark === 1) || (scope.row.isLymphNodes === 0 && scope.row.QuestionMark === 0)) && (scope.row.LesionType === 0 || scope.row.LesionType === 5) ? '#f66' : '#fff' }">{{ :style="{ color: ((scope.row.isLymphNodes === 1 && scope.row.QuestionMark === 1) || (scope.row.isLymphNodes === 0 && scope.row.QuestionMark === 0)) && (scope.row.LesionType === 0 || scope.row.LesionType === 5) ? '#f66' : '#fff' }">{{
scope.row.QuestionName }} scope.row.QuestionName }}
<svg-icon <svg-icon
v-if="scope.row.ShowChartTypeEnum > 0 || (scope.row.LesionType === 0 && scope.row.ReportLayType === 1)" v-if="scope.row.ShowChartTypeEnum > 0 || (scope.row.LesionType === 0 && scope.row.ReportLayType === 1) || (scope.row.LesionType === 4 && scope.row.ReportLayType === 1)"
icon-class="readingChart" class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({ icon-class="readingChart" class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e, e,
data: { data: {
QuestionId: scope.row.RowIndex ? null : scope.row.QuestionId, QuestionId: scope.row.RowIndex ? null : scope.row.QuestionId,
TableQuestionId: scope.row.RowIndex ? scope.row.TableQuestionId : null, TableQuestionId: scope.row.RowIndex ? scope.row.TableQuestionId : null,
RowIndex: scope.row.RowIndex ? scope.row.RowIndex : null, RowIndex: scope.row.RowIndex ? scope.row.RowIndex : null,
ReportChartTypeEnum: scope.row.LesionType === 0 && scope.row.ReportLayType === 1 ? 0 : null, ReportChartTypeEnum: (scope.row.LesionType === 0 && scope.row.ReportLayType === 1) || (scope.row.LesionType === 4 && scope.row.ReportLayType === 1) ? 0 : null,
QuestionName: scope.row.QuestionName QuestionName: scope.row.QuestionName
} }
})" /> })" />
@ -169,7 +169,8 @@
<span v-else>{{ $fd(scope.row.DictionaryCode, scope.row.Answers[task.VisitTaskId]) }}</span> <span v-else>{{ $fd(scope.row.DictionaryCode, scope.row.Answers[task.VisitTaskId]) }}</span>
</template> </template>
<template v-else-if="scope.row.QuestionType === 22"> <template v-else-if="scope.row.QuestionType === 22">
{{ scope.row.Answers[task.VisitTaskId] === '-1' ? $t('trials:readingReport:title:unknow') : {{ scope.row.Answers[task.VisitTaskId] === '-2' ? "NA" : scope.row.Answers[task.VisitTaskId] === '-1' ?
$t('trials:readingReport:title:unknow') :
scope.row.Answers[task.VisitTaskId] }} scope.row.Answers[task.VisitTaskId] }}
</template> </template>

View File

@ -206,7 +206,8 @@
:initUrl="scope.row.Answers[task.VisitTaskId]"></customize-report-page-upload> :initUrl="scope.row.Answers[task.VisitTaskId]"></customize-report-page-upload>
</template> </template>
<template v-else-if="scope.row.QuestionType === 22"> <template v-else-if="scope.row.QuestionType === 22">
{{ scope.row.Answers[task.VisitTaskId] === '-1' ? '未知' : scope.row.Answers[task.VisitTaskId] }} {{ scope.row.Answers[task.VisitTaskId] === '-2' ? "NA" : scope.row.Answers[task.VisitTaskId] === '-1' ?
'未知' : scope.row.Answers[task.VisitTaskId] }}
</template> </template>
<template v-else-if="scope.row.DictionaryCode"> <template v-else-if="scope.row.DictionaryCode">
{{ $fd(scope.row.DictionaryCode, scope.row.Answers[task.VisitTaskId]) }} {{ $fd(scope.row.DictionaryCode, scope.row.Answers[task.VisitTaskId]) }}

View File

@ -168,7 +168,8 @@
<span v-else>{{ $fd(scope.row.DictionaryCode, scope.row.Answers[task.VisitTaskId]) }}</span> <span v-else>{{ $fd(scope.row.DictionaryCode, scope.row.Answers[task.VisitTaskId]) }}</span>
</template> </template>
<template v-else-if="scope.row.QuestionType === 22"> <template v-else-if="scope.row.QuestionType === 22">
{{ scope.row.Answers[task.VisitTaskId] === '-1' ? $t('trials:readingReport:title:unknow') : {{ scope.row.Answers[task.VisitTaskId] === '-2' ? "NA" : scope.row.Answers[task.VisitTaskId] === '-1' ?
$t('trials:readingReport:title:unknow') :
scope.row.Answers[task.VisitTaskId] }} scope.row.Answers[task.VisitTaskId] }}
</template> </template>

View File

@ -1,112 +1,76 @@
<template> <template>
<el-form v-if="globalForm.taskList.length > 0" ref="globalRuleForm" :model="globalForm" class="global-form"> <el-form v-if="globalForm.taskList.length > 0" ref="globalRuleForm" :model="globalForm" class="global-form">
<el-table <el-table v-loading="loading" :data="globalForm.taskList">
v-loading="loading" <el-table-column prop="BlindName" :label="$t('trials:globalReview:table:visitName')" show-overflow-tooltip
:data="globalForm.taskList" width="150" />
>
<el-table-column
prop="BlindName"
:label="$t('trials:globalReview:table:visitName')"
show-overflow-tooltip
width="150"
/>
<!-- 评估结果 --> <!-- 评估结果 -->
<el-table-column <el-table-column :label="$t('trials:medicalFeedback:table:visitPointCount')" align="center" prop="">
:label="$t('trials:medicalFeedback:table:visitPointCount')"
align="center"
prop=""
>
<template> <template>
<el-table-column <el-table-column v-for="(qs, index) in globalInfo.evaluationQsList" :key="index" prop="" :label="qs"
v-for="(qs,index) in globalInfo.evaluationQsList" show-overflow-tooltip width="200">
:key="index"
prop=""
:label="qs"
show-overflow-tooltip
width="200"
>
<template slot-scope="scope"> <template slot-scope="scope">
<template v-if="(scope.row.IsBaseLine && (scope.row.BeforeQuestionList[index].GlobalReadingShowType ===1 || scope.row.BeforeQuestionList[index].GlobalReadingShowType ===5)) || (!scope.row.IsBaseLine && (scope.row.BeforeQuestionList[index].GlobalReadingShowType ===2 || scope.row.BeforeQuestionList[index].GlobalReadingShowType ===6)) || (scope.row.BeforeQuestionList[index].GlobalReadingShowType ===0 || scope.row.BeforeQuestionList[index].GlobalReadingShowType ===4)"> <template
<div v-if="scope.row.BeforeQuestionList.length>index && scope.row.BeforeQuestionList[index].Answer"> v-if="(scope.row.IsBaseLine && (scope.row.BeforeQuestionList[index].GlobalReadingShowType === 1 || scope.row.BeforeQuestionList[index].GlobalReadingShowType === 5)) || (!scope.row.IsBaseLine && (scope.row.BeforeQuestionList[index].GlobalReadingShowType === 2 || scope.row.BeforeQuestionList[index].GlobalReadingShowType === 6)) || (scope.row.BeforeQuestionList[index].GlobalReadingShowType === 0 || scope.row.BeforeQuestionList[index].GlobalReadingShowType === 4)">
<div v-if="scope.row.BeforeQuestionList.length > index && scope.row.BeforeQuestionList[index].Answer">
<span v-if="scope.row.BeforeQuestionList[index].DictionaryCode"> <span v-if="scope.row.BeforeQuestionList[index].DictionaryCode">
{{ $fd(scope.row.BeforeQuestionList[index].DictionaryCode,parseInt(scope.row.BeforeQuestionList[index].Answer)) }} {{
$fd(scope.row.BeforeQuestionList[index].DictionaryCode, parseInt(scope.row.BeforeQuestionList[index].Answer))
}}
</span> </span>
<span v-else-if="scope.row.BeforeQuestionList[index].QuestionType === 22">{{ scope.row.BeforeQuestionList[index].Answer === '-1' ? $t('trials:readingReport:title:unknow') : scope.row.BeforeQuestionList[index].Answer }}</span> <span v-else-if="scope.row.BeforeQuestionList[index].QuestionType === 22">{{
scope.row.BeforeQuestionList[index].Answer === '-2' ? "NA" :
scope.row.BeforeQuestionList[index].Answer === '-1' ? $t('trials:readingReport:title:unknow') :
scope.row.BeforeQuestionList[index].Answer }}</span>
<span v-else>{{ scope.row.BeforeQuestionList[index].Answer }}</span> <span v-else>{{ scope.row.BeforeQuestionList[index].Answer }}</span>
</div> </div>
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
</template> </template>
</el-table-column> </el-table-column>
<!-- 评估结果 --> <!-- 评估结果 -->
<el-table-column <el-table-column :label="$t('trials:globalReview:table:evaluationRes')" align="center" prop="">
:label="$t('trials:globalReview:table:evaluationRes')"
align="center"
prop=""
>
<template> <template>
<el-table-column <el-table-column v-for="(qs, index) in globalInfo.adjustedQsList" v-if="qs.isShow" :key="index" prop=""
v-for="(qs,index) in globalInfo.adjustedQsList" :label="qs.questionName" :width="index > 0 ? '300' : '200'">
v-if="qs.isShow"
:key="index"
prop=""
:label="qs.questionName"
:width="index > 0 ? '300' : '200'"
>
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="readingTaskState<2 && (scope.row.AfterQuestionList[index].GlobalReadingShowType === 0 || (scope.row.IsBaseLine && scope.row.AfterQuestionList[index].GlobalReadingShowType === 1) || (!scope.row.IsBaseLine && scope.row.AfterQuestionList[index].GlobalReadingShowType === 2))"> <div
v-if="readingTaskState < 2 && (scope.row.AfterQuestionList[index].GlobalReadingShowType === 0 || (scope.row.IsBaseLine && scope.row.AfterQuestionList[index].GlobalReadingShowType === 1) || (!scope.row.IsBaseLine && scope.row.AfterQuestionList[index].GlobalReadingShowType === 2))">
<!-- <span v-if="(scope.row.IsBaseLine && scope.row.AfterQuestionList[index].LimitEdit === 2) || (!scope.row.IsBaseLine && scope.row.AfterQuestionList[index].LimitEdit === 1)"> <!-- <span v-if="(scope.row.IsBaseLine && scope.row.AfterQuestionList[index].LimitEdit === 2) || (!scope.row.IsBaseLine && scope.row.AfterQuestionList[index].LimitEdit === 1)">
{{ $fd(scope.row.AfterQuestionList[index].DictionaryCode, parseInt(scope.row.AfterQuestionList[index].VisitAnswer)) }} {{ $fd(scope.row.AfterQuestionList[index].DictionaryCode, parseInt(scope.row.AfterQuestionList[index].VisitAnswer)) }}
</span> --> </span> -->
<el-form-item <el-form-item
:prop="`${scope.$index}${scope.row.AfterQuestionList[index].QuestionId?scope.row.AfterQuestionList[index].QuestionId:scope.row.AfterQuestionList[index].GlobalAnswerType}`" :prop="`${scope.$index}${scope.row.AfterQuestionList[index].QuestionId ? scope.row.AfterQuestionList[index].QuestionId : scope.row.AfterQuestionList[index].GlobalAnswerType}`"
label="" label="" :rules="[
:rules="[ { required: parseInt(scope.row.AfterQuestionList[index].GlobalAnswerType) !== 1 || scope.row.AfterQuestionList[index].isChange, message: $t('common:ruleMessage:specify'), trigger: ['change', 'blur'] },
{ required: parseInt(scope.row.AfterQuestionList[index].GlobalAnswerType) !== 1 || scope.row.AfterQuestionList[index].isChange,message: $t('common:ruleMessage:specify'), trigger: ['change','blur']}, ]">
]" <label
> v-if="scope.row.AfterQuestionList[index].GlobalAnswerType !== 1 || scope.row.AfterQuestionList[index].isChange" />
<label v-if="scope.row.AfterQuestionList[index].GlobalAnswerType !== 1 || scope.row.AfterQuestionList[index].isChange" /> <template v-if="scope.row.AfterQuestionList[index].GlobalAnswerType === 0">
<template v-if="scope.row.AfterQuestionList[index].GlobalAnswerType === 0 ">
<!-- 下拉框 --> <!-- 下拉框 -->
<!-- cope.row.AfterQuestionList[index].Answer --> <!-- cope.row.AfterQuestionList[index].Answer -->
<el-select <el-select
v-model="globalForm[`${scope.$index}${scope.row.AfterQuestionList[index].QuestionId?scope.row.AfterQuestionList[index].QuestionId:String(scope.row.AfterQuestionList[index].GlobalAnswerType)}`]" v-model="globalForm[`${scope.$index}${scope.row.AfterQuestionList[index].QuestionId ? scope.row.AfterQuestionList[index].QuestionId : String(scope.row.AfterQuestionList[index].GlobalAnswerType)}`]"
style="width:90%;" style="width:90%;" @change="(v) => {
@change="(v) => {
selectChange(v, scope.row, index) selectChange(v, scope.row, index)
}" }">
>
<template v-if="scope.row.AfterQuestionList[index].TypeValue"> <template v-if="scope.row.AfterQuestionList[index].TypeValue">
<el-option <el-option v-for="val in scope.row.AfterQuestionList[index].TypeValue.split('|')" :key="val"
v-for="val in scope.row.AfterQuestionList[index].TypeValue.split('|')" :label="val" :value="val" />
:key="val"
:label="val"
:value="val"
/>
</template> </template>
<template v-if="scope.row.AfterQuestionList[index].DictionaryCode"> <template v-if="scope.row.AfterQuestionList[index].DictionaryCode">
<el-option <el-option v-for="item of $d[scope.row.AfterQuestionList[index].DictionaryCode]"
v-for="item of $d[scope.row.AfterQuestionList[index].DictionaryCode]"
v-show="(scope.row.IsBaseLine && scope.row.AfterQuestionList[index].GlobalAnswerType === 0 && item.value === 5) || (!scope.row.IsBaseLine && scope.row.AfterQuestionList[index].GlobalAnswerType === 0 && item.value !== 5)" v-show="(scope.row.IsBaseLine && scope.row.AfterQuestionList[index].GlobalAnswerType === 0 && item.value === 5) || (!scope.row.IsBaseLine && scope.row.AfterQuestionList[index].GlobalAnswerType === 0 && item.value !== 5)"
:key="item.id" :key="item.id" :value="String(item.value)" :label="item.label" />
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
</el-select> </el-select>
</template> </template>
<!-- 全局阅片备注 GlobalAnswerType:1 --> <!-- 全局阅片备注 GlobalAnswerType:1 -->
<el-input <el-input v-if="scope.row.AfterQuestionList[index].GlobalAnswerType === 1"
v-if="scope.row.AfterQuestionList[index].GlobalAnswerType === 1" v-model="globalForm[`${scope.$index}${scope.row.AfterQuestionList[index].QuestionId ? scope.row.AfterQuestionList[index].QuestionId : String(scope.row.AfterQuestionList[index].GlobalAnswerType)}`]"
v-model="globalForm[`${scope.$index}${scope.row.AfterQuestionList[index].QuestionId?scope.row.AfterQuestionList[index].QuestionId:String(scope.row.AfterQuestionList[index].GlobalAnswerType)}`]" maxlength="300" show-word-limit type="textarea" style="width:90%;"
maxlength="300" :autosize="{ minRows: 2, maxRows: 4 }" />
show-word-limit
type="textarea"
style="width:90%;"
:autosize="{ minRows: 2, maxRows: 4}"
/>
</el-form-item> </el-form-item>
</div> </div>
<div v-else> <div v-else>
@ -115,7 +79,9 @@
{{ getAssessType(scope.row.AfterQuestionList[index].Answer) }} {{ getAssessType(scope.row.AfterQuestionList[index].Answer) }}
</span> </span>
<span v-else-if="scope.row.AfterQuestionList[index].DictionaryCode"> <span v-else-if="scope.row.AfterQuestionList[index].DictionaryCode">
{{ $fd(scope.row.AfterQuestionList[index].DictionaryCode,parseInt(scope.row.AfterQuestionList[index].Answer)) }} {{
$fd(scope.row.AfterQuestionList[index].DictionaryCode, parseInt(scope.row.AfterQuestionList[index].Answer))
}}
</span> </span>
<span v-else>{{ scope.row.AfterQuestionList[index].Answer }}</span> <span v-else>{{ scope.row.AfterQuestionList[index].Answer }}</span>
</div> </div>
@ -124,17 +90,10 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('common:action:action')" width="200">
:label="$t('common:action:action')"
width="200"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button circle :title="$t('trials:globalReview:table:view')" icon="el-icon-view"
circle @click="handleView(scope.row)" />
:title="$t('trials:globalReview:table:view')"
icon="el-icon-view"
@click="handleView(scope.row)"
/>
<!-- v-if="readingTaskState < 2 && scope.row.AgreeOrNot[0].Answer==='0'" --> <!-- v-if="readingTaskState < 2 && scope.row.AgreeOrNot[0].Answer==='0'" -->
<!-- <el-button <!-- <el-button
v-if="readingTaskState < 2 " v-if="readingTaskState < 2 "
@ -232,11 +191,11 @@ export default {
if (i.QuestionId) { if (i.QuestionId) {
obj.questionId = i.QuestionId obj.questionId = i.QuestionId
obj.globalAnswerType = i.GlobalAnswerType obj.globalAnswerType = i.GlobalAnswerType
obj.answer = this.globalForm[ `${index}${i.QuestionId}`] obj.answer = this.globalForm[`${index}${i.QuestionId}`]
} else { } else {
obj.questionId = '' obj.questionId = ''
obj.globalAnswerType = i.GlobalAnswerType obj.globalAnswerType = i.GlobalAnswerType
obj.answer = this.globalForm[ `${index}${i.GlobalAnswerType}`] obj.answer = this.globalForm[`${index}${i.GlobalAnswerType}`]
} }
answerList.push(obj) answerList.push(obj)
}) })
@ -255,17 +214,17 @@ export default {
} }
this.$emit('getGlInfo') this.$emit('getGlInfo')
resolve(true) resolve(true)
} else { } else {
resolve(false) resolve(false)
} }
} catch(e) { } catch (e) {
console.log(e) console.log(e)
this.loading = false this.loading = false
resolve(false) resolve(false)
} }
}) })
} }
} }
@ -274,18 +233,21 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
::v-deep .el-form-item label:before { ::v-deep .el-form-item label:before {
content: '*'; content: '*';
color: #F56C6C; color: #F56C6C;
margin-right: 4px; margin-right: 4px;
} }
::v-deep .el-form-item--medium .el-form-item__content{
::v-deep .el-form-item--medium .el-form-item__content {
display: flex; display: flex;
} }
.global-form{
::v-deep .el-form-item__content{ .global-form {
::v-deep .el-form-item__content {
padding-bottom: 10px; padding-bottom: 10px;
} }
::v-deep .form-item .el-form-item__error{
::v-deep .form-item .el-form-item__error {
top: 60%; top: 60%;
} }
} }

View File

@ -5,53 +5,41 @@
<el-button v-if="auditInfo.IsExistsClinicalData" type="text" @click="previewCD"> <el-button v-if="auditInfo.IsExistsClinicalData" type="text" @click="previewCD">
{{ $t('trials:adReview:title:clinicalData') }} {{ $t('trials:adReview:title:clinicalData') }}
</el-button> </el-button>
<el-button v-if="auditInfo.GlobalInfo.OtherGlobalTaskId" type="text" @click="handleView(auditInfo.GlobalInfo.OtherGlobalTaskId)">{{ $t('trials:medicalFeedback:title:otherReader') }}</el-button> <el-button v-if="auditInfo.GlobalInfo.OtherGlobalTaskId" type="text"
@click="handleView(auditInfo.GlobalInfo.OtherGlobalTaskId)">{{ $t('trials:medicalFeedback:title:otherReader')
}}</el-button>
<!-- 关联裁判任务 --> <!-- 关联裁判任务 -->
<el-button v-if="auditInfo.GlobalInfo.JudgeTaskName" type="text" @click="handleView(auditInfo.GlobalInfo.JudgeTaskId)">{{ auditInfo.GlobalInfo.JudgeTaskName }}</el-button> <el-button v-if="auditInfo.GlobalInfo.JudgeTaskName" type="text"
@click="handleView(auditInfo.GlobalInfo.JudgeTaskId)">{{ auditInfo.GlobalInfo.JudgeTaskName }}</el-button>
</div> </div>
<el-table <el-table v-if="rowData.CriterionType === 10" :data="taskList">
v-if="rowData.CriterionType === 10" <el-table-column prop="BlindName" :label="$t('trials:medicalFeedback:table:taskBlindName')" show-overflow-tooltip
:data="taskList" width="150">
>
<el-table-column
prop="BlindName"
:label="$t('trials:medicalFeedback:table:taskBlindName')"
show-overflow-tooltip
width="150"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button type="text" @click="handleView(scope.row.VisitTaskId)">
type="text"
@click="handleView(scope.row.VisitTaskId)"
>
{{ scope.row.BlindName }} {{ scope.row.BlindName }}
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
<!-- 访视点计数 --> <!-- 访视点计数 -->
<el-table-column <el-table-column :label="$t('trials:medicalFeedback:table:visitPointCount')" align="center" prop=""
:label="$t('trials:medicalFeedback:table:visitPointCount')" show-overflow-tooltip>
align="center"
prop=""
show-overflow-tooltip
>
<template> <template>
<el-table-column <el-table-column v-for="(qs, index) in evaluationQsList" :key="index" prop="" :label="qs" show-overflow-tooltip
v-for="(qs,index) in evaluationQsList" width="150">
:key="index"
prop=""
:label="qs"
show-overflow-tooltip
width="150"
>
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="scope.row.BeforeQuestionList.length>index && scope.row.BeforeQuestionList[index].Answer"> <div v-if="scope.row.BeforeQuestionList.length > index && scope.row.BeforeQuestionList[index].Answer">
<span v-if="scope.row.BeforeQuestionList[index].DictionaryCode"> <span v-if="scope.row.BeforeQuestionList[index].DictionaryCode">
{{ $fd(scope.row.BeforeQuestionList[index].DictionaryCode,parseInt(scope.row.BeforeQuestionList[index].Answer)) }} {{
$fd(scope.row.BeforeQuestionList[index].DictionaryCode, parseInt(scope.row.BeforeQuestionList[index].Answer))
}}
</span> </span>
<span v-else-if="scope.row.BeforeQuestionList[index].QuestionType === 22">{{ scope.row.BeforeQuestionList[index].Answer === '-1' ? $t('trials:medicalFeedback:table:unKnow') : scope.row.BeforeQuestionList[index].Answer }}</span> <span v-else-if="scope.row.BeforeQuestionList[index].QuestionType === 22">{{
scope.row.BeforeQuestionList[index].Answer === '-2' ? "NA" : scope.row.BeforeQuestionList[index].Answer
=== '-1' ? $t('trials:medicalFeedback:table:unKnow') : scope.row.BeforeQuestionList[index].Answer
}}</span>
<span v-else>{{ scope.row.BeforeQuestionList[index].Answer }}</span> <span v-else>{{ scope.row.BeforeQuestionList[index].Answer }}</span>
</div> </div>
</template> </template>
@ -60,48 +48,35 @@
</el-table-column> </el-table-column>
<!-- 是否同意访视结果 --> <!-- 是否同意访视结果 -->
<el-table-column <el-table-column v-for="(qs, index) in agreeOrNotList" :key="index" prop=""
v-for="(qs, index) in agreeOrNotList" :label="$t('trials:medicalFeedback:table:agreeToVisitPointCount')" show-overflow-tooltip width="170">
:key="index"
prop=""
:label="$t('trials:medicalFeedback:table:agreeToVisitPointCount')"
show-overflow-tooltip
width="170"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag v-if="parseInt(scope.row.AgreeOrNot[0].Answer) === 1" type="primary"> <el-tag v-if="parseInt(scope.row.AgreeOrNot[0].Answer) === 1" type="primary">
{{ $fd('ReadingYesOrNo',parseInt(scope.row.AgreeOrNot[0].Answer)) }} {{ $fd('ReadingYesOrNo', parseInt(scope.row.AgreeOrNot[0].Answer)) }}
</el-tag> </el-tag>
<el-tag v-else-if="parseInt(scope.row.AgreeOrNot[0].Answer) === 0" type="danger"> {{ $fd('ReadingYesOrNo',parseInt(scope.row.AgreeOrNot[0].Answer)) }}</el-tag> <el-tag v-else-if="parseInt(scope.row.AgreeOrNot[0].Answer) === 0" type="danger"> {{
$fd('ReadingYesOrNo', parseInt(scope.row.AgreeOrNot[0].Answer)) }}</el-tag>
<span v-else /> <span v-else />
</template> </template>
</el-table-column> </el-table-column>
<!-- 评估结果 --> <!-- 评估结果 -->
<el-table-column <el-table-column :label="$t('trials:medicalFeedback:table:assessmentResults')" align="center" prop=""
:label="$t('trials:medicalFeedback:table:assessmentResults')" show-overflow-tooltip>
align="center"
prop=""
show-overflow-tooltip
>
<template> <template>
<el-table-column <el-table-column v-for="(qs, index) in adjustedQsList" :key="index" prop="" :label="qs" show-overflow-tooltip
v-for="(qs,index) in adjustedQsList" width="150">
:key="index"
prop=""
:label="qs"
show-overflow-tooltip
width="150"
>
<template slot-scope="scope"> <template slot-scope="scope">
<!-- {{ scope.row.AfterQuestionList.length>index?scope.row.AfterQuestionList[index].Answer:'' }} --> <!-- {{ scope.row.AfterQuestionList.length>index?scope.row.AfterQuestionList[index].Answer:'' }} -->
<div v-if="scope.row.AfterQuestionList.length>index && scope.row.AfterQuestionList[index].Answer"> <div v-if="scope.row.AfterQuestionList.length > index && scope.row.AfterQuestionList[index].Answer">
<span v-if="scope.row.AfterQuestionList[index].GlobalAnswerType === 3"> <span v-if="scope.row.AfterQuestionList[index].GlobalAnswerType === 3">
{{ getAssessType(scope.row.AfterQuestionList[index].Answer) }} {{ getAssessType(scope.row.AfterQuestionList[index].Answer) }}
</span> </span>
<span v-else-if="scope.row.AfterQuestionList[index].DictionaryCode"> <span v-else-if="scope.row.AfterQuestionList[index].DictionaryCode">
{{ $fd(scope.row.AfterQuestionList[index].DictionaryCode,parseInt(scope.row.AfterQuestionList[index].Answer)) }} {{
$fd(scope.row.AfterQuestionList[index].DictionaryCode, parseInt(scope.row.AfterQuestionList[index].Answer))
}}
</span> </span>
<span v-else>{{ scope.row.AfterQuestionList[index].Answer }}</span> <span v-else>{{ scope.row.AfterQuestionList[index].Answer }}</span>
</div> </div>
@ -110,60 +85,35 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('common:action:action')" width="100">
:label="$t('common:action:action')"
width="100"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button circle :title="$t('trials:medicalFeedback:table:view')" icon="el-icon-view"
circle @click="handleView(scope.row.VisitTaskId)" />
:title="$t('trials:medicalFeedback:table:view')"
icon="el-icon-view"
@click="handleView(scope.row.VisitTaskId)"
/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-table <el-table v-else :data="taskList">
v-else
:data="taskList"
>
<!-- 访视名称 --> <!-- 访视名称 -->
<el-table-column <el-table-column prop="BlindName" :label="$t('trials:globalReview:table:visitName')" show-overflow-tooltip
prop="BlindName" width="150">
:label="$t('trials:globalReview:table:visitName')"
show-overflow-tooltip
width="150"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button type="text" @click="handleView(scope.row.VisitTaskId)">
type="text"
@click="handleView(scope.row.VisitTaskId)"
>
{{ scope.row.BlindName }} {{ scope.row.BlindName }}
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
<!-- 评估结果 --> <!-- 评估结果 -->
<el-table-column <el-table-column :label="$t('trials:globalReview:table:evaluationRes')" align="center" prop="">
:label="$t('trials:globalReview:table:evaluationRes')"
align="center"
prop=""
>
<template> <template>
<el-table-column <el-table-column v-for="(qs, index) in evaluationQsList" :key="index" prop="" :label="qs" show-overflow-tooltip
v-for="(qs,index) in evaluationQsList" width="150">
:key="index"
prop=""
:label="qs"
show-overflow-tooltip
width="150"
>
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="scope.row.BeforeQuestionList.length>index && scope.row.BeforeQuestionList[index].Answer"> <div v-if="scope.row.BeforeQuestionList.length > index && scope.row.BeforeQuestionList[index].Answer">
<span v-if="scope.row.BeforeQuestionList[index].DictionaryCode"> <span v-if="scope.row.BeforeQuestionList[index].DictionaryCode">
{{ $fd(scope.row.BeforeQuestionList[index].DictionaryCode,parseInt(scope.row.BeforeQuestionList[index].Answer)) }} {{
$fd(scope.row.BeforeQuestionList[index].DictionaryCode, parseInt(scope.row.BeforeQuestionList[index].Answer))
}}
</span> </span>
<span v-else>{{ scope.row.BeforeQuestionList[index].Answer }}</span> <span v-else>{{ scope.row.BeforeQuestionList[index].Answer }}</span>
</div> </div>
@ -172,46 +122,33 @@
</template> </template>
</el-table-column> </el-table-column>
<!-- 是否同意访视结果 --> <!-- 是否同意访视结果 -->
<el-table-column <el-table-column v-for="(qs, index) in agreeOrNotList" :key="index" prop=""
v-for="(qs,index) in agreeOrNotList" :label="$t('trials:globalReview:table:isAgreeEvaluationRes')" show-overflow-tooltip width="170">
:key="index"
prop=""
:label="$t('trials:globalReview:table:isAgreeEvaluationRes')"
show-overflow-tooltip
width="170"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag v-if="parseInt(scope.row.AgreeOrNot[0].Answer) === 1" type="primary"> <el-tag v-if="parseInt(scope.row.AgreeOrNot[0].Answer) === 1" type="primary">
{{ $fd('ReadingYesOrNo',parseInt(scope.row.AgreeOrNot[0].Answer)) }} {{ $fd('ReadingYesOrNo', parseInt(scope.row.AgreeOrNot[0].Answer)) }}
</el-tag> </el-tag>
<el-tag v-else-if="parseInt(scope.row.AgreeOrNot[0].Answer) === 0" type="danger"> {{ $fd('ReadingYesOrNo',parseInt(scope.row.AgreeOrNot[0].Answer)) }}</el-tag> <el-tag v-else-if="parseInt(scope.row.AgreeOrNot[0].Answer) === 0" type="danger"> {{
$fd('ReadingYesOrNo', parseInt(scope.row.AgreeOrNot[0].Answer)) }}</el-tag>
<span v-else /> <span v-else />
</template> </template>
</el-table-column> </el-table-column>
<!-- 调整后结果 --> <!-- 调整后结果 -->
<el-table-column <el-table-column :label="$t('trials:globalReview:table:adjustedRes')" align="center" prop="">
:label="$t('trials:globalReview:table:adjustedRes')"
align="center"
prop=""
>
<template> <template>
<el-table-column <el-table-column v-for="(qs, index) in adjustedQsList" :key="index" prop="" :label="qs" show-overflow-tooltip
v-for="(qs,index) in adjustedQsList" width="150">
:key="index"
prop=""
:label="qs"
show-overflow-tooltip
width="150"
>
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="scope.row.AfterQuestionList.length>index && scope.row.AfterQuestionList[index].Answer"> <div v-if="scope.row.AfterQuestionList.length > index && scope.row.AfterQuestionList[index].Answer">
<span v-if="scope.row.AfterQuestionList[index].GlobalAnswerType === 3"> <span v-if="scope.row.AfterQuestionList[index].GlobalAnswerType === 3">
{{ getAssessType(scope.row.AfterQuestionList[index].Answer) }} {{ getAssessType(scope.row.AfterQuestionList[index].Answer) }}
</span> </span>
<span v-else-if="scope.row.AfterQuestionList[index].DictionaryCode"> <span v-else-if="scope.row.AfterQuestionList[index].DictionaryCode">
{{ $fd(scope.row.AfterQuestionList[index].DictionaryCode,parseInt(scope.row.AfterQuestionList[index].Answer)) }} {{
$fd(scope.row.AfterQuestionList[index].DictionaryCode, parseInt(scope.row.AfterQuestionList[index].Answer))
}}
</span> </span>
<span v-else>{{ scope.row.AfterQuestionList[index].Answer }}</span> <span v-else>{{ scope.row.AfterQuestionList[index].Answer }}</span>
</div> </div>
@ -220,18 +157,11 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('common:action:action')" width="120"
:label="$t('common:action:action')" :fixed="adjustedQsList.length > 4 ? 'right' : false">
width="120"
:fixed="adjustedQsList.length > 4 ? 'right' : false"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button circle :title="$t('trials:globalReview:table:view')" icon="el-icon-view"
circle @click="handleView(scope.row.VisitTaskId)" />
:title="$t('trials:globalReview:table:view')"
icon="el-icon-view"
@click="handleView(scope.row.VisitTaskId)"
/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -320,7 +250,7 @@ export default {
var isReadingTaskViewInOrder = this.rowData.IsReadingTaskViewInOrder var isReadingTaskViewInOrder = this.rowData.IsReadingTaskViewInOrder
var trialReadingCriterionId = this.rowData.TrialReadingCriterionId var trialReadingCriterionId = this.rowData.TrialReadingCriterionId
var path = '' var path = ''
if (readingTool === 0 || readingTool === 2 ) { if (readingTool === 0 || readingTool === 2) {
path = `/readingDicoms?TrialReadingCriterionId=${trialReadingCriterionId}&trialId=${trialId}&subjectCode=${this.rowData.SubjectCode}&subjectId=${this.rowData.SubjectId}&visitTaskId=${visitTaskId}&isReadingTaskViewInOrder=${isReadingTaskViewInOrder}&criterionType=${criterionType}&readingTool=${readingTool}&TokenKey=${token}&key=${new Date().getTime()}` path = `/readingDicoms?TrialReadingCriterionId=${trialReadingCriterionId}&trialId=${trialId}&subjectCode=${this.rowData.SubjectCode}&subjectId=${this.rowData.SubjectId}&visitTaskId=${visitTaskId}&isReadingTaskViewInOrder=${isReadingTaskViewInOrder}&criterionType=${criterionType}&readingTool=${readingTool}&TokenKey=${token}&key=${new Date().getTime()}`
} else { } else {
path = `/noneDicomReading?TrialReadingCriterionId=${trialReadingCriterionId}&trialId=${trialId}&subjectCode=${this.rowData.SubjectCode}&subjectId=${this.rowData.SubjectId}&visitTaskId=${visitTaskId}&isReadingTaskViewInOrder=${isReadingTaskViewInOrder}&criterionType=${criterionType}&readingTool=${readingTool}&TokenKey=${token}&key=${new Date().getTime()}` path = `/noneDicomReading?TrialReadingCriterionId=${trialReadingCriterionId}&trialId=${trialId}&subjectCode=${this.rowData.SubjectCode}&subjectId=${this.rowData.SubjectId}&visitTaskId=${visitTaskId}&isReadingTaskViewInOrder=${isReadingTaskViewInOrder}&criterionType=${criterionType}&readingTool=${readingTool}&TokenKey=${token}&key=${new Date().getTime()}`

View File

@ -40,7 +40,7 @@
<!-- 受试者中止状态 --> <!-- 受试者中止状态 -->
<el-form-item style="margin-bottom: 10px" :label="$t('trials:crcUpload:table:IsSubjectQuit')"> <el-form-item style="margin-bottom: 10px" :label="$t('trials:crcUpload:table:IsSubjectQuit')">
<el-select v-model="searchData.IsSubjectQuit" clearable style="width: 120px"> <el-select v-model="searchData.IsSubjectQuit" clearable style="width: 120px">
<el-option v-for="item of $d.YesOrNo" :value="item.value" :label="item.label" :key="item.label" /> <el-option v-for="item of $d.Subject_Visit_Status" :value="item.value" :label="item.label" :key="item.label" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 审核状态 --> <!-- 审核状态 -->

View File

@ -34,7 +34,8 @@
<!-- 受试者中止状态 --> <!-- 受试者中止状态 -->
<el-form-item style="margin-bottom: 10px" :label="$t('trials:qcCheck:table:IsSubjectQuit')"> <el-form-item style="margin-bottom: 10px" :label="$t('trials:qcCheck:table:IsSubjectQuit')">
<el-select v-model="searchData.IsSubjectQuit" clearable style="width: 120px"> <el-select v-model="searchData.IsSubjectQuit" clearable style="width: 120px">
<el-option v-for="item of $d.YesOrNo" :value="item.value" :label="item.label" :key="item.label" /> <el-option v-for="item of $d.Subject_Visit_Status" :value="item.value" :label="item.label"
:key="item.label" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 审核状态 --> <!-- 审核状态 -->