irc_web/.svn/pristine/eb/eb2baecafa26e46ffa261db1588...

421 lines
14 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<el-form
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body">
<el-form-item
v-for="qs in questions"
v-show="qs.ShowQuestion!==2"
:key="qs.Id"
:label="`${qs.QuestionName}`"
:prop="qs.Id"
:rules="[
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue))) && qs.Type!=='group' && qs.Type!=='summary',
message: '请注明', trigger: ['blur']},
]"
>
<!-- 输入框 -->
<template v-if="qs.Type==='input'">
<el-input
v-if="qs.Type==='input'"
v-model="questionForm[qs.Id]"
:disabled="qs.TableQuestionType===2 || !isCurrentTask || qs.QuestionMark===0 || qs.QuestionMark===1 || qs.QuestionMark===4 || readingTaskState>=2 "
>
<template v-if="qs.QuestionMark===0 || qs.QuestionMark===1" slot="append">mm</template>
</el-input>
</template>
<!-- <template v-if="qs.Type==='input' && qs.QuestionMark===0">
<el-col :span="16">
<el-input
v-if="qs.Type==='input'"
v-model="questionForm[qs.Id]"
:disabled="qs.TableQuestionType===2 || !isCurrentTask"
/>
</el-col>
<el-col :span="8" style="padding:0 5px">
<el-button
v-if="qs.QuestionMark === 0 && qs.MeasuredData=== '' && isCurrentTask"
type="text"
size="mini"
@click="activeTool"
>开始测量</el-button>
</el-col>
</template> -->
<!-- 多行文本输入框 -->
<el-input
v-if="qs.Type==='textarea'"
v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2"
/>
<!-- 下拉框 -->
<el-select
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
clearable
:disabled="!isCurrentTask || readingTaskState>=2 || (!isBaseLineTask && qs.QuestionMark === 5 && (lesionType !== 2 || (lesionType === 2 && questionForm.IsCurrentTaskAdd === 'False')))"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template>
<template v-else>
<el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-if="qs.Type==='radio'"
v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
{{ val }}
</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div
v-if="isCurrentTask && readingTaskState<2"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<el-form-item>
<!-- 删除 -->
<el-button
v-if="questionForm.IsCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
删除
</el-button>
<!-- 保存 -->
<el-button
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }}
</el-button>
</el-form-item>
</div>
</el-form>
</template>
<script>
import { getTrialOrganList, submitTableQuestion, deleteReadingRowAnswer } from '@/api/trials'
import Store from './Store'
export default {
name: 'MeasurementForm',
props: {
questions: {
type: Array,
default() { return [] }
},
answers: {
type: Object,
default() { return {} }
},
lesionType: {
type: Number,
required: true
},
visitTaskId: {
type: String,
required: true
},
parentQsId: {
type: String,
required: true
},
isCurrentTask: {
type: Boolean,
required: true
},
readingTaskState: {
type: Number,
required: true
},
isBaseLineTask: {
type: Boolean,
required: true
},
orderMark: {
type: String,
default: ''
}
},
data() {
return {
questionForm: {},
loading: false,
trialId: '',
organList: [],
lesionNameId: '',
lesionOrganId: '',
lesionLocId: '',
originalQuestionForm: {}
}
},
mounted() {
this.trialId = this.$route.query.trialId
this.initForm()
this.getOrganInfoList()
},
methods: {
initForm() {
for (const k in this.answers) {
// if (k === 'isSave') continue
if (k === 'MeasureData' && this.answers[k]) {
this.$set(this.questionForm, k, this.answers[k] ? JSON.parse(this.answers[k]) : null)
} else {
this.$set(this.questionForm, k, this.answers[k])
}
}
this.lesionNameId = this.getQuestionId(4)
this.lesionOrganId = this.getQuestionId(5)
this.lesionLocId = this.getQuestionId(6)
this.originalQuestionForm = { ...this.questionForm }
},
getQuestionId(questionMark) {
var idx = this.questions.findIndex(i => i.QuestionMark === questionMark)
if (idx > -1) {
return this.questions[idx].Id
} else {
return ''
}
},
handleLocation() {
Store.$emit('imageLocation', this.questionForm)
},
getOrganInfoList() {
var param = {
trialId: this.trialId,
lesionType: this.lesionType,
isEnable: true
}
getTrialOrganList(param).then(res => {
this.organList = res.Result
})
},
formItemChange(v, question) {
this.$emit('determineExistsUnsavedLession', val => {
if (val) {
if (question.TableQuestionType === 1 && question.RelationQuestions.length > 0) {
// 当选择器官时,联动位置、是否淋巴结问题答案
var index = this.organList.findIndex(item => item[question.DataTableColumn] === v)
if (index < 0) return
var selected = this.organList[index]
question.RelationQuestions.map(qs => {
var val = selected[qs.DataTableColumn]
if (typeof val === 'boolean') {
val = this.$fd('YesOrNo', val)
}
this.$set(this.questionForm, qs.Id, val)
})
}
if (question.Id === this.lesionOrganId || question.Id === this.lesionLocId) {
// 设置病灶名称
this.$set(this.questionForm, this.lesionNameId, `${this.questionForm[this.lesionOrganId]} ${this.questionForm[this.lesionLocId]}`)
}
this.$set(this.questionForm, 'isSave', false)
} else {
this.$set(this.questionForm, question.Id, this.originalQuestionForm[question.Id])
}
})
},
setMeasureData(measureData) {
setTimeout(() => {
// 获取长径(0)
if (measureData.type === 'Length' || measureData.type === 'Bidirectional') {
var lengthObj = this.questions.find(i => i.QuestionMark === 0)
var length = ''
if (measureData.type === 'Length') {
length = measureData.data.length ? measureData.data.length.toFixed(2) : ''
} else if (measureData.type === 'Bidirectional') {
length = measureData.data.longestDiameter
}
this.$set(this.questionForm, lengthObj.Id, length)
// 获取短径(1)
var shortObj = this.questions.find(i => i.QuestionMark === 1)
var short = ''
if (measureData.type === 'Bidirectional') {
short = measureData.data.shortestDiameter
}
this.$set(this.questionForm, shortObj.Id, short)
}
this.$set(this.questionForm, 'isSave', false)
this.$set(this.questionForm, 'MeasureData', measureData)
}, 100)
},
returnFloat(num) {
if (num) return
var value = Math.round(parseFloat(num) * 100) / 100
var s = value.toString().split('.')
if (s.length === 1) {
value = value.toString() + '.00'
return value
}
if (s.length > 1) {
if (s[1].length < 2) {
value = value.toString() + '0'
}
return value
}
},
getQuestionVal(questionMark) {
var idx = this.questions.findIndex(i => i.QuestionMark === questionMark)
if (idx > -1) {
var questionId = this.questions[idx].Id
return this.questionForm[questionId]
} else {
return ''
}
},
handleSave() {
this.$refs.measurementForm.validate(valid => {
if (!valid) return
var measureData = { ...this.questionForm.MeasureData }
// 普通靶病灶长径大于10mm且不小于2倍层厚
// 淋巴结靶病灶短径大于15mm且不小于2倍层厚
var lymphNodes = this.getQuestionVal(2)
var lesionLength = Number(this.getQuestionVal(0))
var lesionShort = Number(this.getQuestionVal(1))
if ((lymphNodes === '是' || lymphNodes === 'Yes') && this.lesionType === 0) {
if (!(lesionShort && measureData.thick && lesionShort > 15 && lesionShort >= 2 * measureData.thick)) {
this.$confirm(`淋巴结靶病灶短径应大于15mm且不小于2倍层厚`, {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
return
}
}
if ((lymphNodes === '否' || lymphNodes === 'No') && this.lesionType === 0) {
if (!(lesionLength && measureData.thick && lesionLength > 10 && lesionLength >= 2 * measureData.thick)) {
this.$confirm(`普通靶病灶长径应大于10mm且不小于2倍层厚`, {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
return
}
}
this.loading = true
var answers = []
for (const k in this.questionForm) {
if (k === 'isSave' || k === 'RowIndex' || k === 'InstanceId' || k === 'SeriesId' || k === 'MeasureData' || k === 'IsCurrentTaskAdd') continue
answers.push({ tableQuestionId: k, answer: this.questionForm[k] })
}
console.log(`${this.orderMark}${String(this.questionForm.RowIndex).padStart(2, '0')}`)
measureData.data.remark = `${this.orderMark}${String(this.questionForm.RowIndex).padStart(2, '0')}`
var params = {
questionId: this.parentQsId,
rowIndex: this.answers.RowIndex,
visitTaskId: this.visitTaskId,
trialId: this.trialId,
measureData: measureData ? JSON.stringify(measureData) : '',
answerList: answers,
seriesId: this.questionForm.MeasureData.seriesId,
instanceId: this.questionForm.MeasureData.instanceId
}
submitTableQuestion(params).then(res => {
this.loading = false
this.$message.success('保存成功!')
this.$emit('refreshReadingQuestionAndAnswer', 1)
var measureData = { ...this.questionForm.MeasureData }
Store.$emit('resetMeasuredData', measureData.instanceId)
Store.$emit('getReportInfo', true)
this.$set(this.questionForm, 'isSave', true)
this.originalQuestionForm = { ...this.questionForm }
}).catch(() => { this.loading = false })
})
},
handleDelete() {
// 判断是否存在未保存的病灶
this.$emit('determineExistsUnsavedLession', val => {
if (val) {
this.$confirm('是否确认删除?', {
type: 'warning',
distinguishCancelAndClose: true
})
.then(() => {
this.loading = true
var param = {
visitTaskId: this.visitTaskId,
questionId: this.parentQsId,
rowIndex: this.questionForm.RowIndex
}
deleteReadingRowAnswer(param)
.then(res => {
this.loading = false
if (res.IsSuccess) {
this.$emit('refreshReadingQuestionAndAnswer', 0)
var measureData = { ...this.questionForm.MeasureData }
Store.$emit('resetMeasuredData', measureData.instanceId)
Store.$emit('getReportInfo', true)
this.$message.success('删除成功!')
}
}).catch(() => { this.loading = false })
})
}
})
}
}
}
</script>
<style lang="scss" scoped>
.measurement-form{
>>>.el-form-item__label{
color: #c3c3c3;
}
>>>.el-input__inner{
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
>>>.el-form-item{
display: flex;
flex-direction: row;
justify-content: flex-start;
}
>>>.el-form-item__content{
flex: 1;
}
.el-form-item__content
.el-select{
width: 100%;
}
.input-width1{
width: calc(100% -60px)!important;
}
.input-width2{
width: 100% !important;
}
}
</style>