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

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

View File

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

View File

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

View File

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

View File

@ -1,12 +1,6 @@
<template> <template>
<el-form <el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
v-if="isRender" class="measurement-form">
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -19,179 +13,118 @@
</div> </div>
</div> </div>
<el-form-item <el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] }, { required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]" ]">
>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select v-model="questionForm.LesionType" filterable
v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState >= 2 || (!isBaseLineTask && !(isFirstChangeTask && (lesionType === 2 || lesionType === 5 || lesionType === 6)))" :disabled="!isCurrentTask || readingTaskState >= 2 || (!isBaseLineTask && !(isFirstChangeTask && (lesionType === 2 || lesionType === 5 || lesionType === 6)))"
@change="((val)=>{lesionTypeChange(val)})" @change="((val) => { lesionTypeChange(val) })">
>
<el-option <el-option v-for="item of $d.LesionType"
v-for="item of $d.LesionType"
v-show="(isBaseLineTask && (item.value === 0 || item.value === 1)) || (!isBaseLineTask && ((isFirstChangeTask && (item.value === 5 || item.value === 6)) || !isFirstChangeTask))" v-show="(isBaseLineTask && (item.value === 0 || item.value === 1)) || (!isBaseLineTask && ((isFirstChangeTask && (item.value === 5 || item.value === 6)) || !isFirstChangeTask))"
:key="item.id" :key="item.id" :value="item.value" :label="item.label" />
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
v-for="qs in questions" :prop="qs.Id" :rules="[
v-show="qs.ShowQuestion!==2" {
:key="qs.Id" 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',
:label="`${qs.QuestionName}`" message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
:prop="qs.Id" },
:rules="[ ]">
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type!=='group' && qs.Type!=='summary',
message:['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur','change']},
]"
>
<!-- 输入框 --> <!-- 输入框 -->
<template v-if="qs.Type === 'input' || qs.Type === 'number'"> <template v-if="qs.Type === 'input' || qs.Type === 'number'">
<el-input <div style="display: flex;justify-content: space-between;">
v-if="qs.Type==='input' || qs.Type==='number'" <el-input v-if="qs.Type === 'input' || qs.Type === 'number'" v-model="questionForm[qs.Id]"
v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || (isFirstChangeTask && (lesionType === 5 || lesionType === 6) && (qs.QuestionMark === 8 || qs.QuestionMark === 10))" :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"> <template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </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>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input <el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
v-if="qs.Type==='textarea'" :autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
v-model="questionForm[qs.Id]" @change="((val) => { formItemChange(val, qs) })" />
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2 "
@change="((val)=>{formItemChange(val, qs)})"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select v-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
:placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')" :placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 7 && isFirstChangeTask) || (qs.QuestionMark === 8 && isFirstChangeTask)" :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> <template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;"> <span style="padding-left: 5px;">
<i class="el-icon-search" /> <i class="el-icon-search" />
</span> </span>
</template> </template>
<template v-if="qs.TableQuestionType === 1"> <template v-if="qs.TableQuestionType === 1">
<el-option <el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
v-for="item in organList" :value="item[qs.DataTableColumn]" />
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]"
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)" v-show="((lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id" :key="item.id" :value="item.value" :label="item.label" />
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isFirstChangeTask && (lesionType === 5 || lesionType ===6)"> <template
<el-option v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isFirstChangeTask && (lesionType === 5 || lesionType === 6)">
v-for="item of $d[qs.DictionaryCode]" <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)" v-show="((lesionType === 5 && item.value === 1) || (lesionType === 6 && (item.value === 0))) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id" :key="item.id" :value="item.value" :label="item.label" />
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group <el-option-group
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answers.LastTaskState))}` : ''" :label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answers.LastTaskState))}` : ''">
>
<!-- 首次分裂的病灶只能选择存在 --> <!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'"> <template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]"
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)" 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" :key="item.id" :value="item.value" :label="item.label" />
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="isCurrentTaskAdd === 'True' && (lesionType === 2 || lesionType === 8)"> <template v-else-if="isCurrentTaskAdd === 'True' && (lesionType === 2 || lesionType === 8)">
<!-- 首次添加的新病灶不能为无法评估和消失 --> <!-- 首次添加的新病灶不能为无法评估和消失 -->
<el-option <el-option v-for="item of $d[qs.DictionaryCode]"
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)" 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" :key="item.id" :value="item.value" :label="item.label" />
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="isCurrentTaskAdd === 'False' && lesionType === 1 && answers.LastTaskState !== '4'"> <template v-else-if="isCurrentTaskAdd === 'False' && lesionType === 1 && answers.LastTaskState !== '4'">
<el-option <el-option v-for="item of filterState($d[qs.DictionaryCode])"
v-for="item of filterState($d[qs.DictionaryCode])"
v-show="(item.value !== 5) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)" v-show="(item.value !== 5) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id" :key="item.id" :value="item.value" :label="item.label" />
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="item of filterState($d[qs.DictionaryCode])"
v-for="item of filterState($d[qs.DictionaryCode])" v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1" :key="item.id"
v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1" :value="item.value" :label="item.label" />
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]"
v-for="item of $d[qs.DictionaryCode]" v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1" :key="item.id"
v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1" :value="item.value" :label="item.label" />
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.TypeValue"> <template v-else-if="qs.TypeValue">
<el-option <el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group <el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
v-if="qs.Type==='radio'" :disabled="!isCurrentTask || readingTaskState >= 2">
v-model="questionForm[qs.id]" <el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
@ -199,33 +132,21 @@
</div> </div>
<div <div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
v-if="isCurrentTask && readingTaskState<2" style="text-align:right;margin-top:10px;">
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button <el-button
v-if="questionForm.MeasureData && (!isFirstChangeTask || (isFirstChangeTask && (lesionType === 5 || lesionType === 6)))" v-if="questionForm.MeasureData && (!isFirstChangeTask || (isFirstChangeTask && (lesionType === 5 || lesionType === 6)))"
size="mini" size="mini" @click="handleDeleteMeasureData">
@click="handleDeleteMeasureData"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button v-if="!isFirstChangeTask && isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete">
v-if="!isFirstChangeTask && isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button v-if="(isFirstChangeTask && (lesionType === 5 || lesionType === 6)) || !isFirstChangeTask" size="mini"
v-if="(isFirstChangeTask && (lesionType === 5 || lesionType === 6)) || !isFirstChangeTask" @click="handleSave">
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -330,6 +251,9 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal') DicomEvent.$off('handleImageQualityAbnormal')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initForm() { async initForm() {
const loading = this.$loading({ fullscreen: true }) const loading = this.$loading({ fullscreen: true })
this.questions.forEach(item => { this.questions.forEach(item => {
@ -2171,38 +2095,46 @@ export default {
::v-deep .el-form-item__label { ::v-deep .el-form-item__label {
color: #c3c3c3; color: #c3c3c3;
} }
::v-deep .el-input .el-input__inner { ::v-deep .el-input .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item { ::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
} }
::v-deep .el-form-item__content { ::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-input.is-disabled .el-input__inner { ::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-select.is-disabled .el-input__inner { ::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
.el-form-item__content
.el-select{ .el-form-item__content .el-select {
width: 100%; width: 100%;
} }
.input-width1 { .input-width1 {
width: calc(100% - 60px) !important; width: calc(100% - 60px) !important;
} }
.input-width2 { .input-width2 {
width: 100% !important; width: 100% !important;
} }
} }
</style> </style>

View File

@ -8,22 +8,17 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
<i placement="bottom">
class="el-icon-refresh-left" <i class="el-icon-refresh-left" @click="resetMeasuredData" />
@click="resetMeasuredData"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
<!-- 非测量问题 --> <!-- 非测量问题 -->
<div class="lesions"> <div class="lesions">
<Questions <Questions ref="ecrf" :question-form-change-state="questionFormChangeState"
ref="ecrf" :question-form-change-num="questionFormChangeNum" :is-first-change-task="isFirstChangeTask"
:question-form-change-state="questionFormChangeState" @handleReadingChart="handleReadingChart" />
:question-form-change-num="questionFormChangeNum"
:is-first-change-task="isFirstChangeTask"
/>
</div> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
<template v-if="questions.length > 0"> <template v-if="questions.length > 0">
@ -32,19 +27,28 @@
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }} {{ language === 'en' ? qs.GroupEnName : qs.GroupName }}
</h4> </h4>
<div class="lesion_list"> <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="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div <div v-if="isFirstChangeTask && item.LesionType === 2 && readingTaskState < 2" class="title">
v-if="isFirstChangeTask && item.LesionType === 2 && readingTaskState<2"
class="title"
>
{{ item.QuestionName }} {{ 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>
<div v-else class="title"> <div v-else class="title">
{{ item.QuestionName }} {{ 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>
<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" /> <i class="el-icon-plus" />
</div> </div>
@ -52,45 +56,41 @@
111 111
</div> --> </div> -->
</div> </div>
<el-collapse <el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
v-if="item.Type === 'table' && item.TableQuestions" @change="handleCollapseChange">
v-model="activeName" <el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)" @contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
>
<template slot="title"> <template slot="title">
<div <div style="width:300px;position: relative;"
style="width:300px;position: relative;" :style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
:style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}"
>
{{ getLesionName(item.OrderMark, q.RowIndex) }} {{ getLesionName(item.OrderMark, q.RowIndex) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 信息不完整 --> <!-- 信息不完整 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;left: 62px;top: 2px;"> <div style="position: absolute;left: 62px;top: 2px;">
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; --> <!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
<div style="font-size: 11px;width:220px;height: 30px;"> <div style="font-size: 11px;width:220px;height: 30px;">
<div <div v-if="item.TableQuestions.Answers[i].lesionPart"
v-if="item.TableQuestions.Answers[i].lesionPart" style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px">
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px" <el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark"
> :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<span>{{ item.TableQuestions.Answers[i].lesionPart }}</span> <span>{{ item.TableQuestions.Answers[i].lesionPart }}</span>
</el-tooltip> </el-tooltip>
</div> </div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px"> <div
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
<span v-if="item.LesionType === 0"> <span v-if="item.LesionType === 0">
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
@ -107,54 +107,55 @@
{{ $fd('NewNoTargetLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NewNoTargetLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
<span v-else-if="item.LesionType === 7"> <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>
<span v-else-if="item.LesionType === 8"> <span v-else-if="item.LesionType === 8">
{{ $fd('NewLesionAfterTriggeringiRECSITState',parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{
$fd('NewLesionAfterTriggeringiRECSITState',
parseInt(item.TableQuestions.Answers[i].lesionState))
}}
</span> </span>
</div> </div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px"> <div
<template v-if="item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionShort))"> 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 {{ item.TableQuestions.Answers[i].lesionShort }}mm
</template> </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 {{ item.TableQuestions.Answers[i].lesionLength }}mm
</template> </template>
</div> </div>
</div> </div>
</div> </div>
<div v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0,1,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"> <el-tooltip
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" /> 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> </el-tooltip>
</div> </div>
</div> </div>
</template> </template>
<QuestionForm <QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:ref="`${item.Id}_${q.RowIndex}`" :answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:questions="item.TableQuestions.Questions" :order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
:answers="item.TableQuestions.Answers[i]" :question-name="item.QuestionName" :parent-qs-id="item.Id"
:lesion-type="item.LesionType" :crterion-dictionary-group="item.CrterionDictionaryGroup" :visit-task-id="visitTaskId"
:order-mark="item.OrderMark" :is-current-task="isCurrentTask" :is-first-change-task="isFirstChangeTask"
:table-questions="tableQuestions" :is-converted-task="isConvertedTask" :reading-task-state="readingTaskState"
:row-index="String(q.RowIndex)" :is-base-line-task="isBaseLineTask" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
:question-name="item.QuestionName" @determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
:parent-qs-id="item.Id" @close="close" @handleReadingChart="handleReadingChart" />
: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"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -275,6 +276,9 @@ export default {
DicomEvent.$off('getUnSaveTarget') DicomEvent.$off('getUnSaveTarget')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -1183,15 +1187,18 @@ export default {
.container { .container {
padding: 10px; padding: 10px;
.basic-info { .basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3 { h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i { i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
@ -1200,6 +1207,7 @@ export default {
} }
} }
} }
.title { .title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -1207,6 +1215,7 @@ export default {
font-size: 15px; font-size: 15px;
} }
.add-icon { .add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -1216,6 +1225,7 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover { .add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
@ -1227,17 +1237,21 @@ export default {
background-color: #424242; background-color: #424242;
} }
.lesion_list { .lesion_list {
position: relative; position: relative;
} }
.el-collapse { .el-collapse {
border-bottom: none; border-bottom: none;
border-top: none; border-top: none;
::v-deep .el-collapse-item { ::v-deep .el-collapse-item {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header { ::v-deep .el-collapse-item__header {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
@ -1246,10 +1260,12 @@ export default {
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap { ::v-deep .el-collapse-item__wrap {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content { ::v-deep .el-collapse-item__content {
width: 260px; width: 260px;
position: absolute; position: absolute;

View File

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

View File

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

View File

@ -1,12 +1,6 @@
<template> <template>
<el-form <el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
v-if="isRender" class="measurement-form">
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -19,198 +13,135 @@
</div> </div>
</div> </div>
<div ref="scrollPanel" style="height: 420px;overflow-y: auto;overflow-x: hidden;" @scroll.stop="scrollHandle"> <div ref="scrollPanel" style="height: 420px;overflow-y: auto;overflow-x: hidden;" @scroll.stop="scrollHandle">
<el-form-item <el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] }, { required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]" ]">
>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select :ref="`select_LesionType`" v-model="questionForm.LesionType" filterable
:ref="`select_LesionType`"
v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask || answers.SplitOrMergeType === '1'" :disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask || answers.SplitOrMergeType === '1'"
@change="((val)=>{lesionTypeChange(val)})" @change="((val) => { lesionTypeChange(val) })">
>
<el-option <el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
v-for="item of $d.LesionType" :value="item.value" :label="item.label" />
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
v-for="qs in questions" :prop="qs.Id" :rules="[
v-show="qs.ShowQuestion!==2" {
:key="qs.Id" 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',
:label="`${qs.QuestionName}`" message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
:prop="qs.Id" },
:rules="[ ]">
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (qs.RelevanceValue.includes(questionForm[qs.RelevanceId]))) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type!=='group' && qs.Type!=='summary',
message:['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur','change']},
]"
>
<!-- 输入框 --> <!-- 输入框 -->
<template v-if="qs.Type === 'input' || qs.Type === 'number'"> <template v-if="qs.Type === 'input' || qs.Type === 'number'">
<!-- {{ ((qs.QuestionMark === 6 && isCurrentTaskAdd === 'False') || (qs.QuestionMark === 6 && isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition)) }} --> <div style="display: flex;justify-content: space-between;">
<el-input <el-input v-if="qs.Type === 'input' || qs.Type === 'number'" v-model="questionForm[qs.Id]"
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'" :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"> <template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </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> </template>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input <el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
v-if="qs.Type==='textarea'" :autosize="{ minRows: 2, maxRows: 4 }" maxlength="500"
v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="!isCurrentTask || readingTaskState >= 2 || answers.SplitOrMergeType === '1'" :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')" --> <!-- :disabled="!isCurrentTask || readingTaskState>=2 || (!isBaseLineTask && qs.QuestionMark === 5 && isCurrentTaskAdd === 'False') || qs.QuestionMark === 2 || (qs.QuestionMark === 8 && !isBaseLineTask && isCurrentTaskAdd === 'False')" -->
<el-select <el-select v-if="qs.Type === 'select'" :ref="`select_${qs.Id}`" v-model="questionForm[qs.Id]" filterable
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')" :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')" :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> <template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;"> <span style="padding-left: 5px;">
<i class="el-icon-search" /> <i class="el-icon-search" />
</span> </span>
</template> </template>
<template v-if="qs.TableQuestionType === 1"> <template v-if="qs.TableQuestionType === 1">
<el-option <el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
v-for="item in organList" :value="item[qs.DataTableColumn]" />
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]"
v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))" v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))"
:key="item.id" :key="item.id" :value="item.value" :label="item.label" />
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group <el-option-group
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answers.LastTaskState))}` : ''" :label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answers.LastTaskState))}` : ''">
>
<!-- 首次分裂的病灶只能选择存在 --> <!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'"> <template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0" :key="item.id"
v-for="item of $d[qs.DictionaryCode]" :value="item.value" :label="item.label" />
v-show="item.value === 0"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<!-- 首次添加的新病灶不能为无法评估和消失 --> <!-- 首次添加的新病灶不能为无法评估和消失 -->
<template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2"> <template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0 || item.value === 1"
v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-show="item.value === 0 || item.value === 1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="item of filterState($d[qs.DictionaryCode])" :key="item.id" :value="item.value"
v-for="item of filterState($d[qs.DictionaryCode])" :label="item.label" />
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group <el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
v-if="qs.Type==='radio'" :disabled="!isCurrentTask || readingTaskState >= 2 || answers.SplitOrMergeType === '1'">
v-model="questionForm[qs.id]" <el-radio v-for="val in qs.options.split('|')" :key="val" :label="val"
:disabled="!isCurrentTask || readingTaskState>=2 || answers.SplitOrMergeType === '1'" @change="((val) => { formItemChange(val, qs) })">
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
@change="((val)=>{formItemChange(val, qs)})"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
<template v-if="qs.QuestionMark === 20"> <template v-if="qs.QuestionMark === 20">
<div style="display: flex;flex-direction: row;justify-content: flex-start;"> <div style="display: flex;flex-direction: row;justify-content: flex-start;">
<div style="display: flex;justify-content: space-between;" v-if="qs.Type === 'calculation'">
<el-input <el-input v-if="qs.Type === 'calculation'" v-model="questionForm[qs.Id]" disabled style="width:120px;"
v-if="qs.Type==='calculation'" @change="((val) => { formItemChange(val, qs) })">
v-model="questionForm[qs.Id]"
disabled
style="width:120px;"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.Unit" slot="append"> <template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </el-input>
<viewer <svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
v-if="answers.OtherPicturePath" @click.stop="(e) => handleReadingChart({
ref="viewer" e,
style="margin:0 10px;" data: {
:images="[`${OSSclientConfig.basePath}${answers.OtherPicturePath}`]" 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()"> <span style="color:#409eff;cursor: pointer" @click="previewImage()">
{{ $t('trials:lugano:button:suvscreenshot1') }} {{ $t('trials:lugano:button:suvscreenshot1') }}
</span> </span>
<img <img v-show="false" crossorigin="anonymous"
v-show="false" :src="`${OSSclientConfig.basePath}${answers.OtherPicturePath}`" alt="Image">
crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${answers.OtherPicturePath}`"
alt="Image"
>
</viewer> </viewer>
<!-- <img <!-- <img
v-if="answers.OtherPicturePath" v-if="answers.OtherPicturePath"
@ -226,45 +157,39 @@
</div> </div>
</template> </template>
<template v-else> <template v-else>
<el-input <div style="display: flex;justify-content: space-between;" v-if="qs.Type === 'calculation'">
v-if="qs.Type==='calculation'" <el-input v-if="qs.Type === 'calculation'" v-model="questionForm[qs.Id]" disabled
v-model="questionForm[qs.Id]" @change="((val) => { formItemChange(val, qs) })">
disabled
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.Unit" slot="append"> <template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </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>
</el-form-item> </el-form-item>
</div> </div>
<div <div
v-if="isCurrentTask && readingTaskState < 2 && (answers.SplitOrMergeType !== '1' && answers.SplitOrMergeType !== '3')" v-if="isCurrentTask && readingTaskState < 2 && (answers.SplitOrMergeType !== '1' && answers.SplitOrMergeType !== '3')"
class="base-dialog-footer" class="base-dialog-footer" style="text-align:right;margin-top:10px;">
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button <el-button v-if="questionForm.MeasureData" size="mini" @click="handleDeleteMeasureData">
v-if="questionForm.MeasureData"
size="mini"
@click="handleDeleteMeasureData"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete">
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button size="mini" @click="handleSave">
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -368,6 +293,9 @@ export default {
// container.removeEventListener('scroll', this.scrollHandle , true) // container.removeEventListener('scroll', this.scrollHandle , true)
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
scrollHandle() { scrollHandle() {
for (const k in this.$refs) { for (const k in this.$refs) {
if (k.indexOf('select_') === -1) continue if (k.indexOf('select_') === -1) continue
@ -1841,47 +1769,58 @@ export default {
::v-deep .el-form-item__label { ::v-deep .el-form-item__label {
color: #c3c3c3; color: #c3c3c3;
} }
::v-deep .el-input .el-input__inner { ::v-deep .el-input .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item { ::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
flex-wrap: wrap; flex-wrap: wrap;
} }
::v-deep .el-form-item__content { ::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-input.is-disabled .el-input__inner { ::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-input-group__append, .el-input-group__prepend{
::v-deep .el-input-group__append,
.el-input-group__prepend {
padding: 0 10px; padding: 0 10px;
} }
::v-deep .el-select.is-disabled .el-input__inner { ::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
.el-form-item__content
.el-select{ .el-form-item__content .el-select {
width: 100%; width: 100%;
} }
.input-width1 { .input-width1 {
width: calc(100% - 60px) !important; width: calc(100% - 60px) !important;
} }
.input-width2 { .input-width2 {
width: 100% !important; width: 100% !important;
} }
.suv_viewer { .suv_viewer {
::v-deep .viewer-play { ::v-deep .viewer-play {
display: none; display: none;
} }
} }
} }
</style> </style>

View File

@ -8,11 +8,9 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
<i placement="bottom">
class="el-icon-refresh-left" <i class="el-icon-refresh-left" @click="resetMeasuredData" />
@click="resetMeasuredData"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
@ -25,13 +23,8 @@
:question-form-change-num="questionFormChangeNum" :question-form-change-num="questionFormChangeNum"
:group-classify="1" :group-classify="1"
/> --> /> -->
<Questions <Questions ref="ecrf" :question-form-change-state="true" :question-form-change-num="0" :is-qulity-issues="false"
ref="ecrf" :group-classify="1" @handleReadingChart="handleReadingChart" />
:question-form-change-state="true"
:question-form-change-num="0"
:is-qulity-issues="false"
:group-classify="1"
/>
</div> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
<template v-if="questions.length > 0 && CriterionType !== 10"> <template v-if="questions.length > 0 && CriterionType !== 10">
@ -42,50 +35,67 @@
<div class="lesion_list"> <div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id"> <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 v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div> <div class="title">{{ item.QuestionName }}
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)"> <svg-icon v-if="item.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" /> <i class="el-icon-plus" />
</div> </div>
</div> </div>
<!-- @change="handleCollapseChange(qs.Childrens,item)" --> <!-- @change="handleCollapseChange(qs.Childrens,item)" -->
<el-collapse <el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
v-if="item.Type === 'table' && item.TableQuestions" @change="handleCollapseChange">
v-model="activeName" <el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)" @contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
>
<template slot="title"> <template slot="title">
<div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}"> <div style="width:300px;position: relative;"
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
{{ getLesionName(item.OrderMark, q.RowIndex) }} {{ getLesionName(item.OrderMark, q.RowIndex) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 信息不完整 --> <!-- 信息不完整 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div :style="{position: 'absolute',left: 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; --> <!-- 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;"> <div
<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"> 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;">
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'"> <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" /> <span class="login-cycle" />
</div> </div>
</el-tooltip> </el-tooltip>
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '4'"> <div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '4'">
<span class="login-cycle" /> <span class="login-cycle" />
</div> </div>
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom"> <el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark"
<div v-if="item.TableQuestions.Answers[i].lesionPart" style="max-width: 100px;overflow: hidden;"> :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 }} {{ item.TableQuestions.Answers[i].lesionPart }}
</div> </div>
</el-tooltip> </el-tooltip>
@ -99,47 +109,46 @@
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div> </div>
<div v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))"> <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"> <el-tooltip class="item" effect="dark"
<span>{{ item.TableQuestions.Answers[i].lesionLength }}*{{ item.TableQuestions.Answers[i].lesionShort }}m</span> :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> </el-tooltip>
</div> </div>
</div> </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"> <el-tooltip
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" /> 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>
<!-- 融合 --> <!-- 融合 -->
<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"> <el-tooltip
<i class="iconfont icon-24gl-merge" style="color:#fff;font-size: 16px;" @click.stop="handleMerge(item.TableQuestions.Answers[i],item.Id,item.OrderMark)" /> 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> </el-tooltip>
</div> </div>
</div> </div>
</template> </template>
<QuestionForm <QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:ref="`${item.Id}_${q.RowIndex}`" :answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:questions="item.TableQuestions.Questions" :order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
:answers="item.TableQuestions.Answers[i]" :question-name="item.QuestionName" :parent-qs-id="item.Id" :visit-task-id="visitTaskId"
:lesion-type="item.LesionType" :is-current-task="isCurrentTask" :reading-task-state="readingTaskState"
:order-mark="item.OrderMark" :is-base-line-task="isBaseLineTask" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
:table-questions="tableQuestions" @determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
:row-index="String(q.RowIndex)" @close="close" @handleReadingChart="handleReadingChart" />
:question-name="item.QuestionName"
:parent-qs-id="item.Id"
:visit-task-id="visitTaskId"
:is-current-task="isCurrentTask"
:reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -149,35 +158,15 @@
</template> </template>
<!-- <el-divider /> --> <!-- <el-divider /> -->
<!-- 肝脏评估 --> <!-- 肝脏评估 -->
<Questions <Questions ref="ecrf2" :question-form-change-state="true" :question-form-change-num="0" :group-classify="2"
ref="ecrf2" :is-qulity-issues="false" style="margin-top:20px" :question-type="6"
:question-form-change-state="true" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" />
:question-form-change-num="0"
:group-classify="2"
:is-qulity-issues="false"
style="margin-top:20px"
:question-type="6"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
/>
<!-- 脾脏评估 --> <!-- 脾脏评估 -->
<Questions <Questions ref="ecrf3" :question-form-change-state="true" :question-form-change-num="0" :group-classify="3"
ref="ecrf3" :is-qulity-issues="false" :question-type="7" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" />
:question-form-change-state="true"
:question-form-change-num="0"
:group-classify="3"
:is-qulity-issues="false"
:question-type="7"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
/>
</div> </div>
<el-dialog <el-dialog v-if="merge.visible" v-loading="merge.loading" :visible.sync="merge.visible"
v-if="merge.visible" :close-on-click-modal="false" :title="$t('trials:reading:lugano:message:merge')" width="500px">
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-table">
<div class="merge-label"> <div class="merge-label">
<label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label> <label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label>
@ -185,40 +174,19 @@
<span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span> <span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span>
</div> </div>
<div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div> <div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div>
<el-table <el-table :data="lesionData" style="width: 450px" size="small" height="200"
:data="lesionData" @selection-change="handleSelectionChange">
style="width: 450px" <el-table-column type="selection" width="45" />
size="small" <el-table-column prop="OrderMarkName" :label="$t('trials:reading:lugano:label:lesionNumber')" width="100" />
height="200" <el-table-column prop="Part" :label="$t('trials:reading:lugano:label:lesionLocation')" min-width="120"
@selection-change="handleSelectionChange" show-overflow-tooltip />
>
<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> </el-table>
</div> </div>
<div slot="footer" style="text-align:right;"> <div slot="footer" style="text-align:right;">
<!-- 取消 --> <!-- 取消 -->
<el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button> <el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button>
<!-- 确认 --> <!-- 确认 -->
<el-button <el-button type="primary" size="mini" :disabled="mergeList.length === 0" @click="confirmMerge">
type="primary"
size="mini"
:disabled="mergeList.length === 0"
@click="confirmMerge"
>
{{ $t('common:button:confirm') }}</el-button> {{ $t('common:button:confirm') }}</el-button>
</div> </div>
</el-dialog> </el-dialog>
@ -366,6 +334,9 @@ export default {
DicomEvent.$off('refreshQuestions') DicomEvent.$off('refreshQuestions')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -1346,17 +1317,21 @@ export default {
.measurement-wrapper { .measurement-wrapper {
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
.container { .container {
padding: 10px; padding: 10px;
.basic-info { .basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3 { h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i { i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
@ -1365,6 +1340,7 @@ export default {
} }
} }
} }
.title { .title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -1372,6 +1348,7 @@ export default {
font-size: 15px; font-size: 15px;
} }
.add-icon { .add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -1381,6 +1358,7 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover { .add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
@ -1392,9 +1370,11 @@ export default {
background-color: #424242; background-color: #424242;
} }
.lesion_list { .lesion_list {
position: relative; position: relative;
} }
.login-cycle { .login-cycle {
width: 5px; width: 5px;
height: 5px; height: 5px;
@ -1404,14 +1384,17 @@ export default {
margin-right: 2px; margin-right: 2px;
margin-bottom: 2px; margin-bottom: 2px;
} }
.el-collapse { .el-collapse {
border-bottom: none; border-bottom: none;
border-top: none; border-top: none;
::v-deep .el-collapse-item { ::v-deep .el-collapse-item {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header { ::v-deep .el-collapse-item__header {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
@ -1420,10 +1403,12 @@ export default {
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap { ::v-deep .el-collapse-item__wrap {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content { ::v-deep .el-collapse-item__content {
width: 260px; width: 260px;
position: absolute; position: absolute;
@ -1438,18 +1423,26 @@ export default {
} }
} }
.merge-table { .merge-table {
padding: 0 10px; padding: 0 10px;
::v-deep.el-table { ::v-deep.el-table {
background-color: #1e1e1e !important; background-color: #1e1e1e !important;
color: #383838; 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; 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; background-color: #1e1e1e;
} }
::v-deep.el-table__header-wrapper { ::v-deep.el-table__header-wrapper {
th { th {
background-color: #1e1e1e !important; background-color: #1e1e1e !important;
@ -1457,22 +1450,27 @@ export default {
border-bottom: 1px solid #383838; border-bottom: 1px solid #383838;
} }
} }
::v-deep.el-table__body-wrapper { ::v-deep.el-table__body-wrapper {
tr { tr {
background-color: #1e1e1e !important; background-color: #1e1e1e !important;
color: #dfdfdf; color: #dfdfdf;
} }
tr:hover>td { tr:hover>td {
background-color: #1e1e1e !important; background-color: #1e1e1e !important;
} }
} }
::v-deep.el-table__empty-block { ::v-deep.el-table__empty-block {
background-color: #1e1e1e !important; background-color: #1e1e1e !important;
} }
.merge-label { .merge-label {
color: #ddd; color: #ddd;
font-size: 13px; font-size: 13px;
margin-bottom: 10px; margin-bottom: 10px;
span { span {
font-size: 15px; font-size: 15px;
color: red; color: red;

View File

@ -1,12 +1,6 @@
<template> <template>
<el-form <el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
v-if="isRender" class="measurement-form">
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -19,198 +13,135 @@
</div> </div>
</div> </div>
<div ref="scrollPanel" style="height: 420px;overflow-y: auto;overflow-x: hidden;" @scroll.stop="scrollHandle"> <div ref="scrollPanel" style="height: 420px;overflow-y: auto;overflow-x: hidden;" @scroll.stop="scrollHandle">
<el-form-item <el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] }, { required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]" ]">
>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select :ref="`select_LesionType`" v-model="questionForm.LesionType" filterable
:ref="`select_LesionType`"
v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask || answers.SplitOrMergeType === '1'" :disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask || answers.SplitOrMergeType === '1'"
@change="((val)=>{lesionTypeChange(val)})" @change="((val) => { lesionTypeChange(val) })">
>
<el-option <el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
v-for="item of $d.LesionType" :value="item.value" :label="item.label" />
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
v-for="qs in questions" :prop="qs.Id" :rules="[
v-show="qs.ShowQuestion!==2" {
:key="qs.Id" 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',
:label="`${qs.QuestionName}`" message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
:prop="qs.Id" },
:rules="[ ]">
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (qs.RelevanceValue.includes(questionForm[qs.RelevanceId]))) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type!=='group' && qs.Type!=='summary',
message:['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur','change']},
]"
>
<!-- 输入框 --> <!-- 输入框 -->
<template v-if="qs.Type === 'input' || qs.Type === 'number'"> <template v-if="qs.Type === 'input' || qs.Type === 'number'">
<!-- {{ ((qs.QuestionMark === 6 && isCurrentTaskAdd === 'False') || (qs.QuestionMark === 6 && isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition)) }} --> <div style="display: flex;justify-content: space-between;">
<el-input <el-input v-if="qs.Type === 'input' || qs.Type === 'number'" v-model="questionForm[qs.Id]"
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'" :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"> <template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </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> </template>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input <el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
v-if="qs.Type==='textarea'" :autosize="{ minRows: 2, maxRows: 4 }" maxlength="500"
v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="!isCurrentTask || readingTaskState >= 2 || answers.SplitOrMergeType === '1'" :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')" --> <!-- :disabled="!isCurrentTask || readingTaskState>=2 || (!isBaseLineTask && qs.QuestionMark === 5 && isCurrentTaskAdd === 'False') || qs.QuestionMark === 2 || (qs.QuestionMark === 8 && !isBaseLineTask && isCurrentTaskAdd === 'False')" -->
<el-select <el-select v-if="qs.Type === 'select'" :ref="`select_${qs.Id}`" v-model="questionForm[qs.Id]" filterable
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')" :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')" :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> <template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;"> <span style="padding-left: 5px;">
<i class="el-icon-search" /> <i class="el-icon-search" />
</span> </span>
</template> </template>
<template v-if="qs.TableQuestionType === 1"> <template v-if="qs.TableQuestionType === 1">
<el-option <el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
v-for="item in organList" :value="item[qs.DataTableColumn]" />
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]"
v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))" v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))"
:key="item.id" :key="item.id" :value="item.value" :label="item.label" />
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group <el-option-group
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answers.LastTaskState))}` : ''" :label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answers.LastTaskState))}` : ''">
>
<!-- 首次分裂的病灶只能选择存在 --> <!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'"> <template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0" :key="item.id"
v-for="item of $d[qs.DictionaryCode]" :value="item.value" :label="item.label" />
v-show="item.value === 0"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<!-- 首次添加的新病灶不能为无法评估和消失 --> <!-- 首次添加的新病灶不能为无法评估和消失 -->
<template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2"> <template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0 || item.value === 1"
v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-show="item.value === 0 || item.value === 1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="item of filterState($d[qs.DictionaryCode])" :key="item.id" :value="item.value"
v-for="item of filterState($d[qs.DictionaryCode])" :label="item.label" />
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group <el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
v-if="qs.Type==='radio'" :disabled="!isCurrentTask || readingTaskState >= 2 || answers.SplitOrMergeType === '1'">
v-model="questionForm[qs.id]" <el-radio v-for="val in qs.options.split('|')" :key="val" :label="val"
:disabled="!isCurrentTask || readingTaskState>=2 || answers.SplitOrMergeType === '1'" @change="((val) => { formItemChange(val, qs) })">
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
@change="((val)=>{formItemChange(val, qs)})"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
<template v-if="qs.QuestionMark === 20"> <template v-if="qs.QuestionMark === 20">
<div style="display: flex;flex-direction: row;justify-content: flex-start;"> <div style="display: flex;flex-direction: row;justify-content: flex-start;">
<div style="display: flex;justify-content: space-between;" v-if="qs.Type === 'calculation'">
<el-input <el-input v-if="qs.Type === 'calculation'" v-model="questionForm[qs.Id]" disabled style="width:120px;"
v-if="qs.Type==='calculation'" @change="((val) => { formItemChange(val, qs) })">
v-model="questionForm[qs.Id]"
disabled
style="width:120px;"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.Unit" slot="append"> <template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </el-input>
<viewer <svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
v-if="answers.OtherPicturePath" @click.stop="(e) => handleReadingChart({
ref="viewer" e,
style="margin:0 10px;" data: {
:images="[`${OSSclientConfig.basePath}${answers.OtherPicturePath}`]" 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()"> <span style="color:#409eff;cursor: pointer" @click="previewImage()">
{{ $t('trials:lugano:button:suvscreenshot1') }} {{ $t('trials:lugano:button:suvscreenshot1') }}
</span> </span>
<img <img v-show="false" crossorigin="anonymous"
v-show="false" :src="`${OSSclientConfig.basePath}${answers.OtherPicturePath}`" alt="Image">
crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${answers.OtherPicturePath}`"
alt="Image"
>
</viewer> </viewer>
<!-- <img <!-- <img
v-if="answers.OtherPicturePath" v-if="answers.OtherPicturePath"
@ -226,45 +157,39 @@
</div> </div>
</template> </template>
<template v-else> <template v-else>
<el-input <div style="display: flex;justify-content: space-between;" v-if="qs.Type === 'calculation'">
v-if="qs.Type==='calculation'" <el-input v-if="qs.Type === 'calculation'" v-model="questionForm[qs.Id]" disabled
v-model="questionForm[qs.Id]" @change="((val) => { formItemChange(val, qs) })">
disabled
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.Unit" slot="append"> <template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </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>
</el-form-item> </el-form-item>
</div> </div>
<div <div
v-if="isCurrentTask && readingTaskState < 2 && (answers.SplitOrMergeType !== '1' && answers.SplitOrMergeType !== '3')" v-if="isCurrentTask && readingTaskState < 2 && (answers.SplitOrMergeType !== '1' && answers.SplitOrMergeType !== '3')"
class="base-dialog-footer" class="base-dialog-footer" style="text-align:right;margin-top:10px;">
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button <el-button v-if="questionForm.MeasureData" size="mini" @click="handleDeleteMeasureData">
v-if="questionForm.MeasureData"
size="mini"
@click="handleDeleteMeasureData"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete">
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button size="mini" @click="handleSave">
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -272,7 +197,7 @@
</el-form> </el-form>
</template> </template>
<script> <script>
import { submitTableQuestion, deleteReadingRowAnswer, getIsSuvMaxLesionNoPet } from '@/api/trials' import { submitTableQuestion, deleteReadingRowAnswer, getIsSuvMaxLesion } from '@/api/trials'
// import { uploadPrintscreen } from '@/api/reading' // import { uploadPrintscreen } from '@/api/reading'
import DicomEvent from './../DicomEvent' import DicomEvent from './../DicomEvent'
import store from '@/store' import store from '@/store'
@ -368,6 +293,9 @@ export default {
// container.removeEventListener('scroll', this.scrollHandle , true) // container.removeEventListener('scroll', this.scrollHandle , true)
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
scrollHandle() { scrollHandle() {
for (const k in this.$refs) { for (const k in this.$refs) {
if (k.indexOf('select_') === -1) continue if (k.indexOf('select_') === -1) continue
@ -1737,7 +1665,7 @@ export default {
// suvmax // suvmax
const suvMax = this.getQuestionVal(20) const suvMax = this.getQuestionVal(20)
if (this.questionForm.RowId && !!suvMax) { 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) { if (res.IsSuccess && res.Result.IsSuvMaxLesion) {
message = this.$t('trials:reading:warnning:msg58') message = this.$t('trials:reading:warnning:msg58')
} }
@ -1841,47 +1769,58 @@ export default {
::v-deep .el-form-item__label { ::v-deep .el-form-item__label {
color: #c3c3c3; color: #c3c3c3;
} }
::v-deep .el-input .el-input__inner { ::v-deep .el-input .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item { ::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
flex-wrap: wrap; flex-wrap: wrap;
} }
::v-deep .el-form-item__content { ::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-input.is-disabled .el-input__inner { ::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-input-group__append, .el-input-group__prepend{
::v-deep .el-input-group__append,
.el-input-group__prepend {
padding: 0 10px; padding: 0 10px;
} }
::v-deep .el-select.is-disabled .el-input__inner { ::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
.el-form-item__content
.el-select{ .el-form-item__content .el-select {
width: 100%; width: 100%;
} }
.input-width1 { .input-width1 {
width: calc(100% - 60px) !important; width: calc(100% - 60px) !important;
} }
.input-width2 { .input-width2 {
width: 100% !important; width: 100% !important;
} }
.suv_viewer { .suv_viewer {
::v-deep .viewer-play { ::v-deep .viewer-play {
display: none; display: none;
} }
} }
} }
</style> </style>

View File

@ -8,11 +8,9 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
<i placement="bottom">
class="el-icon-refresh-left" <i class="el-icon-refresh-left" @click="resetMeasuredData" />
@click="resetMeasuredData"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
@ -25,13 +23,8 @@
:question-form-change-num="questionFormChangeNum" :question-form-change-num="questionFormChangeNum"
:group-classify="1" :group-classify="1"
/> --> /> -->
<Questions <Questions ref="ecrf" :question-form-change-state="true" :question-form-change-num="0" :is-qulity-issues="false"
ref="ecrf" :group-classify="1" @handleReadingChart="handleReadingChart" />
:question-form-change-state="true"
:question-form-change-num="0"
:is-qulity-issues="false"
:group-classify="1"
/>
</div> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
<template v-if="questions.length > 0 && CriterionType !== 10"> <template v-if="questions.length > 0 && CriterionType !== 10">
@ -42,50 +35,67 @@
<div class="lesion_list"> <div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id"> <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 v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div> <div class="title">{{ item.QuestionName }}
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)"> <svg-icon v-if="item.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" /> <i class="el-icon-plus" />
</div> </div>
</div> </div>
<!-- @change="handleCollapseChange(qs.Childrens,item)" --> <!-- @change="handleCollapseChange(qs.Childrens,item)" -->
<el-collapse <el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
v-if="item.Type === 'table' && item.TableQuestions" @change="handleCollapseChange">
v-model="activeName" <el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)" @contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
>
<template slot="title"> <template slot="title">
<div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}"> <div style="width:300px;position: relative;"
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
{{ getLesionName(item.OrderMark, q.RowIndex) }} {{ getLesionName(item.OrderMark, q.RowIndex) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 信息不完整 --> <!-- 信息不完整 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div :style="{position: 'absolute',left: 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; --> <!-- 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;"> <div
<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"> 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;">
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'"> <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" /> <span class="login-cycle" />
</div> </div>
</el-tooltip> </el-tooltip>
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '4'"> <div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '4'">
<span class="login-cycle" /> <span class="login-cycle" />
</div> </div>
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom"> <el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark"
<div v-if="item.TableQuestions.Answers[i].lesionPart" style="max-width: 100px;overflow: hidden;"> :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 }} {{ item.TableQuestions.Answers[i].lesionPart }}
</div> </div>
</el-tooltip> </el-tooltip>
@ -99,47 +109,46 @@
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div> </div>
<div v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))"> <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"> <el-tooltip class="item" effect="dark"
<span>{{ item.TableQuestions.Answers[i].lesionLength }}*{{ item.TableQuestions.Answers[i].lesionShort }}m</span> :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> </el-tooltip>
</div> </div>
</div> </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"> <el-tooltip
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" /> 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>
<!-- 融合 --> <!-- 融合 -->
<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"> <el-tooltip
<i class="iconfont icon-24gl-merge" style="color:#fff;font-size: 16px;" @click.stop="handleMerge(item.TableQuestions.Answers[i],item.Id,item.OrderMark)" /> 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> </el-tooltip>
</div> </div>
</div> </div>
</template> </template>
<QuestionForm <QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:ref="`${item.Id}_${q.RowIndex}`" :answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:questions="item.TableQuestions.Questions" :order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
:answers="item.TableQuestions.Answers[i]" :question-name="item.QuestionName" :parent-qs-id="item.Id" :visit-task-id="visitTaskId"
:lesion-type="item.LesionType" :is-current-task="isCurrentTask" :reading-task-state="readingTaskState"
:order-mark="item.OrderMark" :is-base-line-task="isBaseLineTask" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
:table-questions="tableQuestions" @determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
:row-index="String(q.RowIndex)" @close="close" @handleReadingChart="handleReadingChart" />
:question-name="item.QuestionName"
:parent-qs-id="item.Id"
:visit-task-id="visitTaskId"
:is-current-task="isCurrentTask"
:reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -149,35 +158,15 @@
</template> </template>
<!-- <el-divider /> --> <!-- <el-divider /> -->
<!-- 肝脏评估 --> <!-- 肝脏评估 -->
<Questions <Questions ref="ecrf2" :question-form-change-state="true" :question-form-change-num="0" :group-classify="2"
ref="ecrf2" :is-qulity-issues="false" style="margin-top:20px" :question-type="6"
:question-form-change-state="true" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" />
:question-form-change-num="0"
:group-classify="2"
:is-qulity-issues="false"
style="margin-top:20px"
:question-type="6"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
/>
<!-- 脾脏评估 --> <!-- 脾脏评估 -->
<Questions <Questions ref="ecrf3" :question-form-change-state="true" :question-form-change-num="0" :group-classify="3"
ref="ecrf3" :is-qulity-issues="false" :question-type="7" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" />
:question-form-change-state="true"
:question-form-change-num="0"
:group-classify="3"
:is-qulity-issues="false"
:question-type="7"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
/>
</div> </div>
<el-dialog <el-dialog v-if="merge.visible" v-loading="merge.loading" :visible.sync="merge.visible"
v-if="merge.visible" :close-on-click-modal="false" :title="$t('trials:reading:lugano:message:merge')" width="500px">
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-table">
<div class="merge-label"> <div class="merge-label">
<label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label> <label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label>
@ -185,40 +174,19 @@
<span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span> <span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span>
</div> </div>
<div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div> <div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div>
<el-table <el-table :data="lesionData" style="width: 450px" size="small" height="200"
:data="lesionData" @selection-change="handleSelectionChange">
style="width: 450px" <el-table-column type="selection" width="45" />
size="small" <el-table-column prop="OrderMarkName" :label="$t('trials:reading:lugano:label:lesionNumber')" width="100" />
height="200" <el-table-column prop="Part" :label="$t('trials:reading:lugano:label:lesionLocation')" min-width="120"
@selection-change="handleSelectionChange" show-overflow-tooltip />
>
<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> </el-table>
</div> </div>
<div slot="footer" style="text-align:right;"> <div slot="footer" style="text-align:right;">
<!-- 取消 --> <!-- 取消 -->
<el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button> <el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button>
<!-- 确认 --> <!-- 确认 -->
<el-button <el-button type="primary" size="mini" :disabled="mergeList.length === 0" @click="confirmMerge">
type="primary"
size="mini"
:disabled="mergeList.length === 0"
@click="confirmMerge"
>
{{ $t('common:button:confirm') }}</el-button> {{ $t('common:button:confirm') }}</el-button>
</div> </div>
</el-dialog> </el-dialog>
@ -366,6 +334,9 @@ export default {
DicomEvent.$off('refreshQuestions') DicomEvent.$off('refreshQuestions')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -1346,17 +1317,21 @@ export default {
.measurement-wrapper { .measurement-wrapper {
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
.container { .container {
padding: 10px; padding: 10px;
.basic-info { .basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3 { h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i { i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
@ -1365,6 +1340,7 @@ export default {
} }
} }
} }
.title { .title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -1372,6 +1348,7 @@ export default {
font-size: 15px; font-size: 15px;
} }
.add-icon { .add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -1381,6 +1358,7 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover { .add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
@ -1392,9 +1370,11 @@ export default {
background-color: #424242; background-color: #424242;
} }
.lesion_list { .lesion_list {
position: relative; position: relative;
} }
.login-cycle { .login-cycle {
width: 5px; width: 5px;
height: 5px; height: 5px;
@ -1404,14 +1384,17 @@ export default {
margin-right: 2px; margin-right: 2px;
margin-bottom: 2px; margin-bottom: 2px;
} }
.el-collapse { .el-collapse {
border-bottom: none; border-bottom: none;
border-top: none; border-top: none;
::v-deep .el-collapse-item { ::v-deep .el-collapse-item {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header { ::v-deep .el-collapse-item__header {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
@ -1420,10 +1403,12 @@ export default {
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap { ::v-deep .el-collapse-item__wrap {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content { ::v-deep .el-collapse-item__content {
width: 260px; width: 260px;
position: absolute; position: absolute;
@ -1438,18 +1423,26 @@ export default {
} }
} }
.merge-table { .merge-table {
padding: 0 10px; padding: 0 10px;
::v-deep.el-table { ::v-deep.el-table {
background-color: #1e1e1e !important; background-color: #1e1e1e !important;
color: #383838; 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; 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; background-color: #1e1e1e;
} }
::v-deep.el-table__header-wrapper { ::v-deep.el-table__header-wrapper {
th { th {
background-color: #1e1e1e !important; background-color: #1e1e1e !important;
@ -1457,22 +1450,27 @@ export default {
border-bottom: 1px solid #383838; border-bottom: 1px solid #383838;
} }
} }
::v-deep.el-table__body-wrapper { ::v-deep.el-table__body-wrapper {
tr { tr {
background-color: #1e1e1e !important; background-color: #1e1e1e !important;
color: #dfdfdf; color: #dfdfdf;
} }
tr:hover>td { tr:hover>td {
background-color: #1e1e1e !important; background-color: #1e1e1e !important;
} }
} }
::v-deep.el-table__empty-block { ::v-deep.el-table__empty-block {
background-color: #1e1e1e !important; background-color: #1e1e1e !important;
} }
.merge-label { .merge-label {
color: #ddd; color: #ddd;
font-size: 13px; font-size: 13px;
margin-bottom: 10px; margin-bottom: 10px;
span { span {
font-size: 15px; font-size: 15px;
color: red; color: red;

View File

@ -1,12 +1,6 @@
<template> <template>
<el-form <el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
v-if="isRender" class="measurement-form">
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -18,27 +12,19 @@
</div> </div>
</div> </div>
<el-form-item <el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
v-for="qs in questions" :prop="qs.Id" :rules="[
v-show="qs.ShowQuestion!==2" {
:key="qs.Id" 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',
:label="`${qs.QuestionName}`" message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
:prop="qs.Id" },
:rules="[ ]" style="flex-wrap: wrap">
{ 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;"> <div style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;">
<el-input <el-input v-model="questionForm[qs.Id]" disabled style="width: 100px;">
v-model="questionForm[qs.Id]"
disabled
style="width: 100px;"
>
<template v-if="qs.Unit" slot="append"> <template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
@ -46,42 +32,26 @@
<!-- 测量 --> <!-- 测量 -->
<el-button <el-button
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && !questionForm[qs.Id] && readingTaskState !== 2" v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && !questionForm[qs.Id] && readingTaskState !== 2"
size="mini" size="mini" type="text" @click="addAnnotation(qs)">
type="text"
@click="addAnnotation(qs)"
>
{{ $t('trials:MRIPDFF:button:measure') }} {{ $t('trials:MRIPDFF:button:measure') }}
</el-button> </el-button>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button <el-button v-if="getAnnotationStatus(qs) && readingTaskState !== 2" size="mini" type="text"
v-if="getAnnotationStatus(qs) && readingTaskState!== 2" style="margin-left: 0px" @click="removeAnnotation(qs)">
size="mini"
type="text"
style="margin-left: 0px"
@click="removeAnnotation(qs)"
>
{{ $t('trials:MRIPDFF:button:clear') }} {{ $t('trials:MRIPDFF:button:clear') }}
</el-button> </el-button>
<!-- 返回 --> <!-- 返回 -->
<el-button <el-button v-if="questionForm[qs.Id]" size="mini" type="text" style="margin-left: 0px"
v-if="questionForm[qs.Id]" @click="locateAnnotation(qs)">
size="mini"
type="text"
style="margin-left: 0px"
@click="locateAnnotation(qs)"
>
{{ $t('trials:MRIPDFF:button:return') }} {{ $t('trials:MRIPDFF:button:return') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && questionForm[qs.Id] && readingTaskState !== 2" v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && questionForm[qs.Id] && readingTaskState !== 2"
size="mini" size="mini" type="text" style="margin-left: 0px" @click="saveAnnotation(qs)">
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" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
@ -89,112 +59,85 @@
</div> </div>
</template> </template>
<template v-else-if="qs.Type === 'input' || qs.Type === 'number'"> <template v-else-if="qs.Type === 'input' || qs.Type === 'number'">
<el-input <div style="display: flex;justify-content: space-between;">
v-model="questionForm[qs.Id]" <el-input v-model="questionForm[qs.Id]" :disabled="!isCurrentTask || readingTaskState >= 2"
:disabled="!isCurrentTask || readingTaskState>=2" @change="((val) => { formItemChange(val, qs) })">
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append"> <template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </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>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input <el-input v-else-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
v-else-if="qs.Type==='textarea'" :autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
v-model="questionForm[qs.Id]" @change="((val) => { formItemChange(val, qs) })" />
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select v-else-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable
v-else-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
:placeholder="$t('common:placeholder:select')" :placeholder="$t('common:placeholder:select')"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 1106" :disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 1106"
@change="((val)=>{formItemChange(val, qs)})" @change="((val) => { formItemChange(val, qs) })">
>
<template v-if="qs.TableQuestionType === 1"> <template v-if="qs.TableQuestionType === 1">
<el-option <el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
v-for="item in organList" :value="item[qs.DataTableColumn]" />
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode"> <template v-else-if="qs.DictionaryCode">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group <el-radio-group v-else-if="qs.Type === 'radio'" v-model="questionForm[qs.Id]"
v-else-if="qs.Type==='radio'"
v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState >= 2 || (qs.QuestionMark === 1105 && isDisabledMeasurableRadio)" :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"> <template v-if="qs.DictionaryCode.length > 0">
<el-radio <el-radio v-for="item in $d[qs.DictionaryCode]" :key="item.id" :label="item.value">
v-for="item in $d[qs.DictionaryCode]"
:key="item.id"
:label="item.value"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</template> </template>
<template v-else-if="qs.options.length > 0"> <template v-else-if="qs.options.length > 0">
<el-radio <el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</template> </template>
</el-radio-group> </el-radio-group>
<div style="display: flex;justify-content: space-between;" v-else-if="qs.Type === 'calculation'">
<!-- 自动计算 --> <!-- 自动计算 -->
<el-input <el-input v-model="questionForm[qs.Id]" disabled @change="((val) => { formItemChange(val, qs) })">
v-else-if="qs.Type==='calculation'"
v-model="questionForm[qs.Id]"
disabled
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.Unit" slot="append"> <template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </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> </el-form-item>
</div> </div>
<div <div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
v-if="isCurrentTask && readingTaskState<2" style="text-align:right;margin-top:10px;">
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button size="mini" @click="handleSave">
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -290,6 +233,9 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal') DicomEvent.$off('handleImageQualityAbnormal')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initForm() { async initForm() {
this.isRender = false this.isRender = false
this.isMeasurableId = this.getQuestionId(1105) this.isMeasurableId = this.getQuestionId(1105)
@ -857,41 +803,51 @@ export default {
::v-deep .el-form-item__label { ::v-deep .el-form-item__label {
color: #c3c3c3; color: #c3c3c3;
} }
::v-deep .el-input .el-input__inner { ::v-deep .el-input .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item { ::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
} }
::v-deep .el-form-item__content { ::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-input.is-disabled .el-input__inner { ::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-select.is-disabled .el-input__inner { ::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
::v-deep .el-input-group__append, .el-input-group__prepend {
::v-deep .el-input-group__append,
.el-input-group__prepend {
padding: 0 10px; padding: 0 10px;
} }
.el-form-item__content
.el-select{ .el-form-item__content .el-select {
width: 100%; width: 100%;
} }
.input-width1 { .input-width1 {
width: calc(100% - 60px) !important; width: calc(100% - 60px) !important;
} }
.input-width2 { .input-width2 {
width: 100% !important; width: 100% !important;
} }
} }
</style> </style>

View File

@ -8,18 +8,17 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
<i placement="bottom">
class="el-icon-refresh-left" <i class="el-icon-refresh-left" @click="resetMeasuredData" />
@click="resetMeasuredData"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
<!-- 非测量问题 --> <!-- 非测量问题 -->
<div class="lesions"> <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> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
<template> <template>
@ -32,7 +31,8 @@
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;"> <div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div> <div class="title">{{ item.QuestionName }}</div>
</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-row>
<!-- 分段 --> <!-- 分段 -->
<el-col :span="14">{{ $t('trials:MRIPDFF:label:col1') }}</el-col> <el-col :span="14">{{ $t('trials:MRIPDFF:label:col1') }}</el-col>
@ -43,28 +43,27 @@
</el-row> </el-row>
</div> </div>
<el-collapse <el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
v-if="item.Type === 'table' && item.TableQuestions" @change="handleCollapseChange">
v-model="activeName" <el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)" @contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
>
<template slot="title"> <template slot="title">
<div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}"> <div style="width:300px;position: relative;"
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
{{ getLesionName(item.TableQuestions.Questions, q) }} {{ 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" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 信息不完整 --> <!-- 信息不完整 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;right: 0px;top: 2px;"> <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"> <!-- <div style="display: inline-block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;width:95px">
{{ $fd('ReadingYesOrNo', parseInt(item.TableQuestions.Answers[i].isMeasurable)) }} {{ $fd('ReadingYesOrNo', parseInt(item.TableQuestions.Answers[i].isMeasurable)) }}
</div> --> </div> -->
<div style="display: inline-block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;width:50px"> <div
{{ isNaN(parseFloat(item.TableQuestions.Answers[i].mean)) ? item.TableQuestions.Answers[i].mean : `${item.TableQuestions.Answers[i].mean}%` }} 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>
</div> </div>
</div> </div>
</template> </template>
<QuestionForm <QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:ref="`${item.Id}_${q.RowIndex}`" :answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:questions="item.TableQuestions.Questions" :order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
:answers="item.TableQuestions.Answers[i]" :question-name="item.QuestionName" :parent-qs-id="item.Id" :visit-task-id="visitTaskId"
:lesion-type="item.LesionType" :is-current-task="isCurrentTask" :reading-task-state="readingTaskState"
:order-mark="item.OrderMark" :is-base-line-task="isBaseLineTask" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
:table-questions="tableQuestions" @resetQuestions="resetQuestions" @close="close" @handleReadingChart="handleReadingChart" />
: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"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -210,6 +200,9 @@ export default {
DicomEvent.$off('getAllUnSaveLesions') DicomEvent.$off('getAllUnSaveLesions')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -532,15 +525,18 @@ export default {
.container { .container {
padding: 10px; padding: 10px;
.basic-info { .basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3 { h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i { i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
@ -549,6 +545,7 @@ export default {
} }
} }
} }
.title { .title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -556,6 +553,7 @@ export default {
font-size: 15px; font-size: 15px;
} }
.add-icon { .add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -565,6 +563,7 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover { .add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
@ -576,17 +575,21 @@ export default {
background-color: #424242; background-color: #424242;
} }
.lesion_list { .lesion_list {
position: relative; position: relative;
} }
.el-collapse { .el-collapse {
border-bottom: none; border-bottom: none;
border-top: none; border-top: none;
::v-deep .el-collapse-item { ::v-deep .el-collapse-item {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header { ::v-deep .el-collapse-item__header {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
@ -595,10 +598,12 @@ export default {
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap { ::v-deep .el-collapse-item__wrap {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content { ::v-deep .el-collapse-item__content {
width: 260px; width: 260px;
position: absolute; position: absolute;

View File

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

View File

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

View File

@ -1,12 +1,6 @@
<template> <template>
<el-form <el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
v-if="isRender" class="measurement-form">
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -20,40 +14,25 @@
</div> </div>
</div> </div>
<el-form-item <el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] }, { required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]" ]">
> <el-select v-model="questionForm.LesionType" filterable :disabled="true">
<el-select <el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
v-model="questionForm.LesionType" :value="item.value" :label="item.label" />
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-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
v-for="qs in questions" :prop="qs.Id" :rules="qs.QuestionMark === 11 ? [
v-show="qs.ShowQuestion!==2" {
:key="qs.Id" required: (qs.IsRequired === 0 || (qs.IsRequired === 1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue))) && qs.Type !== 'group' && qs.Type !== 'summary',
:label="`${qs.QuestionName}`" message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
:prop="qs.Id" }, { validator: validateLesionCount, trigger: ['blur', 'change'] }] : [
:rules="qs.QuestionMark===11?[ {
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue))) && qs.Type!=='group' && qs.Type!=='summary', 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']},{validator:validateLesionCount, trigger: ['blur', 'change']}]:[ message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), 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 }} <!-- {{ isCurrentTaskAdd }}
{{ questionForm.IsCanEditPosition }} --> {{ questionForm.IsCanEditPosition }} -->
@ -61,26 +40,28 @@
@input="questionForm[qs.Id]=questionForm[qs.Id].replace(/^(0+)|[^\d]+/g,'')"--> @input="questionForm[qs.Id]=questionForm[qs.Id].replace(/^(0+)|[^\d]+/g,'')"-->
<template v-if="qs.Type === 'input' || qs.Type === 'number'"> <template v-if="qs.Type === 'input' || qs.Type === 'number'">
<template v-if="qs.QuestionMark === 11"> <template v-if="qs.QuestionMark === 11">
<el-input <div style="display: flex;justify-content: space-between;">
v-model="questionForm[qs.Id]" <el-input v-model="questionForm[qs.Id]" :disabled="!isCurrentTask || readingTaskState >= 2" type="number"
:disabled="!isCurrentTask || readingTaskState>=2 " @focus="focusQs = { ...qs }" @change="((val) => { formItemChange(val, qs) })">
type="number"
@focus="focusQs = {...qs}"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append"> <template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </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>
<template v-else> <template v-else>
<el-input <el-input v-model="questionForm[qs.Id]"
v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False') && lesionType !== 2) || qs.QuestionMark === 9 || (qs.QuestionMark === 10 && isCurrentTaskAdd === 'False')" :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}" @focus="focusQs = { ...qs }" @change="((val) => { formItemChange(val, qs) })">
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append"> <template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
@ -88,109 +69,53 @@
</template> </template>
</template> </template>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input <el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
v-if="qs.Type==='textarea'" :autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
v-model="questionForm[qs.Id]" @change="((val) => { formItemChange(val, qs) })" />
type="textarea" <el-select v-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable
: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)" :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"> <template v-if="qs.TableQuestionType === 1">
<el-option <el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
v-for="item in organList" :value="item[qs.DataTableColumn]" />
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group <el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
v-if="qs.Type==='radio'" :disabled="!isCurrentTask || readingTaskState >= 2">
v-model="questionForm[qs.id]" <el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</div> </div>
<div <div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
v-if="isCurrentTask && readingTaskState<2" style="text-align:right;margin-top:10px;">
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button <el-button v-if="questionForm.MeasureData" size="mini" style="padding:7px 10px" @click="handleDeleteMeasureData">
v-if="questionForm.MeasureData"
size="mini"
style="padding:7px 10px"
@click="handleDeleteMeasureData"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" style="margin-left: 5px;padding:7px 10px"
v-if="isCurrentTaskAdd !== 'False'" @click="handleDelete">
size="mini"
style="margin-left: 5px;padding:7px 10px"
@click="handleDelete"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button size="mini" style="margin-left: 5px;padding:7px 10px" @click="handleSave">
size="mini"
style="margin-left: 5px;padding:7px 10px"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -287,6 +212,9 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal') DicomEvent.$off('handleImageQualityAbnormal')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
validateLesionCount(rule, value, callback) { validateLesionCount(rule, value, callback) {
// const reg = /^[1-9][0-9]?$|^100$/ // const reg = /^[1-9][0-9]?$|^100$/
// const reg = /^(0+)|[^\d]+/g // const reg = /^(0+)|[^\d]+/g
@ -904,35 +832,41 @@ export default {
::v-deep .el-form-item__label { ::v-deep .el-form-item__label {
color: #c3c3c3; color: #c3c3c3;
} }
::v-deep .el-input .el-input__inner { ::v-deep .el-input .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item { ::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
} }
::v-deep .el-form-item__content { ::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-input.is-disabled .el-input__inner { ::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-select.is-disabled .el-input__inner { ::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
.el-form-item__content
.el-select{ .el-form-item__content .el-select {
width: 100%; width: 100%;
} }
.input-width1 { .input-width1 {
width: calc(100% - 60px) !important; width: calc(100% - 60px) !important;
} }
.input-width2 { .input-width2 {
width: 100% !important; width: 100% !important;
} }
} }
</style> </style>

View File

@ -8,22 +8,17 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
<i placement="bottom">
class="el-icon-refresh-left" <i class="el-icon-refresh-left" @click="resetMeasuredData" />
@click="resetMeasuredData"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
<!-- 非测量问题 --> <!-- 非测量问题 -->
<div class="lesions"> <div class="lesions">
<Questions <Questions ref="ecrf" :question-form-change-state="questionFormChangeState"
ref="ecrf" :question-form-change-num="questionFormChangeNum" :is-first-change-task="isFirstChangeTask"
:question-form-change-state="questionFormChangeState" @handleReadingChart="handleReadingChart" />
:question-form-change-num="questionFormChangeNum"
:is-first-change-task="isFirstChangeTask"
/>
</div> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
<template v-if="questions.length > 0"> <template v-if="questions.length > 0">
@ -32,34 +27,36 @@
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }} {{ language === 'en' ? qs.GroupEnName : qs.GroupName }}
</h4> </h4>
<div class="lesion_list"> <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 v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div> <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" /> <i class="el-icon-plus" />
</div> </div>
</div> </div>
<el-collapse <el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
v-if="item.Type === 'table' && item.TableQuestions" @change="handleCollapseChange">
v-model="activeName" <el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)" @contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
>
<template slot="title"> <template slot="title">
<div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}"> <div style="width:300px;position: relative;"
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
{{ getLesionName(item.OrderMark, q.RowIndex, qs.Childrens) }} {{ 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" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 已更新未保存 --> <!-- 已更新未保存 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;left: 60px;top: 2px;"> <div style="position: absolute;left: 60px;top: 2px;">
@ -70,35 +67,27 @@
<div v-if="item.TableQuestions.Answers[i].lesionState" style="margin-left:10px;"> <div v-if="item.TableQuestions.Answers[i].lesionState" style="margin-left:10px;">
{{ $fd('EvaluationOfState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('EvaluationOfState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div> </div>
<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 }} {{ item.TableQuestions.Answers[i].lesionType }}
</div> </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 }} {{ item.TableQuestions.Answers[i].lesionNum }}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<QuestionForm <QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:ref="`${item.Id}_${q.RowIndex}`" :answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:questions="item.TableQuestions.Questions" :order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
:answers="item.TableQuestions.Answers[i]" :question-name="item.QuestionName" :parent-qs-id="item.Id" :visit-task-id="visitTaskId"
:lesion-type="item.LesionType" :is-current-task="isCurrentTask" :reading-task-state="readingTaskState"
:order-mark="item.OrderMark" :is-base-line-task="isBaseLineTask" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
:table-questions="tableQuestions" @determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
:row-index="String(q.RowIndex)" @close="close" @handleReadingChart="handleReadingChart" />
:question-name="item.QuestionName"
:parent-qs-id="item.Id"
:visit-task-id="visitTaskId"
:is-current-task="isCurrentTask"
:reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -218,6 +207,9 @@ export default {
DicomEvent.$off('getUnSaveTarget') DicomEvent.$off('getUnSaveTarget')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -805,15 +797,18 @@ export default {
.container { .container {
padding: 10px; padding: 10px;
.basic-info { .basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3 { h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i { i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
@ -822,6 +817,7 @@ export default {
} }
} }
} }
.title { .title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -829,6 +825,7 @@ export default {
font-size: 15px; font-size: 15px;
} }
.add-icon { .add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -838,6 +835,7 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover { .add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
@ -849,17 +847,21 @@ export default {
background-color: #424242; background-color: #424242;
} }
.lesion_list { .lesion_list {
position: relative; position: relative;
} }
.el-collapse { .el-collapse {
border-bottom: none; border-bottom: none;
border-top: none; border-top: none;
::v-deep .el-collapse-item { ::v-deep .el-collapse-item {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header { ::v-deep .el-collapse-item__header {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
@ -868,10 +870,12 @@ export default {
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap { ::v-deep .el-collapse-item__wrap {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content { ::v-deep .el-collapse-item__content {
width: 260px; width: 260px;
position: absolute; position: absolute;
@ -888,4 +892,3 @@ export default {
} }
} }
</style> </style>

View File

@ -6,9 +6,7 @@
> >
{{ question.GroupName }} {{ question.GroupName }}
</div> --> </div> -->
<div <div v-if="!!question.GroupName && question.Type === 'group'">
v-if="!!question.GroupName && question.Type==='group'"
>
<h4 style="color: #ddd;padding: 5px 0px;margin: 0;"> <h4 style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language === 'en' ? question.GroupEnName : question.GroupName }} {{ language === 'en' ? question.GroupEnName : question.GroupName }}
</h4> </h4>
@ -18,35 +16,43 @@
<el-form-item <el-form-item
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0" v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0"
:label="`${question.QuestionName}`" :label="`${question.QuestionName}`" :prop="question.Id" :rules="[
:prop="question.Id" {
:rules="[ required: (question.IsRequired === 0 || (question.IsRequired === 1 && question.RelevanceId && (questionForm[question.RelevanceId] === question.RelevanceValue))) && question.Type !== 'group' && question.Type !== 'summary',
{ required: (question.IsRequired === 0 || (question.IsRequired ===1 && question.RelevanceId && (questionForm[question.RelevanceId] === question.RelevanceValue))) && question.Type!=='group' && question.Type!=='summary', message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']}, },
]" ]"
:class="[question.Type==='group' ? 'mb' : (question.Type==='upload' || 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"> <template v-if="question.QuestionType === 60 || question.QuestionType === 61">
<div style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;"> <div style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;">
<div style="display: flex;justify-content: space-between;" v-if="question.Type === 'calculation'">
<el-input <el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled
v-if="question.Type==='calculation'" style="width: 130px;">
v-model="questionForm[question.Id]"
disabled
style="width: 130px;"
>
<template v-if="question.Unit" slot="append"> <template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }} {{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template> </template>
</el-input> </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"> <el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
@ -56,157 +62,100 @@
</div> </div>
</template> </template>
<template v-else-if="question.QuestionType === 48 || question.QuestionType === 51 || question.QuestionType === 52 || question.QuestionType === 53"> <template
<el-input v-else-if="question.QuestionType === 48 || question.QuestionType === 51 || question.QuestionType === 52 || question.QuestionType === 53">
v-if="question.Type==='calculation'" <div style="display: flex;justify-content: space-between;" v-if="question.Type === 'calculation'">
v-model="questionForm[question.Id]" <el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled>
disabled
>
<template v-if="question.Unit" slot="append"> <template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }} {{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template> </template>
</el-input> </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> </template>
<!-- 输入框 --> <!-- 输入框 -->
<el-input <el-input v-else-if="question.Type === 'input'" v-model="questionForm[question.Id]"
v-else-if="question.Type==='input'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask" :disabled="readingTaskState >= 2 || isFirstChangeTask"
@change="((val)=>{formItemChange(val, question)})" @change="((val) => { formItemChange(val, question) })" />
/>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input <el-input v-else-if="question.Type === 'textarea'" v-model="questionForm[question.Id]" type="textarea"
v-else-if="question.Type==='textarea'" :autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2 || isFirstChangeTask"
v-model="questionForm[question.Id]" @change="((val) => { formItemChange(val, question) })" />
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
@change="((val)=>{formItemChange(val, question)})"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select v-else-if="question.Type === 'select'" v-model="questionForm[question.Id]"
v-else-if="question.Type==='select'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode) || isFirstChangeTask || question.QuestionType === 50 || question.QuestionType === 55" :disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode) || isFirstChangeTask || question.QuestionType === 50 || question.QuestionType === 55"
clearable clearable @change="((val) => { formItemChange(val, question) })">
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.TableQuestionType === 1"> <template v-if="question.TableQuestionType === 1">
<el-option <el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
v-for="item in organList" :value="item[question.DataTableColumn]" />
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
</template> </template>
<template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 47 && question.IsBaseLineTask"> <template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 47 && question.IsBaseLineTask">
<el-option <el-option v-for="item of $d[question.DictionaryCode]"
v-for="item of $d[question.DictionaryCode]" v-show="item.value === 1 || item.value === 2 || item.value === 5" :key="item.id"
v-show="item.value === 1 ||item.value === 2 || item.value === 5 " :value="String(item.value)" :label="item.label" />
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </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 <el-option-group
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode,parseFloat(question.LastTaskAnswer))}` : ''" :label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode, parseFloat(question.LastTaskAnswer))}` : ''">
> <el-option v-for="item of $d[question.DictionaryCode]"
<el-option v-show="item.value === 1 || item.value === 3 || item.value === 4 || item.value === 5" :key="item.id"
v-for="item of $d[question.DictionaryCode]" :value="String(item.value)" :label="item.label" />
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> </el-option-group>
</template> </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 <el-option v-for="item of $d[question.DictionaryCode]"
v-for="item of $d[question.DictionaryCode]" v-show="item.value === 1 || item.value === 5 || item.value === 6" :key="item.id"
v-show="item.value === 1 ||item.value === 5 || item.value === 6 " :value="String(item.value)" :label="item.label" />
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </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 <el-option-group
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode,parseFloat(question.LastTaskAnswer))}` : ''" :label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode, parseFloat(question.LastTaskAnswer))}` : ''">
> <el-option v-for="item of $d[question.DictionaryCode]"
<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" v-show="item.value === 1 || item.value === 2 || item.value === 3 || item.value === 4 || item.value === 5"
:key="item.id" :key="item.id" :value="String(item.value)" :label="item.label" />
:value="String(item.value)"
:label="item.label"
/>
</el-option-group> </el-option-group>
</template> </template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3"> <template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option <el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
v-for="item of $d[question.DictionaryCode]" :label="item.label" />
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode"> <template
<el-option v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
v-for="item of $d[question.DictionaryCode]" <el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
:key="item.id" :label="item.label" />
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val" />
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group <el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]"
v-else-if="question.Type==='radio'" :disabled="readingTaskState >= 2 || isFirstChangeTask" @change="((val) => { formItemChange(val, question) })">
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.DictionaryCode"> <template v-if="question.DictionaryCode">
<el-radio <el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)">
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="String(item.value)"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</template> </template>
<template v-else-if="question.TypeValue"> <template v-else-if="question.TypeValue">
<el-radio <el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</template> </template>
</el-radio-group> </el-radio-group>
<!-- 复选框 --> <!-- 复选框 -->
<el-checkbox-group <el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]"
v-else-if="question.Type==='checkbox'" :disabled="readingTaskState >= 2 || isFirstChangeTask">
v-model="questionForm[question.Id]" <el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
:disabled="readingTaskState >= 2 || isFirstChangeTask"
>
<el-checkbox
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
@ -217,80 +166,52 @@
:disabled="readingTaskState >= 2 || isFirstChangeTask" :disabled="readingTaskState >= 2 || isFirstChangeTask"
:precision="2" :precision="2"
/> --> /> -->
<template v-else-if="question.Type==='number'"> <div style="display: flex;justify-content: space-between;"
<el-input-number v-else-if="question.Type === 'number' || question.Type === 'calculation'">
v-if="question.ValueType === 0" <template v-if="question.Type === 'number'">
v-model="questionForm[question.Id]" <el-input-number v-if="question.ValueType === 0" v-model="questionForm[question.Id]" :precision="0"
:precision="0" :disabled="readingTaskState >= 2 || isFirstChangeTask" />
: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 <el-input-number v-else-if="question.ValueType === 1 || question.ValueType === 2"
v-else-if="question.ValueType === 3" v-model="questionForm[question.Id]" :precision="digitPlaces"
v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2 || isFirstChangeTask" />
: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> </template>
<el-input <el-input v-else-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled>
v-else-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
disabled
>
<template v-if="question.Unit" slot="append"> <template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }} {{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template> </template>
</el-input> </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 <el-upload v-else-if="question.Type === 'upload'" action :accept="accept" :limit="question.ImageCount"
v-else-if="question.Type==='upload'" :on-preview="handlePictureCardPreview" :before-upload="handleBeforeUpload" :http-request="uploadScreenshot"
action list-type="picture-card" :on-remove="handleRemove" :file-list="fileList"
:accept="accept"
: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 }" :class="{ disabled: fileList.length >= question.ImageCount }"
:disabled="readingTaskState >= 2 || isFirstChangeTask" :disabled="readingTaskState >= 2 || isFirstChangeTask">
>
<i slot="default" class="el-icon-plus" /> <i slot="default" class="el-icon-plus" />
<div slot="file" slot-scope="{file}"> <div slot="file" slot-scope="{file}">
<img <img class="el-upload-list__item-thumbnail" :src="OSSclientConfig.basePath + file.url" alt="">
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
alt=""
>
<span class="el-upload-list__item-actions"> <span class="el-upload-list__item-actions">
<span <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
class="el-upload-list__item-preview"
@click="handlePictureCardPreview(file)"
>
<i class="el-icon-zoom-in" /> <i class="el-icon-zoom-in" />
</span> </span>
<span <span v-if="readingTaskState < 2" class="el-upload-list__item-delete" @click="handleRemove(file)">
v-if="readingTaskState < 2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete" /> <i class="el-icon-delete" />
</span> </span>
</span> </span>
</div> </div>
</el-upload> </el-upload>
<el-dialog <el-dialog v-if="question.Type === 'upload'" append-to-body :visible.sync="imgVisible" width="600px">
v-if="question.Type==='upload'"
append-to-body
:visible.sync="imgVisible"
width="600px"
>
<el-image :src="imageUrl" width="100%"> <el-image :src="imageUrl" width="100%">
<div slot="placeholder" class="image-slot"> <div slot="placeholder" class="image-slot">
加载中<span class="dot">...</span> 加载中<span class="dot">...</span>
@ -300,17 +221,9 @@
</el-form-item> </el-form-item>
</template> </template>
<QuestionItem <QuestionItem v-for="(item) in question.Childrens" :key="item.Id" :question="item"
v-for="(item) in question.Childrens" :reading-task-state="readingTaskState" :is-first-change-task="isFirstChangeTask" :question-form="questionForm"
:key="item.Id" :visit-task-id="visitTaskId" @setFormItemData="setFormItemData" @resetFormItemData="resetFormItemData" />
:question="item"
:reading-task-state="readingTaskState"
:is-first-change-task="isFirstChangeTask"
:question-form="questionForm"
:visit-task-id="visitTaskId"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
</div> </div>
</template> </template>
<script> <script>
@ -482,25 +395,32 @@ export default {
.mb { .mb {
margin-bottom: 0px; margin-bottom: 0px;
} }
.disabled { .disabled {
::v-deep .el-upload--picture-card { ::v-deep .el-upload--picture-card {
display: none; display: none;
} }
} }
.uploadWrapper { .uploadWrapper {
display: flex; display: flex;
flex-direction: column !important; flex-direction: column !important;
align-items: flex-start; align-items: flex-start;
} }
::v-deep .el-input.is-disabled .el-input__inner { ::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-input-group__append, .el-input-group__prepend{
::v-deep .el-input-group__append,
.el-input-group__prepend {
padding: 0 10px; padding: 0 10px;
} }
::v-deep .el-form-item__content { ::v-deep .el-form-item__content {
width: 100%; width: 100%;
} }
::v-deep .el-select.is-disabled .el-input__inner { ::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }

View File

@ -3,7 +3,8 @@
<el-form v-if="questions.length > 0" ref="questions" size="small" :model="questionForm"> <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" <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" :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"> <el-form-item v-if="readingTaskState < 2 && !isFirstChangeTask">
<div class="ecrf-footer"> <div class="ecrf-footer">
@ -140,6 +141,9 @@ export default {
} }
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async getQuestions(visitTaskId, isRefresh = false) { async getQuestions(visitTaskId, isRefresh = false) {
var isChangeVisitTask = this.visitTaskId !== visitTaskId var isChangeVisitTask = this.visitTaskId !== visitTaskId
this.visitTaskId = visitTaskId this.visitTaskId = visitTaskId

View File

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

View File

@ -1,12 +1,6 @@
<template> <template>
<el-form <el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
v-if="isRender" class="measurement-form">
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -19,28 +13,16 @@
</div> </div>
</div> </div>
<el-form-item <el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] }, { required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]" ]">
>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select v-model="questionForm.LesionType" filterable
v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask" :disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask"
@change="((val)=>{lesionTypeChange(val)})" @change="((val) => { lesionTypeChange(val) })">
>
<el-option <el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
v-for="item of $d.LesionType" :value="item.value" :label="item.label" />
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -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, { 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']}, message: '请注明', trigger: ['blur']},
]" --> ]" -->
<el-form-item <el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
v-for="qs in questions" :prop="qs.Id" :rules="[
v-show="qs.ShowQuestion!==2" {
:key="qs.Id" 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',
:label="`${qs.QuestionName}`" message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
: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 }} <!-- {{ isCurrentTaskAdd }}
{{ questionForm.IsCanEditPosition }} --> {{ questionForm.IsCanEditPosition }} -->
<!-- 输入框 --> <!-- 输入框 -->
<template v-if="qs.Type === 'input' || qs.Type === 'number'"> <template v-if="qs.Type === 'input' || qs.Type === 'number'">
<!-- {{ ((qs.QuestionMark === 6 && isCurrentTaskAdd === 'False') || (qs.QuestionMark === 6 && isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition)) }} --> <div style="display: flex;justify-content: space-between;">
<el-input <el-input v-if="qs.Type === 'input' || qs.Type === 'number'" v-model="questionForm[qs.Id]"
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))" :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"> <template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </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> </template>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input <el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
v-if="qs.Type==='textarea'" :autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
v-model="questionForm[qs.Id]" @change="((val) => { formItemChange(val, qs) })" />
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')" --> <!-- :disabled="!isCurrentTask || readingTaskState>=2 || (!isBaseLineTask && qs.QuestionMark === 5 && isCurrentTaskAdd === 'False') || qs.QuestionMark === 2 || (qs.QuestionMark === 8 && !isBaseLineTask && isCurrentTaskAdd === 'False')" -->
<el-select <el-select v-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
:placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')" :placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))" :disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))"
@change="((val)=>{formItemChange(val, qs)})" @change="((val) => { formItemChange(val, qs) })">
>
<template v-if="qs.QuestionMark === 8" #prefix> <template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;"> <span style="padding-left: 5px;">
<i class="el-icon-search" /> <i class="el-icon-search" />
</span> </span>
</template> </template>
<template v-if="qs.TableQuestionType === 1"> <template v-if="qs.TableQuestionType === 1">
<el-option <el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
v-for="item in organList" :value="item[qs.DataTableColumn]" />
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]"
v-for="item of $d[qs.DictionaryCode]" v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))" :key="item.id"
v-show="(lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))" :value="item.value" :label="item.label" />
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group <el-option-group
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answers.LastTaskState))}` : ''" :label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answers.LastTaskState))}` : ''">
>
<!-- 首次分裂的病灶只能选择存在 --> <!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'"> <template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0" :key="item.id"
v-for="item of $d[qs.DictionaryCode]" :value="item.value" :label="item.label" />
v-show="item.value === 0"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<!-- 首次添加的新病灶不能为无法评估和消失 --> <!-- 首次添加的新病灶不能为无法评估和消失 -->
<template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2"> <template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0 || item.value === 1"
v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-show="item.value === 0 || item.value === 1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="item of filterState($d[qs.DictionaryCode])" :key="item.id" :value="item.value"
v-for="item of filterState($d[qs.DictionaryCode])" :label="item.label" />
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group <el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
v-if="qs.Type==='radio'" :disabled="!isCurrentTask || readingTaskState >= 2">
v-model="questionForm[qs.id]" <el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
@ -189,33 +126,19 @@
</div> </div>
<div <div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
v-if="isCurrentTask && readingTaskState<2" style="text-align:right;margin-top:10px;">
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button <el-button v-if="questionForm.MeasureData" size="mini" @click="handleDeleteMeasureData">
v-if="questionForm.MeasureData"
size="mini"
@click="handleDeleteMeasureData"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete">
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button size="mini" @click="handleSave">
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -307,6 +230,9 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal') DicomEvent.$off('handleImageQualityAbnormal')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initForm() { async initForm() {
const loading = this.$loading({ fullscreen: true }) const loading = this.$loading({ fullscreen: true })
this.questions.forEach(item => { this.questions.forEach(item => {
@ -1504,38 +1430,46 @@ export default {
::v-deep .el-form-item__label { ::v-deep .el-form-item__label {
color: #c3c3c3; color: #c3c3c3;
} }
::v-deep .el-input .el-input__inner { ::v-deep .el-input .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item { ::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
} }
::v-deep .el-form-item__content { ::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-input.is-disabled .el-input__inner { ::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-select.is-disabled .el-input__inner { ::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
.el-form-item__content
.el-select{ .el-form-item__content .el-select {
width: 100%; width: 100%;
} }
.input-width1 { .input-width1 {
width: calc(100% - 60px) !important; width: calc(100% - 60px) !important;
} }
.input-width2 { .input-width2 {
width: 100% !important; width: 100% !important;
} }
} }
</style> </style>

View File

@ -8,18 +8,17 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
<i placement="bottom">
class="el-icon-refresh-left" <i class="el-icon-refresh-left" @click="resetMeasuredData" />
@click="resetMeasuredData"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
<!-- 非测量问题 --> <!-- 非测量问题 -->
<div class="lesions"> <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> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
<template v-if="questions.length > 0 && CriterionType !== 10"> <template v-if="questions.length > 0 && CriterionType !== 10">
@ -30,48 +29,56 @@
<div class="lesion_list"> <div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id"> <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 v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div> <div class="title">{{ item.QuestionName }}
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)"> <svg-icon v-if="item.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" /> <i class="el-icon-plus" />
</div> </div>
</div> </div>
<!-- @change="handleCollapseChange(qs.Childrens,item)" --> <!-- @change="handleCollapseChange(qs.Childrens,item)" -->
<el-collapse <el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
v-if="item.Type === 'table' && item.TableQuestions" @change="handleCollapseChange">
v-model="activeName" <el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)" @contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
>
<template slot="title"> <template slot="title">
<div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}"> <div style="width:300px;position: relative;"
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
{{ getLesionName(item.OrderMark, q.RowIndex) }} {{ getLesionName(item.OrderMark, q.RowIndex) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 信息不完整 --> <!-- 信息不完整 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;left: 50px;top: 2px;"> <div style="position: absolute;left: 50px;top: 2px;">
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; --> <!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
<div style="font-size: 11px;width:220px;height: 30px;"> <div style="font-size: 11px;width:220px;height: 30px;">
<div <div v-if="item.TableQuestions.Answers[i].lesionPart"
v-if="item.TableQuestions.Answers[i].lesionPart" style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px">
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px" <el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark"
> :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<span>{{ item.TableQuestions.Answers[i].lesionPart }}</span> <span>{{ item.TableQuestions.Answers[i].lesionPart }}</span>
</el-tooltip> </el-tooltip>
</div> </div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px"> <div
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
<span v-if="item.LesionType === 0"> <span v-if="item.LesionType === 0">
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
@ -82,45 +89,42 @@
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
</div> </div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px"> <div
<template v-if="item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionShort))"> 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 {{ item.TableQuestions.Answers[i].lesionShort }}mm
</template> </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 {{ item.TableQuestions.Answers[i].lesionLength }}mm
</template> </template>
</div> </div>
</div> </div>
</div> </div>
<div v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0,1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'" style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);"> <div
v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0, 1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'"
style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<!-- 分裂 --> <!-- 分裂 -->
<el-tooltip v-show="readingTaskState<2 && !!item.TableQuestions.Answers[i].RowId && !isBaseLineTask && item.TableQuestions.Answers[i].isDicomReading !== false" class="item" :content="$t('trials:reading:button:split')" placement="left"> <el-tooltip
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" /> 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> </el-tooltip>
</div> </div>
</div> </div>
</template> </template>
<QuestionForm <QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:ref="`${item.Id}_${q.RowIndex}`" :answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:questions="item.TableQuestions.Questions" :order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
:answers="item.TableQuestions.Answers[i]" :question-name="item.QuestionName" :parent-qs-id="item.Id" :visit-task-id="visitTaskId"
:lesion-type="item.LesionType" :is-current-task="isCurrentTask" :reading-task-state="readingTaskState"
:order-mark="item.OrderMark" :is-base-line-task="isBaseLineTask" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
:table-questions="tableQuestions" @determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
:row-index="String(q.RowIndex)" @close="close" @handleReadingChart="handleReadingChart" />
:question-name="item.QuestionName"
:parent-qs-id="item.Id"
:visit-task-id="visitTaskId"
:is-current-task="isCurrentTask"
:reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -240,6 +244,9 @@ export default {
DicomEvent.$off('getUnSaveTarget') DicomEvent.$off('getUnSaveTarget')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -1065,15 +1072,18 @@ export default {
.container { .container {
padding: 10px; padding: 10px;
.basic-info { .basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3 { h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i { i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
@ -1082,6 +1092,7 @@ export default {
} }
} }
} }
.title { .title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -1089,6 +1100,7 @@ export default {
font-size: 15px; font-size: 15px;
} }
.add-icon { .add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -1098,6 +1110,7 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover { .add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
@ -1109,17 +1122,21 @@ export default {
background-color: #424242; background-color: #424242;
} }
.lesion_list { .lesion_list {
position: relative; position: relative;
} }
.el-collapse { .el-collapse {
border-bottom: none; border-bottom: none;
border-top: none; border-top: none;
::v-deep .el-collapse-item { ::v-deep .el-collapse-item {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header { ::v-deep .el-collapse-item__header {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
@ -1128,10 +1145,12 @@ export default {
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap { ::v-deep .el-collapse-item__wrap {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content { ::v-deep .el-collapse-item__content {
width: 260px; width: 260px;
position: absolute; position: absolute;

View File

@ -1,12 +1,6 @@
<template> <template>
<el-form <el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
v-if="isRender" class="measurement-form">
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -18,160 +12,103 @@
</div> </div>
</div> </div>
<el-form-item <el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] }, { required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
]" ]">
>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select v-model="questionForm.LesionType" filterable
v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask" :disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask"
@change="((val)=>{lesionTypeChange(val)})" @change="((val) => { lesionTypeChange(val) })">
>
<el-option <el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id"
v-for="item of $d.LesionType" :value="item.value" :label="item.label" />
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
v-for="qs in questions" :prop="qs.Id" :rules="[
v-show="qs.ShowQuestion!==2" {
:key="qs.Id" 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',
:label="`${qs.QuestionName}`" message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
:prop="qs.Id" },
:rules="[ ]">
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type!=='group' && qs.Type!=='summary',
message:['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur','change']},
]"
>
<!-- 输入框 --> <!-- 输入框 -->
<template v-if="qs.Type === 'input' || qs.Type === 'number'"> <template v-if="qs.Type === 'input' || qs.Type === 'number'">
<el-input <div style="display: flex;justify-content: space-between;">
v-if="qs.Type==='input' || qs.Type==='number'" <el-input v-if="qs.Type === 'input' || qs.Type === 'number'" v-model="questionForm[qs.Id]"
v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName))" :disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName))"
@change="((val)=>{formItemChange(val, qs)})" @change="((val) => { formItemChange(val, qs) })">
>
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append"> <template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </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>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input <el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
v-if="qs.Type==='textarea'" :autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
v-model="questionForm[qs.Id]" @change="((val) => { formItemChange(val, qs) })" />
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select v-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
:placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')" :placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))" :disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))"
@change="((val)=>{formItemChange(val, qs)})" @change="((val) => { formItemChange(val, qs) })">
>
<template v-if="qs.QuestionMark === 8" #prefix> <template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;"> <span style="padding-left: 5px;">
<i class="el-icon-search" /> <i class="el-icon-search" />
</span> </span>
</template> </template>
<template v-if="qs.TableQuestionType === 1"> <template v-if="qs.TableQuestionType === 1">
<el-option <el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
v-for="item in organList" :value="item[qs.DataTableColumn]" />
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]"
v-for="item of $d[qs.DictionaryCode]" v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))" :key="item.id"
v-show="(lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))" :value="item.value" :label="item.label" />
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group <el-option-group
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answers.LastTaskState))}` : ''" :label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answers.LastTaskState))}` : ''">
>
<!-- 首次分裂的病灶只能选择存在 --> <!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'"> <template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0" :key="item.id"
v-for="item of $d[qs.DictionaryCode]" :value="item.value" :label="item.label" />
v-show="item.value === 0"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<!-- 首次添加的新病灶不能为无法评估和消失 --> <!-- 首次添加的新病灶不能为无法评估和消失 -->
<template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2"> <template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0 || item.value === 1"
v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-show="item.value === 0 || item.value === 1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="item of filterState($d[qs.DictionaryCode])" :key="item.id" :value="item.value"
v-for="item of filterState($d[qs.DictionaryCode])" :label="item.label" />
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option <el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" />
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" />
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group <el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
v-if="qs.Type==='radio'" :disabled="!isCurrentTask || readingTaskState >= 2">
v-model="questionForm[qs.id]" <el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
@ -179,33 +116,19 @@
</div> </div>
<div <div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
v-if="isCurrentTask && readingTaskState<2" style="text-align:right;margin-top:10px;">
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button <el-button v-if="questionForm.MeasureData" size="mini" @click="handleDeleteMeasureData">
v-if="questionForm.MeasureData"
size="mini"
@click="handleDeleteMeasureData"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete">
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button size="mini" @click="handleSave">
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -297,6 +220,9 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal') DicomEvent.$off('handleImageQualityAbnormal')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initForm() { async initForm() {
const loading = this.$loading({ fullscreen: true }) const loading = this.$loading({ fullscreen: true })
this.questions.forEach(item => { this.questions.forEach(item => {
@ -1186,38 +1112,46 @@ export default {
::v-deep .el-form-item__label { ::v-deep .el-form-item__label {
color: #c3c3c3; color: #c3c3c3;
} }
::v-deep .el-input .el-input__inner { ::v-deep .el-input .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item { ::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
} }
::v-deep .el-form-item__content { ::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-input.is-disabled .el-input__inner { ::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-select.is-disabled .el-input__inner { ::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
.el-form-item__content
.el-select{ .el-form-item__content .el-select {
width: 100%; width: 100%;
} }
.input-width1 { .input-width1 {
width: calc(100% - 60px) !important; width: calc(100% - 60px) !important;
} }
.input-width2 { .input-width2 {
width: 100% !important; width: 100% !important;
} }
} }
</style> </style>

View File

@ -8,17 +8,16 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
<i placement="bottom">
class="el-icon-refresh-left" <i class="el-icon-refresh-left" @click="resetMeasuredData" />
@click="resetMeasuredData"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
<!-- 非测量问题 --> <!-- 非测量问题 -->
<div class="lesions"> <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> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
<template v-if="questions.length > 0"> <template v-if="questions.length > 0">
@ -29,46 +28,54 @@
<div class="lesion_list"> <div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id"> <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 v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div> <div class="title">{{ item.QuestionName }}
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)"> <svg-icon v-if="item.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" /> <i class="el-icon-plus" />
</div> </div>
</div> </div>
<el-collapse <el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
v-if="item.Type === 'table' && item.TableQuestions" @change="handleCollapseChange">
v-model="activeName" <el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)" @contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
>
<template slot="title"> <template slot="title">
<div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}"> <div style="width:300px;position: relative;"
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
{{ getLesionName(item.OrderMark, q.RowIndex) }} {{ getLesionName(item.OrderMark, q.RowIndex) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 信息不完整 --> <!-- 信息不完整 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;left: 50px;top: 2px;"> <div style="position: absolute;left: 50px;top: 2px;">
<div style="font-size: 11px;width:220px;height: 30px;"> <div style="font-size: 11px;width:220px;height: 30px;">
<div <div v-if="item.TableQuestions.Answers[i].lesionPart"
v-if="item.TableQuestions.Answers[i].lesionPart" style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px">
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px" <el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark"
> :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<span>{{ item.TableQuestions.Answers[i].lesionPart }}</span> <span>{{ item.TableQuestions.Answers[i].lesionPart }}</span>
</el-tooltip> </el-tooltip>
</div> </div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px"> <div
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
<span v-if="item.LesionType === 0"> <span v-if="item.LesionType === 0">
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
@ -79,7 +86,8 @@
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
</div> </div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px"> <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))"> <template v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))">
{{ item.TableQuestions.Answers[i].lesionLength }}mm {{ item.TableQuestions.Answers[i].lesionLength }}mm
@ -87,35 +95,29 @@
</div> </div>
</div> </div>
</div> </div>
<div v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0,1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'" style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);"> <div
v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0, 1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'"
style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<!-- 分裂 --> <!-- 分裂 -->
<el-tooltip v-show="readingTaskState<2 && !!item.TableQuestions.Answers[i].RowId && !isBaseLineTask && item.TableQuestions.Answers[i].isDicomReading !== false" class="item" :content="$t('trials:reading:button:split')" placement="left"> <el-tooltip
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" /> 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> </el-tooltip>
</div> </div>
</div> </div>
</template> </template>
<QuestionForm <QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
:ref="`${item.Id}_${q.RowIndex}`" :answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
:questions="item.TableQuestions.Questions" :order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
:answers="item.TableQuestions.Answers[i]" :question-name="item.QuestionName" :parent-qs-id="item.Id" :visit-task-id="visitTaskId"
:lesion-type="item.LesionType" :is-current-task="isCurrentTask" :reading-task-state="readingTaskState"
:order-mark="item.OrderMark" :is-base-line-task="isBaseLineTask" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
:table-questions="tableQuestions" @determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
:row-index="String(q.RowIndex)" @close="close" @handleReadingChart="handleReadingChart" />
:question-name="item.QuestionName"
:parent-qs-id="item.Id"
:visit-task-id="visitTaskId"
:is-current-task="isCurrentTask"
:reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -237,6 +239,9 @@ export default {
DicomEvent.$off('setReadingState') DicomEvent.$off('setReadingState')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -994,15 +999,18 @@ export default {
.container { .container {
padding: 10px; padding: 10px;
.basic-info { .basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3 { h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i { i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
@ -1011,6 +1019,7 @@ export default {
} }
} }
} }
.title { .title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -1018,6 +1027,7 @@ export default {
font-size: 15px; font-size: 15px;
} }
.add-icon { .add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -1027,6 +1037,7 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover { .add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
@ -1038,17 +1049,21 @@ export default {
background-color: #424242; background-color: #424242;
} }
.lesion_list { .lesion_list {
position: relative; position: relative;
} }
.el-collapse { .el-collapse {
border-bottom: none; border-bottom: none;
border-top: none; border-top: none;
::v-deep .el-collapse-item { ::v-deep .el-collapse-item {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header { ::v-deep .el-collapse-item__header {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
@ -1057,10 +1072,12 @@ export default {
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap { ::v-deep .el-collapse-item__wrap {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content { ::v-deep .el-collapse-item__content {
width: 260px; width: 260px;
position: absolute; position: absolute;

View File

@ -40,7 +40,19 @@
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.QuestionName" <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' }">{{ :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;"> <span v-else style="font-weight: bold;font-size: 16px;color: #f44336;">
{{ language === 'en' ? scope.row.GroupEnName : scope.row.GroupName }} {{ language === 'en' ? scope.row.GroupEnName : scope.row.GroupName }}
</span> </span>
@ -206,6 +218,7 @@
</div> </div>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" /> <SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog> </el-dialog>
<readingChart ref="readingChart_report" />
</div> </div>
</template> </template>
<script> <script>
@ -221,9 +234,10 @@ import { mapGetters } from 'vuex'
import { changeURLStatic } from '@/utils/history.js' import { changeURLStatic } from '@/utils/history.js'
import AdditionalAssessment from './AdditionalAssessment' import AdditionalAssessment from './AdditionalAssessment'
import { openWindow } from "@/utils/splitScreen"; import { openWindow } from "@/utils/splitScreen";
import readingChart from '@/components/readingChart'
export default { export default {
name: 'ReportPage', name: 'ReportPage',
components: { SignForm, AdditionalAssessment }, components: { SignForm, AdditionalAssessment, readingChart },
props: { props: {
visitTaskId: { visitTaskId: {
type: String, type: String,
@ -298,6 +312,7 @@ export default {
} }
}) })
this.getReportInfo() this.getReportInfo()
document.addEventListener("click", this.foo);
}, },
beforeDestroy() { beforeDestroy() {
DicomEvent.$off('getReportInfo') DicomEvent.$off('getReportInfo')
@ -307,6 +322,22 @@ export default {
} }
}, },
methods: { 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) { myConfirm(msg) {
return new Promise(resolve => { return new Promise(resolve => {
this.$confirm(msg, { this.$confirm(msg, {

View File

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

View File

@ -4,11 +4,9 @@
<div class="container" :style="{ 'height': height + 'px' }" style="padding-bottom: 50px;overflow-y: auto;"> <div class="container" :style="{ 'height': height + 'px' }" style="padding-bottom: 50px;overflow-y: auto;">
<div class="basic-info"> <div class="basic-info">
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
<i placement="bottom">
class="el-icon-refresh-left" <i class="el-icon-refresh-left" @click="resetMeasuredData" />
@click="resetMeasuredData"
/>
</el-tooltip> </el-tooltip>
</div> </div>
<h3 v-if="isReadingShowSubjectInfo"> <h3 v-if="isReadingShowSubjectInfo">
@ -16,73 +14,48 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
</div> </div>
<QuestionsPreview <QuestionsPreview ref="QuestionsPreview" v-if="ecrfShow && TrialReadingCriterionId" :visitTaskId="visitTaskId"
ref="QuestionsPreview" :criterionId="TrialReadingCriterionId" @handleReadingChart="handleReadingChart">
v-if="ecrfShow && TrialReadingCriterionId"
:visitTaskId="visitTaskId"
:criterionId="TrialReadingCriterionId">
</QuestionsPreview> </QuestionsPreview>
</div> </div>
<div class="questions-footer"> <div class="questions-footer">
<i class="el-icon-warning feedback-icon" @click="openFeedBackTable" :style="{color: isExistUnprocessedFeedback ? '#ffeb3b' : '#fff'}"/> <i class="el-icon-warning feedback-icon" @click="openFeedBackTable"
<el-button v-if="readingTaskState<2" style="margin-right: 10px" type="primary" size="small" @click="handleSave(true)"> :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') }} {{ $t('common:button:save') }}
</el-button> </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') }} {{ $t('trials:readingReport:button:skip') }}
</el-button> </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> {{ $t('common:button:submit') }}</el-button>
</div> </div>
<!-- 签名框 --> <!-- 签名框 -->
<el-dialog <el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px"
v-if="signVisible" custom-class="base-dialog-wrapper">
:visible.sync="signVisible"
:close-on-click-modal="false"
width="600px"
custom-class="base-dialog-wrapper"
>
<div slot="title"> <div slot="title">
<span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span> <span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span>
<span style="font-size:12px;margin-left:5px">{{ `(${$t('common:label:sign')}${currentUser})` }}</span> <span style="font-size:12px;margin-left:5px">{{ `(${$t('common:label:sign')}${currentUser})` }}</span>
</div> </div>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" /> <SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog> </el-dialog>
<el-dialog <el-dialog v-if="measuredDataVisible" :visible.sync="measuredDataVisible" :close-on-click-modal="false"
v-if="measuredDataVisible" width="600px" custom-class="base-dialog-wrapper">
:visible.sync="measuredDataVisible" <el-form ref="measuredDataForm" :model="form" :rules="rules" v-loading="loading" label-width="120px" size="small">
:close-on-click-modal="false" <el-form-item :label="$t('trials:reading:title:measuredDataName')" prop="measuredDataName">
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-input v-model="form.measuredDataName"></el-input>
</el-form-item> </el-form-item>
<el-form-item style="text-align:right;"> <el-form-item style="text-align:right;">
<!-- Cancel --> <!-- Cancel -->
<el-button <el-button type="primary" @click="handleMeasuredDataCancel">
type="primary"
@click="handleMeasuredDataCancel"
>
{{ $t('common:button:cancel') }} {{ $t('common:button:cancel') }}
</el-button> </el-button>
<!-- Save --> <!-- Save -->
<el-button <el-button type="primary" @click="handleMeasuredDataSave">
type="primary"
@click="handleMeasuredDataSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
@ -185,6 +158,9 @@ export default {
DicomEvent.$off('getCustomTableQuestionAnswer') DicomEvent.$off('getCustomTableQuestionAnswer')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
if (this.visitTaskId !== this.lastCanvasTaskId) { if (this.visitTaskId !== this.lastCanvasTaskId) {
this.ecrfShow = true this.ecrfShow = true
@ -466,16 +442,19 @@ export default {
.container { .container {
padding: 10px; padding: 10px;
.basic-info { .basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
flex-direction: row-reverse; flex-direction: row-reverse;
h3 { h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i { i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
@ -484,6 +463,7 @@ export default {
} }
} }
} }
.title { .title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -491,6 +471,7 @@ export default {
font-size: 15px; font-size: 15px;
} }
.add-icon { .add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -500,6 +481,7 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover { .add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
@ -511,16 +493,20 @@ export default {
background-color: #424242; background-color: #424242;
} }
.lesion_list { .lesion_list {
position: relative; position: relative;
} }
.el-collapse { .el-collapse {
border-bottom: none; border-bottom: none;
::v-deep .el-collapse-item { ::v-deep .el-collapse-item {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header { ::v-deep .el-collapse-item__header {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
@ -529,10 +515,12 @@ export default {
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap { ::v-deep .el-collapse-item__wrap {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content { ::v-deep .el-collapse-item__content {
width: 260px; width: 260px;
position: absolute; position: absolute;
@ -547,6 +535,7 @@ export default {
} }
} }
.questions-footer { .questions-footer {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
@ -558,12 +547,14 @@ export default {
justify-content: right; justify-content: right;
align-items: center; align-items: center;
height: 50px; height: 50px;
.feedback-icon { .feedback-icon {
padding: 0 10px; padding: 0 10px;
color: #fff; color: #fff;
font-weight: 400; font-weight: 400;
font-size: 24px; font-size: 24px;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
color: #68a2d5; color: #68a2d5;
} }

View File

@ -122,18 +122,22 @@
<el-input v-if="question.Type === 'class' && question.ClassifyShowType === 4" type="number" <el-input v-if="question.Type === 'class' && question.ClassifyShowType === 4" type="number"
:disabled="!question.ClassifyEditType || readingTaskState === 2" v-model="questionForm[question.Id]" :disabled="!question.ClassifyEditType || readingTaskState === 2" v-model="questionForm[question.Id]"
@change="(val) => { formItemNumberChange(val, question) }" /> @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" --> <!-- :precision="2" :step="0.1" :max="10" -->
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" <el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]"
@input="value = value.replace(/^\D*(\d*(?:.\d{0,2})?).*$/g, '$1')" disabled /> @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]"
<el-select v-if="question.Type === 'number' && question.TypeValue" v-model="questionForm[question.Id]" clearable clearable @change="(val) => { formItemNumberChange(val, question) }" :disabled="readingTaskState === 2">
@change="(val) => { formItemNumberChange(val, question) }" :disabled="readingTaskState === 2"> <el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val.trim()"
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val.trim()" :value="val.trim()" /> :value="val.trim()" />
<template v-if="question.Unit !== 0" slot="prefix">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit) : <template v-if="question.Unit !== 0" slot="prefix">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit)
:
question.CustomUnit }}</template> question.CustomUnit }}</template>
<template v-else-if="question.ValueType === 2" slot="prefix">%</template> <template v-else-if="question.ValueType === 2" slot="prefix">%</template>
</el-select> </el-select>
@ -142,7 +146,8 @@
@blur="handleBlur(questionForm[question.Id], questionForm, question.Id)" @blur="handleBlur(questionForm[question.Id], questionForm, question.Id)"
v-model.trim="questionForm[question.Id]" :disabled="readingTaskState === 2"> v-model.trim="questionForm[question.Id]" :disabled="readingTaskState === 2">
<!-- <template slot="append">1</template> --> <!-- <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> question.CustomUnit }}</template>
<template slot="append" v-else-if="question.ValueType === 2">%</template> <template slot="append" v-else-if="question.ValueType === 2">%</template>
</el-input> </el-input>
@ -151,10 +156,19 @@
@blur="handleBlur(questionForm[question.Id], questionForm, question.Id)" @blur="handleBlur(questionForm[question.Id], questionForm, question.Id)"
:disabled="question.DataSource === 1 || readingTaskState === 2" v-model.trim="questionForm[question.Id]"> :disabled="question.DataSource === 1 || readingTaskState === 2" v-model.trim="questionForm[question.Id]">
<!-- <template slot="append">2</template> --> <!-- <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> question.CustomUnit }}</template>
<template slot="append" v-else-if="question.ValueType === 2">%</template> <template slot="append" v-else-if="question.ValueType === 2">%</template>
</el-input> </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 <el-upload v-if="question.Type === 'upload'" :disabled="readingTaskState === 2" action
:accept="question.FileType" :limit="question.ImageCount === 0 ? 100 : question.ImageCount" :accept="question.FileType" :limit="question.ImageCount === 0 ? 100 : question.ImageCount"
@ -179,7 +193,7 @@
:IsBaseline="IsBaseline" :reading-task-state="readingTaskState" :question-form="questionForm" :IsBaseline="IsBaseline" :reading-task-state="readingTaskState" :question-form="questionForm"
:visit-task-id="visitTaskId" :criterion-id="criterionId" :CalculationList="CalculationList" :visit-task-id="visitTaskId" :criterion-id="criterionId" :CalculationList="CalculationList"
@formItemNumberChange="formItemNumberChange" @setFormItemData="setFormItemData" @formItemNumberChange="formItemNumberChange" @setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData" /> @resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart" />
</template> </template>
<base-model :config="addOrEdit" class="my_dialog" :close-on-click-modal="false" width="400px" append-to-body> <base-model :config="addOrEdit" class="my_dialog" :close-on-click-modal="false" width="400px" append-to-body>
<template slot="dialog-body"> <template slot="dialog-body">
@ -188,7 +202,8 @@
:IsBaseline="IsBaseline" :reading-task-state="readingTaskState" :question-form="QuestionsForm" :IsBaseline="IsBaseline" :reading-task-state="readingTaskState" :question-form="QuestionsForm"
:visit-task-id="visitTaskId" :criterion-id="criterionId" :type="addOrEdit.type" :visit-task-id="visitTaskId" :criterion-id="criterionId" :type="addOrEdit.type"
:CalculationList="CalculationTabelList" @formItemTableNumberChange="formItemTableNumberChange" :CalculationList="CalculationTabelList" @formItemTableNumberChange="formItemTableNumberChange"
@resetFormItemData="resetTableFormItemData" @setFormItemData="setFormTableItemData" /> @resetFormItemData="resetTableFormItemData" @setFormItemData="setFormTableItemData"
@handleReadingChart="handleReadingChart" />
</el-form> </el-form>
</template> </template>
<template slot="dialog-footer"> <template slot="dialog-footer">
@ -347,6 +362,9 @@ export default {
} }
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
numberInput(id) { numberInput(id) {
this.questionForm[id] = this.questionForm[id].toUpperCase(); this.questionForm[id] = this.questionForm[id].toUpperCase();
}, },

View File

@ -71,12 +71,14 @@
{{ item.trim() }} {{ item.trim() }}
</el-radio> </el-radio>
</el-radio-group> </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" --> <!-- :precision="2" :step="0.1" :max="10" -->
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" <el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]"
oninput="value=value.replace(/^\D*(\d*(?:.\d{0,2})?).*$/g, '$1')" disabled /> 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" --> <!-- :precision="2" :step="0.1" :max="10" -->
<el-select v-if="question.Type === 'number' && question.TypeValue" v-model="questionForm[question.Id]" clearable <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) : <template slot="append" v-if="question.Unit !== 0">{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit) :
question.CustomUnit }}</template> question.CustomUnit }}</template>
</el-input> </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" <el-upload v-if="question.Type === 'upload'" action :accept="question.FileType"
:limit="question.ImageCount === 0 ? 100 : question.ImageCount" :on-preview="handlePictureCardPreview" :limit="question.ImageCount === 0 ? 100 : question.ImageCount" :on-preview="handlePictureCardPreview"
@ -251,6 +262,9 @@ export default {
// } // }
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
numberInput(id, notId = false) { numberInput(id, notId = false) {
if (notId) { if (notId) {
this.calculationValue = this.calculationValue.toUpperCase(); this.calculationValue = this.calculationValue.toUpperCase();

View File

@ -1,26 +1,12 @@
<template> <template>
<div v-loading="loading" style="min-height: 500px;"> <div v-loading="loading" style="min-height: 500px;">
<el-form <el-form v-if="isRender" ref="questions" size="small" :model="questionForm" :disabled="readingTaskState >= 2">
v-if="isRender"
ref="questions"
size="small"
:model="questionForm"
:disabled="readingTaskState >= 2"
>
<template> <template>
<QuestionFormItem <QuestionFormItem v-for="question of questions" :key="question.Id" :visitTaskId="visitTaskId"
v-for="question of questions" :question="question" :question-form="questionForm" :reading-task-state="readingTaskState"
:key="question.Id" :criterion-id="criterionId" :CalculationList="CalculationList" :IsBaseline="IsBaseline"
:visitTaskId="visitTaskId" @resetFormItemData="resetFormItemData" @setFormItemData="setFormItemData"
:question="question" @handleReadingChart="handleReadingChart" />
:question-form="questionForm"
:reading-task-state="readingTaskState"
:criterion-id="criterionId"
:CalculationList="CalculationList"
:IsBaseline="IsBaseline"
@resetFormItemData="resetFormItemData"
@setFormItemData="setFormItemData"
/>
</template> </template>
</el-form> </el-form>
</div> </div>
@ -75,6 +61,9 @@ export default {
DicomEvent.$off('reGetQuestionAnswer') DicomEvent.$off('reGetQuestionAnswer')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
handleSave(isMsg) { handleSave(isMsg) {
return new Promise(resolve => { return new Promise(resolve => {
console.log('handleSave') console.log('handleSave')
@ -287,10 +276,12 @@ export default {
width: 7px; width: 7px;
height: 7px; height: 7px;
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
border-radius: 10px; border-radius: 10px;
background: #d0d0d0; background: #d0d0d0;
} }
.tabContent { .tabContent {
height: 300px; height: 300px;
overflow-y: auto; overflow-y: auto;

View File

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

View File

@ -26,7 +26,19 @@
<el-table-column prop="" label="" show-overflow-tooltip width="350px"> <el-table-column prop="" label="" show-overflow-tooltip width="350px">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.QuestionName">{{ scope.row.BlindName ? scope.row.QuestionName : <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;"> <span v-else style="font-weight: bold;font-size: 16px;color: #f44336;">
{{ scope.row.GroupName }} {{ scope.row.GroupName }}
</span> </span>
@ -235,6 +247,7 @@
</div> </div>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" /> <SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog> </el-dialog>
<readingChart ref="readingChart_report" />
</div> </div>
</template> </template>
<script> <script>
@ -247,9 +260,10 @@ import const_ from '@/const/sign-code'
import SignForm from '@/views/trials/components/newSignForm' import SignForm from '@/views/trials/components/newSignForm'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import store from '@/store' import store from '@/store'
import readingChart from '@/components/readingChart'
export default { export default {
name: 'CustomizeReportPage', name: 'CustomizeReportPage',
components: { SignForm, CustomizeReportPageUpload }, components: { SignForm, CustomizeReportPageUpload, readingChart },
props: { props: {
visitTaskId: { visitTaskId: {
type: String, type: String,
@ -317,11 +331,28 @@ export default {
}) })
await this.getQuestionCalculateRelation() await this.getQuestionCalculateRelation()
this.getReportInfo() this.getReportInfo()
document.addEventListener("click", this.foo);
}, },
beforeDestroy() { beforeDestroy() {
DicomEvent.$off('getReportInfo') DicomEvent.$off('getReportInfo')
}, },
methods: { 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) { limitInput(value, a, b) {
if (value.indexOf('.') > -1) { if (value.indexOf('.') > -1) {
if (value.split('.')[1].length >= this.digitPlaces) { if (value.split('.')[1].length >= this.digitPlaces) {

View File

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

View File

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

View File

@ -40,7 +40,15 @@
<div class="lesion_list"> <div class="lesion_list">
<div v-for="table in qs.Childrens" v-show="!(isBaseLineTask && table.LesionType === 2)" :key="table.Id"> <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 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" <div v-if="readingTaskState < 2 && (isBaseLineTask || table.LesionType === 2)" class="add-icon"
@click.prevent="addTarget(table)"> @click.prevent="addTarget(table)">
<i class="el-icon-plus" /> <i class="el-icon-plus" />
@ -246,6 +254,9 @@ export default {
window.addEventListener('message', this.receiveMsg) window.addEventListener('message', this.receiveMsg)
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
// //
async getOrganList() { async getOrganList() {
try { try {

View File

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

View File

@ -40,7 +40,19 @@
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.QuestionName" <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' }">{{ :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;"> <span v-else style="font-weight: bold;font-size: 16px;color: #f44336;">
{{ language === 'en' ? scope.row.GroupEnName : scope.row.GroupName }} {{ language === 'en' ? scope.row.GroupEnName : scope.row.GroupName }}
</span> </span>
@ -205,6 +217,7 @@
</div> </div>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" /> <SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog> </el-dialog>
<readingChart ref="readingChart_report" />
</div> </div>
</template> </template>
<script> <script>
@ -219,9 +232,10 @@ import { mapGetters } from 'vuex'
import { changeURLStatic } from '@/utils/history.js' import { changeURLStatic } from '@/utils/history.js'
import AdditionalAssessment from '@/views/trials/trials-panel/reading/dicoms/components/AdditionalAssessment' import AdditionalAssessment from '@/views/trials/trials-panel/reading/dicoms/components/AdditionalAssessment'
import { openWindow } from "@/utils/splitScreen"; import { openWindow } from "@/utils/splitScreen";
import readingChart from '@/components/readingChart'
export default { export default {
name: 'ReportPage', name: 'ReportPage',
components: { SignForm, AdditionalAssessment }, components: { SignForm, AdditionalAssessment, readingChart },
data() { data() {
return { return {
currentUser: zzSessionStorage.getItem('userName'), currentUser: zzSessionStorage.getItem('userName'),
@ -281,6 +295,7 @@ export default {
this.setScrollTop() this.setScrollTop()
}) })
this.getReportInfo() this.getReportInfo()
document.addEventListener("click", this.foo);
}, },
beforeDestroy() { beforeDestroy() {
if (this.openWindow) { if (this.openWindow) {
@ -288,6 +303,22 @@ export default {
} }
}, },
methods: { 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) { myConfirm(msg) {
return new Promise(resolve => { return new Promise(resolve => {
this.$confirm(msg, { this.$confirm(msg, {

View File

@ -148,12 +148,20 @@
@change="(val) => { formItemNumberChange(val, question) }" /> @change="(val) => { formItemNumberChange(val, question) }" />
<!-- 自动计算 --> <!-- 自动计算 -->
<!-- :precision="2" :step="0.1" :max="10" --> <!-- :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]" <el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]"
@input="value = value.replace(/^\D*(\d*(?:.\d{0,2})?).*$/g, '$1')" disabled /> @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 /> <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)"> <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;"> <div style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;">
<el-input type="text" @change="(val) => { formItemNumberChange(val, question) }" <el-input type="text" @change="(val) => { formItemNumberChange(val, question) }"

View File

@ -75,8 +75,18 @@
</el-radio-group> </el-radio-group>
<!-- 自动计算 --> <!-- 自动计算 -->
<!-- :precision="2" :step="0.1" :max="10" --> <!-- :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]" <el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]"
oninput="value=value.replace(/^\D*(\d*(?:.\d{0,2})?).*$/g, '$1')" disabled /> 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 /> <el-input v-if="question.Type === 'increment'" v-model="questionForm[question.Id]" disabled />
<!-- 数值 --> <!-- 数值 -->

View File

@ -23,7 +23,19 @@
<el-table-column prop="" label="" show-overflow-tooltip width="350px"> <el-table-column prop="" label="" show-overflow-tooltip width="350px">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.QuestionName">{{ scope.row.BlindName ? scope.row.QuestionName : <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;"> <span v-else style="font-weight: bold;font-size: 16px;color: #f44336;">
{{ scope.row.GroupName }} {{ scope.row.GroupName }}
</span> </span>
@ -206,6 +218,7 @@
<img v-show="false" :src="`${OSSclientConfig.basePath}${currentPath}`" alt="Image" /> <img v-show="false" :src="`${OSSclientConfig.basePath}${currentPath}`" alt="Image" />
</viewer> </viewer>
<readingChart ref="readingChart_report" />
</div> </div>
</template> </template>
<script> <script>
@ -216,9 +229,10 @@ import const_ from '@/const/sign-code'
import SignForm from '@/views/trials/components/newSignForm' import SignForm from '@/views/trials/components/newSignForm'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import { openWindow } from "@/utils/splitScreen"; import { openWindow } from "@/utils/splitScreen";
import readingChart from '@/components/readingChart'
export default { export default {
name: 'CustomizeReportPage', name: 'CustomizeReportPage',
components: { SignForm }, components: { SignForm, readingChart },
data() { data() {
return { return {
trialId: '', trialId: '',
@ -289,8 +303,21 @@ export default {
}) })
await this.getQuestionCalculateRelation() await this.getQuestionCalculateRelation()
this.getReportInfo() this.getReportInfo()
document.addEventListener("click", this.foo);
}, },
methods: { 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) { limitBlur(questionForm, id, valueType) {
const value = questionForm[id] const value = questionForm[id]
if (valueType === 0) { if (valueType === 0) {

View File

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

View File

@ -8,35 +8,25 @@
<span style="margin-left:5px;">{{ visitInfo.TaskBlindName }}</span> <span style="margin-left:5px;">{{ visitInfo.TaskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
<i placement="bottom">
class="el-icon-refresh-left" <i class="el-icon-refresh-left" @click="resetForm" />
@click="resetForm"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
<!-- 影像质量评估 --> <!-- 影像质量评估 -->
<div v-if="outerQuestions.length > 0" class="outer_form_wrapper"> <div v-if="outerQuestions.length > 0" class="outer_form_wrapper">
<el-form <el-form ref="outerForm" size="small" :model="outerForm">
ref="outerForm" <question-form-item v-for="outerQs in outerQuestions" :key="outerQs.Id" :question="outerQs"
size="small" :question-form="outerForm" :reading-task-state="readingTaskState" :visit-task-id="visitTaskId"
:model="outerForm" @resetFormItemData="resetOuterFormItemData" @setFormItemData="setOuterFormItemData"
> @handleReadingChart="handleReadingChart" />
<question-form-item
v-for="outerQs in outerQuestions"
:key="outerQs.Id"
:question="outerQs"
:question-form="outerForm"
:reading-task-state="readingTaskState"
:visit-task-id="visitTaskId"
@resetFormItemData="resetOuterFormItemData"
@setFormItemData="setOuterFormItemData"
/>
<el-form-item v-if="readingTaskState < 2"> <el-form-item v-if="readingTaskState < 2">
<div class="outer_form-footer"> <div class="outer_form-footer">
<i class="el-icon-warning feedback-icon" :style="{color: taskInfo && taskInfo.IsExistUnprocessedFeedback ? '#ffeb3b' : '#fff'}" @click="openFeedBackTable" /> <i class="el-icon-warning feedback-icon"
:style="{ color: taskInfo && taskInfo.IsExistUnprocessedFeedback ? '#ffeb3b' : '#fff' }"
@click="openFeedBackTable" />
<el-button size="mini" @click="saveOuterForm">{{ $t('common:button:save') }}</el-button> <el-button size="mini" @click="saveOuterForm">{{ $t('common:button:save') }}</el-button>
</div> </div>
</el-form-item> </el-form-item>
@ -44,147 +34,126 @@
</div> </div>
<!-- 病灶评估 --> <!-- 病灶评估 -->
<template v-if="tableQuestions.length > 0 && criterionType !== 10"> <template v-if="tableQuestions.length > 0 && criterionType !== 10">
<div <div v-for="(qs, index) in tableQuestions" :key="index" class="lesions lesions_wrapper">
v-for="(qs,index) in tableQuestions" <h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;">
:key="index"
class="lesions lesions_wrapper"
>
<h4
v-if="qs.Type === 'group'"
style="color: #ddd;padding: 5px 0px;margin: 0;"
>
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }} {{ language === 'en' ? qs.GroupEnName : qs.GroupName }}
</h4> </h4>
<div class="lesion_list"> <div class="lesion_list">
<div <div v-for="table in qs.Childrens" v-show="!(isBaseLineTask && table.LesionType === 2)" :key="table.Id">
v-for="table in qs.Childrens" <div v-if="table.Type === 'table'" class="flex-row" style="margin:3px 0;">
v-show="!(isBaseLineTask && table.LesionType === 2)" <div class="title">{{ table.QuestionName }}
:key="table.Id" <svg-icon v-if="table.LesionType === 0" icon-class="readingChart"
> class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
<div e,
v-if="table.Type === 'table'" data: {
class="flex-row" ReportChartTypeEnum: 0
style="margin:3px 0;" },
> })" />
<div class="title">{{ table.QuestionName }}</div> </div>
<div <div v-if="readingTaskState < 2 && (isBaseLineTask || table.LesionType === 2)" class="add-icon"
v-if="readingTaskState<2 && (isBaseLineTask || table.LesionType === 2)" @click.prevent="addTarget(table)">
class="add-icon"
@click.prevent="addTarget(table)"
>
<i class="el-icon-plus" /> <i class="el-icon-plus" />
</div> </div>
</div> </div>
<el-collapse <el-collapse v-if="table.Type === 'table' && table.TableQuestions" v-model="activeName" accordion
v-if="table.Type === 'table' && table.TableQuestions" @change="handleCollapseChange">
v-model="activeName" <el-collapse-item v-for="(answer, i) in table.TableQuestions.Answers"
accordion :key="`${table.Id}_${answer.RowIndex}`" :name="`${table.Id}_${answer.RowIndex}`"
@change="handleCollapseChange" @contextmenu.prevent.native="collapseRightClick($event, table.Id, answer.RowIndex)">
>
<el-collapse-item
v-for="(answer,i) in table.TableQuestions.Answers"
:key="`${table.Id}_${answer.RowIndex}`"
:name="`${table.Id}_${answer.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event, table.Id, answer.RowIndex)"
>
<template slot="title"> <template slot="title">
<div <div style="width:340px;position: relative;"
style="width:340px;position: relative;"
:style="{ color: innerFormData[`${table.Id}_${answer.RowIndex}`].IntrahepaticLesion ? '#5fb4ff' : '#fff' }" :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) }} {{ getLesionName(table.OrderMark, answer.RowIndex) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].SaveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].SaveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 信息不完整 --> <!-- 信息不完整 -->
<el-tooltip v-if="readingTaskState<2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].SaveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom"> <el-tooltip
v-if="readingTaskState < 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].SaveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div :style="{position: 'absolute', left: '50px', top: '2px', color: innerFormData[`${table.Id}_${answer.RowIndex}`].IntrahepaticLesion ? '#5fb4ff' : '#fff'}">
<div style="font-size: 11px;width:220px;height: 30px;">
<div <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" style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
:title="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart" :title="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart">
>
{{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart }} {{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart }}
</div> </div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px"> <div
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
<span v-if="table.LesionType === 0"> <span v-if="table.LesionType === 0">
{{ $fd('TargetState',parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState)) }} {{
$fd('TargetState', parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))
}}
</span> </span>
<span v-else-if="table.LesionType === 1"> <span v-else-if="table.LesionType === 1">
{{ $fd('NoTargetState',parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState)) }} {{
$fd('NoTargetState',
parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))
}}
</span> </span>
<span v-else> <span v-else>
{{ $fd('NewLesionState',parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState)) }} {{
$fd('NewLesionState',
parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))
}}
</span> </span>
</div> </div>
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px"> <div
<template v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].IsLymphNodes && !isNaN(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionShort))"> style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px">
<template
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].IsLymphNodes && !isNaN(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionShort))">
{{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionShort }}mm {{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionShort }}mm
</template> </template>
<template v-else-if="!innerFormData[`${table.Id}_${answer.RowIndex}`].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 {{ innerFormData[`${table.Id}_${answer.RowIndex}`].LesionLength }}mm
</template> </template>
</div> </div>
</div> </div>
</div> </div>
<!-- 分裂 --> <!-- 分裂 -->
<div v-if="((table.LesionType === 0 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0) || (table.LesionType === 1 && [0,1].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))) || (table.LesionType === 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0)) && innerFormData[`${table.Id}_${answer.RowIndex}`].IsCurrentTaskAdd === 'False'" style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);"> <div
<el-tooltip v-show="readingTaskState<2 && !!innerFormData[`${table.Id}_${answer.RowIndex}`].RowId && !isBaseLineTask && innerFormData[`${table.Id}_${answer.RowIndex}`].IsDicomReading !== false" class="table" :content="$t('trials:reading:button:split')" placement="left"> v-if="((table.LesionType === 0 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0) || (table.LesionType === 1 && [0, 1].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))) || (table.LesionType === 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0)) && innerFormData[`${table.Id}_${answer.RowIndex}`].IsCurrentTaskAdd === 'False'"
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="lesionSplit(table.Id, innerFormData[`${table.Id}_${answer.RowIndex}`].RowId)" /> style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<el-tooltip
v-show="readingTaskState < 2 && !!innerFormData[`${table.Id}_${answer.RowIndex}`].RowId && !isBaseLineTask && innerFormData[`${table.Id}_${answer.RowIndex}`].IsDicomReading !== false"
class="table" :content="$t('trials:reading:button:split')" placement="left">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
@click.stop="lesionSplit(table.Id, innerFormData[`${table.Id}_${answer.RowIndex}`].RowId)" />
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
</template> </template>
<el-form <el-form :ref="`${table.Id}_${answer.RowIndex}`" size="small"
:ref="`${table.Id}_${answer.RowIndex}`" :model="innerFormData[`${table.Id}_${answer.RowIndex}`]">
size="small" <table-question-form-item :ref="`form_${table.Id}_${answer.RowIndex}`" :table-info="table"
:model="innerFormData[`${table.Id}_${answer.RowIndex}`]" :answer="answer" :question-form="innerFormData[`${table.Id}_${answer.RowIndex}`]"
> :reading-task-state="readingTaskState" :organs="organs" :is-base-line-task="isBaseLineTask"
<table-question-form-item :is-current-task="isCurrentTask" @update="innerFormDataUpdate" @close="closeInnerForm"
:ref="`form_${table.Id}_${answer.RowIndex}`" @lesionTypeChange="lesionTypeChange" @handleReadingChart="handleReadingChart" />
:table-info="table" <div v-if="readingTaskState < 2" style="text-align:right;margin-top:10px;">
:answer="answer"
:question-form="innerFormData[`${table.Id}_${answer.RowIndex}`]"
:reading-task-state="readingTaskState"
:organs="organs"
:is-base-line-task="isBaseLineTask"
:is-current-task="isCurrentTask"
@update="innerFormDataUpdate"
@close="closeInnerForm"
@lesionTypeChange="lesionTypeChange"
/>
<div
v-if="readingTaskState<2"
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button <el-button v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].MeasureData" size="mini"
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].MeasureData" @click="clearMeasureData(table, answer.RowIndex)">
size="mini"
@click="clearMeasureData(table, answer.RowIndex)"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button v-if="table.TableQuestions.Answers[i].IsCurrentTaskAdd !== 'False'" size="mini"
v-if="table.TableQuestions.Answers[i].IsCurrentTaskAdd !== 'False'" @click="deleteLesion(table, answer.RowIndex)">
size="mini"
@click="deleteLesion(table, answer.RowIndex)"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button size="mini" @click="saveLesion(table, answer.RowIndex)">
size="mini"
@click="saveLesion(table, answer.RowIndex)"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -286,6 +255,9 @@ export default {
this.getTableQuestions() this.getTableQuestions()
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
// //
async getOrganList() { async getOrganList() {
try { try {
@ -1964,15 +1936,18 @@ export default {
.container { .container {
padding: 10px; padding: 10px;
.basic-info { .basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3 { h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i { i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
@ -1981,16 +1956,19 @@ export default {
} }
} }
} }
.outer_form_wrapper { .outer_form_wrapper {
::v-deep .el-form-item__label { ::v-deep .el-form-item__label {
color: #c3c3c3; color: #c3c3c3;
text-align: left; text-align: left;
} }
::v-deep .el-input__inner { ::v-deep .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-textarea__inner { ::v-deep .el-textarea__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
@ -2003,27 +1981,33 @@ export default {
justify-content: flex-start; justify-content: flex-start;
flex-wrap: wrap; flex-wrap: wrap;
} }
::v-deep .el-form-item__content { ::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
::v-deep .el-form-item__content
.el-select{ ::v-deep .el-form-item__content .el-select {
width: 100%; width: 100%;
} }
.outer_form-footer { .outer_form-footer {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-end; justify-content: flex-end;
align-items: center; align-items: center;
.feedback-icon { .feedback-icon {
padding: 0 10px; padding: 0 10px;
color: #fff; color: #fff;
font-weight: 400; font-weight: 400;
font-size: 22px; font-size: 22px;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
color: #68a2d5; color: #68a2d5;
} }
@ -2031,6 +2015,7 @@ export default {
} }
} }
.title { .title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -2038,6 +2023,7 @@ export default {
font-size: 15px; font-size: 15px;
} }
.add-icon { .add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
@ -2047,6 +2033,7 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover { .add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
@ -2058,17 +2045,21 @@ export default {
background-color: #424242; background-color: #424242;
} }
.lesion_list { .lesion_list {
position: relative; position: relative;
} }
.el-collapse { .el-collapse {
border-bottom: none; border-bottom: none;
border-top: none; border-top: none;
::v-deep .el-collapse-item { ::v-deep .el-collapse-item {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header { ::v-deep .el-collapse-item__header {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
@ -2077,10 +2068,12 @@ export default {
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap { ::v-deep .el-collapse-item__wrap {
background-color: #000 !important; background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content { ::v-deep .el-collapse-item__content {
width: 260px; width: 260px;
position: absolute; position: absolute;

View File

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

View File

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

View File

@ -23,7 +23,17 @@
<el-table-column prop="" label="" show-overflow-tooltip width="350px"> <el-table-column prop="" label="" show-overflow-tooltip width="350px">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.QuestionName">{{ scope.row.BlindName ? scope.row.QuestionName : <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;"> <span v-else style="font-weight: bold;font-size: 16px;color: #f44336;">
{{ scope.row.GroupName }} {{ scope.row.GroupName }}
</span> </span>
@ -206,6 +216,7 @@
<PreviewFile v-if="previewVisible" :file-path="currentPath" :file-type="currentType" /> <PreviewFile v-if="previewVisible" :file-path="currentPath" :file-type="currentType" />
</div> </div>
</el-dialog> </el-dialog>
<readingChart ref="readingChart_report" />
</div> </div>
</template> </template>
<script> <script>
@ -218,9 +229,10 @@ import PreviewFile from '@/components/PreviewFile/index'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import store from '@/store' import store from '@/store'
import { openWindow } from "@/utils/splitScreen"; import { openWindow } from "@/utils/splitScreen";
import readingChart from '@/components/readingChart'
export default { export default {
name: 'CustomizeReportPage', name: 'CustomizeReportPage',
components: { SignForm, PreviewFile }, components: { SignForm, PreviewFile, readingChart },
data() { data() {
return { return {
trialId: '', trialId: '',
@ -278,8 +290,25 @@ export default {
}) })
await this.getQuestionCalculateRelation() await this.getQuestionCalculateRelation()
this.getReportInfo() this.getReportInfo()
document.addEventListener("click", this.foo);
}, },
methods: { 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) { limitBlur(questionForm, id, valueType) {
const value = questionForm[id] const value = questionForm[id]
if (valueType === 0) { if (valueType === 0) {