阅片报告中数值的统计与可视化
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
ca44352b9e
commit
3243b33b33
|
|
@ -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
|
||||
// 设置菜单出现的位置
|
||||
// 具体显示位置根据自己需求进行调节
|
||||
let { key } = obj
|
||||
if (key) {
|
||||
this.key = key
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
this.visible = true
|
||||
let readingChart = document.querySelector("#readingChart");
|
||||
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 < 150) {
|
||||
if (chaX < 500) {
|
||||
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); // 给整个document添加监听鼠标事件,点击任何位置执行foo方法
|
||||
})
|
||||
},
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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 = {
|
||||
|
|
|
|||
|
|
@ -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="[
|
||||
<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
|
||||
<el-select v-model="questionForm.LesionType" filterable
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || (!isBaseLineTask && !(isFirstChangeTask && (lesionType === 2 || lesionType === 5 || lesionType === 6)))"
|
||||
@change="((val)=>{lesionTypeChange(val)})"
|
||||
>
|
||||
@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]"
|
||||
<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)})"
|
||||
>
|
||||
@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)})"
|
||||
>
|
||||
@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]"
|
||||
<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"
|
||||
/>
|
||||
: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]"
|
||||
<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"
|
||||
/>
|
||||
: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]"
|
||||
<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"
|
||||
/>
|
||||
:key="item.id" :value="item.value" :label="item.label" />
|
||||
</template>
|
||||
<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])"
|
||||
<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 => {
|
||||
|
|
@ -2171,38 +2095,46 @@ export default {
|
|||
::v-deep .el-form-item__label {
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__inner {
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-input.is-disabled .el-input__inner {
|
||||
background-color: #646464a1;
|
||||
}
|
||||
|
||||
::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-width2 {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -8,22 +8,17 @@
|
|||
<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">
|
||||
|
|
@ -32,19 +27,28 @@
|
|||
{{ 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,45 +56,41 @@
|
|||
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) }}
|
||||
<!-- 未保存 -->
|
||||
<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)) }}
|
||||
</span>
|
||||
|
|
@ -107,54 +107,55 @@
|
|||
{{ $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) {
|
||||
|
|
@ -1183,15 +1187,18 @@ export default {
|
|||
|
||||
.container {
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h3 {
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
|
|
@ -1200,6 +1207,7 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -1207,6 +1215,7 @@ export default {
|
|||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -1216,6 +1225,7 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
|
@ -1227,17 +1237,21 @@ export default {
|
|||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.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;
|
||||
color: #ddd;
|
||||
|
|
@ -1246,10 +1260,12 @@ export default {
|
|||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
position: absolute;
|
||||
|
|
|
|||
|
|
@ -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'">
|
||||
<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) {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
<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 }}
|
||||
</h4>
|
||||
|
|
@ -10,110 +8,59 @@
|
|||
<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']},
|
||||
: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)})"
|
||||
>
|
||||
<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)})"
|
||||
>
|
||||
<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-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)
|
||||
|
|
@ -272,25 +219,32 @@ export default {
|
|||
.mb {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
::v-deep .el-upload--picture-card {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.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-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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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="[
|
||||
<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
|
||||
<el-select :ref="`select_LesionType`" v-model="questionForm.LesionType" filterable
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask || answers.SplitOrMergeType === '1'"
|
||||
@change="((val)=>{lesionTypeChange(val)})"
|
||||
>
|
||||
@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'">
|
||||
<!-- {{ ((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]"
|
||||
<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)})"
|
||||
>
|
||||
@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)) }} -->
|
||||
|
||||
</template>
|
||||
<!-- 多行文本输入框 -->
|
||||
<el-input
|
||||
v-if="qs.Type==='textarea'"
|
||||
v-model="questionForm[qs.Id]"
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 2, maxRows: 4}"
|
||||
maxlength="500"
|
||||
<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)})"
|
||||
/>
|
||||
@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)})"
|
||||
>
|
||||
@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]"
|
||||
<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"
|
||||
/>
|
||||
: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"
|
||||
/>
|
||||
<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"
|
||||
/>
|
||||
<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)})"
|
||||
>
|
||||
<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>
|
||||
<viewer
|
||||
v-if="answers.OtherPicturePath"
|
||||
ref="viewer"
|
||||
style="margin:0 10px;"
|
||||
:images="[`${OSSclientConfig.basePath}${answers.OtherPicturePath}`]"
|
||||
>
|
||||
<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)})"
|
||||
>
|
||||
<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;"
|
||||
>
|
||||
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
|
||||
|
|
@ -1841,47 +1769,58 @@ export default {
|
|||
::v-deep .el-form-item__label {
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__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 {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::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 {
|
||||
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-width2 {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.suv_viewer {
|
||||
::v-deep .viewer-play {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -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,13 +23,8 @@
|
|||
: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">
|
||||
|
|
@ -42,50 +35,67 @@
|
|||
<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) }}
|
||||
<!-- 未保存 -->
|
||||
<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>
|
||||
|
|
@ -99,47 +109,46 @@
|
|||
{{ $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>
|
||||
|
|
@ -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) {
|
||||
|
|
@ -1346,17 +1317,21 @@ export default {
|
|||
.measurement-wrapper {
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
|
||||
.container {
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h3 {
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
|
|
@ -1365,6 +1340,7 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -1372,6 +1348,7 @@ export default {
|
|||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -1381,6 +1358,7 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
|
@ -1392,9 +1370,11 @@ export default {
|
|||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.login-cycle {
|
||||
width: 5px;
|
||||
height: 5px;
|
||||
|
|
@ -1404,14 +1384,17 @@ 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;
|
||||
color: #ddd;
|
||||
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__header {
|
||||
background-color: #000 !important;
|
||||
color: #ddd;
|
||||
|
|
@ -1420,10 +1403,12 @@ export default {
|
|||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
position: absolute;
|
||||
|
|
@ -1438,18 +1423,26 @@ export default {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
.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;
|
||||
|
|
@ -1457,22 +1450,27 @@ export default {
|
|||
border-bottom: 1px solid #383838;
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep.el-table__body-wrapper {
|
||||
tr {
|
||||
background-color: #1e1e1e !important;
|
||||
color: #dfdfdf;
|
||||
}
|
||||
|
||||
tr:hover>td {
|
||||
background-color: #1e1e1e !important;
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep.el-table__empty-block {
|
||||
background-color: #1e1e1e !important;
|
||||
}
|
||||
|
||||
.merge-label {
|
||||
color: #ddd;
|
||||
font-size: 13px;
|
||||
margin-bottom: 10px;
|
||||
|
||||
span {
|
||||
font-size: 15px;
|
||||
color: red;
|
||||
|
|
|
|||
|
|
@ -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="[
|
||||
<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
|
||||
<el-select :ref="`select_LesionType`" v-model="questionForm.LesionType" filterable
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask || answers.SplitOrMergeType === '1'"
|
||||
@change="((val)=>{lesionTypeChange(val)})"
|
||||
>
|
||||
@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'">
|
||||
<!-- {{ ((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]"
|
||||
<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)})"
|
||||
>
|
||||
@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)) }} -->
|
||||
|
||||
</template>
|
||||
<!-- 多行文本输入框 -->
|
||||
<el-input
|
||||
v-if="qs.Type==='textarea'"
|
||||
v-model="questionForm[qs.Id]"
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 2, maxRows: 4}"
|
||||
maxlength="500"
|
||||
<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)})"
|
||||
/>
|
||||
@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)})"
|
||||
>
|
||||
@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]"
|
||||
<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"
|
||||
/>
|
||||
: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"
|
||||
/>
|
||||
<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"
|
||||
/>
|
||||
<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)})"
|
||||
>
|
||||
<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>
|
||||
<viewer
|
||||
v-if="answers.OtherPicturePath"
|
||||
ref="viewer"
|
||||
style="margin:0 10px;"
|
||||
:images="[`${OSSclientConfig.basePath}${answers.OtherPicturePath}`]"
|
||||
>
|
||||
<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)})"
|
||||
>
|
||||
<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;"
|
||||
>
|
||||
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
|
||||
|
|
@ -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')
|
||||
}
|
||||
|
|
@ -1841,47 +1769,58 @@ export default {
|
|||
::v-deep .el-form-item__label {
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__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 {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::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 {
|
||||
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-width2 {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.suv_viewer {
|
||||
::v-deep .viewer-play {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -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,13 +23,8 @@
|
|||
: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">
|
||||
|
|
@ -42,50 +35,67 @@
|
|||
<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) }}
|
||||
<!-- 未保存 -->
|
||||
<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>
|
||||
|
|
@ -99,47 +109,46 @@
|
|||
{{ $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>
|
||||
|
|
@ -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) {
|
||||
|
|
@ -1346,17 +1317,21 @@ export default {
|
|||
.measurement-wrapper {
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
|
||||
.container {
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h3 {
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
|
|
@ -1365,6 +1340,7 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -1372,6 +1348,7 @@ export default {
|
|||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -1381,6 +1358,7 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
|
@ -1392,9 +1370,11 @@ export default {
|
|||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.login-cycle {
|
||||
width: 5px;
|
||||
height: 5px;
|
||||
|
|
@ -1404,14 +1384,17 @@ 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;
|
||||
color: #ddd;
|
||||
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__header {
|
||||
background-color: #000 !important;
|
||||
color: #ddd;
|
||||
|
|
@ -1420,10 +1403,12 @@ export default {
|
|||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
position: absolute;
|
||||
|
|
@ -1438,18 +1423,26 @@ export default {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
.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;
|
||||
|
|
@ -1457,22 +1450,27 @@ export default {
|
|||
border-bottom: 1px solid #383838;
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep.el-table__body-wrapper {
|
||||
tr {
|
||||
background-color: #1e1e1e !important;
|
||||
color: #dfdfdf;
|
||||
}
|
||||
|
||||
tr:hover>td {
|
||||
background-color: #1e1e1e !important;
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep.el-table__empty-block {
|
||||
background-color: #1e1e1e !important;
|
||||
}
|
||||
|
||||
.merge-label {
|
||||
color: #ddd;
|
||||
font-size: 13px;
|
||||
margin-bottom: 10px;
|
||||
|
||||
span {
|
||||
font-size: 15px;
|
||||
color: red;
|
||||
|
|
|
|||
|
|
@ -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,27 +12,19 @@
|
|||
</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>
|
||||
|
|
@ -46,42 +32,26 @@
|
|||
<!-- 测量 -->
|
||||
<el-button
|
||||
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && !questionForm[qs.Id] && readingTaskState !== 2"
|
||||
size="mini"
|
||||
type="text"
|
||||
@click="addAnnotation(qs)"
|
||||
>
|
||||
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)"
|
||||
>
|
||||
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') }}
|
||||
|
|
@ -89,112 +59,85 @@
|
|||
</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)})"
|
||||
>
|
||||
<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)})"
|
||||
>
|
||||
@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]"
|
||||
<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)})"
|
||||
>
|
||||
@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>
|
||||
<div style="display: flex;justify-content: space-between;" v-else-if="qs.Type === 'calculation'">
|
||||
<!-- 自动计算 -->
|
||||
<el-input
|
||||
v-else-if="qs.Type==='calculation'"
|
||||
v-model="questionForm[qs.Id]"
|
||||
disabled
|
||||
@change="((val)=>{formItemChange(val, qs)})"
|
||||
>
|
||||
<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)
|
||||
|
|
@ -857,41 +803,51 @@ export default {
|
|||
::v-deep .el-form-item__label {
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__inner {
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-input.is-disabled .el-input__inner {
|
||||
background-color: #646464a1;
|
||||
}
|
||||
|
||||
::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-width2 {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -8,18 +8,17 @@
|
|||
<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>
|
||||
|
|
@ -32,7 +31,8 @@
|
|||
<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;">
|
||||
<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>
|
||||
|
|
@ -43,28 +43,27 @@
|
|||
</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) {
|
||||
|
|
@ -532,15 +525,18 @@ export default {
|
|||
|
||||
.container {
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h3 {
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
|
|
@ -549,6 +545,7 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -556,6 +553,7 @@ export default {
|
|||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -565,6 +563,7 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
|
@ -576,17 +575,21 @@ export default {
|
|||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.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;
|
||||
color: #ddd;
|
||||
|
|
@ -595,10 +598,12 @@ export default {
|
|||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
position: absolute;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
<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 }}
|
||||
</h4>
|
||||
|
|
@ -10,110 +8,59 @@
|
|||
<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']},
|
||||
: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> -->
|
||||
<div style="display: flex;justify-content: space-between;"
|
||||
v-else-if="question.Type === 'calculation' || question.Type === 'number'">
|
||||
<!-- 数值类型 -->
|
||||
<el-input
|
||||
v-else-if="question.Type==='number'"
|
||||
v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState>=2 "
|
||||
type="number"
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<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)})"
|
||||
>
|
||||
<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-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)
|
||||
|
|
@ -272,25 +219,32 @@ export default {
|
|||
.mb {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
::v-deep .el-upload--picture-card {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.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-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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,40 +14,25 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<el-form-item
|
||||
:label="$t('trials:reading:title:lesionType')"
|
||||
prop="LesionType"
|
||||
:rules="[
|
||||
<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 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 }} -->
|
||||
|
||||
|
|
@ -61,26 +40,28 @@
|
|||
@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"
|
||||
|
||||
@focus="focusQs = {...qs}"
|
||||
@change="((val)=>{formItemChange(val, qs)})"
|
||||
>
|
||||
<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>
|
||||
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-input
|
||||
v-model="questionForm[qs.Id]"
|
||||
<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)})"
|
||||
>
|
||||
@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>
|
||||
|
|
@ -88,109 +69,53 @@
|
|||
</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
|
||||
<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)})"
|
||||
>
|
||||
@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
|
||||
|
|
@ -904,35 +832,41 @@ export default {
|
|||
::v-deep .el-form-item__label {
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__inner {
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-input.is-disabled .el-input__inner {
|
||||
background-color: #646464a1;
|
||||
}
|
||||
|
||||
::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-width2 {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -8,22 +8,17 @@
|
|||
<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">
|
||||
|
|
@ -32,34 +27,36 @@
|
|||
{{ 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')}">
|
||||
<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;">
|
||||
|
|
@ -70,35 +67,27 @@
|
|||
<div v-if="item.TableQuestions.Answers[i].lesionState" style="margin-left:10px;">
|
||||
{{ $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) {
|
||||
|
|
@ -805,15 +797,18 @@ export default {
|
|||
|
||||
.container {
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h3 {
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
|
|
@ -822,6 +817,7 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -829,6 +825,7 @@ export default {
|
|||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -838,6 +835,7 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
|
@ -849,17 +847,21 @@ export default {
|
|||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.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;
|
||||
color: #ddd;
|
||||
|
|
@ -868,10 +870,12 @@ export default {
|
|||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
position: absolute;
|
||||
|
|
@ -888,4 +892,3 @@ export default {
|
|||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
|
|
|||
|
|
@ -6,9 +6,7 @@
|
|||
>
|
||||
{{ 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 }}
|
||||
</h4>
|
||||
|
|
@ -18,35 +16,43 @@
|
|||
|
||||
<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']},
|
||||
: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;">
|
||||
|
||||
<el-input
|
||||
v-if="question.Type==='calculation'"
|
||||
v-model="questionForm[question.Id]"
|
||||
disabled
|
||||
style="width: 130px;"
|
||||
>
|
||||
<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-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-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]"
|
||||
: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"
|
||||
/>
|
||||
: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"
|
||||
/>
|
||||
<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
|
||||
v-else-if="question.Type==='calculation'"
|
||||
v-model="questionForm[question.Id]"
|
||||
disabled
|
||||
>
|
||||
<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"
|
||||
<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"
|
||||
>
|
||||
: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>
|
||||
|
|
@ -482,25 +395,32 @@ export default {
|
|||
.mb {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
::v-deep .el-upload--picture-card {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.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-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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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(() => {
|
||||
|
|
|
|||
|
|
@ -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="[
|
||||
<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
|
||||
<el-select v-model="questionForm.LesionType" filterable
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask"
|
||||
@change="((val)=>{lesionTypeChange(val)})"
|
||||
>
|
||||
@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'">
|
||||
<!-- {{ ((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]"
|
||||
<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)})"
|
||||
>
|
||||
@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)) }} -->
|
||||
|
||||
</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)})"
|
||||
>
|
||||
@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"
|
||||
/>
|
||||
<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"
|
||||
/>
|
||||
<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 => {
|
||||
|
|
@ -1504,38 +1430,46 @@ export default {
|
|||
::v-deep .el-form-item__label {
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__inner {
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-input.is-disabled .el-input__inner {
|
||||
background-color: #646464a1;
|
||||
}
|
||||
|
||||
::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-width2 {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -8,18 +8,17 @@
|
|||
<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">
|
||||
|
|
@ -30,48 +29,56 @@
|
|||
<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) }}
|
||||
<!-- 未保存 -->
|
||||
<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)) }}
|
||||
</span>
|
||||
|
|
@ -82,45 +89,42 @@
|
|||
{{ $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) {
|
||||
|
|
@ -1065,15 +1072,18 @@ export default {
|
|||
|
||||
.container {
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h3 {
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
|
|
@ -1082,6 +1092,7 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -1089,6 +1100,7 @@ export default {
|
|||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -1098,6 +1110,7 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
|
@ -1109,17 +1122,21 @@ export default {
|
|||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.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;
|
||||
color: #ddd;
|
||||
|
|
@ -1128,10 +1145,12 @@ export default {
|
|||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
position: absolute;
|
||||
|
|
|
|||
|
|
@ -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="[
|
||||
<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
|
||||
<el-select v-model="questionForm.LesionType" filterable
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask"
|
||||
@change="((val)=>{lesionTypeChange(val)})"
|
||||
>
|
||||
@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]"
|
||||
<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)})"
|
||||
>
|
||||
@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)})"
|
||||
>
|
||||
@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"
|
||||
/>
|
||||
<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"
|
||||
/>
|
||||
<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 => {
|
||||
|
|
@ -1186,38 +1112,46 @@ export default {
|
|||
::v-deep .el-form-item__label {
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__inner {
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-input.is-disabled .el-input__inner {
|
||||
background-color: #646464a1;
|
||||
}
|
||||
|
||||
::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-width2 {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -8,17 +8,16 @@
|
|||
<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">
|
||||
|
|
@ -29,46 +28,54 @@
|
|||
<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) }}
|
||||
<!-- 未保存 -->
|
||||
<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)) }}
|
||||
</span>
|
||||
|
|
@ -79,7 +86,8 @@
|
|||
{{ $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) {
|
||||
|
|
@ -994,15 +999,18 @@ export default {
|
|||
|
||||
.container {
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h3 {
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
|
|
@ -1011,6 +1019,7 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -1018,6 +1027,7 @@ export default {
|
|||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -1027,6 +1037,7 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
|
@ -1038,17 +1049,21 @@ export default {
|
|||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.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;
|
||||
color: #ddd;
|
||||
|
|
@ -1057,10 +1072,12 @@ export default {
|
|||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
position: absolute;
|
||||
|
|
|
|||
|
|
@ -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, {
|
||||
|
|
|
|||
|
|
@ -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 = {
|
||||
|
|
|
|||
|
|
@ -4,11 +4,9 @@
|
|||
<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)">
|
||||
<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>
|
||||
</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>
|
||||
|
|
@ -185,6 +158,9 @@ export default {
|
|||
DicomEvent.$off('getCustomTableQuestionAnswer')
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
async initList() {
|
||||
if (this.visitTaskId !== this.lastCanvasTaskId) {
|
||||
this.ecrfShow = true
|
||||
|
|
@ -466,16 +442,19 @@ export default {
|
|||
|
||||
.container {
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-direction: row-reverse;
|
||||
|
||||
h3 {
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
|
|
@ -484,6 +463,7 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -491,6 +471,7 @@ export default {
|
|||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -500,6 +481,7 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
|
@ -511,16 +493,20 @@ export default {
|
|||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.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;
|
||||
color: #ddd;
|
||||
|
|
@ -529,10 +515,12 @@ export default {
|
|||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
position: absolute;
|
||||
|
|
@ -547,6 +535,7 @@ export default {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
.questions-footer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
|
|
@ -558,12 +547,14 @@ export default {
|
|||
justify-content: right;
|
||||
align-items: center;
|
||||
height: 50px;
|
||||
|
||||
.feedback-icon {
|
||||
padding: 0 10px;
|
||||
color: #fff;
|
||||
font-weight: 400;
|
||||
font-size: 24px;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
color: #68a2d5;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -122,18 +122,22 @@
|
|||
<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) }" />
|
||||
<!-- 自增 -->
|
||||
<el-input v-if="question.Type === 'increment'" v-model="questionForm[question.Id]" disabled />
|
||||
<!-- :precision="2" :step="0.1" :max="10" -->
|
||||
<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-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) :
|
||||
<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>
|
||||
|
|
@ -142,7 +146,8 @@
|
|||
@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) :
|
||||
<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>
|
||||
|
|
@ -151,10 +156,19 @@
|
|||
@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) :
|
||||
<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();
|
||||
},
|
||||
|
|
|
|||
|
|
@ -71,12 +71,14 @@
|
|||
{{ item.trim() }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
<!-- 自增 -->
|
||||
<el-input v-if="question.Type === 'increment'" v-model="questionForm[question.Id]" disabled />
|
||||
<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 />
|
||||
<!-- 自增 -->
|
||||
<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
|
||||
|
|
@ -101,6 +103,15 @@
|
|||
<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();
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
@ -287,10 +276,12 @@ export default {
|
|||
width: 7px;
|
||||
height: 7px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
border-radius: 10px;
|
||||
background: #d0d0d0;
|
||||
}
|
||||
|
||||
.tabContent {
|
||||
height: 300px;
|
||||
overflow-y: auto;
|
||||
|
|
|
|||
|
|
@ -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 });
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 = {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
<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 }}
|
||||
</h4>
|
||||
|
|
@ -10,188 +8,108 @@
|
|||
<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']},
|
||||
: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>
|
||||
<div style="display: flex;justify-content: space-between;"
|
||||
v-else-if="question.Type === 'number' || question.Type === 'calculation'">
|
||||
<!-- 数值 -->
|
||||
<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 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
|
||||
v-else-if="question.Type==='calculation'"
|
||||
v-model="questionForm[question.Id]"
|
||||
disabled
|
||||
>
|
||||
<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) {
|
||||
|
|
@ -296,30 +210,37 @@ export default {
|
|||
.mb {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
::v-deep .el-upload--picture-card {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.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-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-radio__input.is-disabled.is-checked .el-radio__inner {
|
||||
// background-color: #428bca;
|
||||
// border-color: #428bca;
|
||||
// }
|
||||
</style>
|
||||
// }</style>
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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="[
|
||||
<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
|
||||
<el-select v-model="qsForm.LesionType" filterable
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask"
|
||||
@change="((val)=>{lesionTypeChange(val)})"
|
||||
>
|
||||
@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="qsForm[qs.Id]"
|
||||
<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)})"
|
||||
>
|
||||
@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>
|
||||
|
||||
</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)})"
|
||||
>
|
||||
@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'">
|
||||
|
||||
<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"
|
||||
/>
|
||||
<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 })
|
||||
},
|
||||
|
|
@ -320,38 +265,46 @@ export default {
|
|||
::v-deep .el-form-item__label {
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__inner {
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-input.is-disabled .el-input__inner {
|
||||
background-color: #646464a1;
|
||||
}
|
||||
|
||||
::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-width2 {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -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, {
|
||||
|
|
|
|||
|
|
@ -148,12 +148,20 @@
|
|||
@change="(val) => { formItemNumberChange(val, question) }" />
|
||||
<!-- 自动计算 -->
|
||||
<!-- :precision="2" :step="0.1" :max="10" -->
|
||||
<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) }"
|
||||
|
|
|
|||
|
|
@ -75,8 +75,18 @@
|
|||
</el-radio-group>
|
||||
<!-- 自动计算 -->
|
||||
<!-- :precision="2" :step="0.1" :max="10" -->
|
||||
<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 />
|
||||
<!-- 数值 -->
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
<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 }}
|
||||
</h4>
|
||||
|
|
@ -10,188 +8,108 @@
|
|||
<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']},
|
||||
: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>
|
||||
<div style="display: flex;justify-content: space-between;"
|
||||
v-else-if="question.Type === 'number' || question.Type === 'calculation'">
|
||||
<!-- 数值 -->
|
||||
<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 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
|
||||
v-else-if="question.Type==='calculation'"
|
||||
v-model="questionForm[question.Id]"
|
||||
disabled
|
||||
>
|
||||
<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)
|
||||
|
|
@ -295,30 +209,37 @@ export default {
|
|||
.mb {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
::v-deep .el-upload--picture-card {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.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-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-radio__input.is-disabled.is-checked .el-radio__inner {
|
||||
// background-color: #428bca;
|
||||
// border-color: #428bca;
|
||||
// }
|
||||
</style>
|
||||
// }</style>
|
||||
|
|
|
|||
|
|
@ -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;"
|
||||
>
|
||||
<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;"
|
||||
<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') : ''"
|
||||
>
|
||||
: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="font-size: 11px;width:220px;height: 30px;">
|
||||
<div
|
||||
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart"
|
||||
: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"
|
||||
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 {
|
||||
|
|
@ -1964,15 +1936,18 @@ export default {
|
|||
|
||||
.container {
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h3 {
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
|
|
@ -1981,16 +1956,19 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.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 {
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
|
|
@ -2003,27 +1981,33 @@ export default {
|
|||
justify-content: flex-start;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
::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 {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
|
||||
.feedback-icon {
|
||||
padding: 0 10px;
|
||||
color: #fff;
|
||||
font-weight: 400;
|
||||
font-size: 22px;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
color: #68a2d5;
|
||||
}
|
||||
|
|
@ -2031,6 +2015,7 @@ export default {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
.title {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -2038,6 +2023,7 @@ export default {
|
|||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
|
|
@ -2047,6 +2033,7 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
|
@ -2058,17 +2045,21 @@ export default {
|
|||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.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;
|
||||
color: #ddd;
|
||||
|
|
@ -2077,10 +2068,12 @@ export default {
|
|||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
position: absolute;
|
||||
|
|
|
|||
|
|
@ -9,45 +9,31 @@
|
|||
<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="[
|
||||
<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
|
||||
<el-select v-model="qsForm.LesionType" filterable
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask"
|
||||
@change="((val)=>{lesionTypeChange(val)})"
|
||||
>
|
||||
@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']},
|
||||
]"
|
||||
>
|
||||
<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-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 }}
|
||||
|
|
@ -55,122 +41,80 @@
|
|||
|
||||
<!-- 输入框 -->
|
||||
<template v-if="qs.Type === 'input' || qs.Type === 'number'">
|
||||
|
||||
<el-input
|
||||
v-if="qs.Type==='input' || qs.Type==='number'"
|
||||
v-model="qsForm[qs.Id]"
|
||||
<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)})"
|
||||
>
|
||||
@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>
|
||||
|
||||
</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)})"
|
||||
>
|
||||
@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'">
|
||||
|
||||
<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"
|
||||
/>
|
||||
<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 })
|
||||
},
|
||||
|
|
@ -328,38 +275,46 @@ export default {
|
|||
::v-deep .el-form-item__label {
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__inner {
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-input.is-disabled .el-input__inner {
|
||||
background-color: #646464a1;
|
||||
}
|
||||
|
||||
::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-width2 {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue