阅片报告中数值的统计与可视化
continuous-integration/drone/push Build is passing Details

main
wangxiaoshuang 2025-11-20 15:48:40 +08:00
parent ca44352b9e
commit 3243b33b33
45 changed files with 3290 additions and 3785 deletions

View File

@ -1,8 +1,8 @@
<template>
<div id="readingChart" class="readingChart" v-show="visible" :style="{
<div :id="key" class="readingChart" v-show="visible" :style="{
'z-index': zIndex
}" :loading="loading">
<div ref="chartContainer" style="width: 490px; height: 290px;"></div>
}">
<div ref="chartContainer" style="width: 490px; height: 290px;" v-loading="loading"></div>
</div>
</template>
@ -32,32 +32,35 @@ export default {
visible: false,
zIndex: 9,
chart: null,
loading: false
loading: false,
key: 'readingChart'
};
},
methods: {
init(event, obj, zIndex = 9) {
this.loading = true
this.zIndex = zIndex
//
//
this.visible = true
let readingChart = document.querySelector("#readingChart");
let chaY = document.body.clientHeight - event.clientY;
let chaX = document.body.clientWidth - event.clientX;
//
if (chaY < 250) {
readingChart.style.top = event.clientY - 220 + "px";
} else {
readingChart.style.top = event.clientY + "px";
let { key } = obj
if (key) {
this.key = key
}
if (chaX < 150) {
readingChart.style.left = event.clientX - 520 + "px";
} else {
readingChart.style.left = event.clientX + 15 + "px";
}
this.getInfo(obj)
// this.initChart()
// document.addEventListener("click", this.foo); // documentfoo
this.$nextTick(() => {
this.visible = true
let readingChart = document.querySelector(`#${this.key}`);
let chaY = document.body.clientHeight - event.clientY;
let chaX = document.body.clientWidth - event.clientX;
if (chaY < 250) {
readingChart.style.top = event.clientY - 220 + "px";
} else {
readingChart.style.top = event.clientY + "px";
}
if (chaX < 500) {
readingChart.style.left = event.clientX - 520 + "px";
} else {
readingChart.style.left = event.clientX + 15 + "px";
}
this.getInfo(obj)
})
},
async getInfo(data) {
try {
@ -70,7 +73,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
let obj = {
xAxisData: res.Result.VisitTaskNameList || [],
xAxisData: res.Result.LatestScanDateList || [],
series: []
}
res.Result.ChartDataList.forEach(item => {
@ -101,8 +104,32 @@ export default {
tooltip: {
trigger: 'axis'
},
xAxis: { data: obj.xAxisData },
yAxis: { type: 'value' },
xAxis: {
data: obj.xAxisData,
axisLine: { // x 线
lineStyle: {
color: '#fff',
}
},
axisLabel: { // x
textStyle: {
color: '#fff'
}
}
},
yAxis: {
type: 'value',
axisLabel: {
textStyle: {
color: '#fff',
}
},
axisLine: {
lineStyle: {
color: '#fff',
}
}
},
series: obj.series
};
// 4. 使
@ -129,7 +156,8 @@ export default {
max-width: 500px;
font-size: 14px;
display: inline-block;
background: #fff;
background: #000;
border: 1px solid #ebeef5;
border-radius: 4px;
position: fixed;
padding: 10px 6px;

View File

@ -365,3 +365,10 @@ body .el-table th.gutter {
margin-left: 10px;
cursor: pointer;
}
.svg-readingChart-mini {
width: 18px !important;
height: 20px !important;
vertical-align: -0.4em !important;
cursor: pointer;
}

View File

@ -457,32 +457,41 @@
<div class="form-wrapper" v-show="listShow">
<RecistBMQuestionList v-if="CriterionType === 17" ref="measurementList"
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo" />
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo"
@handleReadingChart="handleReadingChart" />
<IRecistQuestionList v-else-if="CriterionType === 3" ref="measurementList"
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo" />
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo"
@handleReadingChart="handleReadingChart" />
<PCWGQuestionList v-else-if="CriterionType === 10" ref="measurementList"
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo" />
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo"
@handleReadingChart="handleReadingChart" />
<LuganoQuestionList v-else-if="CriterionType === 2" ref="measurementList"
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo" />
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo"
@handleReadingChart="handleReadingChart" />
<LuganoWithoutPETQuestionList v-else-if="CriterionType === 18" ref="measurementList"
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo" />
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo"
@handleReadingChart="handleReadingChart" />
<RecistQuestionList v-else-if="CriterionType === 1" ref="measurementList"
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo" />
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo"
@handleReadingChart="handleReadingChart" />
<IVUSList v-else-if="CriterionType === 19" ref="measurementList"
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo" />
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo"
@handleReadingChart="handleReadingChart" />
<OCTList v-else-if="CriterionType === 20" ref="measurementList"
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo" />
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo"
@handleReadingChart="handleReadingChart" />
<MRIPDFF v-else-if="CriterionType === 21" ref="measurementList"
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo" />
:is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo"
@handleReadingChart="handleReadingChart" />
<h2 v-else style="color:#ddd">
Developing...
</h2>
@ -1149,6 +1158,9 @@ export default {
})
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async handleSubmitKeyDoc() {
try {
let data = {

View File

@ -1,12 +1,6 @@
<template>
<el-form
v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
class="measurement-form">
<div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -19,179 +13,118 @@
</div>
</div>
<el-form-item
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]">
<!-- 下拉框 -->
<el-select
v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState>=2 || (!isBaseLineTask && !(isFirstChangeTask && (lesionType === 2 || lesionType === 5 || lesionType === 6)))"
@change="((val)=>{lesionTypeChange(val)})"
>
<el-select v-model="questionForm.LesionType" filterable
:disabled="!isCurrentTask || readingTaskState >= 2 || (!isBaseLineTask && !(isFirstChangeTask && (lesionType === 2 || lesionType === 5 || lesionType === 6)))"
@change="((val) => { lesionTypeChange(val) })">
<el-option
v-for="item of $d.LesionType"
<el-option v-for="item of $d.LesionType"
v-show="(isBaseLineTask && (item.value === 0 || item.value === 1)) || (!isBaseLineTask && ((isFirstChangeTask && (item.value === 5 || item.value === 6)) || !isFirstChangeTask))"
:key="item.id"
:value="item.value"
:label="item.label"
/>
:key="item.id" :value="item.value" :label="item.label" />
</el-select>
</el-form-item>
<el-form-item
v-for="qs in questions"
v-show="qs.ShowQuestion!==2"
:key="qs.Id"
:label="`${qs.QuestionName}`"
:prop="qs.Id"
: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']},
]"
>
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
:prop="qs.Id" :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']
},
]">
<!-- 输入框 -->
<template v-if="qs.Type==='input' || qs.Type==='number'">
<el-input
v-if="qs.Type==='input' || qs.Type==='number'"
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)) || (isFirstChangeTask && (lesionType === 5 || lesionType === 6) && (qs.QuestionMark === 8 || qs.QuestionMark === 10 ))"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<template v-if="qs.Type === 'input' || qs.Type === 'number'">
<div style="display: flex;justify-content: space-between;">
<el-input v-if="qs.Type === 'input' || qs.Type === 'number'" 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)) || (isFirstChangeTask && (lesionType === 5 || lesionType === 6) && (qs.QuestionMark === 8 || qs.QuestionMark === 10))"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
</template>
<!-- 多行文本输入框 -->
<el-input
v-if="qs.Type==='textarea'"
v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2 "
@change="((val)=>{formItemChange(val, qs)})"
/>
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
@change="((val) => { formItemChange(val, qs) })" />
<!-- 下拉框 -->
<el-select
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
<el-select v-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable
: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)) || (qs.QuestionMark === 7 && isFirstChangeTask ) || (qs.QuestionMark === 8 && isFirstChangeTask)"
@change="((val)=>{formItemChange(val, qs)})"
>
: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)) || (qs.QuestionMark === 7 && isFirstChangeTask) || (qs.QuestionMark === 8 && isFirstChangeTask)"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;">
<i class="el-icon-search" />
</span>
</template>
<template v-if="qs.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="((lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]"
v-show="((lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isFirstChangeTask && (lesionType === 5 || lesionType ===6)">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="((lesionType === 5 && item.value ===1) || (lesionType === 6 && (item.value ===0))) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<template
v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isFirstChangeTask && (lesionType === 5 || lesionType === 6)">
<el-option v-for="item of $d[qs.DictionaryCode]"
v-show="((lesionType === 5 && item.value === 1) || (lesionType === 6 && (item.value === 0))) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answers.LastTaskState))}` : ''"
>
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answers.LastTaskState))}` : ''">
<!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answers.IsFristAdd=== 'True' && answers.SplitOrMergeType === '0'">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="((lesionType === 0 && item.value === 0) || (lesionType === 1 && item.value === 0 ) || (lesionType === 2 && item.value === 0 )|| (lesionType === 5 && item.value === 1 )|| (lesionType === 6 && item.value === 0 )|| (lesionType === 7 && item.value === 0 )|| (lesionType === 8 && item.value === 1 )) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'">
<el-option v-for="item of $d[qs.DictionaryCode]"
v-show="((lesionType === 0 && item.value === 0) || (lesionType === 1 && item.value === 0) || (lesionType === 2 && item.value === 0) || (lesionType === 5 && item.value === 1) || (lesionType === 6 && item.value === 0) || (lesionType === 7 && item.value === 0) || (lesionType === 8 && item.value === 1)) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else-if="isCurrentTaskAdd=== 'True' && (lesionType === 2 || lesionType === 8)">
<template v-else-if="isCurrentTaskAdd === 'True' && (lesionType === 2 || lesionType === 8)">
<!-- 首次添加的新病灶不能为无法评估和消失 -->
<el-option
v-for="item of $d[qs.DictionaryCode]"
<el-option v-for="item of $d[qs.DictionaryCode]"
v-show="(((item.value === 0 || item.value === 1) && lesionType === 2) || ((item.value === 1 || item.value === 2) && lesionType === 8)) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else-if="isCurrentTaskAdd=== 'False' && lesionType === 1 && answers.LastTaskState !== '4'">
<el-option
v-for="item of filterState($d[qs.DictionaryCode])"
<template v-else-if="isCurrentTaskAdd === 'False' && lesionType === 1 && answers.LastTaskState !== '4'">
<el-option v-for="item of filterState($d[qs.DictionaryCode])"
v-show="(item.value !== 5) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="item of filterState($d[qs.DictionaryCode])"
v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of filterState($d[qs.DictionaryCode])"
v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1" :key="item.id"
:value="item.value" :label="item.label" />
</template>
</el-option-group>
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]"
v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1" :key="item.id"
:value="item.value" :label="item.label" />
</template>
<template v-else-if="qs.TypeValue">
<el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-if="qs.Type==='radio'"
v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState >= 2">
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</el-radio-group>
@ -199,33 +132,21 @@
</div>
<div
v-if="isCurrentTask && readingTaskState<2"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
style="text-align:right;margin-top:10px;">
<!-- 清除标记 -->
<el-button
v-if="questionForm.MeasureData && (!isFirstChangeTask || (isFirstChangeTask && (lesionType === 5 || lesionType === 6)))"
size="mini"
@click="handleDeleteMeasureData"
>
size="mini" @click="handleDeleteMeasureData">
{{ $t('trials:reading:button:removeMark') }}
</el-button>
<!-- 删除 -->
<el-button
v-if="!isFirstChangeTask && isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
<el-button v-if="!isFirstChangeTask && isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete">
{{ $t('common:button:delete') }}
</el-button>
<!-- 保存 -->
<el-button
v-if="(isFirstChangeTask && (lesionType === 5 || lesionType === 6)) || !isFirstChangeTask"
size="mini"
@click="handleSave"
>
<el-button v-if="(isFirstChangeTask && (lesionType === 5 || lesionType === 6)) || !isFirstChangeTask" size="mini"
@click="handleSave">
{{ $t('common:button:save') }}
</el-button>
</div>
@ -330,6 +251,9 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initForm() {
const loading = this.$loading({ fullscreen: true })
this.questions.forEach(item => {
@ -375,12 +299,12 @@ export default {
await this.setMeasureData(this.answers.measureObj, true)
} else {
if (this.questionForm.MeasureData) {
// 线
// 线
if (this.questionForm.MeasureData.type === 'Bidirectional') {
this.organList = []
await this.getOrganInfoList(1)
} else if (this.questionForm.MeasureData.type === 'Length') {
//
//
this.organList = []
await this.getOrganInfoList(0)
} else {
@ -486,8 +410,8 @@ export default {
type: 'warning',
distinguishCancelAndClose: true
})
.then(() => {})
.catch(() => {})
.then(() => { })
.catch(() => { })
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return
}
@ -500,7 +424,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return
@ -926,7 +850,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg19'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -938,7 +862,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg20'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -955,7 +879,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg21'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -967,7 +891,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg22'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -985,7 +909,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg23'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -997,7 +921,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg24'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1013,7 +937,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg25'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1029,7 +953,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg26'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1050,7 +974,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg27'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1062,7 +986,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg28'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1078,7 +1002,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg29'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1090,7 +1014,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg30'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1111,7 +1035,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg31'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1123,7 +1047,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg32'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1140,7 +1064,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg33'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1152,7 +1076,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg34'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1169,7 +1093,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg35'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1181,7 +1105,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg36'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1198,7 +1122,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg37'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1210,7 +1134,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg38'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1227,7 +1151,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg33'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1239,7 +1163,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg34'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1256,7 +1180,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg50'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1268,7 +1192,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg51'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1285,7 +1209,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg39'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1297,7 +1221,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg40'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1314,7 +1238,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg41'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1326,7 +1250,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg42'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1343,7 +1267,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg43'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1355,7 +1279,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg44'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1372,7 +1296,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg45'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1384,7 +1308,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg46'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1404,7 +1328,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg31'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1416,7 +1340,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg32'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1433,7 +1357,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg1'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1445,7 +1369,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg2'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1460,7 +1384,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg3'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1472,7 +1396,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg4'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1493,7 +1417,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg5'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1505,7 +1429,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg6'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1522,7 +1446,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg33'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1538,7 +1462,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg34'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1595,7 +1519,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg7'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1607,7 +1531,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg8'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1623,7 +1547,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg9'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1635,7 +1559,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg10'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1651,7 +1575,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg11'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1663,7 +1587,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg12'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1679,7 +1603,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg13'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1691,7 +1615,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg14'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1711,7 +1635,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg15'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1723,7 +1647,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg16'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1740,7 +1664,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg17'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1752,7 +1676,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg18'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1769,7 +1693,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg19'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1781,7 +1705,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg20'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1798,7 +1722,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg21'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1810,7 +1734,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg22'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1829,7 +1753,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg23'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1841,7 +1765,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg24'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1858,7 +1782,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg25'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1870,7 +1794,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg26'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1886,7 +1810,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg27'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1898,7 +1822,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg28'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1914,7 +1838,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg29'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1926,7 +1850,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg30'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -2167,42 +2091,50 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-form{
::v-deep .el-form-item__label{
.measurement-form {
::v-deep .el-form-item__label {
color: #c3c3c3;
}
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1;
}
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1;
}
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
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;
}
.el-form-item__content
.el-select{
.el-form-item__content .el-select {
width: 100%;
}
.input-width1{
width: calc(100% - 60px)!important;
.input-width1 {
width: calc(100% - 60px) !important;
}
.input-width2{
.input-width2 {
width: 100% !important;
}
}
</style>

View File

@ -8,43 +8,47 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3>
<div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
<i
class="el-icon-refresh-left"
@click="resetMeasuredData"
/>
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
placement="bottom">
<i class="el-icon-refresh-left" @click="resetMeasuredData" />
</el-tooltip>
</div>
</div>
<!-- 非测量问题 -->
<div class="lesions">
<Questions
ref="ecrf"
:question-form-change-state="questionFormChangeState"
:question-form-change-num="questionFormChangeNum"
:is-first-change-task="isFirstChangeTask"
/>
<Questions ref="ecrf" :question-form-change-state="questionFormChangeState"
:question-form-change-num="questionFormChangeNum" :is-first-change-task="isFirstChangeTask"
@handleReadingChart="handleReadingChart" />
</div>
<!-- 测量问题 -->
<template v-if="questions.length > 0">
<div v-for="(qs,index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<div v-for="(qs, index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<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>
<div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="(!isConvertedTask && !(isBaseLineTask && item.LesionType === 2)) || (isConvertedTask && (isFirstChangeTask && item.LesionType !== 8) || (!isFirstChangeTask && item.LesionType !== 2))" :key="item.Id">
<div v-for="item in qs.Childrens"
v-show="(!isConvertedTask && !(isBaseLineTask && item.LesionType === 2)) || (isConvertedTask && (isFirstChangeTask && item.LesionType !== 8) || (!isFirstChangeTask && item.LesionType !== 2))"
:key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div
v-if="isFirstChangeTask && item.LesionType === 2 && readingTaskState<2"
class="title"
>
<div v-if="isFirstChangeTask && item.LesionType === 2 && readingTaskState < 2" class="title">
{{ item.QuestionName }}
<span v-if="isFirstChangeTask && item.TableQuestions.Answers.length > 0" style="color:red;font-size: 12px;">{{ $t("trials:reading:dicom:IRecist:reevaluate") }}</span>
<span v-if="isFirstChangeTask && item.TableQuestions.Answers.length > 0"
style="color:red;font-size: 12px;">{{ $t("trials:reading:dicom:IRecist:reevaluate") }}</span>
</div>
<div v-else class="title">
{{ item.QuestionName }}
<svg-icon v-if="item.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0
},
})" />
</div>
<div v-if="readingTaskState<2 && ((!isConvertedTask && (isBaseLineTask || item.LesionType === 2)) || (isConvertedTask && !isFirstChangeTask && item.LesionType === 8))" class="add-icon" @click.prevent="handleAdd(item)">
<div
v-if="readingTaskState < 2 && ((!isConvertedTask && (isBaseLineTask || item.LesionType === 2)) || (isConvertedTask && !isFirstChangeTask && item.LesionType === 8))"
class="add-icon" @click.prevent="handleAdd(item)">
<i class="el-icon-plus" />
</div>
@ -52,109 +56,106 @@
111
</div> -->
</div>
<el-collapse
v-if="item.Type === 'table' && item.TableQuestions"
v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
@change="handleCollapseChange">
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${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">
<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" />
</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" />
</el-tooltip>
<div style="position: absolute;left: 62px;top: 2px;">
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
<div style="font-size: 11px;width:220px;height: 30px;">
<div
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"
>
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<div 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">
<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>
</el-tooltip>
</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">
{{ $fd('TargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span>
<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 v-else-if="item.LesionType === 2">
{{ $fd('NewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span>
<span v-else-if="item.LesionType === 5">
{{ $fd('NewTargetLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('NewTargetLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span>
<span v-else-if="item.LesionType === 6">
{{ $fd('NewNoTargetLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('NewNoTargetLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span>
<span v-else-if="item.LesionType === 7">
{{ $fd('OtherPreviousNewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('OtherPreviousNewLesionState',
parseInt(item.TableQuestions.Answers[i].lesionState))
}}
</span>
<span v-else-if="item.LesionType === 8">
{{ $fd('NewLesionAfterTriggeringiRECSITState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{
$fd('NewLesionAfterTriggeringiRECSITState',
parseInt(item.TableQuestions.Answers[i].lesionState))
}}
</span>
</div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px">
<template v-if="item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionShort))">
<div
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px">
<template
v-if="item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionShort))">
{{ item.TableQuestions.Answers[i].lesionShort }}mm
</template>
<template v-else-if="!item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))">
<template
v-else-if="!item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))">
{{ item.TableQuestions.Answers[i].lesionLength }}mm
</template>
</div>
</div>
</div>
<div v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0,1,4,5].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 5 && parseInt(item.TableQuestions.Answers[i].lesionState) === 1) || (item.LesionType === 6 && [0,1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 7 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 8 && parseInt(item.TableQuestions.Answers[i].lesionState) === 1)) && 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, 4, 5].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 5 && parseInt(item.TableQuestions.Answers[i].lesionState) === 1) || (item.LesionType === 6 && [0, 1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 7 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 8 && parseInt(item.TableQuestions.Answers[i].lesionState) === 1)) && 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 && !isFirstChangeTask ) && item.TableQuestions.Answers[i].isDicomReading !== false" 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)" />
<el-tooltip
v-show="readingTaskState < 2 && !!item.TableQuestions.Answers[i].RowId && (!isBaseLineTask && !isFirstChangeTask) && item.TableQuestions.Answers[i].isDicomReading !== false"
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)" />
</el-tooltip>
</div>
</div>
</template>
<QuestionForm
:ref="`${item.Id}_${q.RowIndex}`"
:questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]"
:lesion-type="item.LesionType"
:order-mark="item.OrderMark"
:table-questions="tableQuestions"
:row-index="String(q.RowIndex)"
:question-name="item.QuestionName"
:parent-qs-id="item.Id"
:crterion-dictionary-group="item.CrterionDictionaryGroup"
:visit-task-id="visitTaskId"
:is-current-task="isCurrentTask"
:is-first-change-task="isFirstChangeTask"
:is-converted-task="isConvertedTask"
:reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
:question-name="item.QuestionName" :parent-qs-id="item.Id"
:crterion-dictionary-group="item.CrterionDictionaryGroup" :visit-task-id="visitTaskId"
:is-current-task="isCurrentTask" :is-first-change-task="isFirstChangeTask"
:is-converted-task="isConvertedTask" :reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
@close="close" @handleReadingChart="handleReadingChart" />
</el-collapse-item>
</el-collapse>
@ -275,6 +276,9 @@ export default {
DicomEvent.$off('getUnSaveTarget')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) {
@ -568,7 +572,7 @@ export default {
.then(() => {
this.split(rowId, questionId)
})
.catch(() => {})
.catch(() => { })
} else {
//
this.$confirm(this.$t('trials:reading:warnning:msg4'), {
@ -578,7 +582,7 @@ export default {
.then(() => {
this.split(rowId, questionId)
})
.catch(() => {})
.catch(() => { })
}
}
}
@ -736,7 +740,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
return
}
@ -747,7 +751,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
} else {
// saveTypeEnum: 0
@ -898,7 +902,7 @@ export default {
async changeLesionType(questionsObj) {
await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId })
// saveTypeEnum: 0
var lesionObj = { }
var lesionObj = {}
var questionObj = questionsObj.questionForm
//
var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType)
@ -1176,23 +1180,26 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-wrapper{
.measurement-wrapper {
height: 100%;
overflow-y: auto;
// overflow: hidden;
.container{
.container {
padding: 10px;
.basic-info{
.basic-info {
display: flex;
justify-content: space-between;
align-items: center;
h3{
h3 {
color: #ddd;
padding: 5px 0px;
margin: 0;
}
i{
i {
color: #fff;
font-size: 22px;
font-weight: bold;
@ -1200,14 +1207,16 @@ export default {
}
}
}
.title{
.title {
padding: 5px;
font-weight: bold;
color: #ddd;
font-size: 15px;
}
.add-icon{
.add-icon {
padding: 5px;
font-weight: bold;
color: #ddd;
@ -1216,42 +1225,49 @@ export default {
margin-bottom: 2px;
cursor: pointer;
}
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b;
}
.flex-row{
.flex-row {
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: #424242;
}
.lesion_list{
.lesion_list {
position: relative;
}
.el-collapse{
border-bottom:none;
border-top:none;
::v-deep .el-collapse-item{
background-color: #000!important;
.el-collapse {
border-bottom: none;
border-top: none;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd;
}
::v-deep .el-collapse-item__header{
background-color: #000!important;
::v-deep .el-collapse-item__header {
background-color: #000 !important;
color: #ddd;
border-bottom-color:#5a5a5a;
border-bottom-color: #5a5a5a;
padding-left: 5px;
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;
}
::v-deep .el-collapse-item__content{
width:260px;
::v-deep .el-collapse-item__content {
width: 260px;
position: absolute;
top: 0px;
right: 0px;
@ -1260,7 +1276,7 @@ export default {
z-index: 1;
color: #ddd;
padding: 5px;
background-color:#1e1e1e;
background-color: #1e1e1e;
}
}

View File

@ -18,7 +18,7 @@
<!-- 影像质量问题 -->
<div class="lesions">
<Questions ref="ecrf" :question-form-change-state="true" :question-form-change-num="0" :is-qulity-issues="false"
:group-classify="1" />
:group-classify="1" @handleReadingChart="handleReadingChart" />
</div>
<!-- 测量问题 -->
<template v-if="questions.length > 0">
@ -37,7 +37,8 @@
<div class="add-icon" @click.prevent="downloadTpl">
<i class="el-icon-download" />
</div>
<div class="add-icon" style="margin: 0 5px;" @click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
<div class="add-icon" style="margin: 0 5px;"
@click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
<i class="el-icon-upload2" />
</div>
<div class="add-icon" @click.prevent="handleAddOrEdit('add', item)">
@ -100,9 +101,18 @@
@change="((val) => { formItemChange(val, item) })" />
</template>
<template v-if="item.Type === 'number'">
<el-input-number v-model="questionForm[item.Id]"
:disabled="!isCurrentTask || readingTaskState >= 2" :precision="0"
@change="((val) => { formItemChange(val, item) })" />
<div style="display: flex;justify-content: space-between;">
<el-input-number v-model="questionForm[item.Id]"
:disabled="!isCurrentTask || readingTaskState >= 2" :precision="0"
@change="((val) => { formItemChange(val, item) })" />
<svg-icon v-if="item.ShowChartTypeEnum > 0" icon-class="readingChart"
class="svg-icon svg-readingChart" @click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: item.Id
}
})" />
</div>
</template>
<template v-if="item.Type === 'select'">
<el-select v-model="questionForm[item.Id]" :disabled="!isCurrentTask || readingTaskState >= 2"
@ -159,7 +169,7 @@
<el-form ref="tableQsForm" v-loading="loading" :model="qsForm" size="small">
<QuestionTableFormItem v-for="item in qsList" :key="item.Id" :question="item" :question-form="qsForm"
:reading-task-state="readingTaskState" @setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData" />
@resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart" />
<el-form-item style="text-align: right">
<el-button size="small" @click="addOrEdit.visible = false">
{{ $t('common:button:cancel') }}
@ -286,6 +296,9 @@ export default {
DicomEvent.$off('refreshQuestions')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) {

View File

@ -1,119 +1,66 @@
<template>
<div>
<div
v-if="!!question.GroupName && question.Type==='group'"
>
<div v-if="!!question.GroupName && question.Type === 'group'">
<h4 style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language==='en'?question.GroupEnName:question.GroupName }}
{{ language === 'en' ? question.GroupEnName : question.GroupName }}
</h4>
</div>
<template v-else>
<el-form-item
v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0 "
:label="`${question.QuestionName}`"
:prop="question.Id"
:rules="[
{ 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']},
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0"
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[
{
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']
},
]"
:class="[question.Type==='group' ? 'mb' : (question.Type==='upload' || question.QuestionName.length > 15) ?'uploadWrapper' : '']"
>
:class="[question.Type === 'group' ? 'mb' : (question.Type === 'upload' || question.QuestionName.length > 15) ? 'uploadWrapper' : '']">
<!-- 输入框 -->
<el-input
v-if="question.Type==='input'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
/>
<el-input v-if="question.Type === 'input'" v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2"
@change="((val) => { formItemChange(val, question) })" />
<!-- 多行文本输入框 -->
<el-input
v-else-if="question.Type==='textarea'"
v-model="questionForm[question.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
/>
<el-input v-else-if="question.Type === 'textarea'" v-model="questionForm[question.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2"
@change="((val) => { formItemChange(val, question) })" />
<!-- 下拉框 -->
<el-select
v-else-if="question.Type==='select'"
v-model="questionForm[question.Id]"
<el-select v-else-if="question.Type === 'select'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode)"
clearable
@change="((val)=>{formItemChange(val, question)})"
>
clearable @change="((val) => { formItemChange(val, question) })">
<template v-if="question.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]" />
</template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
:label="item.label" />
</template>
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
<template
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
:label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-else-if="question.Type==='radio'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
>
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })">
<template v-if="question.DictionaryCode">
<el-radio
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="String(item.value)"
>
<el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)">
{{ item.label }}
</el-radio>
</template>
<template v-else-if="question.TypeValue">
<el-radio
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
<el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</template>
</el-radio-group>
<!-- 复选框 -->
<el-checkbox-group
v-else-if="question.Type==='checkbox'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
>
<el-checkbox
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
<el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })">
<el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
{{ val }}
</el-checkbox>
</el-checkbox-group>
@ -144,40 +91,37 @@
/>
</template> -->
<!-- 数值类型 -->
<el-input
v-else-if="question.Type==='number'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState>=2 "
type="number"
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<div style="display: flex;justify-content: space-between;"
v-else-if="question.Type === 'number' || question.Type === 'calculation'">
<el-input v-if="question.Type === 'number'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2" type="number" @change="((val) => { formItemChange(val, question) })">
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<el-input v-else-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled
@change="((val) => { formItemChange(val, question) })">
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: question.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
<el-input
v-else-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
disabled
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
</el-form-item>
</template>
<QuestionTableFormItem
v-for="item in question.Childrens"
:key="item.Id"
:question="item"
:question-form="questionForm"
:reading-task-state="readingTaskState"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
<QuestionTableFormItem v-for="item in question.Childrens" :key="item.Id" :question="item"
:question-form="questionForm" :reading-task-state="readingTaskState" @setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData" />
</div>
</template>
<script>
@ -214,6 +158,9 @@ export default {
this.digitPlaces = Number(localStorage.getItem('digitPlaces'))
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
formItemChange(v, question) {
if (question.Childrens && question.Childrens.length > 0) {
this.resetChild(question.Childrens)
@ -269,29 +216,36 @@ export default {
}
</script>
<style lang="scss" scoped>
.mb{
.mb {
margin-bottom: 0px;
}
.disabled{
.disabled {
::v-deep .el-upload--picture-card {
display: none;
}
}
.uploadWrapper{
.uploadWrapper {
display: flex;
flex-direction: column !important;
align-items: flex-start;
}
::v-deep .el-input.is-disabled .el-input__inner{
background-color: #646464a1;
}
::v-deep .el-input-group__append, .el-input-group__prepend{
padding: 0 10px;
}
::v-deep .el-form-item__content {
width: 100%;
}
::v-deep .el-select.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 10px;
}
::v-deep .el-form-item__content {
width: 100%;
}
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1;
}
</style>

View File

@ -1,12 +1,6 @@
<template>
<el-form
v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
class="measurement-form">
<div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;">
<h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -19,198 +13,135 @@
</div>
</div>
<div ref="scrollPanel" style="height: 420px;overflow-y: auto;overflow-x: hidden;" @scroll.stop="scrollHandle">
<el-form-item
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]">
<!-- 下拉框 -->
<el-select
:ref="`select_LesionType`"
v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState>=2 || !isBaseLineTask || answers.SplitOrMergeType === '1'"
@change="((val)=>{lesionTypeChange(val)})"
>
<el-select :ref="`select_LesionType`" v-model="questionForm.LesionType" filterable
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask || answers.SplitOrMergeType === '1'"
@change="((val) => { lesionTypeChange(val) })">
<el-option
v-for="item of $d.LesionType"
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
:value="item.value" :label="item.label" />
</el-select>
</el-form-item>
<el-form-item
v-for="qs in questions"
v-show="qs.ShowQuestion!==2"
:key="qs.Id"
:label="`${qs.QuestionName}`"
:prop="qs.Id"
:rules="[
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (qs.RelevanceValue.includes(questionForm[qs.RelevanceId]))) || (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']},
]"
>
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
:prop="qs.Id" :rules="[
{
required: (qs.IsRequired === 0 || (qs.IsRequired === 1 && qs.RelevanceId && (qs.RelevanceValue.includes(questionForm[qs.RelevanceId]))) || (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']
},
]">
<!-- 输入框 -->
<template v-if="qs.Type==='input' || qs.Type==='number'">
<template v-if="qs.Type === 'input' || qs.Type === 'number'">
<div style="display: flex;justify-content: space-between;">
<el-input v-if="qs.Type === 'input' || qs.Type === 'number'" 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)) || answers.SplitOrMergeType === '1'"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
<!-- {{ ((qs.QuestionMark === 6 && isCurrentTaskAdd === 'False') || (qs.QuestionMark === 6 && isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition)) }} -->
<el-input
v-if="qs.Type==='input' || qs.Type==='number'"
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)) || answers.SplitOrMergeType === '1'"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
</template>
<!-- 多行文本输入框 -->
<el-input
v-if="qs.Type==='textarea'"
v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="!isCurrentTask || readingTaskState>=2 || answers.SplitOrMergeType === '1'"
@change="((val)=>{formItemChange(val, qs)})"
/>
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500"
:disabled="!isCurrentTask || readingTaskState >= 2 || answers.SplitOrMergeType === '1'"
@change="((val) => { formItemChange(val, qs) })" />
<!-- 下拉框 -->
<!-- :disabled="!isCurrentTask || readingTaskState>=2 || (!isBaseLineTask && qs.QuestionMark === 5 && isCurrentTaskAdd === 'False') || qs.QuestionMark === 2 || (qs.QuestionMark === 8 && !isBaseLineTask && isCurrentTaskAdd === 'False')" -->
<el-select
v-if="qs.Type==='select'"
:ref="`select_${qs.Id}`"
v-model="questionForm[qs.Id]"
filterable
<el-select v-if="qs.Type === 'select'" :ref="`select_${qs.Id}`" v-model="questionForm[qs.Id]" filterable
: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)) || (qs.QuestionMark === 7 && stateDisabled) || answers.SplitOrMergeType === '1' || (qs.QuestionMark === 7 && answers.SplitOrMergeType === '3')"
@change="((val)=>{formItemChange(val, qs)})"
>
: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)) || (qs.QuestionMark === 7 && stateDisabled) || answers.SplitOrMergeType === '1' || (qs.QuestionMark === 7 && answers.SplitOrMergeType === '3')"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;">
<i class="el-icon-search" />
</span>
</template>
<template v-if="qs.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))"
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answers.LastTaskState))}` : ''"
>
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answers.LastTaskState))}` : ''">
<!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answers.IsFristAdd=== 'True' && answers.SplitOrMergeType === '0'">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'">
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0" :key="item.id"
:value="item.value" :label="item.label" />
</template>
<!-- 首次添加的新病灶不能为无法评估和消失 -->
<template v-else-if="isCurrentTaskAdd=== 'True' && lesionType === 2">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0 || item.value === 1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2">
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0 || item.value === 1"
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="item of filterState($d[qs.DictionaryCode])"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of filterState($d[qs.DictionaryCode])" :key="item.id" :value="item.value"
:label="item.label" />
</template>
</el-option-group>
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-if="qs.Type==='radio'"
v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2 || answers.SplitOrMergeType === '1'"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
@change="((val)=>{formItemChange(val, qs)})"
>
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState >= 2 || answers.SplitOrMergeType === '1'">
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val"
@change="((val) => { formItemChange(val, qs) })">
{{ val }}
</el-radio>
</el-radio-group>
<template v-if="qs.QuestionMark === 20">
<div style="display: flex;flex-direction: row;justify-content: flex-start;">
<el-input
v-if="qs.Type==='calculation'"
v-model="questionForm[qs.Id]"
disabled
style="width:120px;"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<viewer
v-if="answers.OtherPicturePath"
ref="viewer"
style="margin:0 10px;"
:images="[`${OSSclientConfig.basePath}${answers.OtherPicturePath}`]"
>
<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;"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
<viewer v-if="answers.OtherPicturePath" ref="viewer" style="margin:0 10px;"
:images="[`${OSSclientConfig.basePath}${answers.OtherPicturePath}`]">
<span style="color:#409eff;cursor: pointer" @click="previewImage()">
{{ $t('trials:lugano:button:suvscreenshot1') }}
</span>
<img
v-show="false"
crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${answers.OtherPicturePath}`"
alt="Image"
>
<img v-show="false" crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${answers.OtherPicturePath}`" alt="Image">
</viewer>
<!-- <img
v-if="answers.OtherPicturePath"
@ -226,45 +157,39 @@
</div>
</template>
<template v-else>
<el-input
v-if="qs.Type==='calculation'"
v-model="questionForm[qs.Id]"
disabled
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</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
@change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
</template>
</el-form-item>
</div>
<div
v-if="isCurrentTask && readingTaskState<2 && (answers.SplitOrMergeType !== '1' && answers.SplitOrMergeType !== '3')"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
v-if="isCurrentTask && readingTaskState < 2 && (answers.SplitOrMergeType !== '1' && answers.SplitOrMergeType !== '3')"
class="base-dialog-footer" style="text-align:right;margin-top:10px;">
<!-- 清除标记 -->
<el-button
v-if="questionForm.MeasureData"
size="mini"
@click="handleDeleteMeasureData"
>
<el-button v-if="questionForm.MeasureData" size="mini" @click="handleDeleteMeasureData">
{{ $t('trials:reading:button:removeMark') }}
</el-button>
<!-- 删除 -->
<el-button
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
<el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete">
{{ $t('common:button:delete') }}
</el-button>
<!-- 保存 -->
<el-button
size="mini"
@click="handleSave"
>
<el-button size="mini" @click="handleSave">
{{ $t('common:button:save') }}
</el-button>
</div>
@ -368,6 +293,9 @@ export default {
// container.removeEventListener('scroll', this.scrollHandle , true)
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
scrollHandle() {
for (const k in this.$refs) {
if (k.indexOf('select_') === -1) continue
@ -505,11 +433,11 @@ export default {
if ((ldi > 15 && ldi <= 20) && (pddIncrease >= 50) && (ldiIncrease >= 5 || sdiIncrease >= 5)) {
this.stateDisabled = true
} else if ((ldi > 20) && (pddIncrease >= 50) && (ldiIncrease >= 10 || sdiIncrease >= 10)) {
/**
* 当前靶病灶LDi>20 mm
* 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 10 mm 或者 相比PPD最低点SDi增加值Sdi 10 mm
**/
/**
* 当前靶病灶LDi>20 mm
* 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 10 mm 或者 相比PPD最低点SDi增加值Sdi 10 mm
**/
this.stateDisabled = true
} else {
this.stateDisabled = false
@ -607,8 +535,8 @@ export default {
type: 'warning',
distinguishCancelAndClose: true
})
.then(() => {})
.catch(() => {})
.then(() => { })
.catch(() => { })
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return
}
@ -621,7 +549,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return
@ -653,7 +581,7 @@ export default {
})
},
deleteLesionInfo() {
return new Promise(async(resolve, reject) => {
return new Promise(async (resolve, reject) => {
const loading = this.$loading({ fullscreen: true })
var param = {
visitTaskId: this.visitTaskId,
@ -965,31 +893,31 @@ export default {
this.stateDisabled = false
}
} else {
/**
* 15mm<当前靶病灶LDi20mm
* 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 5 mm 或者 相比PPD最低点SDi增加值5 mm
**/
/**
* 15mm<当前靶病灶LDi20mm
* 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 5 mm 或者 相比PPD最低点SDi增加值5 mm
**/
if ((ldi > 15 && ldi <= 20) && (pddIncreaseNum >= 50) && (ldiIncrease >= 5 || sdiIncrease >= 5)) {
const stateId = this.getQuestionId(7)
this.$set(this.questionForm, stateId, 4)
this.stateDisabled = true
} else if ((ldi > 20) && (pddIncreaseNum >= 50) && (ldiIncrease >= 10 || sdiIncrease >= 10)) {
/**
* 当前靶病灶LDi>20 mm
* 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 10 mm 或者 相比PPD最低点SDi增加值Sdi 10 mm
**/
/**
* 当前靶病灶LDi>20 mm
* 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 10 mm 或者 相比PPD最低点SDi增加值Sdi 10 mm
**/
const stateId = this.getQuestionId(7)
this.$set(this.questionForm, stateId, 4)
this.stateDisabled = true
} else {
//
// const lesionState = !isNaN(parseInt(this.getQuestionVal(7))) ? parseInt(this.getQuestionVal(7)) : ''
// if (lesionState === 4) {
// const stateId = this.getQuestionId(7)
// this.$set(this.questionForm, stateId, null)
// }
//
// const lesionState = !isNaN(parseInt(this.getQuestionVal(7))) ? parseInt(this.getQuestionVal(7)) : ''
// if (lesionState === 4) {
// const stateId = this.getQuestionId(7)
// this.$set(this.questionForm, stateId, null)
// }
this.stateDisabled = false
}
}
@ -1132,7 +1060,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState1'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1143,7 +1071,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState2'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1159,7 +1087,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg21'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1170,7 +1098,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState12'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1187,7 +1115,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState3'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1199,7 +1127,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState4'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1215,7 +1143,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg25'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1234,7 +1162,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg26'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1258,7 +1186,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg27'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1270,7 +1198,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg28'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1287,7 +1215,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState5'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1296,7 +1224,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState6'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1318,7 +1246,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg30'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1347,7 +1275,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState7'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1359,7 +1287,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState8'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1376,7 +1304,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg31'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1388,7 +1316,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState9'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1405,7 +1333,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg33'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1417,7 +1345,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState10'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1434,7 +1362,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg35'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1446,7 +1374,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg36'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1463,7 +1391,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg37'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1475,7 +1403,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg38'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1492,7 +1420,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg39'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1504,7 +1432,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState11'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1550,7 +1478,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg43'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1562,7 +1490,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg44'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1579,7 +1507,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg45'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1591,7 +1519,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg46'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1837,51 +1765,62 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-form{
::v-deep .el-form-item__label{
.measurement-form {
::v-deep .el-form-item__label {
color: #c3c3c3;
}
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex;
flex-direction: row;
justify-content: flex-start;
flex-wrap: wrap;
}
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1;
}
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
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;
}
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
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;
}
.el-form-item__content
.el-select{
.el-form-item__content .el-select {
width: 100%;
}
.input-width1{
width: calc(100% - 60px)!important;
.input-width1 {
width: calc(100% - 60px) !important;
}
.input-width2{
.input-width2 {
width: 100% !important;
}
.suv_viewer{
.suv_viewer {
::v-deep .viewer-play {
display: none;
}
}
}
</style>

View File

@ -8,11 +8,9 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3>
<div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
<i
class="el-icon-refresh-left"
@click="resetMeasuredData"
/>
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
placement="bottom">
<i class="el-icon-refresh-left" @click="resetMeasuredData" />
</el-tooltip>
</div>
</div>
@ -25,121 +23,132 @@
:question-form-change-num="questionFormChangeNum"
:group-classify="1"
/> -->
<Questions
ref="ecrf"
:question-form-change-state="true"
:question-form-change-num="0"
:is-qulity-issues="false"
:group-classify="1"
/>
<Questions ref="ecrf" :question-form-change-state="true" :question-form-change-num="0" :is-qulity-issues="false"
:group-classify="1" @handleReadingChart="handleReadingChart" />
</div>
<!-- 测量问题 -->
<template v-if="questions.length > 0 && CriterionType !== 10">
<div v-for="(qs,index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<div v-for="(qs, index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<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>
<div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div>
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)">
<div class="title">{{ item.QuestionName }}
<svg-icon v-if="item.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" />
</div>
</div>
<!-- @change="handleCollapseChange(qs.Childrens,item)" -->
<el-collapse
v-if="item.Type === 'table' && item.TableQuestions"
v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
@change="handleCollapseChange">
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${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">
<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" />
</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" />
</el-tooltip>
<div :style="{position: 'absolute',left: item.LesionType === 1 && readingTaskState < 2?'58px':'50px',top: '2px'}">
<div
:style="{ position: 'absolute', left: item.LesionType === 1 && readingTaskState < 2 ? '58px' : '50px', top: '2px' }">
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
<div style="font-size: 11px;width:210px;height: 30px;display: flex;justify-content: flex-start;flex-wrap: nowrap;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
<el-tooltip v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'" class="item" effect="dark" :content="`${$t('trials:reading:message:fused')}${item.TableQuestions.Answers[i].SplitOrMergeLesionName}`" placement="bottom">
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'">
<div
style="font-size: 11px;width:210px;height: 30px;display: flex;justify-content: flex-start;flex-wrap: nowrap;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
<el-tooltip
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'"
class="item" effect="dark"
:content="`${$t('trials:reading:message:fused')}${item.TableQuestions.Answers[i].SplitOrMergeLesionName}`"
placement="bottom">
<div
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'">
<span class="login-cycle" />
</div>
</el-tooltip>
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '4'">
<span class="login-cycle" />
</div>
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<div v-if="item.TableQuestions.Answers[i].lesionPart" style="max-width: 100px;overflow: hidden;">
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark"
:content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<div v-if="item.TableQuestions.Answers[i].lesionPart"
style="max-width: 100px;overflow: hidden;">
{{ item.TableQuestions.Answers[i].lesionPart }}
</div>
</el-tooltip>
<div v-if="item.LesionType === 0" style="margin:0 5px;">
{{ $fd('TargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div>
<div v-else-if="item.LesionType === 1" style="margin:0 5px;">
{{ $fd('NoTargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('NoTargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div>
<div v-else style="margin:0 5px;">
{{ $fd('NewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div>
<div v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))">
<el-tooltip class="item" effect="dark" :content="`${item.TableQuestions.Answers[i].lesionLength}*${item.TableQuestions.Answers[i].lesionShort}m㎡`" placement="bottom">
<span>{{ item.TableQuestions.Answers[i].lesionLength }}*{{ item.TableQuestions.Answers[i].lesionShort }}m</span>
<el-tooltip class="item" effect="dark"
:content="`${item.TableQuestions.Answers[i].lesionLength}*${item.TableQuestions.Answers[i].lesionShort}m㎡`"
placement="bottom">
<span>{{ item.TableQuestions.Answers[i].lesionLength }}*{{
item.TableQuestions.Answers[i].lesionShort }}m</span>
</el-tooltip>
</div>
</div>
</div>
<div v-if="item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False' && readingTaskState < 2" style="position: absolute;right: 5px;top: 2px;">
<div v-if="item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False' && readingTaskState < 2"
style="position: absolute;right: 5px;top: 2px;">
<!-- 分裂 -->
<el-tooltip v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '4' && ((item.LesionType === 0 && [0,4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 1 && [0,1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0))" class="item" :content="$t('trials:reading:button:split')" placement="bottom">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" />
<el-tooltip
v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '4' && ((item.LesionType === 0 && [0, 4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 1 && [0, 1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0))"
class="item" :content="$t('trials:reading:button:split')" placement="bottom">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
@click.stop="handleSplit(item.TableQuestions.Answers[i].RowId, item.Id)" />
</el-tooltip>
<!-- 融合 -->
<el-tooltip v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '2' && ((item.LesionType === 0 && [0,1,4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))))" class="item" :content="$t('trials:reading:button:merge')" placement="bottom">
<i class="iconfont icon-24gl-merge" style="color:#fff;font-size: 16px;" @click.stop="handleMerge(item.TableQuestions.Answers[i],item.Id,item.OrderMark)" />
<el-tooltip
v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '2' && ((item.LesionType === 0 && [0, 1, 4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))))"
class="item" :content="$t('trials:reading:button:merge')" placement="bottom">
<i class="iconfont icon-24gl-merge" style="color:#fff;font-size: 16px;"
@click.stop="handleMerge(item.TableQuestions.Answers[i], item.Id, item.OrderMark)" />
</el-tooltip>
</div>
</div>
</template>
<QuestionForm
:ref="`${item.Id}_${q.RowIndex}`"
:questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]"
:lesion-type="item.LesionType"
:order-mark="item.OrderMark"
:table-questions="tableQuestions"
:row-index="String(q.RowIndex)"
: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"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
: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" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
@close="close" @handleReadingChart="handleReadingChart" />
</el-collapse-item>
</el-collapse>
@ -149,35 +158,15 @@
</template>
<!-- <el-divider /> -->
<!-- 肝脏评估 -->
<Questions
ref="ecrf2"
:question-form-change-state="true"
:question-form-change-num="0"
:group-classify="2"
:is-qulity-issues="false"
style="margin-top:20px"
:question-type="6"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
/>
<Questions ref="ecrf2" :question-form-change-state="true" :question-form-change-num="0" :group-classify="2"
:is-qulity-issues="false" style="margin-top:20px" :question-type="6"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" />
<!-- 脾脏评估 -->
<Questions
ref="ecrf3"
:question-form-change-state="true"
:question-form-change-num="0"
:group-classify="3"
:is-qulity-issues="false"
:question-type="7"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
/>
<Questions ref="ecrf3" :question-form-change-state="true" :question-form-change-num="0" :group-classify="3"
:is-qulity-issues="false" :question-type="7" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" />
</div>
<el-dialog
v-if="merge.visible"
v-loading="merge.loading"
:visible.sync="merge.visible"
:close-on-click-modal="false"
:title="$t('trials:reading:lugano:message:merge')"
width="500px"
>
<el-dialog v-if="merge.visible" v-loading="merge.loading" :visible.sync="merge.visible"
:close-on-click-modal="false" :title="$t('trials:reading:lugano:message:merge')" width="500px">
<div class="merge-table">
<div class="merge-label">
<label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label>
@ -185,40 +174,19 @@
<span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span>
</div>
<div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div>
<el-table
:data="lesionData"
style="width: 450px"
size="small"
height="200"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="45"
/>
<el-table-column
prop="OrderMarkName"
:label="$t('trials:reading:lugano:label:lesionNumber')"
width="100"
/>
<el-table-column
prop="Part"
:label="$t('trials:reading:lugano:label:lesionLocation')"
min-width="120"
show-overflow-tooltip
/>
<el-table :data="lesionData" style="width: 450px" size="small" height="200"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="45" />
<el-table-column prop="OrderMarkName" :label="$t('trials:reading:lugano:label:lesionNumber')" width="100" />
<el-table-column prop="Part" :label="$t('trials:reading:lugano:label:lesionLocation')" min-width="120"
show-overflow-tooltip />
</el-table>
</div>
<div slot="footer" style="text-align:right;">
<!-- 取消 -->
<el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button>
<!-- 确认 -->
<el-button
type="primary"
size="mini"
:disabled="mergeList.length === 0"
@click="confirmMerge"
>
<el-button type="primary" size="mini" :disabled="mergeList.length === 0" @click="confirmMerge">
{{ $t('common:button:confirm') }}</el-button>
</div>
</el-dialog>
@ -333,7 +301,7 @@ export default {
DicomEvent.$on('split', measureData => {
this.handleSplit(measureData.RowId, measureData.QuestionId)
})
DicomEvent.$on('refreshQuestions', async(obj) => {
DicomEvent.$on('refreshQuestions', async (obj) => {
var triald = this.$router.currentRoute.query.trialId
await store.dispatch('reading/refreshDicomReadingQuestionAnswer', { trialId: triald, visitTaskId: this.visitTaskId })
this.$nextTick(() => {
@ -342,7 +310,7 @@ export default {
this.$refs['ecrf3'].getQuestions(this.visitTaskId)
})
})
DicomEvent.$on('refreshSplitTargetLesionPDD', async(callback) => {
DicomEvent.$on('refreshSplitTargetLesionPDD', async (callback) => {
const res = await getSplitPPdSum({ visitTaskId: this.visitTaskId })
this.splitTargetLesions = res.Result
if (this.splitTargetLesions && this.splitTargetLesions.length > 0) {
@ -366,6 +334,9 @@ export default {
DicomEvent.$off('refreshQuestions')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) {
@ -529,7 +500,7 @@ export default {
try {
const loading = this.$loading({ fullscreen: true })
await store.dispatch('reading/refreshReadingQuestionAndAnswer', { trialId: this.$router.currentRoute.query.trialId, visitTaskId: this.visitTaskId }).then(async() => {
await store.dispatch('reading/refreshReadingQuestionAndAnswer', { trialId: this.$router.currentRoute.query.trialId, visitTaskId: this.visitTaskId }).then(async () => {
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
if (idx > -1) {
if (this.visitTaskList[idx].ReadingQuestions.length > 0) {
@ -655,7 +626,7 @@ export default {
.then(() => {
this.split(rowId, questionId)
})
.catch(() => {})
.catch(() => { })
} else {
//
this.$confirm(this.$t('trials:reading:warnning:msg4'), {
@ -665,7 +636,7 @@ export default {
.then(() => {
this.split(rowId, questionId)
})
.catch(() => {})
.catch(() => { })
}
}
}
@ -722,7 +693,7 @@ export default {
})
},
confirmMerge() {
// ', ?'
// ', ?'
this.$confirm(this.$t('trials:reading:lugano:warnning:fuse'), {
type: 'warning'
}).then(() => {
@ -875,7 +846,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
return
}
@ -886,7 +857,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
} else {
// saveTypeEnum: 0
@ -1026,7 +997,7 @@ export default {
async changeLesionType(questionsObj) {
await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId })
// saveTypeEnum: 0
var lesionObj = { }
var lesionObj = {}
var questionObj = questionsObj.questionForm
//
var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType)
@ -1343,21 +1314,25 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-wrapper{
.measurement-wrapper {
height: 100%;
overflow-y: auto;
.container{
.container {
padding: 10px;
.basic-info{
.basic-info {
display: flex;
justify-content: space-between;
align-items: center;
h3{
h3 {
color: #ddd;
padding: 5px 0px;
margin: 0;
}
i{
i {
color: #fff;
font-size: 22px;
font-weight: bold;
@ -1365,14 +1340,16 @@ export default {
}
}
}
.title{
.title {
padding: 5px;
font-weight: bold;
color: #ddd;
font-size: 15px;
}
.add-icon{
.add-icon {
padding: 5px;
font-weight: bold;
color: #ddd;
@ -1381,21 +1358,24 @@ export default {
margin-bottom: 2px;
cursor: pointer;
}
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b;
}
.flex-row{
.flex-row {
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: #424242;
}
.lesion_list{
.lesion_list {
position: relative;
}
.login-cycle{
.login-cycle {
width: 5px;
height: 5px;
display: inline-block;
@ -1404,28 +1384,33 @@ export default {
margin-right: 2px;
margin-bottom: 2px;
}
.el-collapse{
border-bottom:none;
border-top:none;
::v-deep .el-collapse-item{
background-color: #000!important;
.el-collapse {
border-bottom: none;
border-top: none;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd;
}
::v-deep .el-collapse-item__header{
background-color: #000!important;
::v-deep .el-collapse-item__header {
background-color: #000 !important;
color: #ddd;
border-bottom-color:#5a5a5a;
border-bottom-color: #5a5a5a;
padding-left: 5px;
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;
}
::v-deep .el-collapse-item__content{
width:260px;
::v-deep .el-collapse-item__content {
width: 260px;
position: absolute;
top: 0px;
right: 0px;
@ -1434,46 +1419,59 @@ export default {
z-index: 1;
color: #ddd;
padding: 5px;
background-color:#1e1e1e;
background-color: #1e1e1e;
}
}
.merge-table{
padding:0 10px;
::v-deep.el-table{
background-color: #1e1e1e !important;
.merge-table {
padding: 0 10px;
::v-deep.el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell, .el-table th.el-table__cell.is-leaf{
::v-deep.el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
.el-table--border::after, .el-table--group::after, .el-table::before{
.el-table--border::after,
.el-table--group::after,
.el-table::before {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper{
th{
background-color: #1e1e1e !important;
color: #dfdfdf;
border-bottom: 1px solid #383838;
}
::v-deep.el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
border-bottom: 1px solid #383838;
}
::v-deep.el-table__body-wrapper{
tr{
background-color: #1e1e1e !important;
}
::v-deep.el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
}
tr:hover > td{
background-color: #1e1e1e !important;
tr:hover>td {
background-color: #1e1e1e !important;
}
}
::v-deep.el-table__empty-block{
background-color: #1e1e1e !important;
::v-deep.el-table__empty-block {
background-color: #1e1e1e !important;
}
.merge-label{
color:#ddd;
.merge-label {
color: #ddd;
font-size: 13px;
margin-bottom: 10px;
span{
span {
font-size: 15px;
color: red;
}

View File

@ -1,12 +1,6 @@
<template>
<el-form
v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
class="measurement-form">
<div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;">
<h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -19,198 +13,135 @@
</div>
</div>
<div ref="scrollPanel" style="height: 420px;overflow-y: auto;overflow-x: hidden;" @scroll.stop="scrollHandle">
<el-form-item
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]">
<!-- 下拉框 -->
<el-select
:ref="`select_LesionType`"
v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState>=2 || !isBaseLineTask || answers.SplitOrMergeType === '1'"
@change="((val)=>{lesionTypeChange(val)})"
>
<el-select :ref="`select_LesionType`" v-model="questionForm.LesionType" filterable
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask || answers.SplitOrMergeType === '1'"
@change="((val) => { lesionTypeChange(val) })">
<el-option
v-for="item of $d.LesionType"
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
:value="item.value" :label="item.label" />
</el-select>
</el-form-item>
<el-form-item
v-for="qs in questions"
v-show="qs.ShowQuestion!==2"
:key="qs.Id"
:label="`${qs.QuestionName}`"
:prop="qs.Id"
:rules="[
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (qs.RelevanceValue.includes(questionForm[qs.RelevanceId]))) || (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']},
]"
>
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
:prop="qs.Id" :rules="[
{
required: (qs.IsRequired === 0 || (qs.IsRequired === 1 && qs.RelevanceId && (qs.RelevanceValue.includes(questionForm[qs.RelevanceId]))) || (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']
},
]">
<!-- 输入框 -->
<template v-if="qs.Type==='input' || qs.Type==='number'">
<template v-if="qs.Type === 'input' || qs.Type === 'number'">
<div style="display: flex;justify-content: space-between;">
<el-input v-if="qs.Type === 'input' || qs.Type === 'number'" 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)) || answers.SplitOrMergeType === '1'"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
<!-- {{ ((qs.QuestionMark === 6 && isCurrentTaskAdd === 'False') || (qs.QuestionMark === 6 && isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition)) }} -->
<el-input
v-if="qs.Type==='input' || qs.Type==='number'"
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)) || answers.SplitOrMergeType === '1'"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
</template>
<!-- 多行文本输入框 -->
<el-input
v-if="qs.Type==='textarea'"
v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="!isCurrentTask || readingTaskState>=2 || answers.SplitOrMergeType === '1'"
@change="((val)=>{formItemChange(val, qs)})"
/>
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500"
:disabled="!isCurrentTask || readingTaskState >= 2 || answers.SplitOrMergeType === '1'"
@change="((val) => { formItemChange(val, qs) })" />
<!-- 下拉框 -->
<!-- :disabled="!isCurrentTask || readingTaskState>=2 || (!isBaseLineTask && qs.QuestionMark === 5 && isCurrentTaskAdd === 'False') || qs.QuestionMark === 2 || (qs.QuestionMark === 8 && !isBaseLineTask && isCurrentTaskAdd === 'False')" -->
<el-select
v-if="qs.Type==='select'"
:ref="`select_${qs.Id}`"
v-model="questionForm[qs.Id]"
filterable
<el-select v-if="qs.Type === 'select'" :ref="`select_${qs.Id}`" v-model="questionForm[qs.Id]" filterable
: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)) || (qs.QuestionMark === 7 && stateDisabled) || answers.SplitOrMergeType === '1' || (qs.QuestionMark === 7 && answers.SplitOrMergeType === '3')"
@change="((val)=>{formItemChange(val, qs)})"
>
: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)) || (qs.QuestionMark === 7 && stateDisabled) || answers.SplitOrMergeType === '1' || (qs.QuestionMark === 7 && answers.SplitOrMergeType === '3')"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;">
<i class="el-icon-search" />
</span>
</template>
<template v-if="qs.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))"
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answers.LastTaskState))}` : ''"
>
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answers.LastTaskState))}` : ''">
<!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answers.IsFristAdd=== 'True' && answers.SplitOrMergeType === '0'">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'">
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0" :key="item.id"
:value="item.value" :label="item.label" />
</template>
<!-- 首次添加的新病灶不能为无法评估和消失 -->
<template v-else-if="isCurrentTaskAdd=== 'True' && lesionType === 2">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0 || item.value === 1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2">
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0 || item.value === 1"
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="item of filterState($d[qs.DictionaryCode])"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of filterState($d[qs.DictionaryCode])" :key="item.id" :value="item.value"
:label="item.label" />
</template>
</el-option-group>
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-if="qs.Type==='radio'"
v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2 || answers.SplitOrMergeType === '1'"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
@change="((val)=>{formItemChange(val, qs)})"
>
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState >= 2 || answers.SplitOrMergeType === '1'">
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val"
@change="((val) => { formItemChange(val, qs) })">
{{ val }}
</el-radio>
</el-radio-group>
<template v-if="qs.QuestionMark === 20">
<div style="display: flex;flex-direction: row;justify-content: flex-start;">
<el-input
v-if="qs.Type==='calculation'"
v-model="questionForm[qs.Id]"
disabled
style="width:120px;"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<viewer
v-if="answers.OtherPicturePath"
ref="viewer"
style="margin:0 10px;"
:images="[`${OSSclientConfig.basePath}${answers.OtherPicturePath}`]"
>
<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;"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
<viewer v-if="answers.OtherPicturePath" ref="viewer" style="margin:0 10px;"
:images="[`${OSSclientConfig.basePath}${answers.OtherPicturePath}`]">
<span style="color:#409eff;cursor: pointer" @click="previewImage()">
{{ $t('trials:lugano:button:suvscreenshot1') }}
</span>
<img
v-show="false"
crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${answers.OtherPicturePath}`"
alt="Image"
>
<img v-show="false" crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${answers.OtherPicturePath}`" alt="Image">
</viewer>
<!-- <img
v-if="answers.OtherPicturePath"
@ -226,45 +157,39 @@
</div>
</template>
<template v-else>
<el-input
v-if="qs.Type==='calculation'"
v-model="questionForm[qs.Id]"
disabled
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</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
@change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
</template>
</el-form-item>
</div>
<div
v-if="isCurrentTask && readingTaskState<2 && (answers.SplitOrMergeType !== '1' && answers.SplitOrMergeType !== '3')"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
v-if="isCurrentTask && readingTaskState < 2 && (answers.SplitOrMergeType !== '1' && answers.SplitOrMergeType !== '3')"
class="base-dialog-footer" style="text-align:right;margin-top:10px;">
<!-- 清除标记 -->
<el-button
v-if="questionForm.MeasureData"
size="mini"
@click="handleDeleteMeasureData"
>
<el-button v-if="questionForm.MeasureData" size="mini" @click="handleDeleteMeasureData">
{{ $t('trials:reading:button:removeMark') }}
</el-button>
<!-- 删除 -->
<el-button
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
<el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete">
{{ $t('common:button:delete') }}
</el-button>
<!-- 保存 -->
<el-button
size="mini"
@click="handleSave"
>
<el-button size="mini" @click="handleSave">
{{ $t('common:button:save') }}
</el-button>
</div>
@ -272,7 +197,7 @@
</el-form>
</template>
<script>
import { submitTableQuestion, deleteReadingRowAnswer, getIsSuvMaxLesionNoPet } from '@/api/trials'
import { submitTableQuestion, deleteReadingRowAnswer, getIsSuvMaxLesion } from '@/api/trials'
// import { uploadPrintscreen } from '@/api/reading'
import DicomEvent from './../DicomEvent'
import store from '@/store'
@ -368,6 +293,9 @@ export default {
// container.removeEventListener('scroll', this.scrollHandle , true)
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
scrollHandle() {
for (const k in this.$refs) {
if (k.indexOf('select_') === -1) continue
@ -505,11 +433,11 @@ export default {
if ((ldi > 15 && ldi <= 20) && (pddIncrease >= 50) && (ldiIncrease >= 5 || sdiIncrease >= 5)) {
this.stateDisabled = true
} else if ((ldi > 20) && (pddIncrease >= 50) && (ldiIncrease >= 10 || sdiIncrease >= 10)) {
/**
* 当前靶病灶LDi>20 mm
* 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 10 mm 或者 相比PPD最低点SDi增加值Sdi 10 mm
**/
/**
* 当前靶病灶LDi>20 mm
* 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 10 mm 或者 相比PPD最低点SDi增加值Sdi 10 mm
**/
this.stateDisabled = true
} else {
this.stateDisabled = false
@ -607,8 +535,8 @@ export default {
type: 'warning',
distinguishCancelAndClose: true
})
.then(() => {})
.catch(() => {})
.then(() => { })
.catch(() => { })
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return
}
@ -621,7 +549,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return
@ -653,7 +581,7 @@ export default {
})
},
deleteLesionInfo() {
return new Promise(async(resolve, reject) => {
return new Promise(async (resolve, reject) => {
const loading = this.$loading({ fullscreen: true })
var param = {
visitTaskId: this.visitTaskId,
@ -965,31 +893,31 @@ export default {
this.stateDisabled = false
}
} else {
/**
* 15mm<当前靶病灶LDi20mm
* 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 5 mm 或者 相比PPD最低点SDi增加值5 mm
**/
/**
* 15mm<当前靶病灶LDi20mm
* 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 5 mm 或者 相比PPD最低点SDi增加值5 mm
**/
if ((ldi > 15 && ldi <= 20) && (pddIncreaseNum >= 50) && (ldiIncrease >= 5 || sdiIncrease >= 5)) {
const stateId = this.getQuestionId(7)
this.$set(this.questionForm, stateId, 4)
this.stateDisabled = true
} else if ((ldi > 20) && (pddIncreaseNum >= 50) && (ldiIncrease >= 10 || sdiIncrease >= 10)) {
/**
* 当前靶病灶LDi>20 mm
* 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 10 mm 或者 相比PPD最低点SDi增加值Sdi 10 mm
**/
/**
* 当前靶病灶LDi>20 mm
* 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 10 mm 或者 相比PPD最低点SDi增加值Sdi 10 mm
**/
const stateId = this.getQuestionId(7)
this.$set(this.questionForm, stateId, 4)
this.stateDisabled = true
} else {
//
// const lesionState = !isNaN(parseInt(this.getQuestionVal(7))) ? parseInt(this.getQuestionVal(7)) : ''
// if (lesionState === 4) {
// const stateId = this.getQuestionId(7)
// this.$set(this.questionForm, stateId, null)
// }
//
// const lesionState = !isNaN(parseInt(this.getQuestionVal(7))) ? parseInt(this.getQuestionVal(7)) : ''
// if (lesionState === 4) {
// const stateId = this.getQuestionId(7)
// this.$set(this.questionForm, stateId, null)
// }
this.stateDisabled = false
}
}
@ -1132,7 +1060,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState1'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1143,7 +1071,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState2'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1159,7 +1087,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg21'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1170,7 +1098,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState12'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1187,7 +1115,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState3'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1199,7 +1127,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState4'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1215,7 +1143,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg25'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1234,7 +1162,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg26'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1258,7 +1186,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg27'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1270,7 +1198,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg28'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1287,7 +1215,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState5'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1296,7 +1224,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState6'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1318,7 +1246,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg30'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1347,7 +1275,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState7'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1359,7 +1287,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState8'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1376,7 +1304,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg31'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1388,7 +1316,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState9'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1405,7 +1333,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg33'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1417,7 +1345,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState10'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1434,7 +1362,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg35'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1446,7 +1374,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg36'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1463,7 +1391,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg37'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1475,7 +1403,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg38'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1492,7 +1420,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg39'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1504,7 +1432,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState11'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1550,7 +1478,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg43'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1562,7 +1490,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg44'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1579,7 +1507,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg45'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1591,7 +1519,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg46'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1737,7 +1665,7 @@ export default {
// suvmax
const suvMax = this.getQuestionVal(20)
if (this.questionForm.RowId && !!suvMax) {
const res = await getIsSuvMaxLesionNoPet({ visitTaskId: this.visitTaskId, rowId: this.questionForm.RowId })
const res = await getIsSuvMaxLesion({ visitTaskId: this.visitTaskId, rowId: this.questionForm.RowId })
if (res.IsSuccess && res.Result.IsSuvMaxLesion) {
message = this.$t('trials:reading:warnning:msg58')
}
@ -1837,51 +1765,62 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-form{
::v-deep .el-form-item__label{
.measurement-form {
::v-deep .el-form-item__label {
color: #c3c3c3;
}
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex;
flex-direction: row;
justify-content: flex-start;
flex-wrap: wrap;
}
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1;
}
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
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;
}
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
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;
}
.el-form-item__content
.el-select{
.el-form-item__content .el-select {
width: 100%;
}
.input-width1{
width: calc(100% - 60px)!important;
.input-width1 {
width: calc(100% - 60px) !important;
}
.input-width2{
.input-width2 {
width: 100% !important;
}
.suv_viewer{
.suv_viewer {
::v-deep .viewer-play {
display: none;
}
}
}
</style>

View File

@ -8,11 +8,9 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3>
<div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
<i
class="el-icon-refresh-left"
@click="resetMeasuredData"
/>
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
placement="bottom">
<i class="el-icon-refresh-left" @click="resetMeasuredData" />
</el-tooltip>
</div>
</div>
@ -25,121 +23,132 @@
:question-form-change-num="questionFormChangeNum"
:group-classify="1"
/> -->
<Questions
ref="ecrf"
:question-form-change-state="true"
:question-form-change-num="0"
:is-qulity-issues="false"
:group-classify="1"
/>
<Questions ref="ecrf" :question-form-change-state="true" :question-form-change-num="0" :is-qulity-issues="false"
:group-classify="1" @handleReadingChart="handleReadingChart" />
</div>
<!-- 测量问题 -->
<template v-if="questions.length > 0 && CriterionType !== 10">
<div v-for="(qs,index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<div v-for="(qs, index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<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>
<div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div>
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)">
<div class="title">{{ item.QuestionName }}
<svg-icon v-if="item.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" />
</div>
</div>
<!-- @change="handleCollapseChange(qs.Childrens,item)" -->
<el-collapse
v-if="item.Type === 'table' && item.TableQuestions"
v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
@change="handleCollapseChange">
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${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">
<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" />
</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" />
</el-tooltip>
<div :style="{position: 'absolute',left: item.LesionType === 1 && readingTaskState < 2?'58px':'50px',top: '2px'}">
<div
:style="{ position: 'absolute', left: item.LesionType === 1 && readingTaskState < 2 ? '58px' : '50px', top: '2px' }">
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
<div style="font-size: 11px;width:210px;height: 30px;display: flex;justify-content: flex-start;flex-wrap: nowrap;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
<el-tooltip v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'" class="item" effect="dark" :content="`${$t('trials:reading:message:fused')}${item.TableQuestions.Answers[i].SplitOrMergeLesionName}`" placement="bottom">
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'">
<div
style="font-size: 11px;width:210px;height: 30px;display: flex;justify-content: flex-start;flex-wrap: nowrap;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
<el-tooltip
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'"
class="item" effect="dark"
:content="`${$t('trials:reading:message:fused')}${item.TableQuestions.Answers[i].SplitOrMergeLesionName}`"
placement="bottom">
<div
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'">
<span class="login-cycle" />
</div>
</el-tooltip>
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '4'">
<span class="login-cycle" />
</div>
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<div v-if="item.TableQuestions.Answers[i].lesionPart" style="max-width: 100px;overflow: hidden;">
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark"
:content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<div v-if="item.TableQuestions.Answers[i].lesionPart"
style="max-width: 100px;overflow: hidden;">
{{ item.TableQuestions.Answers[i].lesionPart }}
</div>
</el-tooltip>
<div v-if="item.LesionType === 0" style="margin:0 5px;">
{{ $fd('TargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div>
<div v-else-if="item.LesionType === 1" style="margin:0 5px;">
{{ $fd('NoTargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('NoTargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div>
<div v-else style="margin:0 5px;">
{{ $fd('NewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div>
<div v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))">
<el-tooltip class="item" effect="dark" :content="`${item.TableQuestions.Answers[i].lesionLength}*${item.TableQuestions.Answers[i].lesionShort}m㎡`" placement="bottom">
<span>{{ item.TableQuestions.Answers[i].lesionLength }}*{{ item.TableQuestions.Answers[i].lesionShort }}m</span>
<el-tooltip class="item" effect="dark"
:content="`${item.TableQuestions.Answers[i].lesionLength}*${item.TableQuestions.Answers[i].lesionShort}m㎡`"
placement="bottom">
<span>{{ item.TableQuestions.Answers[i].lesionLength }}*{{
item.TableQuestions.Answers[i].lesionShort }}m</span>
</el-tooltip>
</div>
</div>
</div>
<div v-if="item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False' && readingTaskState < 2" style="position: absolute;right: 5px;top: 2px;">
<div v-if="item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False' && readingTaskState < 2"
style="position: absolute;right: 5px;top: 2px;">
<!-- 分裂 -->
<el-tooltip v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '4' && ((item.LesionType === 0 && [0,4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 1 && [0,1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0))" class="item" :content="$t('trials:reading:button:split')" placement="bottom">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" />
<el-tooltip
v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '4' && ((item.LesionType === 0 && [0, 4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 1 && [0, 1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0))"
class="item" :content="$t('trials:reading:button:split')" placement="bottom">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
@click.stop="handleSplit(item.TableQuestions.Answers[i].RowId, item.Id)" />
</el-tooltip>
<!-- 融合 -->
<el-tooltip v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '2' && ((item.LesionType === 0 && [0,1,4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))))" class="item" :content="$t('trials:reading:button:merge')" placement="bottom">
<i class="iconfont icon-24gl-merge" style="color:#fff;font-size: 16px;" @click.stop="handleMerge(item.TableQuestions.Answers[i],item.Id,item.OrderMark)" />
<el-tooltip
v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '2' && ((item.LesionType === 0 && [0, 1, 4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))))"
class="item" :content="$t('trials:reading:button:merge')" placement="bottom">
<i class="iconfont icon-24gl-merge" style="color:#fff;font-size: 16px;"
@click.stop="handleMerge(item.TableQuestions.Answers[i], item.Id, item.OrderMark)" />
</el-tooltip>
</div>
</div>
</template>
<QuestionForm
:ref="`${item.Id}_${q.RowIndex}`"
:questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]"
:lesion-type="item.LesionType"
:order-mark="item.OrderMark"
:table-questions="tableQuestions"
:row-index="String(q.RowIndex)"
: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"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
: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" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
@close="close" @handleReadingChart="handleReadingChart" />
</el-collapse-item>
</el-collapse>
@ -149,35 +158,15 @@
</template>
<!-- <el-divider /> -->
<!-- 肝脏评估 -->
<Questions
ref="ecrf2"
:question-form-change-state="true"
:question-form-change-num="0"
:group-classify="2"
:is-qulity-issues="false"
style="margin-top:20px"
:question-type="6"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
/>
<Questions ref="ecrf2" :question-form-change-state="true" :question-form-change-num="0" :group-classify="2"
:is-qulity-issues="false" style="margin-top:20px" :question-type="6"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" />
<!-- 脾脏评估 -->
<Questions
ref="ecrf3"
:question-form-change-state="true"
:question-form-change-num="0"
:group-classify="3"
:is-qulity-issues="false"
:question-type="7"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
/>
<Questions ref="ecrf3" :question-form-change-state="true" :question-form-change-num="0" :group-classify="3"
:is-qulity-issues="false" :question-type="7" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" />
</div>
<el-dialog
v-if="merge.visible"
v-loading="merge.loading"
:visible.sync="merge.visible"
:close-on-click-modal="false"
:title="$t('trials:reading:lugano:message:merge')"
width="500px"
>
<el-dialog v-if="merge.visible" v-loading="merge.loading" :visible.sync="merge.visible"
:close-on-click-modal="false" :title="$t('trials:reading:lugano:message:merge')" width="500px">
<div class="merge-table">
<div class="merge-label">
<label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label>
@ -185,40 +174,19 @@
<span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span>
</div>
<div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div>
<el-table
:data="lesionData"
style="width: 450px"
size="small"
height="200"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="45"
/>
<el-table-column
prop="OrderMarkName"
:label="$t('trials:reading:lugano:label:lesionNumber')"
width="100"
/>
<el-table-column
prop="Part"
:label="$t('trials:reading:lugano:label:lesionLocation')"
min-width="120"
show-overflow-tooltip
/>
<el-table :data="lesionData" style="width: 450px" size="small" height="200"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="45" />
<el-table-column prop="OrderMarkName" :label="$t('trials:reading:lugano:label:lesionNumber')" width="100" />
<el-table-column prop="Part" :label="$t('trials:reading:lugano:label:lesionLocation')" min-width="120"
show-overflow-tooltip />
</el-table>
</div>
<div slot="footer" style="text-align:right;">
<!-- 取消 -->
<el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button>
<!-- 确认 -->
<el-button
type="primary"
size="mini"
:disabled="mergeList.length === 0"
@click="confirmMerge"
>
<el-button type="primary" size="mini" :disabled="mergeList.length === 0" @click="confirmMerge">
{{ $t('common:button:confirm') }}</el-button>
</div>
</el-dialog>
@ -333,7 +301,7 @@ export default {
DicomEvent.$on('split', measureData => {
this.handleSplit(measureData.RowId, measureData.QuestionId)
})
DicomEvent.$on('refreshQuestions', async(obj) => {
DicomEvent.$on('refreshQuestions', async (obj) => {
var triald = this.$router.currentRoute.query.trialId
await store.dispatch('reading/refreshDicomReadingQuestionAnswer', { trialId: triald, visitTaskId: this.visitTaskId })
this.$nextTick(() => {
@ -342,7 +310,7 @@ export default {
this.$refs['ecrf3'].getQuestions(this.visitTaskId)
})
})
DicomEvent.$on('refreshSplitTargetLesionPDD', async(callback) => {
DicomEvent.$on('refreshSplitTargetLesionPDD', async (callback) => {
const res = await getSplitPPdSumNoPet({ visitTaskId: this.visitTaskId })
this.splitTargetLesions = res.Result
if (this.splitTargetLesions && this.splitTargetLesions.length > 0) {
@ -366,6 +334,9 @@ export default {
DicomEvent.$off('refreshQuestions')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) {
@ -529,7 +500,7 @@ export default {
try {
const loading = this.$loading({ fullscreen: true })
await store.dispatch('reading/refreshReadingQuestionAndAnswer', { trialId: this.$router.currentRoute.query.trialId, visitTaskId: this.visitTaskId }).then(async() => {
await store.dispatch('reading/refreshReadingQuestionAndAnswer', { trialId: this.$router.currentRoute.query.trialId, visitTaskId: this.visitTaskId }).then(async () => {
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
if (idx > -1) {
if (this.visitTaskList[idx].ReadingQuestions.length > 0) {
@ -655,7 +626,7 @@ export default {
.then(() => {
this.split(rowId, questionId)
})
.catch(() => {})
.catch(() => { })
} else {
//
this.$confirm(this.$t('trials:reading:warnning:msg4'), {
@ -665,7 +636,7 @@ export default {
.then(() => {
this.split(rowId, questionId)
})
.catch(() => {})
.catch(() => { })
}
}
}
@ -722,7 +693,7 @@ export default {
})
},
confirmMerge() {
// ', ?'
// ', ?'
this.$confirm(this.$t('trials:reading:lugano:warnning:fuse'), {
type: 'warning'
}).then(() => {
@ -875,7 +846,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
return
}
@ -886,7 +857,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
} else {
// saveTypeEnum: 0
@ -1026,7 +997,7 @@ export default {
async changeLesionType(questionsObj) {
await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId })
// saveTypeEnum: 0
var lesionObj = { }
var lesionObj = {}
var questionObj = questionsObj.questionForm
//
var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType)
@ -1343,21 +1314,25 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-wrapper{
.measurement-wrapper {
height: 100%;
overflow-y: auto;
.container{
.container {
padding: 10px;
.basic-info{
.basic-info {
display: flex;
justify-content: space-between;
align-items: center;
h3{
h3 {
color: #ddd;
padding: 5px 0px;
margin: 0;
}
i{
i {
color: #fff;
font-size: 22px;
font-weight: bold;
@ -1365,14 +1340,16 @@ export default {
}
}
}
.title{
.title {
padding: 5px;
font-weight: bold;
color: #ddd;
font-size: 15px;
}
.add-icon{
.add-icon {
padding: 5px;
font-weight: bold;
color: #ddd;
@ -1381,21 +1358,24 @@ export default {
margin-bottom: 2px;
cursor: pointer;
}
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b;
}
.flex-row{
.flex-row {
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: #424242;
}
.lesion_list{
.lesion_list {
position: relative;
}
.login-cycle{
.login-cycle {
width: 5px;
height: 5px;
display: inline-block;
@ -1404,28 +1384,33 @@ export default {
margin-right: 2px;
margin-bottom: 2px;
}
.el-collapse{
border-bottom:none;
border-top:none;
::v-deep .el-collapse-item{
background-color: #000!important;
.el-collapse {
border-bottom: none;
border-top: none;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd;
}
::v-deep .el-collapse-item__header{
background-color: #000!important;
::v-deep .el-collapse-item__header {
background-color: #000 !important;
color: #ddd;
border-bottom-color:#5a5a5a;
border-bottom-color: #5a5a5a;
padding-left: 5px;
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;
}
::v-deep .el-collapse-item__content{
width:260px;
::v-deep .el-collapse-item__content {
width: 260px;
position: absolute;
top: 0px;
right: 0px;
@ -1434,46 +1419,59 @@ export default {
z-index: 1;
color: #ddd;
padding: 5px;
background-color:#1e1e1e;
background-color: #1e1e1e;
}
}
.merge-table{
padding:0 10px;
::v-deep.el-table{
background-color: #1e1e1e !important;
.merge-table {
padding: 0 10px;
::v-deep.el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell, .el-table th.el-table__cell.is-leaf{
::v-deep.el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
.el-table--border::after, .el-table--group::after, .el-table::before{
.el-table--border::after,
.el-table--group::after,
.el-table::before {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper{
th{
background-color: #1e1e1e !important;
color: #dfdfdf;
border-bottom: 1px solid #383838;
}
::v-deep.el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
border-bottom: 1px solid #383838;
}
::v-deep.el-table__body-wrapper{
tr{
background-color: #1e1e1e !important;
}
::v-deep.el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
}
tr:hover > td{
background-color: #1e1e1e !important;
tr:hover>td {
background-color: #1e1e1e !important;
}
}
::v-deep.el-table__empty-block{
background-color: #1e1e1e !important;
::v-deep.el-table__empty-block {
background-color: #1e1e1e !important;
}
.merge-label{
color:#ddd;
.merge-label {
color: #ddd;
font-size: 13px;
margin-bottom: 10px;
span{
span {
font-size: 15px;
color: red;
}

View File

@ -1,12 +1,6 @@
<template>
<el-form
v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
class="measurement-form">
<div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -18,183 +12,132 @@
</div>
</div>
<el-form-item
v-for="qs in questions"
v-show="qs.ShowQuestion!==2"
:key="qs.Id"
:label="`${qs.QuestionName}`"
:prop="qs.Id"
:rules="[
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (String(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']},
]"
style="flex-wrap: wrap"
>
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
:prop="qs.Id" :rules="[
{
required: (qs.IsRequired === 0 || (qs.IsRequired === 1 && qs.RelevanceId && (String(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']
},
]" style="flex-wrap: wrap">
<!-- 输入框 -->
<template v-if="(qs.Type==='input' || qs.Type==='number') && (qs.QuestionMark === 1101 || qs.QuestionMark === 1102 || qs.QuestionMark === 1103)">
<template
v-if="(qs.Type === 'input' || qs.Type === 'number') && (qs.QuestionMark === 1101 || qs.QuestionMark === 1102 || qs.QuestionMark === 1103)">
<div style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;">
<el-input
v-model="questionForm[qs.Id]"
disabled
style="width: 100px;"
>
<el-input v-model="questionForm[qs.Id]" disabled style="width: 100px;">
<template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<!-- 测量 -->
<el-button
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && !questionForm[qs.Id] && readingTaskState!== 2"
size="mini"
type="text"
@click="addAnnotation(qs)"
>
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && !questionForm[qs.Id] && readingTaskState !== 2"
size="mini" type="text" @click="addAnnotation(qs)">
{{ $t('trials:MRIPDFF:button:measure') }}
</el-button>
<!-- 清除标记 -->
<el-button
v-if="getAnnotationStatus(qs) && readingTaskState!== 2"
size="mini"
type="text"
style="margin-left: 0px"
@click="removeAnnotation(qs)"
>
<el-button v-if="getAnnotationStatus(qs) && readingTaskState !== 2" size="mini" type="text"
style="margin-left: 0px" @click="removeAnnotation(qs)">
{{ $t('trials:MRIPDFF:button:clear') }}
</el-button>
<!-- 返回 -->
<el-button
v-if="questionForm[qs.Id]"
size="mini"
type="text"
style="margin-left: 0px"
@click="locateAnnotation(qs)"
>
<el-button v-if="questionForm[qs.Id]" size="mini" type="text" style="margin-left: 0px"
@click="locateAnnotation(qs)">
{{ $t('trials:MRIPDFF:button:return') }}
</el-button>
<!-- 保存 -->
<el-button
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && questionForm[qs.Id] && readingTaskState!== 2"
size="mini"
type="text"
style="margin-left: 0px"
@click="saveAnnotation(qs)"
>
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && questionForm[qs.Id] && readingTaskState !== 2"
size="mini" type="text" style="margin-left: 0px" @click="saveAnnotation(qs)">
<!-- 未保存 -->
<el-tooltip v-if="getAnnotationSaveEnum(qs) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<el-tooltip v-if="getAnnotationSaveEnum(qs) === 0" class="item" effect="dark"
:content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" />
</el-tooltip>
{{ $t('common:button:save') }}
</el-button>
</div>
</template>
<template v-else-if="qs.Type==='input' || qs.Type==='number'">
<el-input
v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<template v-else-if="qs.Type === 'input' || qs.Type === 'number'">
<div style="display: flex;justify-content: space-between;">
<el-input v-model="questionForm[qs.Id]" :disabled="!isCurrentTask || readingTaskState >= 2"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
</template>
<!-- 多行文本输入框 -->
<el-input
v-else-if="qs.Type==='textarea'"
v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<el-input v-else-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
@change="((val) => { formItemChange(val, qs) })" />
<!-- 下拉框 -->
<el-select
v-else-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
<el-select v-else-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable
:placeholder="$t('common:placeholder:select')"
:disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 1106"
@change="((val)=>{formItemChange(val, qs)})"
>
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 1106"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]" />
</template>
<template v-else-if="qs.DictionaryCode">
<el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-else-if="qs.Type==='radio'"
v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState>=2 || (qs.QuestionMark === 1105 && isDisabledMeasurableRadio)"
@change="((val)=>{formItemChange(val, qs)})"
>
<el-radio-group v-else-if="qs.Type === 'radio'" v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState >= 2 || (qs.QuestionMark === 1105 && isDisabledMeasurableRadio)"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.DictionaryCode.length > 0">
<el-radio
v-for="item in $d[qs.DictionaryCode]"
:key="item.id"
:label="item.value"
>
<el-radio v-for="item in $d[qs.DictionaryCode]" :key="item.id" :label="item.value">
{{ item.label }}
</el-radio>
</template>
<template v-else-if="qs.options.length > 0">
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</template>
</el-radio-group>
<!-- 自动计算 -->
<el-input
v-else-if="qs.Type==='calculation'"
v-model="questionForm[qs.Id]"
disabled
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<div style="display: flex;justify-content: space-between;" v-else-if="qs.Type === 'calculation'">
<!-- 自动计算 -->
<el-input v-model="questionForm[qs.Id]" disabled @change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
</el-form-item>
</div>
<div
v-if="isCurrentTask && readingTaskState<2"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
style="text-align:right;margin-top:10px;">
<!-- 保存 -->
<el-button
size="mini"
@click="handleSave"
>
<el-button size="mini" @click="handleSave">
{{ $t('common:button:save') }}
</el-button>
</div>
@ -290,6 +233,9 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initForm() {
this.isRender = false
this.isMeasurableId = this.getQuestionId(1105)
@ -503,7 +449,7 @@ export default {
const orderMarkName = this.getLesionName(this.orderMark, qs.QuestionMark)
this.activeQuestionId = qs.Id
this.activeQuestionMark = qs.QuestionMark
DicomEvent.$emit('addAnnotation', { question: qs, locateInfo: { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: orderMarkName, lesionType: null, markTool: 'Probe', readingTaskState: this.readingTaskState, isMarked: true }})
DicomEvent.$emit('addAnnotation', { question: qs, locateInfo: { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: orderMarkName, lesionType: null, markTool: 'Probe', readingTaskState: this.readingTaskState, isMarked: true } })
},
getAnnotationSaveEnum(qs) {
const i = this.markList.findIndex(i => i.tableQuestionId === qs.Id)
@ -754,17 +700,17 @@ export default {
const valid = await this.$refs.measurementForm.validate()
if (!valid) return
if (parseInt(this.questionForm[this.isMeasurableId]) === 1) {
//
//
const i = this.markList.findIndex(i => i.saveEnum === 0)
if (i > -1) {
//
//
this.$alert(this.$t('trials:MRIPDFF:message:message1'))
// this.$message.warning(this.$t('trials:MRIPDFF:message:message1'))
return
}
} else {
//
// ''
//
// ''
const confirm = await this.$confirm(
this.$t('trials:MRIPDFF:message:message2'),
{
@ -817,7 +763,7 @@ export default {
}
const res = await submitTaskRowInfo(params, 11)
if (res.IsSuccess) {
//
//
this.$message.success(this.$t('common:message:savedSuccessfully'))
this.$set(this.questionForm, 'saveTypeEnum', 2)
this.originalQuestionForm = { ...this.questionForm }
@ -853,45 +799,55 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-form{
::v-deep .el-form-item__label{
.measurement-form {
::v-deep .el-form-item__label {
color: #c3c3c3;
}
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1;
}
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1;
}
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
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;
}
::v-deep .el-input-group__append, .el-input-group__prepend {
::v-deep .el-input-group__append,
.el-input-group__prepend {
padding: 0 10px;
}
.el-form-item__content
.el-select{
.el-form-item__content .el-select {
width: 100%;
}
.input-width1{
width: calc(100% - 60px)!important;
.input-width1 {
width: calc(100% - 60px) !important;
}
.input-width2{
.input-width2 {
width: 100% !important;
}
}
</style>

View File

@ -8,63 +8,62 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3>
<div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
<i
class="el-icon-refresh-left"
@click="resetMeasuredData"
/>
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
placement="bottom">
<i class="el-icon-refresh-left" @click="resetMeasuredData" />
</el-tooltip>
</div>
</div>
<!-- 非测量问题 -->
<div class="lesions">
<Questions ref="ecrf" :groupClassify="1" :question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum" />
<Questions ref="ecrf" :groupClassify="1" :question-form-change-state="questionFormChangeState"
:question-form-change-num="questionFormChangeNum" @handleReadingChart="handleReadingChart" />
</div>
<!-- 测量问题 -->
<template >
<div v-for="(qs,index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<template>
<div v-for="(qs, index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<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>
<div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div>
</div>
<div style="color: #ddd;text-align: left;padding: 5px 10px;border-bottom: 1px solid #5a5a5a; font-size: 15px;">
<el-row >
<div
style="color: #ddd;text-align: left;padding: 5px 10px;border-bottom: 1px solid #5a5a5a; font-size: 15px;">
<el-row>
<!-- 分段 -->
<el-col :span="14">{{$t('trials:MRIPDFF:label:col1')}}</el-col>
<el-col :span="14">{{ $t('trials:MRIPDFF:label:col1') }}</el-col>
<!-- 是否可测量 -->
<!-- <el-col :span="7">{{$t('trials:MRIPDFF:label:col2')}}</el-col> -->
<!-- 平均值 -->
<el-col :span="7">{{$t('trials:MRIPDFF:label:col3')}}</el-col>
<el-col :span="7">{{ $t('trials:MRIPDFF:label:col3') }}</el-col>
</el-row>
</div>
<el-collapse
v-if="item.Type === 'table' && item.TableQuestions"
v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
@change="handleCollapseChange">
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${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">
<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.TableQuestions.Questions, q) }}
<!-- 未保存 -->
<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" />
</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" />
</el-tooltip>
<div style="position: absolute;right: 0px;top: 2px;">
@ -73,32 +72,23 @@
<!-- <div style="display: inline-block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;width:95px">
{{ $fd('ReadingYesOrNo', parseInt(item.TableQuestions.Answers[i].isMeasurable)) }}
</div> -->
<div style="display: inline-block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;width:50px">
{{ isNaN(parseFloat(item.TableQuestions.Answers[i].mean)) ? item.TableQuestions.Answers[i].mean : `${item.TableQuestions.Answers[i].mean}%` }}
<div
style="display: inline-block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;width:50px">
{{ isNaN(parseFloat(item.TableQuestions.Answers[i].mean)) ?
item.TableQuestions.Answers[i].mean : `${item.TableQuestions.Answers[i].mean}%` }}
</div>
</div>
</div>
</div>
</template>
<QuestionForm
:ref="`${item.Id}_${q.RowIndex}`"
:questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]"
:lesion-type="item.LesionType"
:order-mark="item.OrderMark"
:table-questions="tableQuestions"
:row-index="String(q.RowIndex)"
: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"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@resetQuestions="resetQuestions"
@close="close"
/>
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
: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" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@resetQuestions="resetQuestions" @close="close" @handleReadingChart="handleReadingChart" />
</el-collapse-item>
</el-collapse>
@ -210,6 +200,9 @@ export default {
DicomEvent.$off('getAllUnSaveLesions')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) {
@ -383,13 +376,13 @@ export default {
},
checkToolCanActive(toolName) {
return { isCanActiveTool: true, reason: '' }
return { isCanActiveTool: true, reason: '' }
},
getLesionName(questions, q) {
let liverSegmentStr = ''
if (!this.liverSegmentId) {
let i = questions.findIndex(i=>i.QuestionMark === 1106)
let i = questions.findIndex(i => i.QuestionMark === 1106)
if (i === -1) return
this.liverSegmentId = questions[i].Id
this.liverSegmentDicCode = questions[i].DictionaryCode
@ -525,23 +518,26 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-wrapper{
.measurement-wrapper {
height: 100%;
overflow-y: auto;
// overflow: hidden;
.container{
.container {
padding: 10px;
.basic-info{
.basic-info {
display: flex;
justify-content: space-between;
align-items: center;
h3{
h3 {
color: #ddd;
padding: 5px 0px;
margin: 0;
}
i{
i {
color: #fff;
font-size: 22px;
font-weight: bold;
@ -549,14 +545,16 @@ export default {
}
}
}
.title{
.title {
padding: 5px;
font-weight: bold;
color: #ddd;
font-size: 15px;
}
.add-icon{
.add-icon {
padding: 5px;
font-weight: bold;
color: #ddd;
@ -565,42 +563,49 @@ export default {
margin-bottom: 2px;
cursor: pointer;
}
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b;
}
.flex-row{
.flex-row {
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: #424242;
}
.lesion_list{
.lesion_list {
position: relative;
}
.el-collapse{
border-bottom:none;
border-top:none;
::v-deep .el-collapse-item{
background-color: #000!important;
.el-collapse {
border-bottom: none;
border-top: none;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd;
}
::v-deep .el-collapse-item__header{
background-color: #000!important;
::v-deep .el-collapse-item__header {
background-color: #000 !important;
color: #ddd;
border-bottom-color:#5a5a5a;
border-bottom-color: #5a5a5a;
padding-left: 5px;
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;
}
::v-deep .el-collapse-item__content{
width:260px;
::v-deep .el-collapse-item__content {
width: 260px;
position: absolute;
top: 0px;
right: 0px;
@ -609,7 +614,7 @@ export default {
z-index: 1;
color: #ddd;
padding: 5px;
background-color:#1e1e1e;
background-color: #1e1e1e;
}
}

View File

@ -17,7 +17,7 @@
<!-- 影像质量问题 -->
<div class="lesions">
<Questions ref="ecrf" :question-form-change-state="true" :question-form-change-num="0" :is-qulity-issues="false"
:group-classify="1" />
:group-classify="1" @handleReadingChart="handleReadingChart" />
</div>
<!-- 测量问题 -->
@ -37,7 +37,8 @@
<div class="add-icon" @click.prevent="downloadTpl(item.LesionType)">
<i class="el-icon-download" />
</div>
<div class="add-icon" style="margin: 0 5px;" @click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
<div class="add-icon" style="margin: 0 5px;"
@click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
<i class="el-icon-upload2" />
</div>
<div class="add-icon" @click.prevent="handleAddOrEdit('add', item)">
@ -154,7 +155,7 @@
<el-form ref="tableQsForm" v-loading="loading" :model="qsForm" size="small">
<QuestionTableFormItem v-for="item in qsList" :key="item.Id" :question="item" :question-form="qsForm"
:reading-task-state="readingTaskState" @setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData" />
@resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart" />
<el-form-item style="text-align: right">
<el-button size="small" @click="addOrEdit.visible = false">
{{ $t('common:button:cancel') }}
@ -169,7 +170,8 @@
<!-- 导入 -->
<el-dialog v-if="upload.visible" :visible.sync="upload.visible" :close-on-click-modal="false"
:title="upload.title" width="500px">
<UploadExcel :visit-task-id="visitTaskId" :lesion-type="upload.lesionType" :TableName="upload.TableName" @close="uploadDlgClose" />
<UploadExcel :visit-task-id="visitTaskId" :lesion-type="upload.lesionType" :TableName="upload.TableName"
@close="uploadDlgClose" />
</el-dialog>
</div>
</div>
@ -282,6 +284,9 @@ export default {
DicomEvent.$off('refreshQuestions')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) {

View File

@ -1,119 +1,66 @@
<template>
<div>
<div
v-if="!!question.GroupName && question.Type==='group'"
>
<div v-if="!!question.GroupName && question.Type === 'group'">
<h4 style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language==='en'?question.GroupEnName:question.GroupName }}
{{ language === 'en' ? question.GroupEnName : question.GroupName }}
</h4>
</div>
<template v-else>
<el-form-item
v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0 "
:label="`${question.QuestionName}`"
:prop="question.Id"
:rules="[
{ 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']},
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0"
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[
{
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']
},
]"
:class="[question.Type==='group' ? 'mb' : (question.Type==='upload' || question.QuestionName.length > 15) ?'uploadWrapper' : '']"
>
:class="[question.Type === 'group' ? 'mb' : (question.Type === 'upload' || question.QuestionName.length > 15) ? 'uploadWrapper' : '']">
<!-- 输入框 -->
<el-input
v-if="question.Type==='input'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
/>
<el-input v-if="question.Type === 'input'" v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2"
@change="((val) => { formItemChange(val, question) })" />
<!-- 多行文本输入框 -->
<el-input
v-else-if="question.Type==='textarea'"
v-model="questionForm[question.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
/>
<el-input v-else-if="question.Type === 'textarea'" v-model="questionForm[question.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2"
@change="((val) => { formItemChange(val, question) })" />
<!-- 下拉框 -->
<el-select
v-else-if="question.Type==='select'"
v-model="questionForm[question.Id]"
<el-select v-else-if="question.Type === 'select'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode)"
clearable
@change="((val)=>{formItemChange(val, question)})"
>
clearable @change="((val) => { formItemChange(val, question) })">
<template v-if="question.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]" />
</template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
:label="item.label" />
</template>
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
<template
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
:label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-else-if="question.Type==='radio'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
>
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })">
<template v-if="question.DictionaryCode">
<el-radio
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="String(item.value)"
>
<el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)">
{{ item.label }}
</el-radio>
</template>
<template v-else-if="question.TypeValue">
<el-radio
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
<el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</template>
</el-radio-group>
<!-- 复选框 -->
<el-checkbox-group
v-else-if="question.Type==='checkbox'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
>
<el-checkbox
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
<el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })">
<el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
{{ val }}
</el-checkbox>
</el-checkbox-group>
@ -143,41 +90,38 @@
@change="((val)=>{formItemChange(val, question)})"
/>
</template> -->
<!-- 数值类型 -->
<el-input
v-else-if="question.Type==='number'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState>=2 "
type="number"
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<div style="display: flex;justify-content: space-between;"
v-else-if="question.Type === 'calculation' || question.Type === 'number'">
<!-- 数值类型 -->
<el-input v-if="question.Type === 'number'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2" type="number" @change="((val) => { formItemChange(val, question) })">
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<el-input v-else-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled
@change="((val) => { formItemChange(val, question) })">
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: question.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
<el-input
v-else-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
disabled
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
</el-form-item>
</template>
<QuestionTableFormItem
v-for="item in question.Childrens"
:key="item.Id"
:question="item"
:question-form="questionForm"
:reading-task-state="readingTaskState"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
<QuestionTableFormItem v-for="item in question.Childrens" :key="item.Id" :question="item"
:question-form="questionForm" :reading-task-state="readingTaskState" @setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart"/>
</div>
</template>
<script>
@ -214,6 +158,9 @@ export default {
this.digitPlaces = Number(localStorage.getItem('digitPlaces'))
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
formItemChange(v, question) {
if (question.Childrens && question.Childrens.length > 0) {
this.resetChild(question.Childrens)
@ -269,29 +216,36 @@ export default {
}
</script>
<style lang="scss" scoped>
.mb{
.mb {
margin-bottom: 0px;
}
.disabled{
.disabled {
::v-deep .el-upload--picture-card {
display: none;
}
}
.uploadWrapper{
.uploadWrapper {
display: flex;
flex-direction: column !important;
align-items: flex-start;
}
::v-deep .el-input.is-disabled .el-input__inner{
background-color: #646464a1;
}
::v-deep .el-input-group__append, .el-input-group__prepend{
padding: 0 10px;
}
::v-deep .el-form-item__content {
width: 100%;
}
::v-deep .el-select.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 10px;
}
::v-deep .el-form-item__content {
width: 100%;
}
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1;
}
</style>

View File

@ -1,12 +1,6 @@
<template>
<el-form
v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
class="measurement-form">
<div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -20,177 +14,108 @@
</div>
</div>
<el-form-item
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<el-select
v-model="questionForm.LesionType"
filterable
:disabled="true"
>
<el-option
v-for="item of $d.LesionType"
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]">
<el-select v-model="questionForm.LesionType" filterable :disabled="true">
<el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
:value="item.value" :label="item.label" />
</el-select>
</el-form-item>
<el-form-item
v-for="qs in questions"
v-show="qs.ShowQuestion!==2"
:key="qs.Id"
:label="`${qs.QuestionName}`"
:prop="qs.Id"
:rules="qs.QuestionMark===11?[
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue))) && qs.Type!=='group' && qs.Type!=='summary',
message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']},{validator:validateLesionCount, trigger: ['blur', 'change']}]:[
{ 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']}]"
>
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
:prop="qs.Id" :rules="qs.QuestionMark === 11 ? [
{
required: (qs.IsRequired === 0 || (qs.IsRequired === 1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue))) && qs.Type !== 'group' && qs.Type !== 'summary',
message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
}, { validator: validateLesionCount, trigger: ['blur', 'change'] }] : [
{
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 }}
{{ questionForm.IsCanEditPosition }} -->
<!-- 输入框 min="1"
@input="questionForm[qs.Id]=questionForm[qs.Id].replace(/^(0+)|[^\d]+/g,'')"-->
<template v-if="qs.Type==='input' || qs.Type==='number'">
<template v-if="qs.QuestionMark===11">
<el-input
v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState>=2 "
type="number"
<template v-if="qs.Type === 'input' || qs.Type === 'number'">
<template v-if="qs.QuestionMark === 11">
<div style="display: flex;justify-content: space-between;">
<el-input v-model="questionForm[qs.Id]" :disabled="!isCurrentTask || readingTaskState >= 2" type="number"
@focus="focusQs = { ...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>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
@focus="focusQs = {...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>
</el-input>
</template>
<template v-else>
<el-input
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') && lesionType !== 2) || qs.QuestionMark === 9 || (qs.QuestionMark === 10 && isCurrentTaskAdd === 'False')"
@focus="focusQs = {...qs}"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
<el-input 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') && lesionType !== 2) || qs.QuestionMark === 9 || (qs.QuestionMark === 10 && isCurrentTaskAdd === 'False')"
@focus="focusQs = { ...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>
</el-input>
</template>
</template>
<!-- 多行文本输入框 -->
<el-input
v-if="qs.Type==='textarea'"
v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<el-select
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
:disabled="((!isBaseLineTask && qs.QuestionMark === 11) || (isBaseLineTask || lesionType === 2) && qs.QuestionMark === 7) || !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)"
@change="((val)=>{formItemChange(val, qs)})"
>
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
@change="((val) => { formItemChange(val, qs) })" />
<el-select v-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable
:disabled="((!isBaseLineTask && qs.QuestionMark === 11) || (isBaseLineTask || lesionType === 2) && qs.QuestionMark === 7) || !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)"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-if="qs.Type==='radio'"
v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState >= 2">
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div
v-if="isCurrentTask && readingTaskState<2"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
style="text-align:right;margin-top:10px;">
<!-- 清除标记 -->
<el-button
v-if="questionForm.MeasureData"
size="mini"
style="padding:7px 10px"
@click="handleDeleteMeasureData"
>
<el-button v-if="questionForm.MeasureData" size="mini" style="padding:7px 10px" @click="handleDeleteMeasureData">
{{ $t('trials:reading:button:removeMark') }}
</el-button>
<!-- 删除 -->
<el-button
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
style="margin-left: 5px;padding:7px 10px"
@click="handleDelete"
>
<el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" style="margin-left: 5px;padding:7px 10px"
@click="handleDelete">
{{ $t('common:button:delete') }}
</el-button>
<!-- 保存 -->
<el-button
size="mini"
style="margin-left: 5px;padding:7px 10px"
@click="handleSave"
>
<el-button size="mini" style="margin-left: 5px;padding:7px 10px" @click="handleSave">
{{ $t('common:button:save') }}
</el-button>
</div>
@ -287,6 +212,9 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
validateLesionCount(rule, value, callback) {
// const reg = /^[1-9][0-9]?$|^100$/
// const reg = /^(0+)|[^\d]+/g
@ -647,7 +575,7 @@ export default {
this.$confirm(this.$t('trials:readingPGWC:warnning:msg2'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -660,7 +588,7 @@ export default {
this.$confirm(this.$t('trials:readingPGWC:warnning:msg3'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -672,7 +600,7 @@ export default {
this.$confirm(this.$t('trials:readingPGWC:warnning:msg4'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -684,7 +612,7 @@ export default {
this.$confirm(this.$t('trials:readingPGWC:warnning:msg5'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -696,7 +624,7 @@ export default {
this.$confirm(this.$t('trials:readingPGWC:warnning:msg6'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -855,7 +783,7 @@ export default {
type: 'warning',
distinguishCancelAndClose: true
})
.then(async() => {
.then(async () => {
//
if (this.questionForm.MeasureData) {
var remark = this.getLesionName(this.orderMark, this.questionForm.RowIndex)
@ -864,7 +792,7 @@ export default {
DicomEvent.$emit('getMeasureData')
this.$emit('close', { lesionType: this.lesionType, rowIndex: this.rowIndex, visitTaskId: this.visitTaskId })
})
.catch(() => {})
.catch(() => { })
} else {
if (this.questionForm.isSave === false) {
// ''
@ -875,7 +803,7 @@ export default {
.then(() => {
this.$emit('close')
})
.catch(() => {})
.catch(() => { })
} else {
this.$emit('close')
}
@ -900,39 +828,45 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-form{
::v-deep .el-form-item__label{
.measurement-form {
::v-deep .el-form-item__label {
color: #c3c3c3;
}
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1;
}
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1;
}
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1;
}
.el-form-item__content
.el-select{
.el-form-item__content .el-select {
width: 100%;
}
.input-width1{
width: calc(100% - 60px)!important;
.input-width1 {
width: calc(100% - 60px) !important;
}
.input-width2{
.input-width2 {
width: 100% !important;
}
}
</style>

View File

@ -8,58 +8,55 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3>
<div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
<i
class="el-icon-refresh-left"
@click="resetMeasuredData"
/>
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
placement="bottom">
<i class="el-icon-refresh-left" @click="resetMeasuredData" />
</el-tooltip>
</div>
</div>
<!-- 非测量问题 -->
<div class="lesions">
<Questions
ref="ecrf"
:question-form-change-state="questionFormChangeState"
:question-form-change-num="questionFormChangeNum"
:is-first-change-task="isFirstChangeTask"
/>
<Questions ref="ecrf" :question-form-change-state="questionFormChangeState"
:question-form-change-num="questionFormChangeNum" :is-first-change-task="isFirstChangeTask"
@handleReadingChart="handleReadingChart" />
</div>
<!-- 测量问题 -->
<template v-if="questions.length > 0">
<div v-for="(qs,index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<div v-for="(qs, index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<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>
<div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2) && !(isBaseLineTask && item.LesionType === 3)" :key="item.Id">
<div v-for="item in qs.Childrens"
v-show="!(isBaseLineTask && item.LesionType === 2) && !(isBaseLineTask && item.LesionType === 3)"
:key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div>
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)">
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" />
</div>
</div>
<el-collapse
v-if="item.Type === 'table' && item.TableQuestions"
v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
@change="handleCollapseChange">
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${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">
<div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}">
{{ getLesionName(item.OrderMark,q.RowIndex, qs.Childrens) }}
<div style="width:300px;position: relative;"
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
{{ getLesionName(item.OrderMark, q.RowIndex, qs.Childrens) }}
<!-- 未保存 -->
<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" />
</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" />
</el-tooltip>
<div style="position: absolute;left: 60px;top: 2px;">
@ -68,37 +65,29 @@
{{ item.TableQuestions.Answers[i].lesionPart }}
</div>
<div v-if="item.TableQuestions.Answers[i].lesionState" style="margin-left:10px;">
{{ $fd('EvaluationOfState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('EvaluationOfState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div>
<div v-if="item.TableQuestions.Answers[i].lesionType" style="margin-left:10px;margin-bottom:5px;">
<div v-if="item.TableQuestions.Answers[i].lesionType"
style="margin-left:10px;margin-bottom:5px;">
{{ item.TableQuestions.Answers[i].lesionType }}
</div>
<div v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionNum)) && item.LesionType === 4" style="margin-left:10px;">
<div
v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionNum)) && item.LesionType === 4"
style="margin-left:10px;">
{{ item.TableQuestions.Answers[i].lesionNum }}
</div>
</div>
</div>
</div>
</template>
<QuestionForm
:ref="`${item.Id}_${q.RowIndex}`"
:questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]"
:lesion-type="item.LesionType"
:order-mark="item.OrderMark"
:table-questions="tableQuestions"
:row-index="String(q.RowIndex)"
: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"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
: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" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
@close="close" @handleReadingChart="handleReadingChart" />
</el-collapse-item>
</el-collapse>
@ -218,6 +207,9 @@ export default {
DicomEvent.$off('getUnSaveTarget')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) {
@ -519,7 +511,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
return
}
@ -530,7 +522,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
} else {
var obj = { saveTypeEnum: 0 }
@ -798,23 +790,26 @@ export default {
</script>
<style lang="scss" scoped>
.measurement-wrapper{
.measurement-wrapper {
height: 100%;
overflow-y: auto;
// overflow: hidden;
.container{
.container {
padding: 10px;
.basic-info{
.basic-info {
display: flex;
justify-content: space-between;
align-items: center;
h3{
h3 {
color: #ddd;
padding: 5px 0px;
margin: 0;
}
i{
i {
color: #fff;
font-size: 22px;
font-weight: bold;
@ -822,14 +817,16 @@ export default {
}
}
}
.title{
.title {
padding: 5px;
font-weight: bold;
color: #ddd;
font-size: 15px;
}
.add-icon{
.add-icon {
padding: 5px;
font-weight: bold;
color: #ddd;
@ -838,42 +835,49 @@ export default {
margin-bottom: 2px;
cursor: pointer;
}
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b;
}
.flex-row{
.flex-row {
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: #424242;
}
.lesion_list{
.lesion_list {
position: relative;
}
.el-collapse{
border-bottom:none;
border-top:none;
::v-deep .el-collapse-item{
background-color: #000!important;
.el-collapse {
border-bottom: none;
border-top: none;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd;
}
::v-deep .el-collapse-item__header{
background-color: #000!important;
::v-deep .el-collapse-item__header {
background-color: #000 !important;
color: #ddd;
border-bottom-color:#5a5a5a;
border-bottom-color: #5a5a5a;
padding-left: 5px;
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;
}
::v-deep .el-collapse-item__content{
width:260px;
::v-deep .el-collapse-item__content {
width: 260px;
position: absolute;
top: 0px;
right: 0px;
@ -882,10 +886,9 @@ export default {
z-index: 1;
color: #ddd;
padding: 5px;
background-color:#1e1e1e;
background-color: #1e1e1e;
}
}
}
</style>

View File

@ -6,47 +6,53 @@
>
{{ question.GroupName }}
</div> -->
<div
v-if="!!question.GroupName && question.Type==='group'"
>
<div v-if="!!question.GroupName && question.Type === 'group'">
<h4 style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language==='en'?question.GroupEnName:question.GroupName }}
{{ language === 'en' ? question.GroupEnName : question.GroupName }}
</h4>
</div>
<template v-else-if="((question.QuestionType === 56 || question.QuestionType === 57) && question.IsBaseLineTask)" />
<template v-else>
<el-form-item
v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0 "
:label="`${question.QuestionName}`"
:prop="question.Id"
:rules="[
{ 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']},
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0"
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[
{
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']
},
]"
:class="[question.Type==='group' ? 'mb' : (question.Type==='upload' || question.QuestionName.length > 15) ?'uploadWrapper' : '']"
>
:class="[question.Type === 'group' ? 'mb' : (question.Type === 'upload' || question.QuestionName.length > 15) ? 'uploadWrapper' : '']">
<template v-if="question.QuestionType === 60 || question.QuestionType === 61">
<div style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;">
<div style="display: flex;justify-content: space-between;" v-if="question.Type === 'calculation'">
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled
style="width: 130px;">
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart"
class="svg-icon svg-readingChart" @click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: question.Id
}
})" />
</div>
<el-input
v-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
disabled
style="width: 130px;"
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<!-- 测量 -->
<el-button v-if="!questionForm[question.Id] && readingTaskState!== 2" size="mini" type="text" @click="addAnnotation(question)">{{ $t('trials:lugano:button:addAnnotation') }}</el-button>
<el-button v-if="!questionForm[question.Id] && readingTaskState !== 2" size="mini" type="text"
@click="addAnnotation(question)">{{ $t('trials:lugano:button:addAnnotation') }}</el-button>
<!-- 清除标记 -->
<el-button v-if="questionForm[question.Id]&& readingTaskState!== 2" size="mini" type="text" @click="removeAnnotation(question)">{{ $t('trials:lugano:button:clearAnnotation') }}</el-button>
<el-button v-if="questionForm[question.Id] && readingTaskState !== 2" size="mini" type="text"
@click="removeAnnotation(question)">{{ $t('trials:lugano:button:clearAnnotation') }}</el-button>
<!-- 定位 -->
<el-button v-if="questionForm[question.Id]" size="mini" type="text" @click="locateAnnotation(question)">{{ $t('trials:lugano:button:locateAnnotation') }}</el-button>
<el-button v-if="questionForm[question.Id]" size="mini" type="text" @click="locateAnnotation(question)">{{
$t('trials:lugano:button:locateAnnotation') }}</el-button>
<!-- 保存 -->
<el-button v-if="readingTaskState!== 2 && question.SaveEnum === 1" size="mini" type="text" @click="saveAnnotation(question)">
<el-button v-if="readingTaskState !== 2 && question.SaveEnum === 1" size="mini" type="text"
@click="saveAnnotation(question)">
<!-- 未保存 -->
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" />
@ -56,157 +62,100 @@
</div>
</template>
<template v-else-if="question.QuestionType === 48 || question.QuestionType === 51 || question.QuestionType === 52 || question.QuestionType === 53">
<el-input
v-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
disabled
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<template
v-else-if="question.QuestionType === 48 || question.QuestionType === 51 || question.QuestionType === 52 || question.QuestionType === 53">
<div style="display: flex;justify-content: space-between;" v-if="question.Type === 'calculation'">
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: question.Id
}
})" />
</div>
</template>
<!-- 输入框 -->
<el-input
v-else-if="question.Type==='input'"
v-model="questionForm[question.Id]"
<el-input v-else-if="question.Type === 'input'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
@change="((val)=>{formItemChange(val, question)})"
/>
@change="((val) => { formItemChange(val, question) })" />
<!-- 多行文本输入框 -->
<el-input
v-else-if="question.Type==='textarea'"
v-model="questionForm[question.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
@change="((val)=>{formItemChange(val, question)})"
/>
<el-input v-else-if="question.Type === 'textarea'" v-model="questionForm[question.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2 || isFirstChangeTask"
@change="((val) => { formItemChange(val, question) })" />
<!-- 下拉框 -->
<el-select
v-else-if="question.Type==='select'"
v-model="questionForm[question.Id]"
<el-select v-else-if="question.Type === 'select'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode) || isFirstChangeTask || question.QuestionType === 50 || question.QuestionType === 55"
clearable
@change="((val)=>{formItemChange(val, question)})"
>
clearable @change="((val) => { formItemChange(val, question) })">
<template v-if="question.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]" />
</template>
<template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 47 && question.IsBaseLineTask">
<el-option
v-for="item of $d[question.DictionaryCode]"
v-show="item.value === 1 ||item.value === 2 || item.value === 5 "
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
<el-option v-for="item of $d[question.DictionaryCode]"
v-show="item.value === 1 || item.value === 2 || item.value === 5" :key="item.id"
:value="String(item.value)" :label="item.label" />
</template>
<template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 47 && !question.IsBaseLineTask">
<template
v-else-if="question.QuestionGenre === 3 && question.QuestionType === 47 && !question.IsBaseLineTask">
<el-option-group
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode,parseFloat(question.LastTaskAnswer))}` : ''"
>
<el-option
v-for="item of $d[question.DictionaryCode]"
v-show="item.value === 1 ||item.value === 3|| item.value === 4 || item.value === 5"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode, parseFloat(question.LastTaskAnswer))}` : ''">
<el-option v-for="item of $d[question.DictionaryCode]"
v-show="item.value === 1 || item.value === 3 || item.value === 4 || item.value === 5" :key="item.id"
:value="String(item.value)" :label="item.label" />
</el-option-group>
</template>
<template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 49 && question.IsBaseLineTask">
<el-option
v-for="item of $d[question.DictionaryCode]"
v-show="item.value === 1 ||item.value === 5 || item.value === 6 "
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
<el-option v-for="item of $d[question.DictionaryCode]"
v-show="item.value === 1 || item.value === 5 || item.value === 6" :key="item.id"
:value="String(item.value)" :label="item.label" />
</template>
<template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 49 && !question.IsBaseLineTask">
<template
v-else-if="question.QuestionGenre === 3 && question.QuestionType === 49 && !question.IsBaseLineTask">
<el-option-group
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode,parseFloat(question.LastTaskAnswer))}` : ''"
>
<el-option
v-for="item of $d[question.DictionaryCode]"
v-show="item.value === 1 ||item.value === 2 || item.value === 3 || item.value === 4 || item.value === 5"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode, parseFloat(question.LastTaskAnswer))}` : ''">
<el-option v-for="item of $d[question.DictionaryCode]"
v-show="item.value === 1 || item.value === 2 || item.value === 3 || item.value === 4 || item.value === 5"
:key="item.id" :value="String(item.value)" :label="item.label" />
</el-option-group>
</template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
:label="item.label" />
</template>
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
<template
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
:label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-else-if="question.Type==='radio'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
@change="((val)=>{formItemChange(val, question)})"
>
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask" @change="((val) => { formItemChange(val, question) })">
<template v-if="question.DictionaryCode">
<el-radio
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="String(item.value)"
>
<el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)">
{{ item.label }}
</el-radio>
</template>
<template v-else-if="question.TypeValue">
<el-radio
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
<el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</template>
</el-radio-group>
<!-- 复选框 -->
<el-checkbox-group
v-else-if="question.Type==='checkbox'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
>
<el-checkbox
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
<el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask">
<el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
{{ val }}
</el-checkbox>
</el-checkbox-group>
@ -217,80 +166,52 @@
:disabled="readingTaskState >= 2 || isFirstChangeTask"
:precision="2"
/> -->
<template v-else-if="question.Type==='number'">
<el-input-number
v-if="question.ValueType === 0"
v-model="questionForm[question.Id]"
:precision="0"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
/>
<el-input-number
v-else-if="question.ValueType === 3"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
/>
<el-input-number
v-else-if="question.ValueType === 1 || question.ValueType === 2"
v-model="questionForm[question.Id]"
:precision="digitPlaces"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
/>
</template>
<el-input
v-else-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
disabled
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
<div style="display: flex;justify-content: space-between;"
v-else-if="question.Type === 'number' || question.Type === 'calculation'">
<template v-if="question.Type === 'number'">
<el-input-number v-if="question.ValueType === 0" v-model="questionForm[question.Id]" :precision="0"
:disabled="readingTaskState >= 2 || isFirstChangeTask" />
<el-input-number v-else-if="question.ValueType === 3" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask" />
<el-input-number v-else-if="question.ValueType === 1 || question.ValueType === 2"
v-model="questionForm[question.Id]" :precision="digitPlaces"
:disabled="readingTaskState >= 2 || isFirstChangeTask" />
</template>
</el-input>
<el-input v-else-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: question.Id
}
})" />
</div>
<!-- 上传图像 -->
<el-upload
v-else-if="question.Type==='upload'"
action
:accept="accept"
: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 || isFirstChangeTask"
>
<el-upload v-else-if="question.Type === 'upload'" action :accept="accept" :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 || isFirstChangeTask">
<i slot="default" class="el-icon-plus" />
<div slot="file" slot-scope="{file}">
<img
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
alt=""
>
<img 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-preview"
@click="handlePictureCardPreview(file)"
>
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
<i class="el-icon-zoom-in" />
</span>
<span
v-if="readingTaskState < 2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<span v-if="readingTaskState < 2" class="el-upload-list__item-delete" @click="handleRemove(file)">
<i class="el-icon-delete" />
</span>
</span>
</div>
</el-upload>
<el-dialog
v-if="question.Type==='upload'"
append-to-body
:visible.sync="imgVisible"
width="600px"
>
<el-dialog v-if="question.Type === 'upload'" append-to-body :visible.sync="imgVisible" width="600px">
<el-image :src="imageUrl" width="100%">
<div slot="placeholder" class="image-slot">
加载中<span class="dot">...</span>
@ -300,17 +221,9 @@
</el-form-item>
</template>
<QuestionItem
v-for="(item) in question.Childrens"
:key="item.Id"
:question="item"
:reading-task-state="readingTaskState"
:is-first-change-task="isFirstChangeTask"
:question-form="questionForm"
:visit-task-id="visitTaskId"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
<QuestionItem v-for="(item) in question.Childrens" :key="item.Id" :question="item"
:reading-task-state="readingTaskState" :is-first-change-task="isFirstChangeTask" :question-form="questionForm"
:visit-task-id="visitTaskId" @setFormItemData="setFormItemData" @resetFormItemData="resetFormItemData" />
</div>
</template>
<script>
@ -423,7 +336,7 @@ export default {
.then(() => {
DicomEvent.$emit('removeAnnotation', question)
})
.catch(() => {})
.catch(() => { })
},
locateAnnotation(question) {
DicomEvent.$emit('locateAnnotation', question)
@ -479,29 +392,36 @@ export default {
}
</script>
<style lang="scss" scoped>
.mb{
.mb {
margin-bottom: 0px;
}
.disabled{
.disabled {
::v-deep .el-upload--picture-card {
display: none;
}
}
.uploadWrapper{
.uploadWrapper {
display: flex;
flex-direction: column !important;
align-items: flex-start;
}
::v-deep .el-input.is-disabled .el-input__inner{
background-color: #646464a1;
}
::v-deep .el-input-group__append, .el-input-group__prepend{
padding: 0 10px;
}
::v-deep .el-form-item__content {
width: 100%;
}
::v-deep .el-select.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 10px;
}
::v-deep .el-form-item__content {
width: 100%;
}
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1;
}
</style>

View File

@ -3,7 +3,8 @@
<el-form v-if="questions.length > 0" ref="questions" size="small" :model="questionForm">
<QuestionItem v-for="question of questions" :key="question.Id" :question="question" :question-form="questionForm"
:reading-task-state="readingTaskState" :is-first-change-task="isFirstChangeTask" :visit-task-id="visitTaskId"
@setFormItemData="setFormItemData" @resetFormItemData="resetFormItemData" />
@setFormItemData="setFormItemData" @resetFormItemData="resetFormItemData"
@handleReadingChart="handleReadingChart" />
<el-form-item v-if="readingTaskState < 2 && !isFirstChangeTask">
<div class="ecrf-footer">
@ -140,6 +141,9 @@ export default {
}
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async getQuestions(visitTaskId, isRefresh = false) {
var isChangeVisitTask = this.visitTaskId !== visitTaskId
this.visitTaskId = visitTaskId

View File

@ -44,10 +44,12 @@
:is-reading-show-subject-info="isReadingShowSubjectInfo" :studyShow="studyShow"
:is-reading-task-view-in-order="isReadingTaskViewInOrder" :is-exists-manual="isExistsManual"
:isReadKeyFile="isReadKeyFile" :isHaveKeyFile="isHaveKeyFile"
:iseCRFShowInDicomReading="iseCRFShowInDicomReading" @previewCD="previewCD" />
:iseCRFShowInDicomReading="iseCRFShowInDicomReading" @previewCD="previewCD"
@handleReadingChart="handleReadingChart" />
</div>
</div>
<readingChart ref="readingChart" />
</div>
</template>
<script>
@ -62,6 +64,7 @@ import * as dicomParser from 'dicom-parser'
import * as cornerstone from 'cornerstone-core'
import { workSpeedclose } from "@/utils"
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
import readingChart from '@/components/readingChart'
// import metaDataProvider from '@/utils/metaDataProvider'
// cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 });
var config = {
@ -82,7 +85,8 @@ export default {
name: 'ReadPage',
components: {
DicomViewer,
StudyList
StudyList,
readingChart
},
props: {
trialId: {
@ -233,6 +237,7 @@ export default {
window.addEventListener('beforeunload', e => {
cornerstone.imageCache.purgeCache()
})
document.addEventListener("click", this.foo);
},
beforeDestroy() {
cornerstone.imageCache.purgeCache()
@ -246,6 +251,21 @@ export default {
workSpeedclose(true)
},
methods: {
handleReadingChart(row) {
let { e, data } = row
let obj = Object.assign({}, data)
obj.TrialId = this.$route.query.trialId
obj.VisitTaskId = this.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()
},
clickShow() {
this.studyShow = !this.studyShow
this.$nextTick(() => {

View File

@ -1,12 +1,6 @@
<template>
<el-form
v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
class="measurement-form">
<div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -19,28 +13,16 @@
</div>
</div>
<el-form-item
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]">
<!-- 下拉框 -->
<el-select
v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState>=2 || !isBaseLineTask"
@change="((val)=>{lesionTypeChange(val)})"
>
<el-select v-model="questionForm.LesionType" filterable
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask"
@change="((val) => { lesionTypeChange(val) })">
<el-option
v-for="item of $d.LesionType"
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
:value="item.value" :label="item.label" />
</el-select>
</el-form-item>
@ -48,140 +30,95 @@
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue))) && qs.Type!=='group' && qs.Type!=='summary' && qs.QuestionMark !== 4 && qs.QuestionMark !== 6 && qs.QuestionMark !== 2,
message: '请注明', trigger: ['blur']},
]" -->
<el-form-item
v-for="qs in questions"
v-show="qs.ShowQuestion!==2"
:key="qs.Id"
:label="`${qs.QuestionName}`"
:prop="qs.Id"
: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']},
]"
>
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
:prop="qs.Id" :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 }}
{{ questionForm.IsCanEditPosition }} -->
<!-- 输入框 -->
<template v-if="qs.Type==='input' || qs.Type==='number'">
<template v-if="qs.Type === 'input' || qs.Type === 'number'">
<div style="display: flex;justify-content: space-between;">
<el-input v-if="qs.Type === 'input' || qs.Type === 'number'" 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))"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
<!-- {{ ((qs.QuestionMark === 6 && isCurrentTaskAdd === 'False') || (qs.QuestionMark === 6 && isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition)) }} -->
<el-input
v-if="qs.Type==='input' || qs.Type==='number'"
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))"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
</template>
<!-- 多行文本输入框 -->
<el-input
v-if="qs.Type==='textarea'"
v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
@change="((val) => { formItemChange(val, qs) })" />
<!-- 下拉框 -->
<!-- :disabled="!isCurrentTask || readingTaskState>=2 || (!isBaseLineTask && qs.QuestionMark === 5 && isCurrentTaskAdd === 'False') || qs.QuestionMark === 2 || (qs.QuestionMark === 8 && !isBaseLineTask && isCurrentTaskAdd === 'False')" -->
<el-select
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
<el-select v-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable
: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))"
@change="((val)=>{formItemChange(val, qs)})"
>
: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) })">
<template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;">
<i class="el-icon-search" />
</span>
</template>
<template v-if="qs.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))" :key="item.id"
:value="item.value" :label="item.label" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answers.LastTaskState))}` : ''"
>
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answers.LastTaskState))}` : ''">
<!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answers.IsFristAdd=== 'True' && answers.SplitOrMergeType === '0'">
<template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0" :key="item.id"
:value="item.value" :label="item.label" />
</template>
<!-- 首次添加的新病灶不能为无法评估和消失 -->
<template v-else-if="isCurrentTaskAdd=== 'True' && lesionType === 2">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0 || item.value === 1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2">
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0 || item.value === 1"
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="item of filterState($d[qs.DictionaryCode])"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of filterState($d[qs.DictionaryCode])" :key="item.id" :value="item.value"
:label="item.label" />
</template>
</el-option-group>
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-if="qs.Type==='radio'"
v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState >= 2">
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</el-radio-group>
@ -189,33 +126,19 @@
</div>
<div
v-if="isCurrentTask && readingTaskState<2"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
style="text-align:right;margin-top:10px;">
<!-- 清除标记 -->
<el-button
v-if="questionForm.MeasureData"
size="mini"
@click="handleDeleteMeasureData"
>
<el-button v-if="questionForm.MeasureData" size="mini" @click="handleDeleteMeasureData">
{{ $t('trials:reading:button:removeMark') }}
</el-button>
<!-- 删除 -->
<el-button
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
<el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete">
{{ $t('common:button:delete') }}
</el-button>
<!-- 保存 -->
<el-button
size="mini"
@click="handleSave"
>
<el-button size="mini" @click="handleSave">
{{ $t('common:button:save') }}
</el-button>
</div>
@ -307,6 +230,9 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initForm() {
const loading = this.$loading({ fullscreen: true })
this.questions.forEach(item => {
@ -352,12 +278,12 @@ export default {
await this.setMeasureData(this.answers.measureObj, true)
} else {
if (this.questionForm.MeasureData) {
// 线
// 线
if (this.questionForm.MeasureData.type === 'Bidirectional') {
this.organList = []
await this.getOrganInfoList(1)
} else if (this.questionForm.MeasureData.type === 'Length') {
//
//
this.organList = []
await this.getOrganInfoList(0)
} else {
@ -469,8 +395,8 @@ export default {
type: 'warning',
distinguishCancelAndClose: true
})
.then(() => {})
.catch(() => {})
.then(() => { })
.catch(() => { })
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return
}
@ -483,7 +409,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return
@ -657,7 +583,7 @@ export default {
var lesionShort = this.getQuestionVal(1)
//
if (!(this.isCurrentTaskAdd === 'True')) {
// 线>=10mm>=10mm
// 线>=10mm>=10mm
if (!this.isBaseLineTask && ((measureData.type === 'Length' && lesionLength >= 10) || (measureData.type === 'Bidirectional' && lesionShort >= 10))) {
const stateId = this.getQuestionId(7)
this.$set(this.questionForm, stateId, 0)
@ -855,7 +781,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg19'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -867,7 +793,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg20'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -884,7 +810,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg21'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -896,7 +822,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg22'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -914,7 +840,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg23'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -926,7 +852,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg24'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -942,7 +868,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg25'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -958,7 +884,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg26'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -979,7 +905,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg27'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -991,7 +917,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg28'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1026,7 +952,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg29'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1038,7 +964,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg30'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1059,7 +985,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg31'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1071,7 +997,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg32'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1088,7 +1014,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg33'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1100,7 +1026,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg34'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1117,7 +1043,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg35'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1129,7 +1055,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg36'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1146,7 +1072,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg37'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1158,7 +1084,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg38'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1175,7 +1101,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg39'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1187,7 +1113,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg40'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1204,7 +1130,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg41'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1216,7 +1142,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg42'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1233,7 +1159,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg43'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1245,7 +1171,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg44'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1262,7 +1188,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg45'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1274,7 +1200,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg46'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1330,7 +1256,7 @@ export default {
}
const res = await submitTableQuestion(params)
if (res.IsSuccess) {
//
//
this.$message.success(this.$t('common:message:savedSuccessfully'))
this.currentMarkTool = measureData ? measureData.type : ''
// saveTypeEnum 01访/2
@ -1500,42 +1426,50 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-form{
::v-deep .el-form-item__label{
.measurement-form {
::v-deep .el-form-item__label {
color: #c3c3c3;
}
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1;
}
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1;
}
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
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;
}
.el-form-item__content
.el-select{
.el-form-item__content .el-select {
width: 100%;
}
.input-width1{
width: calc(100% - 60px)!important;
.input-width1 {
width: calc(100% - 60px) !important;
}
.input-width2{
.input-width2 {
width: 100% !important;
}
}
</style>

View File

@ -8,119 +8,123 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3>
<div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
<i
class="el-icon-refresh-left"
@click="resetMeasuredData"
/>
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
placement="bottom">
<i class="el-icon-refresh-left" @click="resetMeasuredData" />
</el-tooltip>
</div>
</div>
<!-- 非测量问题 -->
<div class="lesions">
<Questions ref="ecrf" :question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum" />
<Questions ref="ecrf" :question-form-change-state="questionFormChangeState"
:question-form-change-num="questionFormChangeNum" @handleReadingChart="handleReadingChart" />
</div>
<!-- 测量问题 -->
<template v-if="questions.length > 0 && CriterionType !== 10">
<div v-for="(qs,index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<div v-for="(qs, index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<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>
<div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div>
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)">
<div class="title">{{ item.QuestionName }}
<svg-icon v-if="item.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" />
</div>
</div>
<!-- @change="handleCollapseChange(qs.Childrens,item)" -->
<el-collapse
v-if="item.Type === 'table' && item.TableQuestions"
v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
@change="handleCollapseChange">
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${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">
<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" />
</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" />
</el-tooltip>
<div style="position: absolute;left: 50px;top: 2px;">
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
<div style="font-size: 11px;width:220px;height: 30px;">
<div
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"
>
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<div 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">
<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>
</el-tooltip>
</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">
{{ $fd('TargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span>
<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 v-else>
{{ $fd('NewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span>
</div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px">
<template v-if="item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionShort))">
<div
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px">
<template
v-if="item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionShort))">
{{ item.TableQuestions.Answers[i].lesionShort }}mm
</template>
<template v-else-if="!item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))">
<template
v-else-if="!item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))">
{{ item.TableQuestions.Answers[i].lesionLength }}mm
</template>
</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 && item.TableQuestions.Answers[i].isDicomReading !== false" 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)" />
<el-tooltip
v-show="readingTaskState < 2 && !!item.TableQuestions.Answers[i].RowId && !isBaseLineTask && item.TableQuestions.Answers[i].isDicomReading !== false"
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)" />
</el-tooltip>
</div>
</div>
</template>
<QuestionForm
:ref="`${item.Id}_${q.RowIndex}`"
:questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]"
:lesion-type="item.LesionType"
:order-mark="item.OrderMark"
:table-questions="tableQuestions"
:row-index="String(q.RowIndex)"
: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"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
: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" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
@close="close" @handleReadingChart="handleReadingChart" />
</el-collapse-item>
</el-collapse>
@ -240,6 +244,9 @@ export default {
DicomEvent.$off('getUnSaveTarget')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) {
@ -495,7 +502,7 @@ export default {
.then(() => {
this.split(rowId, questionId)
})
.catch(() => {})
.catch(() => { })
} else {
//
this.$confirm(this.$t('trials:reading:warnning:msg4'), {
@ -505,7 +512,7 @@ export default {
.then(() => {
this.split(rowId, questionId)
})
.catch(() => {})
.catch(() => { })
}
}
}
@ -631,7 +638,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
return
}
@ -642,7 +649,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
} else {
// saveTypeEnum: 0
@ -781,7 +788,7 @@ export default {
async changeLesionType(questionsObj) {
await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId })
// saveTypeEnum: 0
var lesionObj = { }
var lesionObj = {}
var questionObj = questionsObj.questionForm
//
var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType)
@ -1058,23 +1065,26 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-wrapper{
.measurement-wrapper {
height: 100%;
overflow-y: auto;
// overflow: hidden;
.container{
.container {
padding: 10px;
.basic-info{
.basic-info {
display: flex;
justify-content: space-between;
align-items: center;
h3{
h3 {
color: #ddd;
padding: 5px 0px;
margin: 0;
}
i{
i {
color: #fff;
font-size: 22px;
font-weight: bold;
@ -1082,14 +1092,16 @@ export default {
}
}
}
.title{
.title {
padding: 5px;
font-weight: bold;
color: #ddd;
font-size: 15px;
}
.add-icon{
.add-icon {
padding: 5px;
font-weight: bold;
color: #ddd;
@ -1098,42 +1110,49 @@ export default {
margin-bottom: 2px;
cursor: pointer;
}
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b;
}
.flex-row{
.flex-row {
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: #424242;
}
.lesion_list{
.lesion_list {
position: relative;
}
.el-collapse{
border-bottom:none;
border-top:none;
::v-deep .el-collapse-item{
background-color: #000!important;
.el-collapse {
border-bottom: none;
border-top: none;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd;
}
::v-deep .el-collapse-item__header{
background-color: #000!important;
::v-deep .el-collapse-item__header {
background-color: #000 !important;
color: #ddd;
border-bottom-color:#5a5a5a;
border-bottom-color: #5a5a5a;
padding-left: 5px;
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;
}
::v-deep .el-collapse-item__content{
width:260px;
::v-deep .el-collapse-item__content {
width: 260px;
position: absolute;
top: 0px;
right: 0px;
@ -1142,7 +1161,7 @@ export default {
z-index: 1;
color: #ddd;
padding: 5px;
background-color:#1e1e1e;
background-color: #1e1e1e;
}
}

View File

@ -1,12 +1,6 @@
<template>
<el-form
v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
class="measurement-form">
<div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -18,160 +12,103 @@
</div>
</div>
<el-form-item
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]">
<!-- 下拉框 -->
<el-select
v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState>=2 || !isBaseLineTask"
@change="((val)=>{lesionTypeChange(val)})"
>
<el-select v-model="questionForm.LesionType" filterable
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask"
@change="((val) => { lesionTypeChange(val) })">
<el-option
v-for="item of $d.LesionType"
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
:value="item.value" :label="item.label" />
</el-select>
</el-form-item>
<el-form-item
v-for="qs in questions"
v-show="qs.ShowQuestion!==2"
:key="qs.Id"
:label="`${qs.QuestionName}`"
:prop="qs.Id"
: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']},
]"
>
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
:prop="qs.Id" :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']
},
]">
<!-- 输入框 -->
<template v-if="qs.Type==='input' || qs.Type==='number'">
<el-input
v-if="qs.Type==='input' || qs.Type==='number'"
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))"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<template v-if="qs.Type === 'input' || qs.Type === 'number'">
<div style="display: flex;justify-content: space-between;">
<el-input v-if="qs.Type === 'input' || qs.Type === 'number'" 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))"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
</template>
<!-- 多行文本输入框 -->
<el-input
v-if="qs.Type==='textarea'"
v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
@change="((val) => { formItemChange(val, qs) })" />
<!-- 下拉框 -->
<el-select
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
<el-select v-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable
: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))"
@change="((val)=>{formItemChange(val, qs)})"
>
: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) })">
<template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;">
<i class="el-icon-search" />
</span>
</template>
<template v-if="qs.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))" :key="item.id"
:value="item.value" :label="item.label" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answers.LastTaskState))}` : ''"
>
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answers.LastTaskState))}` : ''">
<!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answers.IsFristAdd=== 'True' && answers.SplitOrMergeType === '0'">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'">
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0" :key="item.id"
:value="item.value" :label="item.label" />
</template>
<!-- 首次添加的新病灶不能为无法评估和消失 -->
<template v-else-if="isCurrentTaskAdd=== 'True' && lesionType === 2">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0 || item.value === 1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2">
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0 || item.value === 1"
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="item of filterState($d[qs.DictionaryCode])"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of filterState($d[qs.DictionaryCode])" :key="item.id" :value="item.value"
:label="item.label" />
</template>
</el-option-group>
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-if="qs.Type==='radio'"
v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState >= 2">
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</el-radio-group>
@ -179,33 +116,19 @@
</div>
<div
v-if="isCurrentTask && readingTaskState<2"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
style="text-align:right;margin-top:10px;">
<!-- 清除标记 -->
<el-button
v-if="questionForm.MeasureData"
size="mini"
@click="handleDeleteMeasureData"
>
<el-button v-if="questionForm.MeasureData" size="mini" @click="handleDeleteMeasureData">
{{ $t('trials:reading:button:removeMark') }}
</el-button>
<!-- 删除 -->
<el-button
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
<el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete">
{{ $t('common:button:delete') }}
</el-button>
<!-- 保存 -->
<el-button
size="mini"
@click="handleSave"
>
<el-button size="mini" @click="handleSave">
{{ $t('common:button:save') }}
</el-button>
</div>
@ -297,6 +220,9 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initForm() {
const loading = this.$loading({ fullscreen: true })
this.questions.forEach(item => {
@ -427,8 +353,8 @@ export default {
type: 'warning',
distinguishCancelAndClose: true
})
.then(() => {})
.catch(() => {})
.then(() => { })
.catch(() => { })
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return
}
@ -440,7 +366,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return
@ -584,7 +510,7 @@ export default {
//
if (!(this.isCurrentTaskAdd === 'True')) {
// 线>=10mm>=10mm
// 线>=10mm>=10mm
if (!this.isBaseLineTask && ((measureData.type === 'Length' && lesionLength >= 10) || (measureData.type === 'Bidirectional' && lesionShort >= 10))) {
const stateId = this.getQuestionId(7)
this.$set(this.questionForm, stateId, 0)
@ -779,7 +705,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg06'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -793,7 +719,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg07'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -808,7 +734,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg08'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -821,7 +747,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg09'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -839,7 +765,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg10'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -853,7 +779,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg11'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -871,7 +797,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg12'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -885,7 +811,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg13'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -899,7 +825,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg14'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -913,7 +839,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg15'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -927,7 +853,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg16'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -941,7 +867,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg17'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -955,7 +881,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg18'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -969,7 +895,7 @@ export default {
this.$confirm(this.$t('trials:readingBM:warnning:msg19'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1182,42 +1108,50 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-form{
::v-deep .el-form-item__label{
.measurement-form {
::v-deep .el-form-item__label {
color: #c3c3c3;
}
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1;
}
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1;
}
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
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;
}
.el-form-item__content
.el-select{
.el-form-item__content .el-select {
width: 100%;
}
.input-width1{
width: calc(100% - 60px)!important;
.input-width1 {
width: calc(100% - 60px) !important;
}
.input-width2{
.input-width2 {
width: 100% !important;
}
}
</style>

View File

@ -8,78 +8,86 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3>
<div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
<i
class="el-icon-refresh-left"
@click="resetMeasuredData"
/>
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
placement="bottom">
<i class="el-icon-refresh-left" @click="resetMeasuredData" />
</el-tooltip>
</div>
</div>
<!-- 非测量问题 -->
<div class="lesions">
<Questions ref="ecrf" :question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum" />
<Questions ref="ecrf" :question-form-change-state="questionFormChangeState"
:question-form-change-num="questionFormChangeNum" @handleReadingChart="handleReadingChart" />
</div>
<!-- 测量问题 -->
<template v-if="questions.length > 0">
<div v-for="(qs,index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<div v-for="(qs, index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<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>
<div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div>
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)">
<div class="title">{{ item.QuestionName }}
<svg-icon v-if="item.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" />
</div>
</div>
<el-collapse
v-if="item.Type === 'table' && item.TableQuestions"
v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
@change="handleCollapseChange">
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${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">
<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" />
</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" />
</el-tooltip>
<div style="position: absolute;left: 50px;top: 2px;">
<div style="font-size: 11px;width:220px;height: 30px;">
<div
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"
>
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<div 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">
<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>
</el-tooltip>
</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">
{{ $fd('TargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span>
<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 v-else>
{{ $fd('NewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span>
</div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px">
<div
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px">
<template v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))">
{{ item.TableQuestions.Answers[i].lesionLength }}mm
@ -87,35 +95,29 @@
</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 && item.TableQuestions.Answers[i].isDicomReading !== false" 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)" />
<el-tooltip
v-show="readingTaskState < 2 && !!item.TableQuestions.Answers[i].RowId && !isBaseLineTask && item.TableQuestions.Answers[i].isDicomReading !== false"
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)" />
</el-tooltip>
</div>
</div>
</template>
<QuestionForm
:ref="`${item.Id}_${q.RowIndex}`"
:questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]"
:lesion-type="item.LesionType"
:order-mark="item.OrderMark"
:table-questions="tableQuestions"
:row-index="String(q.RowIndex)"
: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"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
: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" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
@close="close" @handleReadingChart="handleReadingChart" />
</el-collapse-item>
</el-collapse>
@ -237,6 +239,9 @@ export default {
DicomEvent.$off('setReadingState')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) {
@ -488,7 +493,7 @@ export default {
.then(() => {
this.split(rowId, questionId)
})
.catch(() => {})
.catch(() => { })
} else {
//
this.$confirm(this.$t('trials:reading:warnning:msg4'), {
@ -498,7 +503,7 @@ export default {
.then(() => {
this.split(rowId, questionId)
})
.catch(() => {})
.catch(() => { })
}
}
}
@ -604,7 +609,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
return
}
@ -614,7 +619,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
} else {
var obj = { saveTypeEnum: 0 }
@ -742,7 +747,7 @@ export default {
async changeLesionType(questionsObj) {
await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId })
// saveTypeEnum: 0
var lesionObj = { }
var lesionObj = {}
var questionObj = questionsObj.questionForm
//
var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType)
@ -987,23 +992,26 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-wrapper{
.measurement-wrapper {
height: 100%;
overflow-y: auto;
// overflow: hidden;
.container{
.container {
padding: 10px;
.basic-info{
.basic-info {
display: flex;
justify-content: space-between;
align-items: center;
h3{
h3 {
color: #ddd;
padding: 5px 0px;
margin: 0;
}
i{
i {
color: #fff;
font-size: 22px;
font-weight: bold;
@ -1011,14 +1019,16 @@ export default {
}
}
}
.title{
.title {
padding: 5px;
font-weight: bold;
color: #ddd;
font-size: 15px;
}
.add-icon{
.add-icon {
padding: 5px;
font-weight: bold;
color: #ddd;
@ -1027,42 +1037,49 @@ export default {
margin-bottom: 2px;
cursor: pointer;
}
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b;
}
.flex-row{
.flex-row {
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: #424242;
}
.lesion_list{
.lesion_list {
position: relative;
}
.el-collapse{
border-bottom:none;
border-top:none;
::v-deep .el-collapse-item{
background-color: #000!important;
.el-collapse {
border-bottom: none;
border-top: none;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd;
}
::v-deep .el-collapse-item__header{
background-color: #000!important;
::v-deep .el-collapse-item__header {
background-color: #000 !important;
color: #ddd;
border-bottom-color:#5a5a5a;
border-bottom-color: #5a5a5a;
padding-left: 5px;
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;
}
::v-deep .el-collapse-item__content{
width:260px;
::v-deep .el-collapse-item__content {
width: 260px;
position: absolute;
top: 0px;
right: 0px;
@ -1071,7 +1088,7 @@ export default {
z-index: 1;
color: #ddd;
padding: 5px;
background-color:#1e1e1e;
background-color: #1e1e1e;
}
}

View File

@ -40,7 +40,19 @@
<template slot-scope="scope">
<span v-if="scope.row.QuestionName"
: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 }}</span>
scope.row.QuestionName }}
<svg-icon
v-if="scope.row.ShowChartTypeEnum > 0 || (scope.row.LesionType === 0 && scope.row.ReportLayType === 1)"
icon-class="readingChart" class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: scope.row.RowIndex ? null : scope.row.QuestionId,
TableQuestionId: scope.row.RowIndex ? scope.row.TableQuestionId : null,
RowIndex: scope.row.RowIndex ? scope.row.RowIndex : null,
ReportChartTypeEnum: scope.row.LesionType === 0 && scope.row.ReportLayType === 1 ? 0 : null
}
})" />
</span>
<span v-else style="font-weight: bold;font-size: 16px;color: #f44336;">
{{ language === 'en' ? scope.row.GroupEnName : scope.row.GroupName }}
</span>
@ -206,6 +218,7 @@
</div>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog>
<readingChart ref="readingChart_report" />
</div>
</template>
<script>
@ -221,9 +234,10 @@ import { mapGetters } from 'vuex'
import { changeURLStatic } from '@/utils/history.js'
import AdditionalAssessment from './AdditionalAssessment'
import { openWindow } from "@/utils/splitScreen";
import readingChart from '@/components/readingChart'
export default {
name: 'ReportPage',
components: { SignForm, AdditionalAssessment },
components: { SignForm, AdditionalAssessment, readingChart },
props: {
visitTaskId: {
type: String,
@ -298,6 +312,7 @@ export default {
}
})
this.getReportInfo()
document.addEventListener("click", this.foo);
},
beforeDestroy() {
DicomEvent.$off('getReportInfo')
@ -307,6 +322,22 @@ export default {
}
},
methods: {
handleReadingChart(row) {
let { e, data } = row
let obj = Object.assign({}, data)
obj.TrialId = this.$route.query.trialId
obj.VisitTaskId = this.taskInfo.VisitTaskId
obj.key = 'readingChart_report'
let zIndex = 9
if (obj.RowIndex) {
zIndex = 9999
}
this.$refs.readingChart_report.init(e, obj, zIndex)
},
foo() {
if (!this.$refs.readingChart_report) return false
this.$refs.readingChart_report.foo()
},
myConfirm(msg) {
return new Promise(resolve => {
this.$confirm(msg, {

View File

@ -391,7 +391,7 @@
<div ref="form-container" class="form-container">
<!-- 激活canvas测量数据 -->
<MeasurementList ref="measurementList" :ise-c-r-f-show-in-dicom-reading="IseCRFShowInDicomReading"
:is-reading-show-subject-info="isReadingShowSubjectInfo" />
:is-reading-show-subject-info="isReadingShowSubjectInfo" @handleReadingChart="handleReadingChart" />
</div>
</div>
</div>
@ -864,6 +864,9 @@ export default {
DicomEvent.$off('loadLinkedImageStack')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async handleSubmitKeyDoc() {
try {
let data = {

View File

@ -1,14 +1,12 @@
<template>
<div class="measurement-wrapper" :style="{'height':height+10+'px'}" style="position: relative">
<div class="measurement-wrapper" :style="{ 'height': height + 10 + 'px' }" style="position: relative">
<div class="container" :style="{'height':height+'px'}" style="padding-bottom: 50px;overflow-y: auto;">
<div class="container" :style="{ 'height': height + 'px' }" style="padding-bottom: 50px;overflow-y: auto;">
<div class="basic-info">
<div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
<i
class="el-icon-refresh-left"
@click="resetMeasuredData"
/>
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
placement="bottom">
<i class="el-icon-refresh-left" @click="resetMeasuredData" />
</el-tooltip>
</div>
<h3 v-if="isReadingShowSubjectInfo">
@ -16,73 +14,48 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3>
</div>
<QuestionsPreview
ref="QuestionsPreview"
v-if="ecrfShow && TrialReadingCriterionId"
:visitTaskId="visitTaskId"
:criterionId="TrialReadingCriterionId">
<QuestionsPreview ref="QuestionsPreview" v-if="ecrfShow && TrialReadingCriterionId" :visitTaskId="visitTaskId"
:criterionId="TrialReadingCriterionId" @handleReadingChart="handleReadingChart">
</QuestionsPreview>
</div>
<div class="questions-footer">
<i class="el-icon-warning feedback-icon" @click="openFeedBackTable" :style="{color: isExistUnprocessedFeedback ? '#ffeb3b' : '#fff'}"/>
<el-button v-if="readingTaskState<2" style="margin-right: 10px" type="primary" size="small" @click="handleSave(true)">
{{$t('common:button:save')}}
<i class="el-icon-warning feedback-icon" @click="openFeedBackTable"
:style="{ color: isExistUnprocessedFeedback ? '#ffeb3b' : '#fff' }" />
<el-button v-if="readingTaskState < 2" style="margin-right: 10px" type="primary" size="small"
@click="handleSave(true)">
{{ $t('common:button:save') }}
</el-button>
<el-button v-if="readingTaskState<2 && IseCRFShowInDicomReading" type="primary" style="margin-right: 10px" size="small" @click="skipTask">
<el-button v-if="readingTaskState < 2 && IseCRFShowInDicomReading" type="primary" style="margin-right: 10px"
size="small" @click="skipTask">
<!-- 跳过 -->
{{ $t('trials:readingReport:button:skip') }}
</el-button>
<el-button style="margin-right: 10px" type="primary" size="small" v-if="readingTaskState<2 && IseCRFShowInDicomReading" @click="handleConfirm">
<el-button style="margin-right: 10px" type="primary" size="small"
v-if="readingTaskState < 2 && IseCRFShowInDicomReading" @click="handleConfirm">
{{ $t('common:button:submit') }}</el-button>
</div>
<!-- 签名框 -->
<el-dialog
v-if="signVisible"
:visible.sync="signVisible"
:close-on-click-modal="false"
width="600px"
custom-class="base-dialog-wrapper"
>
<el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px"
custom-class="base-dialog-wrapper">
<div slot="title">
<span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span>
<span style="font-size:12px;margin-left:5px">{{ `(${$t('common:label:sign')}${ currentUser })` }}</span>
<span style="font-size:12px;margin-left:5px">{{ `(${$t('common:label:sign')}${currentUser})` }}</span>
</div>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog>
<el-dialog
v-if="measuredDataVisible"
:visible.sync="measuredDataVisible"
:close-on-click-modal="false"
width="600px"
custom-class="base-dialog-wrapper"
>
<el-form
ref="measuredDataForm"
:model="form"
:rules="rules"
v-loading="loading"
label-width="120px"
size="small"
>
<el-form-item
:label="$t('trials:reading:title:measuredDataName')"
prop="measuredDataName"
>
<el-dialog v-if="measuredDataVisible" :visible.sync="measuredDataVisible" :close-on-click-modal="false"
width="600px" custom-class="base-dialog-wrapper">
<el-form ref="measuredDataForm" :model="form" :rules="rules" v-loading="loading" label-width="120px" size="small">
<el-form-item :label="$t('trials:reading:title:measuredDataName')" prop="measuredDataName">
<el-input v-model="form.measuredDataName"></el-input>
</el-form-item>
<el-form-item style="text-align:right;">
<!-- Cancel -->
<el-button
type="primary"
@click="handleMeasuredDataCancel"
>
<el-button type="primary" @click="handleMeasuredDataCancel">
{{ $t('common:button:cancel') }}
</el-button>
<!-- Save -->
<el-button
type="primary"
@click="handleMeasuredDataSave"
>
<el-button type="primary" @click="handleMeasuredDataSave">
{{ $t('common:button:save') }}
</el-button>
</el-form-item>
@ -140,7 +113,7 @@ export default {
}
},
computed: {
...mapGetters(['visitTaskList','lastCanvasTaskId', 'currentReadingTaskState'])
...mapGetters(['visitTaskList', 'lastCanvasTaskId', 'currentReadingTaskState'])
},
watch: {
lastCanvasTaskId: {
@ -185,7 +158,10 @@ export default {
DicomEvent.$off('getCustomTableQuestionAnswer')
},
methods: {
async initList(){
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() {
if (this.visitTaskId !== this.lastCanvasTaskId) {
this.ecrfShow = true
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
@ -215,15 +191,15 @@ export default {
loading.close()
}
this.$nextTick(() => {
if(this.$refs['QuestionsPreview']){
this.$refs['QuestionsPreview'].getCustomTableQuestionAnswer(this.visitTaskId )
if (this.$refs['QuestionsPreview']) {
this.$refs['QuestionsPreview'].getCustomTableQuestionAnswer(this.visitTaskId)
}
})
}
}
},
getCustomTag() {
getCustomTag({visitTaskId: this.visitTaskId}).then(res => {
getCustomTag({ visitTaskId: this.visitTaskId }).then(res => {
console.log(res)
})
},
@ -236,10 +212,10 @@ export default {
modifyMeasuredData(measureData) {
measureData.visitTaskId = this.visitTaskId
measureData.measureData.pictureBaseStr = ''
if (this.readingTaskState >=2) {
if (this.readingTaskState >= 2) {
this.measuredDataVisible = false
store.dispatch('reading/addCustomizeMeasuredData', { visitTaskId: this.visitTaskId, measureData: measureData.measureData })
}else{
} else {
let params = JSON.parse(JSON.stringify(measureData))
params.measureData = JSON.stringify(measureData.measureData)
params.Id = params.questionInfo.Id
@ -256,7 +232,7 @@ export default {
},
async moveMeasureData(measureData) {
console.log('measureData', measureData)
console.log('measureData', measureData)
await store.dispatch('reading/removeCustomizeMeasuredData', { visitTaskId: this.visitTaskId, ...measureData })
DicomEvent.$emit('updateImage')
},
@ -265,42 +241,42 @@ export default {
// DicomEvent.$emit('updateImage')
},
handleMeasuredDataSave() {
this.$refs.measuredDataForm.validate(valid => {
if (!valid) return
//
let isValid = this.validateRemarkName(this.form.measuredDataName)
if (!isValid) {
// ''
this.$message.error(this.$t('trials:customReading:error:validMarkName'))
return
}
this.measureData.data.remark = this.form.measuredDataName
this.measureData.pictureBaseStr = ''
if (this.readingTaskState >=2) {
this.measuredDataVisible = false
this.form.measuredDataName = ''
store.dispatch('reading/addCustomizeMeasuredData', { visitTaskId: this.visitTaskId, measureData: this.measureData })
DicomEvent.$emit('updateImage')
this.$message.success(this.$t('common:message:savedSuccessfully'))
} else {
let params = JSON.parse(JSON.stringify(this.measureData))
params.measureData = JSON.stringify(this.measureData)
params.NumberOfFrames = this.measureData.frame
submitCustomTag(params).then(async (res) => {
this.$refs.measuredDataForm.validate(valid => {
if (!valid) return
//
let isValid = this.validateRemarkName(this.form.measuredDataName)
if (!isValid) {
// ''
this.$message.error(this.$t('trials:customReading:error:validMarkName'))
return
}
this.measureData.data.remark = this.form.measuredDataName
this.measureData.pictureBaseStr = ''
if (this.readingTaskState >= 2) {
this.measuredDataVisible = false
this.form.measuredDataName = ''
await store.dispatch('reading/addCustomizeMeasuredData', { visitTaskId: this.visitTaskId, measureData: this.measureData, id: res.Result })
await store.dispatch('reading/getCustomizeMeasuredData', this.visitTaskId)
store.dispatch('reading/addCustomizeMeasuredData', { visitTaskId: this.visitTaskId, measureData: this.measureData })
DicomEvent.$emit('updateImage')
this.$message.success(this.$t('common:message:savedSuccessfully'))
})
}
})
} else {
let params = JSON.parse(JSON.stringify(this.measureData))
params.measureData = JSON.stringify(this.measureData)
params.NumberOfFrames = this.measureData.frame
submitCustomTag(params).then(async (res) => {
this.measuredDataVisible = false
this.form.measuredDataName = ''
await store.dispatch('reading/addCustomizeMeasuredData', { visitTaskId: this.visitTaskId, measureData: this.measureData, id: res.Result })
await store.dispatch('reading/getCustomizeMeasuredData', this.visitTaskId)
DicomEvent.$emit('updateImage')
this.$message.success(this.$t('common:message:savedSuccessfully'))
})
}
})
},
validateRemarkName(remark) {
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
var measureData = this.visitTaskList[idx].MeasureData
let i = measureData.findIndex(i=>i.MeasureData.data.remark === remark)
let i = measureData.findIndex(i => i.MeasureData.data.remark === remark)
return i === -1
},
//
@ -393,7 +369,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
//
this.$refs['QuestionsPreview'].getCustomTableQuestionAnswer(this.visitTaskId )
this.$refs['QuestionsPreview'].getCustomTableQuestionAnswer(this.visitTaskId)
await store.dispatch('reading/refreshCustomizeMeasuredData', this.visitTaskId)
DicomEvent.$emit('getMeasureData')
DicomEvent.$emit('getReportInfo', true)
@ -432,7 +408,7 @@ export default {
type: 'imgfail',
trialId: this.$route.query.trialId,
visitTaskId: this.visitTaskId,
callBack: async() => {
callBack: async () => {
console.log('callBack')
const confirm = await this.$confirm(
this.$t('trials:reading:confirm:feedbackmsg'),
@ -460,23 +436,26 @@ export default {
}
</script>
<style lang="scss" scoped>
.measurement-wrapper{
.measurement-wrapper {
overflow-y: auto;
// overflow: hidden;
.container{
.container {
padding: 10px;
.basic-info{
.basic-info {
display: flex;
justify-content: space-between;
align-items: center;
flex-direction: row-reverse;
h3{
h3 {
color: #ddd;
padding: 5px 0px;
margin: 0;
}
i{
i {
color: #fff;
font-size: 22px;
font-weight: bold;
@ -484,14 +463,16 @@ export default {
}
}
}
.title{
.title {
padding: 5px;
font-weight: bold;
color: #ddd;
font-size: 15px;
}
.add-icon{
.add-icon {
padding: 5px;
font-weight: bold;
color: #ddd;
@ -500,41 +481,48 @@ export default {
margin-bottom: 2px;
cursor: pointer;
}
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b;
}
.flex-row{
.flex-row {
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: #424242;
}
.lesion_list{
.lesion_list {
position: relative;
}
.el-collapse{
border-bottom:none;
::v-deep .el-collapse-item{
background-color: #000!important;
.el-collapse {
border-bottom: none;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd;
}
::v-deep .el-collapse-item__header{
background-color: #000!important;
::v-deep .el-collapse-item__header {
background-color: #000 !important;
color: #ddd;
border-bottom-color:#5a5a5a;
border-bottom-color: #5a5a5a;
padding-left: 5px;
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;
}
::v-deep .el-collapse-item__content{
width:260px;
::v-deep .el-collapse-item__content {
width: 260px;
position: absolute;
top: 0px;
right: 0px;
@ -543,13 +531,14 @@ export default {
z-index: 1;
color: #ddd;
padding: 5px;
background-color:#1e1e1e;
background-color: #1e1e1e;
}
}
.questions-footer{
.questions-footer {
position: absolute;
bottom:0;
bottom: 0;
left: 0;
z-index: 10;
background: #000;
@ -558,13 +547,15 @@ export default {
justify-content: right;
align-items: center;
height: 50px;
.feedback-icon{
.feedback-icon {
padding: 0 10px;
color: #fff;
font-weight: 400;
font-size: 24px;
cursor: pointer;
&:hover{
&:hover {
color: #68a2d5;
}
}

View File

@ -122,39 +122,53 @@
<el-input v-if="question.Type === 'class' && question.ClassifyShowType === 4" type="number"
:disabled="!question.ClassifyEditType || readingTaskState === 2" v-model="questionForm[question.Id]"
@change="(val) => { formItemNumberChange(val, question) }" />
<!-- 自动计算 -->
<!-- :precision="2" :step="0.1" :max="10" -->
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]"
@input="value = value.replace(/^\D*(\d*(?:.\d{0,2})?).*$/g, '$1')" disabled />
<!-- 自增 -->
<el-input v-if="question.Type === 'increment'" v-model="questionForm[question.Id]" disabled />
<!-- 数值 -->
<!-- :precision="2" :step="0.1" :max="10" -->
<el-select v-if="question.Type === 'number' && question.TypeValue" v-model="questionForm[question.Id]" clearable
@change="(val) => { formItemNumberChange(val, question) }" :disabled="readingTaskState === 2">
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val.trim()" :value="val.trim()" />
<template v-if="question.Unit !== 0" slot="prefix">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit) :
question.CustomUnit }}</template>
<template v-else-if="question.ValueType === 2" slot="prefix">%</template>
</el-select>
<el-input type="text" v-if="question.Type === 'number' && !question.TypeValue && question.DataSource !== 1"
@change="(val) => { formItemNumberChange(val, question) }" @input="numberInput(question.Id)"
@blur="handleBlur(questionForm[question.Id], questionForm, question.Id)"
v-model.trim="questionForm[question.Id]" :disabled="readingTaskState === 2">
<!-- <template slot="append">1</template> -->
<template slot="append" v-if="question.Unit !== 0">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit) :
question.CustomUnit }}</template>
<template slot="append" v-else-if="question.ValueType === 2">%</template>
</el-input>
<el-input type="text" @input="numberInput(question.Id)"
v-if="question.Type === 'number' && !question.TypeValue && question.DataSource === 1"
@blur="handleBlur(questionForm[question.Id], questionForm, question.Id)"
:disabled="question.DataSource === 1 || readingTaskState === 2" v-model.trim="questionForm[question.Id]">
<!-- <template slot="append">2</template> -->
<template slot="append" v-if="question.Unit !== 0">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit) :
question.CustomUnit }}</template>
<template slot="append" v-else-if="question.ValueType === 2">%</template>
</el-input>
<div style="display: flex;justify-content: space-between;"
v-if="question.Type === 'number' || question.Type === 'calculation'">
<!-- 自动计算 -->
<!-- :precision="2" :step="0.1" :max="10" -->
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]"
@input="value = value.replace(/^\D*(\d*(?:.\d{0,2})?).*$/g, '$1')" disabled />
<!-- 数值 -->
<el-select v-if="question.Type === 'number' && question.TypeValue" v-model="questionForm[question.Id]"
clearable @change="(val) => { formItemNumberChange(val, question) }" :disabled="readingTaskState === 2">
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val.trim()"
:value="val.trim()" />
<template v-if="question.Unit !== 0" slot="prefix">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit)
:
question.CustomUnit }}</template>
<template v-else-if="question.ValueType === 2" slot="prefix">%</template>
</el-select>
<el-input type="text" v-if="question.Type === 'number' && !question.TypeValue && question.DataSource !== 1"
@change="(val) => { formItemNumberChange(val, question) }" @input="numberInput(question.Id)"
@blur="handleBlur(questionForm[question.Id], questionForm, question.Id)"
v-model.trim="questionForm[question.Id]" :disabled="readingTaskState === 2">
<!-- <template slot="append">1</template> -->
<template slot="append" v-if="question.Unit !== 0">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit)
:
question.CustomUnit }}</template>
<template slot="append" v-else-if="question.ValueType === 2">%</template>
</el-input>
<el-input type="text" @input="numberInput(question.Id)"
v-if="question.Type === 'number' && !question.TypeValue && question.DataSource === 1"
@blur="handleBlur(questionForm[question.Id], questionForm, question.Id)"
:disabled="question.DataSource === 1 || readingTaskState === 2" v-model.trim="questionForm[question.Id]">
<!-- <template slot="append">2</template> -->
<template slot="append" v-if="question.Unit !== 0">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit)
:
question.CustomUnit }}</template>
<template slot="append" v-else-if="question.ValueType === 2">%</template>
</el-input>
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: question.Id
}
})" />
</div>
<!-- 上传图像 -->
<el-upload v-if="question.Type === 'upload'" :disabled="readingTaskState === 2" action
:accept="question.FileType" :limit="question.ImageCount === 0 ? 100 : question.ImageCount"
@ -179,7 +193,7 @@
:IsBaseline="IsBaseline" :reading-task-state="readingTaskState" :question-form="questionForm"
:visit-task-id="visitTaskId" :criterion-id="criterionId" :CalculationList="CalculationList"
@formItemNumberChange="formItemNumberChange" @setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData" />
@resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart" />
</template>
<base-model :config="addOrEdit" class="my_dialog" :close-on-click-modal="false" width="400px" append-to-body>
<template slot="dialog-body">
@ -188,7 +202,8 @@
:IsBaseline="IsBaseline" :reading-task-state="readingTaskState" :question-form="QuestionsForm"
:visit-task-id="visitTaskId" :criterion-id="criterionId" :type="addOrEdit.type"
:CalculationList="CalculationTabelList" @formItemTableNumberChange="formItemTableNumberChange"
@resetFormItemData="resetTableFormItemData" @setFormItemData="setFormTableItemData" />
@resetFormItemData="resetTableFormItemData" @setFormItemData="setFormTableItemData"
@handleReadingChart="handleReadingChart" />
</el-form>
</template>
<template slot="dialog-footer">
@ -347,6 +362,9 @@ export default {
}
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
numberInput(id) {
this.questionForm[id] = this.questionForm[id].toUpperCase();
},

View File

@ -71,36 +71,47 @@
{{ item.trim() }}
</el-radio>
</el-radio-group>
<!-- 自动计算 -->
<!-- :precision="2" :step="0.1" :max="10" -->
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]"
oninput="value=value.replace(/^\D*(\d*(?:.\d{0,2})?).*$/g, '$1')" disabled />
<!-- 自增 -->
<el-input v-if="question.Type === 'increment'" v-model="questionForm[question.Id]" disabled />
<!-- 数值 -->
<!-- :precision="2" :step="0.1" :max="10" -->
<el-select v-if="question.Type === 'number' && question.TypeValue" v-model="questionForm[question.Id]" clearable
@change="(val) => { formItemNumberChange(val, question) }"
:disabled="question.TableQuestionType === 2 || (question.IsCopy && type === 'edit' && !IsBaseline && questionForm.IsCurrentTaskAdd === 'False')">
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val.trim()" :value="val.trim()" />
<template v-if="question.Unit !== 0" slot="prefix">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit) :
question.CustomUnit }}</template>
<template v-else-if="question.ValueType === 2" slot="prefix">%</template>
</el-select>
<el-input type="text" v-else-if="question.Type === 'number' && question.DataSource !== 1"
:disabled="question.TableQuestionType === 2 || (question.IsCopy && type === 'edit' && !IsBaseline && questionForm.IsCurrentTaskAdd === 'False')"
@change="((val) => { formItemNumberChange(val, question) })" @input="numberInput(question.Id)"
@blur="handleBlur(questionForm[question.Id], questionForm, question.Id)"
v-model.trim="questionForm[question.Id]">
<template slot="append" v-if="question.Unit !== 0">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit) :
question.CustomUnit }}</template>
</el-input>
<el-input type="text" v-else-if="question.Type === 'number' && question.DataSource === 1"
:disabled="question.DataSource === 1" @input="numberInput(question.Id, true)"
@blur="handleCalculationBlur(calculationValue)" v-model.trim="calculationValue">
<template slot="append" v-if="question.Unit !== 0">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit) :
question.CustomUnit }}</template>
</el-input>
<div style="display: flex;justify-content: space-between;"
v-if="question.Type === 'number' || question.Type === 'calculation'">
<!-- 自动计算 -->
<!-- :precision="2" :step="0.1" :max="10" -->
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]"
oninput="value=value.replace(/^\D*(\d*(?:.\d{0,2})?).*$/g, '$1')" disabled />
<!-- 数值 -->
<!-- :precision="2" :step="0.1" :max="10" -->
<el-select v-if="question.Type === 'number' && question.TypeValue" v-model="questionForm[question.Id]" clearable
@change="(val) => { formItemNumberChange(val, question) }"
:disabled="question.TableQuestionType === 2 || (question.IsCopy && type === 'edit' && !IsBaseline && questionForm.IsCurrentTaskAdd === 'False')">
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val.trim()" :value="val.trim()" />
<template v-if="question.Unit !== 0" slot="prefix">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit) :
question.CustomUnit }}</template>
<template v-else-if="question.ValueType === 2" slot="prefix">%</template>
</el-select>
<el-input type="text" v-else-if="question.Type === 'number' && question.DataSource !== 1"
:disabled="question.TableQuestionType === 2 || (question.IsCopy && type === 'edit' && !IsBaseline && questionForm.IsCurrentTaskAdd === 'False')"
@change="((val) => { formItemNumberChange(val, question) })" @input="numberInput(question.Id)"
@blur="handleBlur(questionForm[question.Id], questionForm, question.Id)"
v-model.trim="questionForm[question.Id]">
<template slot="append" v-if="question.Unit !== 0">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit) :
question.CustomUnit }}</template>
</el-input>
<el-input type="text" v-else-if="question.Type === 'number' && question.DataSource === 1"
:disabled="question.DataSource === 1" @input="numberInput(question.Id, true)"
@blur="handleCalculationBlur(calculationValue)" v-model.trim="calculationValue">
<template slot="append" v-if="question.Unit !== 0">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit) :
question.CustomUnit }}</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: question.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
<!-- 上传图像 -->
<el-upload v-if="question.Type === 'upload'" action :accept="question.FileType"
:limit="question.ImageCount === 0 ? 100 : question.ImageCount" :on-preview="handlePictureCardPreview"
@ -251,6 +262,9 @@ export default {
// }
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
numberInput(id, notId = false) {
if (notId) {
this.calculationValue = this.calculationValue.toUpperCase();

View File

@ -1,26 +1,12 @@
<template>
<div v-loading="loading" style="min-height: 500px;">
<el-form
v-if="isRender"
ref="questions"
size="small"
:model="questionForm"
:disabled="readingTaskState >= 2"
>
<el-form v-if="isRender" ref="questions" size="small" :model="questionForm" :disabled="readingTaskState >= 2">
<template>
<QuestionFormItem
v-for="question of questions"
:key="question.Id"
:visitTaskId="visitTaskId"
:question="question"
:question-form="questionForm"
:reading-task-state="readingTaskState"
:criterion-id="criterionId"
:CalculationList="CalculationList"
:IsBaseline="IsBaseline"
@resetFormItemData="resetFormItemData"
@setFormItemData="setFormItemData"
/>
<QuestionFormItem v-for="question of questions" :key="question.Id" :visitTaskId="visitTaskId"
:question="question" :question-form="questionForm" :reading-task-state="readingTaskState"
:criterion-id="criterionId" :CalculationList="CalculationList" :IsBaseline="IsBaseline"
@resetFormItemData="resetFormItemData" @setFormItemData="setFormItemData"
@handleReadingChart="handleReadingChart" />
</template>
</el-form>
</div>
@ -75,6 +61,9 @@ export default {
DicomEvent.$off('reGetQuestionAnswer')
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
handleSave(isMsg) {
return new Promise(resolve => {
console.log('handleSave')
@ -86,7 +75,7 @@ export default {
this.loading = true
var answers = []
for (const k in this.questionForm) {
if (this.questionForm[k] instanceof Array) {} else {
if (this.questionForm[k] instanceof Array) { } else {
answers.push({ id: k, answer: this.questionForm[k] })
}
}
@ -134,7 +123,7 @@ export default {
this.$set(this.questionForm, v.Id, v.TableQuestions.Answers)
}
if (v.Type === 'class') {
this.classArr.push({triggerId: v.ClassifyQuestionId, classId: v.Id, classifyAlgorithms: v.ClassifyAlgorithms, classifyType: v.ClassifyType})
this.classArr.push({ triggerId: v.ClassifyQuestionId, classId: v.Id, classifyAlgorithms: v.ClassifyAlgorithms, classifyType: v.ClassifyType })
}
if (v.Type === 'number') {
this.$set(this.questionForm, v.Id, isNaN(parseFloat(v.Answer)) ? v.Answer : parseFloat(v.Answer).toFixed(this.digitPlaces))
@ -205,7 +194,7 @@ export default {
},
setChild(obj) {
obj.forEach(i => {
if (i.Type !== 'group' && i.Type !== 'summary' && i.Id && i.Type !== 'table' && i.Type !== 'basicTable') {
if (i.Type !== 'group' && i.Type !== 'summary' && i.Id && i.Type !== 'table' && i.Type !== 'basicTable') {
this.$set(this.questionForm, i.Id, i.Answer)
}
if (i.Type === 'table' || i.Type === 'basicTable') {
@ -219,7 +208,7 @@ export default {
this.$set(this.questionForm, i.Id, i.TableQuestions.Answers)
}
if (i.Type === 'class') {
this.classArr.push({triggerId: i.ClassifyQuestionId, classId: i.Id, classifyAlgorithms: i.ClassifyAlgorithms, classifyType: i.ClassifyType})
this.classArr.push({ triggerId: i.ClassifyQuestionId, classId: i.Id, classifyAlgorithms: i.ClassifyAlgorithms, classifyType: i.ClassifyType })
}
if (i.Type === 'number') {
this.$set(this.questionForm, i.Id, isNaN(parseFloat(i.Answer)) ? i.Answer : parseFloat(i.Answer).toFixed(this.digitPlaces))
@ -234,7 +223,7 @@ export default {
},
setFormItemData(obj) {
this.$set(this.questionForm, obj.key, JSON.parse(JSON.stringify(obj.val)))
this.classArr.map(i=>{
this.classArr.map(i => {
if (i.triggerId === obj.key) {
let answer = null
let list = JSON.parse(i.classifyAlgorithms)
@ -284,15 +273,17 @@ export default {
</script>
<style lang="scss" scoped>
::-webkit-scrollbar {
width: 7px;
height: 7px;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
background: #d0d0d0;
}
.tabContent{
height:300px;
width: 7px;
height: 7px;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
background: #d0d0d0;
}
.tabContent {
height: 300px;
overflow-y: auto;
}

View File

@ -34,9 +34,11 @@
:is-reading-show-subject-info="isReadingShowSubjectInfo"
:is-reading-task-view-in-order="isReadingTaskViewInOrder" :isExistsManual="isExistsManual"
:isReadKeyFile="isReadKeyFile" :isHaveKeyFile="isHaveKeyFile"
:IseCRFShowInDicomReading="IseCRFShowInDicomReading" @previewCD="previewCD" />
:IseCRFShowInDicomReading="IseCRFShowInDicomReading" @previewCD="previewCD"
@handleReadingChart="handleReadingChart" />
</div>
</div>
<readingChart ref="readingChart" />
</div>
</template>
<script>
@ -50,6 +52,7 @@ import * as dicomParser from 'dicom-parser'
import * as cornerstone from 'cornerstone-core'
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
import { workSpeedclose } from "@/utils"
import readingChart from '@/components/readingChart'
// import metaDataProvider from '@/utils/metaDataProvider'
// cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 });
var config = {
@ -71,6 +74,7 @@ export default {
components: {
DicomViewer,
StudyList,
readingChart
},
props: {
isReadingShowSubjectInfo: {
@ -233,6 +237,7 @@ export default {
window.addEventListener('beforeunload', e => {
cornerstone.imageCache.purgeCache()
})
document.addEventListener("click", this.foo);
},
beforeDestroy() {
DicomEvent.$off("getNextVisitInfo");
@ -245,6 +250,21 @@ export default {
workSpeedclose(true)
},
methods: {
handleReadingChart(row) {
let { e, data } = row
let obj = Object.assign({}, data)
obj.TrialId = this.$route.query.trialId
obj.VisitTaskId = this.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()
},
async getVisitInfo() {
const loading = this.$loading({ fullscreen: true });

View File

@ -26,7 +26,19 @@
<el-table-column prop="" label="" show-overflow-tooltip width="350px">
<template slot-scope="scope">
<span v-if="scope.row.QuestionName">{{ scope.row.BlindName ? scope.row.QuestionName :
scope.row.QuestionName }}</span>
scope.row.QuestionName }}
<svg-icon
v-if="scope.row.ShowChartTypeEnum > 0 || (scope.row.LesionType === 0 && scope.row.ReportLayType === 1)"
icon-class="readingChart" class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: scope.row.RowIndex ? null : scope.row.QuestionId,
TableQuestionId: scope.row.RowIndex ? scope.row.TableQuestionId : null,
RowIndex: scope.row.RowIndex ? scope.row.RowIndex : null,
ReportChartTypeEnum: scope.row.LesionType === 0 && scope.row.ReportLayType === 1 ? 0 : null
}
})" />
</span>
<span v-else style="font-weight: bold;font-size: 16px;color: #f44336;">
{{ scope.row.GroupName }}
</span>
@ -235,6 +247,7 @@
</div>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog>
<readingChart ref="readingChart_report" />
</div>
</template>
<script>
@ -247,9 +260,10 @@ import const_ from '@/const/sign-code'
import SignForm from '@/views/trials/components/newSignForm'
import { getToken } from '@/utils/auth'
import store from '@/store'
import readingChart from '@/components/readingChart'
export default {
name: 'CustomizeReportPage',
components: { SignForm, CustomizeReportPageUpload },
components: { SignForm, CustomizeReportPageUpload, readingChart },
props: {
visitTaskId: {
type: String,
@ -317,11 +331,28 @@ export default {
})
await this.getQuestionCalculateRelation()
this.getReportInfo()
document.addEventListener("click", this.foo);
},
beforeDestroy() {
DicomEvent.$off('getReportInfo')
},
methods: {
handleReadingChart(row) {
let { e, data } = row
let obj = Object.assign({}, data)
obj.TrialId = this.$route.query.trialId
obj.VisitTaskId = this.taskInfo.VisitTaskId
obj.key = 'readingChart_report'
let zIndex = 9
if (obj.RowIndex) {
zIndex = 9999
}
this.$refs.readingChart_report.init(e, obj, zIndex)
},
foo() {
if (!this.$refs.readingChart_report) return false
this.$refs.readingChart_report.foo()
},
limitInput(value, a, b) {
if (value.indexOf('.') > -1) {
if (value.split('.')[1].length >= this.digitPlaces) {

View File

@ -324,16 +324,16 @@
:reading-task-state="currentVisitInfo.VisitTaskId === taskInfo.VisitTaskId ? readingTaskState : 2"
:last-viewport-task-id="lastViewportTaskId" :visit-info="s" @removeAnnotation="removeAnnotation"
@getScreenshots="getScreenshots" @setMarkName="setMarkName" @imageLocation="imageLocation"
@resetAnnotations="resetAnnotations" @getAnnotations="getAnnotations"
@setToolToTarget="setToolToTarget" />
@resetAnnotations="resetAnnotations" @getAnnotations="getAnnotations" @setToolToTarget="setToolToTarget"
@handleReadingChart="handleReadingChart" />
<recisit
v-else-if="lastViewportTaskId && criterionType === 1 && lastViewportTaskIds.includes(s.VisitTaskId)"
:ref="`ecrf_${s.VisitTaskId}`"
:reading-task-state="currentVisitInfo.VisitTaskId === taskInfo.VisitTaskId ? readingTaskState : 2"
:last-viewport-task-id="lastViewportTaskId" :visit-info="s" @removeAnnotation="removeAnnotation"
@getScreenshots="getScreenshots" @setMarkName="setMarkName" @imageLocation="imageLocation"
@resetAnnotations="resetAnnotations" @getAnnotations="getAnnotations"
@setToolToTarget="setToolToTarget" />
@resetAnnotations="resetAnnotations" @getAnnotations="getAnnotations" @setToolToTarget="setToolToTarget"
@handleReadingChart="handleReadingChart" />
<customize-question-list
v-else-if="lastViewportTaskId && criterionType === 0 && lastViewportTaskIds.includes(s.VisitTaskId)"
:ref="`ecrf_${s.VisitTaskId}`"
@ -560,7 +560,7 @@ export default {
trialId: '',
visitTaskList: [],
selectArr: [],
taskInfo: null,
taskInfo: {},
activeTaskId: null,
activeTaskIndex: -1,
activeStudyIndex: -1,
@ -766,19 +766,24 @@ export default {
DicomEvent.$on('addNoneDicomMeasureData', data => {
this.open.postMessage({ type: 'addNoneDicomMeasureData', data: data }, window.location)
})
document.addEventListener("click", this.foo);
},
methods: {
handleReadingChart(row) {
let { e, data } = row
let obj = Object.assign({}, data)
obj.TrialId = this.$route.query.trialId
obj.VisitTaskId = this.taskInfo.VisitTaskI
obj.VisitTaskId = this.taskInfo.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()
},
async handleSubmitKeyDoc() {
try {
let data = {

View File

@ -1,197 +1,115 @@
<template>
<div>
<div
v-if="!!question.GroupName && question.Type==='group'"
>
<div v-if="!!question.GroupName && question.Type === 'group'">
<h4 style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language==='en'?question.GroupEnName:question.GroupName }}
{{ language === 'en' ? question.GroupEnName : question.GroupName }}
</h4>
</div>
<template v-else>
<el-form-item
v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0 "
:label="`${question.QuestionName}`"
:prop="question.Id"
:rules="[
{ 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']},
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0"
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[
{
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']
},
]"
:class="[question.Type==='group' ? 'mb' : (question.Type==='upload' || question.QuestionName.length > 15) ?'uploadWrapper' : '']"
>
:class="[question.Type === 'group' ? 'mb' : (question.Type === 'upload' || question.QuestionName.length > 15) ? 'uploadWrapper' : '']">
<!-- 输入框 -->
<el-input
v-if="question.Type==='input'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
/>
<el-input v-if="question.Type === 'input'" v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2"
@change="((val) => { formItemChange(val, question) })" />
<!-- 多行文本输入框 -->
<el-input
v-else-if="question.Type==='textarea'"
v-model="questionForm[question.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
/>
<el-input v-else-if="question.Type === 'textarea'" v-model="questionForm[question.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2"
@change="((val) => { formItemChange(val, question) })" />
<!-- 下拉框 -->
<el-select
v-else-if="question.Type==='select'"
v-model="questionForm[question.Id]"
<el-select v-else-if="question.Type === 'select'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode)"
clearable
@change="((val)=>{formItemChange(val, question)})"
>
clearable @change="((val) => { formItemChange(val, question) })">
<template v-if="question.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]" />
</template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
:label="item.label" />
</template>
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
<template
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
:label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-else-if="question.Type==='radio'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
>
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })">
<template v-if="question.DictionaryCode">
<el-radio
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="String(item.value)"
>
<el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)">
{{ item.label }}
</el-radio>
</template>
<template v-else-if="question.TypeValue">
<el-radio
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
<el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</template>
</el-radio-group>
<!-- 复选框 -->
<el-checkbox-group
v-else-if="question.Type==='checkbox'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
>
<el-checkbox
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
<el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2">
<el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
{{ val }}
</el-checkbox>
</el-checkbox-group>
<!-- 数值 -->
<template v-else-if="question.Type==='number'">
<el-input-number
v-if="question.ValueType === 0"
v-model="questionForm[question.Id]"
:precision="0"
:disabled="readingTaskState >= 2"
/>
<el-input-number
v-else-if="question.ValueType === 3"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
/>
<el-input-number
v-else-if="question.ValueType === 1 || question.ValueType === 2"
v-model="questionForm[question.Id]"
:precision="digitPlaces"
:disabled="readingTaskState >= 2"
/>
</template>
<el-input
v-else-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
disabled
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
<div style="display: flex;justify-content: space-between;"
v-else-if="question.Type === 'number' || question.Type === 'calculation'">
<!-- 数值 -->
<template v-if="question.Type === 'number'">
<el-input-number v-if="question.ValueType === 0" v-model="questionForm[question.Id]" :precision="0"
:disabled="readingTaskState >= 2" />
<el-input-number v-else-if="question.ValueType === 3" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2" />
<el-input-number v-else-if="question.ValueType === 1 || question.ValueType === 2"
v-model="questionForm[question.Id]" :precision="digitPlaces" :disabled="readingTaskState >= 2" />
</template>
</el-input>
<el-input v-else-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: question.Id
}
})" />
</div>
<!-- 上传图像 -->
<el-upload
v-else-if="question.Type==='upload'"
action
:accept="accept"
: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"
>
<el-upload v-else-if="question.Type === 'upload'" action :accept="accept" :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" />
<div slot="file" slot-scope="{file}">
<img
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
alt=""
>
<img 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-preview"
@click="handlePictureCardPreview(file)"
>
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
<i class="el-icon-zoom-in" />
</span>
<span
v-if="readingTaskState < 2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<span v-if="readingTaskState < 2" class="el-upload-list__item-delete" @click="handleRemove(file)">
<i class="el-icon-delete" />
</span>
</span>
</div>
</el-upload>
<el-dialog
v-if="question.Type==='upload'"
append-to-body
:visible.sync="imgVisible"
width="600px"
>
<el-dialog v-if="question.Type === 'upload'" append-to-body :visible.sync="imgVisible" width="600px">
<el-image :src="imageUrl" width="100%">
<div slot="placeholder" class="image-slot">
加载中<span class="dot">...</span>
@ -201,16 +119,9 @@
</el-form-item>
</template>
<question-form-item
v-for="(item) in question.Childrens"
:key="item.Id"
:question="item"
:question-form="questionForm"
:reading-task-state="readingTaskState"
:visitTaskId="visitTaskId"
@resetFormItemData="resetFormItemData"
@setFormItemData="setFormItemData"
/>
<question-form-item v-for="(item) in question.Childrens" :key="item.Id" :question="item"
:question-form="questionForm" :reading-task-state="readingTaskState" :visitTaskId="visitTaskId"
@resetFormItemData="resetFormItemData" @setFormItemData="setFormItemData" />
</div>
</template>
<script>
@ -267,6 +178,9 @@ export default {
this.digitPlaces = digitPlaces === -1 ? this.digitPlaces : digitPlaces
},
methods: {
handleReadingChart(row) {
this.$emit('handleReadingChart', row)
},
formItemChange(v, question) {
console.log('formItemChange')
if (question.Childrens.length > 0) {
@ -293,33 +207,40 @@ export default {
}
</script>
<style lang="scss" scoped>
.mb{
.mb {
margin-bottom: 0px;
}
.disabled{
.disabled {
::v-deep .el-upload--picture-card {
display: none;
}
}
.uploadWrapper{
.uploadWrapper {
display: flex;
flex-direction: column !important;
align-items: flex-start;
}
::v-deep .el-input.is-disabled .el-input__inner{
background-color: #646464a1;
}
::v-deep .el-input-group__append, .el-input-group__prepend{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1;
}
::v-deep .el-input-group__append,
.el-input-group__prepend {
padding: 0 10px;
}
::v-deep .el-form-item__content {
width: 100%;
}
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1;
}
// ::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner {
// background-color: #428bca;
// border-color: #428bca;
// }
</style>
// }</style>

View File

@ -40,7 +40,15 @@
<div class="lesion_list">
<div v-for="table in qs.Childrens" v-show="!(isBaseLineTask && table.LesionType === 2)" :key="table.Id">
<div v-if="table.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ table.QuestionName }}</div>
<div class="title">{{ table.QuestionName }}
<svg-icon v-if="table.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || table.LesionType === 2)" class="add-icon"
@click.prevent="addTarget(table)">
<i class="el-icon-plus" />
@ -246,6 +254,9 @@ export default {
window.addEventListener('message', this.receiveMsg)
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
//
async getOrganList() {
try {

View File

@ -9,160 +9,102 @@
<i class="el-icon-circle-close" style="font-size: 25px;cursor: pointer;" @click="close" />
</div>
</div>
<el-form-item
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]">
<!-- 下拉框 -->
<el-select
v-model="qsForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState>=2 || !isBaseLineTask"
@change="((val)=>{lesionTypeChange(val)})"
>
<el-select v-model="qsForm.LesionType" filterable
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask"
@change="((val) => { lesionTypeChange(val) })">
<el-option
v-for="item of $d.LesionType"
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
:value="item.value" :label="item.label" />
</el-select>
</el-form-item>
<el-form-item
v-for="qs in questions"
v-show="qs.ShowQuestion!==2"
:key="qs.Id"
:label="`${qs.QuestionName}`"
:prop="qs.Id"
: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']},
]"
>
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
:prop="qs.Id" :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']
},
]">
<!-- 输入框 -->
<template v-if="qs.Type==='input' || qs.Type==='number'">
<template v-if="qs.Type === 'input' || qs.Type === 'number'">
<div style="display: flex;justify-content: space-between;">
<el-input v-if="qs.Type === 'input' || qs.Type === 'number'" v-model="qsForm[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) || !!answer.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answer.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answer.SplitOrMergeLesionName))"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: qsForm.RowIndex
}
})" />
</div>
<el-input
v-if="qs.Type==='input' || qs.Type==='number'"
v-model="qsForm[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) || !!answer.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answer.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answer.SplitOrMergeLesionName))"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
</template>
<!-- 多行文本输入框 -->
<el-input
v-if="qs.Type==='textarea'"
v-model="qsForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<el-input v-if="qs.Type === 'textarea'" v-model="qsForm[qs.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
@change="((val) => { formItemChange(val, qs) })" />
<!-- 下拉框 -->
<el-select
v-if="qs.Type==='select'"
v-model="qsForm[qs.Id]"
filterable
<el-select v-if="qs.Type === 'select'" v-model="qsForm[qs.Id]" filterable
:placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : qs.QuestionMark === 2 ? '' : $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) || !!answer.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False'|| !!answer.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answer.SplitOrMergeLesionName))"
@change="((val)=>{formItemChange(val, qs)})"
>
: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) || !!answer.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answer.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answer.SplitOrMergeLesionName))"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;">
<i class="el-icon-search" />
</span>
</template>
<template v-if="qs.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))" :key="item.id"
:value="item.value" :label="item.label" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group
:label="!isNaN(parseFloat(answer.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answer.LastTaskState))}` : ''"
>
:label="!isNaN(parseFloat(answer.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answer.LastTaskState))}` : ''">
<!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answer.IsFristAdd=== 'True' && answer.SplitOrMergeType === '0'">
<template v-if="answer.IsFristAdd === 'True' && answer.SplitOrMergeType === '0'">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0" :key="item.id"
:value="item.value" :label="item.label" />
</template>
<!-- 首次添加的新病灶不能为无法评估和消失 -->
<template v-else-if="isCurrentTaskAdd=== 'True' && lesionType === 2">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0 || item.value === 1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2">
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0 || item.value === 1"
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="item of filterState($d[qs.DictionaryCode])"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of filterState($d[qs.DictionaryCode])" :key="item.id" :value="item.value"
:label="item.label" />
</template>
</el-option-group>
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-if="qs.Type==='radio'"
v-model="qsForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
<el-radio-group v-if="qs.Type === 'radio'" v-model="qsForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState >= 2">
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</el-radio-group>
@ -254,6 +196,9 @@ export default {
}
},
methods: {
handleReadingChart(row) {
this.$emit('handleReadingChart', row)
},
lesionTypeChange(v) {
this.$emit('lesionTypeChange', { tableId: this.tableInfo.Id, rowIndex: this.answer.RowIndex, newLesionType: v })
},
@ -316,42 +261,50 @@ export default {
}
</script>
<style lang="scss" scoped>
.table-question-form{
::v-deep .el-form-item__label{
.table-question-form {
::v-deep .el-form-item__label {
color: #c3c3c3;
}
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1;
}
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1;
}
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
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;
}
.el-form-item__content
.el-select{
.el-form-item__content .el-select {
width: 100%;
}
.input-width1{
width: calc(100% - 60px)!important;
.input-width1 {
width: calc(100% - 60px) !important;
}
.input-width2{
.input-width2 {
width: 100% !important;
}
}
</style>

View File

@ -40,7 +40,19 @@
<template slot-scope="scope">
<span v-if="scope.row.QuestionName"
: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 }}</span>
scope.row.QuestionName }}
<svg-icon
v-if="scope.row.ShowChartTypeEnum > 0 || (scope.row.LesionType === 0 && scope.row.ReportLayType === 1)"
icon-class="readingChart" class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: scope.row.RowIndex ? null : scope.row.QuestionId,
TableQuestionId: scope.row.RowIndex ? scope.row.TableQuestionId : null,
RowIndex: scope.row.RowIndex ? scope.row.RowIndex : null,
ReportChartTypeEnum: scope.row.LesionType === 0 && scope.row.ReportLayType === 1 ? 0 : null
}
})" />
</span>
<span v-else style="font-weight: bold;font-size: 16px;color: #f44336;">
{{ language === 'en' ? scope.row.GroupEnName : scope.row.GroupName }}
</span>
@ -205,6 +217,7 @@
</div>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog>
<readingChart ref="readingChart_report" />
</div>
</template>
<script>
@ -219,9 +232,10 @@ import { mapGetters } from 'vuex'
import { changeURLStatic } from '@/utils/history.js'
import AdditionalAssessment from '@/views/trials/trials-panel/reading/dicoms/components/AdditionalAssessment'
import { openWindow } from "@/utils/splitScreen";
import readingChart from '@/components/readingChart'
export default {
name: 'ReportPage',
components: { SignForm, AdditionalAssessment },
components: { SignForm, AdditionalAssessment, readingChart },
data() {
return {
currentUser: zzSessionStorage.getItem('userName'),
@ -281,6 +295,7 @@ export default {
this.setScrollTop()
})
this.getReportInfo()
document.addEventListener("click", this.foo);
},
beforeDestroy() {
if (this.openWindow) {
@ -288,6 +303,22 @@ export default {
}
},
methods: {
handleReadingChart(row) {
let { e, data } = row
let obj = Object.assign({}, data)
obj.TrialId = this.$route.query.trialId
obj.VisitTaskId = this.taskInfo.VisitTaskId
obj.key = 'readingChart_report'
let zIndex = 9
if (obj.RowIndex) {
zIndex = 9999
}
this.$refs.readingChart_report.init(e, obj, zIndex)
},
foo() {
if (!this.$refs.readingChart_report) return false
this.$refs.readingChart_report.foo()
},
myConfirm(msg) {
return new Promise(resolve => {
this.$confirm(msg, {

View File

@ -148,12 +148,20 @@
@change="(val) => { formItemNumberChange(val, question) }" />
<!-- 自动计算 -->
<!-- :precision="2" :step="0.1" :max="10" -->
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]"
@input="value = value.replace(/^\D*(\d*(?:.\d{0,2})?).*$/g, '$1')" disabled />
<div style="display: flex;justify-content: space-between;">
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]"
@input="value = value.replace(/^\D*(\d*(?:.\d{0,2})?).*$/g, '$1')" disabled />
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: question.Id
}
})" />
</div>
<!-- 自增 -->
<el-input v-if="question.Type === 'increment'" v-model="questionForm[question.Id]" disabled />
<!-- 数值 -->
<template v-if="question.Type === 'number' && (question.ImageMarkEnum === 1 || question.ImageMarkEnum === 2)">
<div style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;">
<el-input type="text" @change="(val) => { formItemNumberChange(val, question) }"

View File

@ -75,8 +75,18 @@
</el-radio-group>
<!-- 自动计算 -->
<!-- :precision="2" :step="0.1" :max="10" -->
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]"
oninput="value=value.replace(/^\D*(\d*(?:.\d{0,2})?).*$/g, '$1')" disabled />
<div style="display: flex;justify-content: space-between;">
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]"
oninput="value=value.replace(/^\D*(\d*(?:.\d{0,2})?).*$/g, '$1')" disabled />
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: question.Id,
RowIndex: questionForm.RowIndex
}
})" />
</div>
<!-- 自增 -->
<el-input v-if="question.Type === 'increment'" v-model="questionForm[question.Id]" disabled />
<!-- 数值 -->

View File

@ -23,7 +23,19 @@
<el-table-column prop="" label="" show-overflow-tooltip width="350px">
<template slot-scope="scope">
<span v-if="scope.row.QuestionName">{{ scope.row.BlindName ? scope.row.QuestionName :
scope.row.QuestionName }}</span>
scope.row.QuestionName }}
<svg-icon
v-if="scope.row.ShowChartTypeEnum > 0 || (scope.row.LesionType === 0 && scope.row.ReportLayType === 1)"
icon-class="readingChart" class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: scope.row.RowIndex ? null : scope.row.QuestionId,
TableQuestionId: scope.row.RowIndex ? scope.row.TableQuestionId : null,
RowIndex: scope.row.RowIndex ? scope.row.RowIndex : null,
ReportChartTypeEnum: scope.row.LesionType === 0 && scope.row.ReportLayType === 1 ? 0 : null
}
})" />
</span>
<span v-else style="font-weight: bold;font-size: 16px;color: #f44336;">
{{ scope.row.GroupName }}
</span>
@ -206,6 +218,7 @@
<img v-show="false" :src="`${OSSclientConfig.basePath}${currentPath}`" alt="Image" />
</viewer>
<readingChart ref="readingChart_report" />
</div>
</template>
<script>
@ -216,9 +229,10 @@ import const_ from '@/const/sign-code'
import SignForm from '@/views/trials/components/newSignForm'
import { getToken } from '@/utils/auth'
import { openWindow } from "@/utils/splitScreen";
import readingChart from '@/components/readingChart'
export default {
name: 'CustomizeReportPage',
components: { SignForm },
components: { SignForm, readingChart },
data() {
return {
trialId: '',
@ -289,8 +303,21 @@ export default {
})
await this.getQuestionCalculateRelation()
this.getReportInfo()
document.addEventListener("click", this.foo);
},
methods: {
handleReadingChart(row) {
let { e, data } = row
let obj = Object.assign({}, data)
obj.TrialId = this.$route.query.trialId
obj.VisitTaskId = this.taskInfo.VisitTaskId
obj.key = 'readingChart_report'
let zIndex = 9
if (obj.RowIndex) {
zIndex = 9999
}
this.$refs.readingChart_report.init(e, obj, zIndex)
},
limitBlur(questionForm, id, valueType) {
const value = questionForm[id]
if (valueType === 0) {

View File

@ -1,197 +1,115 @@
<template>
<div>
<div
v-if="!!question.GroupName && question.Type==='group'"
>
<div v-if="!!question.GroupName && question.Type === 'group'">
<h4 style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language==='en'?question.GroupEnName:question.GroupName }}
{{ language === 'en' ? question.GroupEnName : question.GroupName }}
</h4>
</div>
<template v-else>
<el-form-item
v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0 "
:label="`${question.QuestionName}`"
:prop="question.Id"
:rules="[
{ 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']},
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0"
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[
{
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']
},
]"
:class="[question.Type==='group' ? 'mb' : (question.Type==='upload' || question.QuestionName.length > 15) ?'uploadWrapper' : '']"
>
:class="[question.Type === 'group' ? 'mb' : (question.Type === 'upload' || question.QuestionName.length > 15) ? 'uploadWrapper' : '']">
<!-- 输入框 -->
<el-input
v-if="question.Type==='input'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
/>
<el-input v-if="question.Type === 'input'" v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2"
@change="((val) => { formItemChange(val, question) })" />
<!-- 多行文本输入框 -->
<el-input
v-else-if="question.Type==='textarea'"
v-model="questionForm[question.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
/>
<el-input v-else-if="question.Type === 'textarea'" v-model="questionForm[question.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2"
@change="((val) => { formItemChange(val, question) })" />
<!-- 下拉框 -->
<el-select
v-else-if="question.Type==='select'"
v-model="questionForm[question.Id]"
<el-select v-else-if="question.Type === 'select'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode)"
clearable
@change="((val)=>{formItemChange(val, question)})"
>
clearable @change="((val) => { formItemChange(val, question) })">
<template v-if="question.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]" />
</template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
:label="item.label" />
</template>
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
<template
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
:label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-else-if="question.Type==='radio'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
>
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })">
<template v-if="question.DictionaryCode">
<el-radio
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="String(item.value)"
>
<el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)">
{{ item.label }}
</el-radio>
</template>
<template v-else-if="question.TypeValue">
<el-radio
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
<el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</template>
</el-radio-group>
<!-- 复选框 -->
<el-checkbox-group
v-else-if="question.Type==='checkbox'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
>
<el-checkbox
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
<el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2">
<el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
{{ val }}
</el-checkbox>
</el-checkbox-group>
<!-- 数值 -->
<template v-else-if="question.Type==='number'">
<el-input-number
v-if="question.ValueType === 0"
v-model="questionForm[question.Id]"
:precision="0"
:disabled="readingTaskState >= 2"
/>
<el-input-number
v-else-if="question.ValueType === 3"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
/>
<el-input-number
v-else-if="question.ValueType === 1 || question.ValueType === 2"
v-model="questionForm[question.Id]"
:precision="digitPlaces"
:disabled="readingTaskState >= 2"
/>
</template>
<el-input
v-else-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
disabled
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
<div style="display: flex;justify-content: space-between;"
v-else-if="question.Type === 'number' || question.Type === 'calculation'">
<!-- 数值 -->
<template v-if="question.Type === 'number'">
<el-input-number v-if="question.ValueType === 0" v-model="questionForm[question.Id]" :precision="0"
:disabled="readingTaskState >= 2" />
<el-input-number v-else-if="question.ValueType === 3" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2" />
<el-input-number v-else-if="question.ValueType === 1 || question.ValueType === 2"
v-model="questionForm[question.Id]" :precision="digitPlaces" :disabled="readingTaskState >= 2" />
</template>
</el-input>
<el-input v-else-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: question.Id
}
})" />
</div>
<!-- 上传图像 -->
<el-upload
v-else-if="question.Type==='upload'"
action
:accept="accept"
: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"
>
<el-upload v-else-if="question.Type === 'upload'" action :accept="accept" :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" />
<div slot="file" slot-scope="{file}">
<img
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
alt=""
>
<img 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-preview"
@click="handlePictureCardPreview(file)"
>
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
<i class="el-icon-zoom-in" />
</span>
<span
v-if="readingTaskState < 2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<span v-if="readingTaskState < 2" class="el-upload-list__item-delete" @click="handleRemove(file)">
<i class="el-icon-delete" />
</span>
</span>
</div>
</el-upload>
<el-dialog
v-if="question.Type==='upload'"
append-to-body
:visible.sync="imgVisible"
width="600px"
>
<el-dialog v-if="question.Type === 'upload'" append-to-body :visible.sync="imgVisible" width="600px">
<el-image :src="imageUrl" width="100%">
<div slot="placeholder" class="image-slot">
加载中<span class="dot">...</span>
@ -201,16 +119,9 @@
</el-form-item>
</template>
<question-form-item
v-for="(item) in question.Childrens"
:key="item.Id"
:question="item"
:question-form="questionForm"
:reading-task-state="readingTaskState"
:visitTaskId="visitTaskId"
@resetFormItemData="resetFormItemData"
@setFormItemData="setFormItemData"
/>
<question-form-item v-for="(item) in question.Childrens" :key="item.Id" :question="item"
:question-form="questionForm" :reading-task-state="readingTaskState" :visitTaskId="visitTaskId"
@resetFormItemData="resetFormItemData" @setFormItemData="setFormItemData" />
</div>
</template>
<script>
@ -267,6 +178,9 @@ export default {
this.digitPlaces = digitPlaces === -1 ? this.digitPlaces : digitPlaces
},
methods: {
handleReadingChart(row) {
this.$emit('handleReadingChart', row)
},
formItemChange(v, question) {
if (question.Childrens.length > 0) {
this.resetChild(question.Childrens)
@ -292,33 +206,40 @@ export default {
}
</script>
<style lang="scss" scoped>
.mb{
.mb {
margin-bottom: 0px;
}
.disabled{
.disabled {
::v-deep .el-upload--picture-card {
display: none;
}
}
.uploadWrapper{
.uploadWrapper {
display: flex;
flex-direction: column !important;
align-items: flex-start;
}
::v-deep .el-input.is-disabled .el-input__inner{
background-color: #646464a1;
}
::v-deep .el-input-group__append, .el-input-group__prepend{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1;
}
::v-deep .el-input-group__append,
.el-input-group__prepend {
padding: 0 10px;
}
::v-deep .el-form-item__content {
width: 100%;
}
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1;
}
// ::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner {
// background-color: #428bca;
// border-color: #428bca;
// }
</style>
// }</style>

View File

@ -8,35 +8,25 @@
<span style="margin-left:5px;">{{ visitInfo.TaskBlindName }}</span>
</h3>
<div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
<i
class="el-icon-refresh-left"
@click="resetForm"
/>
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
placement="bottom">
<i class="el-icon-refresh-left" @click="resetForm" />
</el-tooltip>
</div>
</div>
<!-- 影像质量评估 -->
<div v-if="outerQuestions.length > 0" class="outer_form_wrapper">
<el-form
ref="outerForm"
size="small"
:model="outerForm"
>
<question-form-item
v-for="outerQs in outerQuestions"
:key="outerQs.Id"
:question="outerQs"
:question-form="outerForm"
:reading-task-state="readingTaskState"
:visit-task-id="visitTaskId"
@resetFormItemData="resetOuterFormItemData"
@setFormItemData="setOuterFormItemData"
/>
<el-form ref="outerForm" size="small" :model="outerForm">
<question-form-item v-for="outerQs in outerQuestions" :key="outerQs.Id" :question="outerQs"
:question-form="outerForm" :reading-task-state="readingTaskState" :visit-task-id="visitTaskId"
@resetFormItemData="resetOuterFormItemData" @setFormItemData="setOuterFormItemData"
@handleReadingChart="handleReadingChart" />
<el-form-item v-if="readingTaskState < 2">
<div class="outer_form-footer">
<i class="el-icon-warning feedback-icon" :style="{color: taskInfo && taskInfo.IsExistUnprocessedFeedback ? '#ffeb3b' : '#fff'}" @click="openFeedBackTable" />
<i class="el-icon-warning feedback-icon"
:style="{ color: taskInfo && taskInfo.IsExistUnprocessedFeedback ? '#ffeb3b' : '#fff' }"
@click="openFeedBackTable" />
<el-button size="mini" @click="saveOuterForm">{{ $t('common:button:save') }}</el-button>
</div>
</el-form-item>
@ -44,147 +34,126 @@
</div>
<!-- 病灶评估 -->
<template v-if="tableQuestions.length > 0 && criterionType !== 10">
<div
v-for="(qs,index) in tableQuestions"
:key="index"
class="lesions lesions_wrapper"
>
<h4
v-if="qs.Type === 'group'"
style="color: #ddd;padding: 5px 0px;margin: 0;"
>
{{ language==='en'?qs.GroupEnName:qs.GroupName }}
<div v-for="(qs, index) in tableQuestions" :key="index" class="lesions lesions_wrapper">
<h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }}
</h4>
<div class="lesion_list">
<div
v-for="table in qs.Childrens"
v-show="!(isBaseLineTask && table.LesionType === 2)"
:key="table.Id"
>
<div
v-if="table.Type === 'table'"
class="flex-row"
style="margin:3px 0;"
>
<div class="title">{{ table.QuestionName }}</div>
<div
v-if="readingTaskState<2 && (isBaseLineTask || table.LesionType === 2)"
class="add-icon"
@click.prevent="addTarget(table)"
>
<div v-for="table in qs.Childrens" v-show="!(isBaseLineTask && table.LesionType === 2)" :key="table.Id">
<div v-if="table.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ table.QuestionName }}
<svg-icon v-if="table.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || table.LesionType === 2)" class="add-icon"
@click.prevent="addTarget(table)">
<i class="el-icon-plus" />
</div>
</div>
<el-collapse
v-if="table.Type === 'table' && table.TableQuestions"
v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(answer,i) in table.TableQuestions.Answers"
:key="`${table.Id}_${answer.RowIndex}`"
:name="`${table.Id}_${answer.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event, table.Id, answer.RowIndex)"
>
<el-collapse v-if="table.Type === 'table' && table.TableQuestions" v-model="activeName" accordion
@change="handleCollapseChange">
<el-collapse-item v-for="(answer, i) in table.TableQuestions.Answers"
:key="`${table.Id}_${answer.RowIndex}`" :name="`${table.Id}_${answer.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event, table.Id, answer.RowIndex)">
<template slot="title">
<div
style="width:340px;position: relative;"
:style="{color:innerFormData[`${table.Id}_${answer.RowIndex}`].IntrahepaticLesion ?'#5fb4ff':'#fff'}"
:title="innerFormData[`${table.Id}_${answer.RowIndex}`].IntrahepaticLesion ? $t('trials:mRecist:text:text1') : ''"
>
{{ getLesionName(table.OrderMark,answer.RowIndex) }}
<div style="width:340px;position: relative;"
:style="{ color: innerFormData[`${table.Id}_${answer.RowIndex}`].IntrahepaticLesion ? '#5fb4ff' : '#fff' }"
:title="innerFormData[`${table.Id}_${answer.RowIndex}`].IntrahepaticLesion ? $t('trials:mRecist:text:text1') : ''">
{{ getLesionName(table.OrderMark, answer.RowIndex) }}
<!-- 未保存 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].SaveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<el-tooltip
v-if="readingTaskState < 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].SaveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" />
</el-tooltip>
<!-- 信息不完整 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].SaveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom">
<el-tooltip
v-if="readingTaskState < 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].SaveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip>
<div :style="{position: 'absolute', left: '50px', top: '2px', color: innerFormData[`${table.Id}_${answer.RowIndex}`].IntrahepaticLesion ? '#5fb4ff' : '#fff'}">
<div
:style="{ position: 'absolute', left: '50px', top: '2px', color: innerFormData[`${table.Id}_${answer.RowIndex}`].IntrahepaticLesion ? '#5fb4ff' : '#fff' }">
<div style="font-size: 11px;width:220px;height: 30px;">
<div
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart"
<div v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart"
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
:title="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart"
>
:title="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart">
{{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart }}
</div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
<div
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
<span v-if="table.LesionType === 0">
{{ $fd('TargetState',parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState)) }}
{{
$fd('TargetState', parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))
}}
</span>
<span v-else-if="table.LesionType === 1">
{{ $fd('NoTargetState',parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState)) }}
{{
$fd('NoTargetState',
parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))
}}
</span>
<span v-else>
{{ $fd('NewLesionState',parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState)) }}
{{
$fd('NewLesionState',
parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))
}}
</span>
</div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px">
<template v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].IsLymphNodes && !isNaN(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionShort))">
<div
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px">
<template
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].IsLymphNodes && !isNaN(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionShort))">
{{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionShort }}mm
</template>
<template v-else-if="!innerFormData[`${table.Id}_${answer.RowIndex}`].IsLymphNodes && !isNaN(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionLength))">
<template
v-else-if="!innerFormData[`${table.Id}_${answer.RowIndex}`].IsLymphNodes && !isNaN(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionLength))">
{{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionLength }}mm
</template>
</div>
</div>
</div>
<!-- 分裂 -->
<div v-if="((table.LesionType === 0 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0) || (table.LesionType === 1 && [0,1].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))) || (table.LesionType === 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0)) && innerFormData[`${table.Id}_${answer.RowIndex}`].IsCurrentTaskAdd === 'False'" style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<el-tooltip v-show="readingTaskState<2 && !!innerFormData[`${table.Id}_${answer.RowIndex}`].RowId && !isBaseLineTask && innerFormData[`${table.Id}_${answer.RowIndex}`].IsDicomReading !== false" class="table" :content="$t('trials:reading:button:split')" placement="left">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="lesionSplit(table.Id, innerFormData[`${table.Id}_${answer.RowIndex}`].RowId)" />
<div
v-if="((table.LesionType === 0 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0) || (table.LesionType === 1 && [0, 1].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))) || (table.LesionType === 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0)) && innerFormData[`${table.Id}_${answer.RowIndex}`].IsCurrentTaskAdd === 'False'"
style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<el-tooltip
v-show="readingTaskState < 2 && !!innerFormData[`${table.Id}_${answer.RowIndex}`].RowId && !isBaseLineTask && innerFormData[`${table.Id}_${answer.RowIndex}`].IsDicomReading !== false"
class="table" :content="$t('trials:reading:button:split')" placement="left">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
@click.stop="lesionSplit(table.Id, innerFormData[`${table.Id}_${answer.RowIndex}`].RowId)" />
</el-tooltip>
</div>
</div>
</template>
<el-form
:ref="`${table.Id}_${answer.RowIndex}`"
size="small"
:model="innerFormData[`${table.Id}_${answer.RowIndex}`]"
>
<table-question-form-item
:ref="`form_${table.Id}_${answer.RowIndex}`"
:table-info="table"
:answer="answer"
:question-form="innerFormData[`${table.Id}_${answer.RowIndex}`]"
:reading-task-state="readingTaskState"
:organs="organs"
:is-base-line-task="isBaseLineTask"
:is-current-task="isCurrentTask"
@update="innerFormDataUpdate"
@close="closeInnerForm"
@lesionTypeChange="lesionTypeChange"
/>
<div
v-if="readingTaskState<2"
style="text-align:right;margin-top:10px;"
>
<el-form :ref="`${table.Id}_${answer.RowIndex}`" size="small"
:model="innerFormData[`${table.Id}_${answer.RowIndex}`]">
<table-question-form-item :ref="`form_${table.Id}_${answer.RowIndex}`" :table-info="table"
:answer="answer" :question-form="innerFormData[`${table.Id}_${answer.RowIndex}`]"
:reading-task-state="readingTaskState" :organs="organs" :is-base-line-task="isBaseLineTask"
:is-current-task="isCurrentTask" @update="innerFormDataUpdate" @close="closeInnerForm"
@lesionTypeChange="lesionTypeChange" @handleReadingChart="handleReadingChart" />
<div v-if="readingTaskState < 2" style="text-align:right;margin-top:10px;">
<!-- 清除标记 -->
<el-button
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].MeasureData"
size="mini"
@click="clearMeasureData(table, answer.RowIndex)"
>
<el-button v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].MeasureData" size="mini"
@click="clearMeasureData(table, answer.RowIndex)">
{{ $t('trials:reading:button:removeMark') }}
</el-button>
<!-- 删除 -->
<el-button
v-if="table.TableQuestions.Answers[i].IsCurrentTaskAdd !== 'False'"
size="mini"
@click="deleteLesion(table, answer.RowIndex)"
>
<el-button v-if="table.TableQuestions.Answers[i].IsCurrentTaskAdd !== 'False'" size="mini"
@click="deleteLesion(table, answer.RowIndex)">
{{ $t('common:button:delete') }}
</el-button>
<!-- 保存 -->
<el-button
size="mini"
@click="saveLesion(table, answer.RowIndex)"
>
<el-button size="mini" @click="saveLesion(table, answer.RowIndex)">
{{ $t('common:button:save') }}
</el-button>
</div>
@ -286,6 +255,9 @@ export default {
this.getTableQuestions()
},
methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
//
async getOrganList() {
try {
@ -676,7 +648,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
return
}
@ -687,7 +659,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
return
}
@ -895,7 +867,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg19'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -905,7 +877,7 @@ export default {
this.$confirm(this.$t('trials:mRecist:warnning:msg2'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -917,7 +889,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg20'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -934,7 +906,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg21'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -946,7 +918,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg22'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -964,7 +936,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg23'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -976,7 +948,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg24'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -992,7 +964,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg25'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1009,7 +981,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg26'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1031,7 +1003,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg27'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1043,7 +1015,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg28'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1059,7 +1031,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg29'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1071,7 +1043,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg30'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1093,7 +1065,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg31'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1105,7 +1077,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg32'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1122,7 +1094,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg33'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1134,7 +1106,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg34'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1151,7 +1123,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg35'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1163,7 +1135,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg36'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1180,7 +1152,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg37'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1192,7 +1164,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg38'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1209,7 +1181,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg39'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1221,7 +1193,7 @@ export default {
this.$confirm(this.$t('trials:mRecist:warnning:msg6'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1231,7 +1203,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg40'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1241,7 +1213,7 @@ export default {
this.$confirm(this.$t('trials:mRecist:warnning:msg3'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1258,7 +1230,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg41'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1269,7 +1241,7 @@ export default {
this.$confirm(this.$t('trials:mRecist:warnning:msg6'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1280,7 +1252,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg42'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1290,7 +1262,7 @@ export default {
this.$confirm(this.$t('trials:mRecist:warnning:msg4'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1307,7 +1279,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg43'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1319,7 +1291,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg44'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1336,7 +1308,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg45'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1348,7 +1320,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg46'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
loading.close()
return
@ -1576,7 +1548,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
return
}
@ -1679,7 +1651,7 @@ export default {
type: 'imgfail',
trialId: this.$route.query.trialId,
visitTaskId: this.visitTaskId,
callBack: async() => {
callBack: async () => {
const confirm = await this.$confirm(
this.$t('trials:reading:confirm:feedbackmsg'),
{
@ -1716,7 +1688,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
this.$set(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`], 'LesionType', innerForm.LesionType)
return
@ -1733,7 +1705,7 @@ export default {
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
this.$set(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`], 'LesionType', innerForm.LesionType)
return
@ -1744,7 +1716,7 @@ export default {
this.$confirm(this.$t(' trials:reading:warnning:msg15'), {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
this.$set(this.innerFormData[`${obj.tableId}_${obj.rowIndex}`], 'LesionType', innerForm.LesionType)
return
@ -1957,23 +1929,26 @@ export default {
}
</script>
<style lang="scss" scoped>
.questionList-wrapper{
.questionList-wrapper {
height: 100%;
overflow-y: auto;
// overflow: hidden;
.container{
.container {
padding: 10px;
.basic-info{
.basic-info {
display: flex;
justify-content: space-between;
align-items: center;
h3{
h3 {
color: #ddd;
padding: 5px 0px;
margin: 0;
}
i{
i {
color: #fff;
font-size: 22px;
font-weight: bold;
@ -1981,64 +1956,75 @@ export default {
}
}
}
.outer_form_wrapper{
::v-deep .el-form-item__label{
.outer_form_wrapper {
::v-deep .el-form-item__label {
color: #c3c3c3;
text-align: left;
}
::v-deep .el-input__inner{
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-textarea__inner{
::v-deep .el-input__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-form-item{
::v-deep .el-textarea__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-form-item {
display: flex;
flex-direction: row;
justify-content: flex-start;
flex-wrap: wrap;
}
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1;
}
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px;
}
::v-deep .el-form-item__content
.el-select{
::v-deep .el-form-item__content .el-select {
width: 100%;
}
.outer_form-footer{
.outer_form-footer {
display: flex;
flex-direction: row;
justify-content: flex-end;
align-items: center;
.feedback-icon{
.feedback-icon {
padding: 0 10px;
color: #fff;
font-weight: 400;
font-size: 22px;
cursor: pointer;
&:hover{
&:hover {
color: #68a2d5;
}
}
}
}
.title{
.title {
padding: 5px;
font-weight: bold;
color: #ddd;
font-size: 15px;
}
.add-icon{
.add-icon {
padding: 5px;
font-weight: bold;
color: #ddd;
@ -2047,42 +2033,49 @@ export default {
margin-bottom: 2px;
cursor: pointer;
}
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b;
}
.flex-row{
.flex-row {
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: #424242;
}
.lesion_list{
.lesion_list {
position: relative;
}
.el-collapse{
border-bottom:none;
border-top:none;
::v-deep .el-collapse-item{
background-color: #000!important;
.el-collapse {
border-bottom: none;
border-top: none;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd;
}
::v-deep .el-collapse-item__header{
background-color: #000!important;
::v-deep .el-collapse-item__header {
background-color: #000 !important;
color: #ddd;
border-bottom-color:#5a5a5a;
border-bottom-color: #5a5a5a;
padding-left: 5px;
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;
}
::v-deep .el-collapse-item__content{
width:260px;
::v-deep .el-collapse-item__content {
width: 260px;
position: absolute;
top: 0px;
right: 0px;
@ -2091,7 +2084,7 @@ export default {
z-index: 1;
color: #ddd;
padding: 5px;
background-color:#1e1e1e;
background-color: #1e1e1e;
}
}

View File

@ -9,168 +9,112 @@
<i class="el-icon-circle-close" style="font-size: 25px;cursor: pointer;" @click="close" />
</div>
</div>
<el-form-item
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]">
<!-- 下拉框 -->
<el-select
v-model="qsForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState>=2 || !isBaseLineTask"
@change="((val)=>{lesionTypeChange(val)})"
>
<el-select v-model="qsForm.LesionType" filterable
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask"
@change="((val) => { lesionTypeChange(val) })">
<el-option
v-for="item of $d.LesionType"
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
:value="item.value" :label="item.label" />
</el-select>
</el-form-item>
<!-- 靶病灶非靶病灶的器官为肝脏/Liver时,需要选择典型肝内病灶该值默认为否如果选择是对于靶病灶需要提示按照独立影像评估章程的相关规则对于典型肝内靶病灶请测量肿瘤活性部分最长径提示方式为在长径属性上显示浮框或者增加
-->
<el-form-item
v-for="qs in questions"
v-show="qs.ShowQuestion!==2"
:key="qs.Id"
:prop="qs.Id"
: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.QuestionMark === 21 && (questionForm.LesionOrgan === '肝脏' || questionForm.LesionOrgan === 'Liver') && (lesionType === 0 || lesionType === 1 || lesionType === 2))) && qs.Type!=='group' && qs.Type!=='summary',
message:['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur','change']},
]"
>
<span slot="label" style="display:inline-block;" >
<el-tooltip v-if="qs.QuestionMark === 0 && (questionForm.LesionOrgan === '肝脏' || questionForm.LesionOrgan === 'Liver') && (lesionType === 0 || lesionType === 1 || lesionType === 2) && questionForm.IntrahepaticLesion" effect="dark" :content="$t('trials:mRecist:warnning:msg1')" placement="bottom">
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :prop="qs.Id" :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.QuestionMark === 21 && (questionForm.LesionOrgan === '肝脏' || questionForm.LesionOrgan === 'Liver') && (lesionType === 0 || lesionType === 1 || lesionType === 2))) && qs.Type !== 'group' && qs.Type !== 'summary',
message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
},
]">
<span slot="label" style="display:inline-block;">
<el-tooltip
v-if="qs.QuestionMark === 0 && (questionForm.LesionOrgan === '肝脏' || questionForm.LesionOrgan === 'Liver') && (lesionType === 0 || lesionType === 1 || lesionType === 2) && questionForm.IntrahepaticLesion"
effect="dark" :content="$t('trials:mRecist:warnning:msg1')" placement="bottom">
<i class='el-icon-warning' />
</el-tooltip>
{{ qs.QuestionName }}
</span>
<!-- 输入框 -->
<template v-if="qs.Type==='input' || qs.Type==='number'">
<template v-if="qs.Type === 'input' || qs.Type === 'number'">
<div style="display: flex;justify-content: space-between;">
<el-input v-if="qs.Type === 'input' || qs.Type === 'number'" v-model="qsForm[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) || !!answer.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answer.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answer.SplitOrMergeLesionName))"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: qsForm.RowIndex
}
})" />
</div>
<el-input
v-if="qs.Type==='input' || qs.Type==='number'"
v-model="qsForm[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) || !!answer.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answer.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answer.SplitOrMergeLesionName))"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
</template>
<!-- 多行文本输入框 -->
<el-input
v-if="qs.Type==='textarea'"
v-model="qsForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<el-input v-if="qs.Type === 'textarea'" v-model="qsForm[qs.Id]" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
@change="((val) => { formItemChange(val, qs) })" />
<!-- 下拉框 -->
<el-select
v-if="qs.Type==='select'"
v-model="qsForm[qs.Id]"
filterable
<el-select v-if="qs.Type === 'select'" v-model="qsForm[qs.Id]" filterable
:placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : qs.QuestionMark === 2 ? '' : $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) || !!answer.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False'|| !!answer.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answer.SplitOrMergeLesionName)) || (qs.QuestionMark === 21 && (isCurrentTaskAdd === 'False'|| !!answer.SplitOrMergeLesionName)) || (questionForm.LesionOrgan && questionForm.LesionOrgan !== '肝脏' && questionForm.LesionOrgan !== 'Liver' && qs.QuestionMark === 21)"
@change="((val)=>{formItemChange(val, qs)})"
>
: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) || !!answer.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answer.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answer.SplitOrMergeLesionName)) || (qs.QuestionMark === 21 && (isCurrentTaskAdd === 'False' || !!answer.SplitOrMergeLesionName)) || (questionForm.LesionOrgan && questionForm.LesionOrgan !== '肝脏' && questionForm.LesionOrgan !== 'Liver' && qs.QuestionMark === 21)"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;">
<i class="el-icon-search" />
</span>
</template>
<template v-if="qs.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))" :key="item.id"
:value="item.value" :label="item.label" />
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group
:label="!isNaN(parseFloat(answer.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answer.LastTaskState))}` : ''"
>
:label="!isNaN(parseFloat(answer.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answer.LastTaskState))}` : ''">
<!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answer.IsFristAdd=== 'True' && answer.SplitOrMergeType === '0'">
<template v-if="answer.IsFristAdd === 'True' && answer.SplitOrMergeType === '0'">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0" :key="item.id"
:value="item.value" :label="item.label" />
</template>
<!-- 首次添加的新病灶不能为无法评估和消失 -->
<template v-else-if="isCurrentTaskAdd=== 'True' && lesionType === 2">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0 || item.value === 1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2">
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0 || item.value === 1"
:key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="item of filterState($d[qs.DictionaryCode])"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of filterState($d[qs.DictionaryCode])" :key="item.id" :value="item.value"
:label="item.label" />
</template>
</el-option-group>
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-if="qs.Type==='radio'"
v-model="qsForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
<el-radio-group v-if="qs.Type === 'radio'" v-model="qsForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState >= 2">
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</el-radio-group>
@ -262,6 +206,9 @@ export default {
}
},
methods: {
handleReadingChart(row) {
this.$emit('handleReadingChart', row)
},
lesionTypeChange(v) {
this.$emit('lesionTypeChange', { tableId: this.tableInfo.Id, rowIndex: this.answer.RowIndex, newLesionType: v })
},
@ -324,42 +271,50 @@ export default {
}
</script>
<style lang="scss" scoped>
.table-question-form{
::v-deep .el-form-item__label{
.table-question-form {
::v-deep .el-form-item__label {
color: #c3c3c3;
}
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex;
flex-direction: row;
justify-content: flex-start;
}
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1;
}
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1;
}
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
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;
}
.el-form-item__content
.el-select{
.el-form-item__content .el-select {
width: 100%;
}
.input-width1{
width: calc(100% - 60px)!important;
.input-width1 {
width: calc(100% - 60px) !important;
}
.input-width2{
.input-width2 {
width: 100% !important;
}
}
</style>

View File

@ -176,6 +176,7 @@ export default {
this.$refs.readingChart.init(e, obj, zIndex)
},
foo() {
if (!this.$refs.readingChart) return false
this.$refs.readingChart.foo()
},
getEcrf(data) {

View File

@ -23,7 +23,17 @@
<el-table-column prop="" label="" show-overflow-tooltip width="350px">
<template slot-scope="scope">
<span v-if="scope.row.QuestionName">{{ scope.row.BlindName ? scope.row.QuestionName :
scope.row.QuestionName }}</span>
scope.row.QuestionName }}
<svg-icon v-if="scope.row.ShowChartTypeEnum > 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: scope.row.RowIndex ? null : scope.row.QuestionId,
TableQuestionId: scope.row.RowIndex ? scope.row.TableQuestionId : null,
RowIndex: scope.row.RowIndex ? scope.row.RowIndex : null,
}
})" />
</span>
<span v-else style="font-weight: bold;font-size: 16px;color: #f44336;">
{{ scope.row.GroupName }}
</span>
@ -206,6 +216,7 @@
<PreviewFile v-if="previewVisible" :file-path="currentPath" :file-type="currentType" />
</div>
</el-dialog>
<readingChart ref="readingChart_report" />
</div>
</template>
<script>
@ -218,9 +229,10 @@ import PreviewFile from '@/components/PreviewFile/index'
import { getToken } from '@/utils/auth'
import store from '@/store'
import { openWindow } from "@/utils/splitScreen";
import readingChart from '@/components/readingChart'
export default {
name: 'CustomizeReportPage',
components: { SignForm, PreviewFile },
components: { SignForm, PreviewFile, readingChart },
data() {
return {
trialId: '',
@ -278,8 +290,25 @@ export default {
})
await this.getQuestionCalculateRelation()
this.getReportInfo()
document.addEventListener("click", this.foo);
},
methods: {
handleReadingChart(row) {
let { e, data } = row
let obj = Object.assign({}, data)
obj.TrialId = this.$route.query.trialId
obj.VisitTaskId = this.taskInfo.VisitTaskId
obj.key = 'readingChart_report'
let zIndex = 9
if (obj.RowIndex) {
zIndex = 9999
}
this.$refs.readingChart_report.init(e, obj, zIndex)
},
foo() {
if (!this.$refs.readingChart_report) return false
this.$refs.readingChart_report.foo()
},
limitBlur(questionForm, id, valueType) {
const value = questionForm[id]
if (valueType === 0) {