irc_web/src/views/dictionary/template/components/TableQsForm.vue

682 lines
21 KiB
Vue
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="tableQsForm"
v-loading="loading"
:model="form"
size="small"
:disabled="type === 'look'"
:rules="rules"
label-width="120px"
>
<div class="base-dialog-body">
<el-form-item label="类型" prop="Type">
<el-select
v-model="form.Type"
@change="((val)=>{qsTypeChange(val, form)})"
>
<el-option
v-for="item of $d.Criterion_Question_Type"
:key="item.value"
:value="item.value"
:label="item.label"
:disabled="item.label === 'group' || item.label === 'table' || item.label === 'summary' || item.label === 'upload'"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="form.Type !== 'group'"
label="问题名称"
prop="QuestionName"
>
<el-input
v-model="form.QuestionName"
/>
</el-form-item>
<el-form-item
v-if="form.Type !== 'group'"
label="问题名称EN"
prop="QuestionEnName"
>
<el-input
v-model="form.QuestionEnName"
/>
</el-form-item>
<!-- 选项类型 -->
<el-form-item
v-if="form.Type === 'select' || form.Type === 'radio' || form.Type === 'input'"
label="选项类型"
prop="TableQuestionType"
:rules="[
{ required: form.Type !== 'input', message: '请选择'}
]"
>
<el-radio-group
v-model="form.TableQuestionType"
@change="((val)=>{tableQuestionTypeChange(val, form)})"
>
<el-radio
v-for="item of $d.TableQuestionType"
:key="item.id"
:label="item.value"
:disabled="form.Type === 'radio' && (item.value===1 || item.value===2)"
>
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
v-if="form.TableQuestionType === 0"
label="选项"
prop="TypeValue"
>
<el-input
v-model="form.TypeValue"
placeholder="选项请用‘|’分割多个选项"
/>
</el-form-item>
<!-- 关联表 -->
<!-- <el-form-item
v-if="form.TableQuestionType === 1"
label="关联表"
prop="DataTableName"
>
<el-select
v-model="form.DataTableName"
clearable
@change="((val)=>{dataTableNameChange(val, form)})"
>
<el-option
v-for="item of tblOptions"
:key="`RelevanceId${item.QuestionId}`"
:label="item.QuestionName"
:value="item.QuestionId"
/>
</el-select>
</el-form-item> -->
<el-form-item label="问题分类">
<!-- <el-radio-group v-model="form.QuestionClassify">
<el-radio v-for="item of $d.QuestionClassify" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group> -->
<el-select v-model="form.QuestionClassify" clearable>
<el-option
v-for="item of $d.QuestionClassify"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<!-- 数值类型 -->
<el-form-item
v-if="form.Type === 'number' || form.Type === 'calculation'"
label="数值类型"
prop="ValueType"
:rules="[
{ required: true, message: '请选择'}
]"
>
<el-radio-group
v-model="form.ValueType"
>
<el-radio
v-for="item of $d.ValueType"
:key="item.id"
:label="item.value"
>
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<!-- 数值单位 -->
<el-form-item
v-if="form.Type === 'number' || form.Type === 'calculation'"
label="单位"
>
<el-radio-group
v-model="form.Unit"
>
<el-radio
v-for="item of $d.ValueUnit"
:key="item.id"
:label="item.value"
>
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<!-- 关联字段 -->
<el-form-item
v-if="form.TableQuestionType === 2"
label="关联问题"
prop="DependParentId"
>
<el-select
v-model="form.DependParentId"
>
<el-option
v-for="item of parentOptions"
:key="`DependParentId${item.QuestionId}`"
:label="item.QuestionName"
:value="item.QuestionId"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="form.TableQuestionType === 1 || !!form.DependParentId"
label="关联字段"
prop="DataTableColumn"
>
<el-select v-model="form.DataTableColumn">
<el-option
v-for="item of CriterionDictionaryList.OrganColumn"
:key="item.Id"
:label="item.ValueCN"
:value="item.Code"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="form.TableQuestionType === 3 || form.TableQuestionType === 2"
label="关联字典"
prop="DictionaryCode"
:rules="[{ required: form.TableQuestionType === 3, message: '请选择', trigger: 'blur' }]"
>
<el-select v-model="form.DictionaryCode">
<el-option
v-for="item of dicList"
:key="item.Id"
:label="item.Code"
:value="item.Code"
/>
</el-select>
</el-form-item>
<el-form-item v-if="form.Type !== 'group'" label="是否显示" prop="ShowQuestion">
<el-radio-group
v-model="form.ShowQuestion"
@change="((val)=>{isShowQuestionChange(val, form)})"
>
<el-radio
v-for="item of $d.ShowQuestion"
:key="`ShowQuestion${item.value}`"
:label="item.value"
>
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<!-- 显示时依赖父问题 -->
<el-form-item
v-if="form.Type !== 'group' && form.ShowQuestion===1"
label="显示依赖父问题"
prop="ParentId"
>
<el-select
v-model="form.ParentId"
clearable
@change="((val)=>{parentQuestionChange(val, form)})"
>
<el-option
v-for="item of parentOptions"
:key="`ParentId${item.QuestionId}`"
:label="item.QuestionName"
:value="item.QuestionId"
/>
</el-select>
</el-form-item>
<!-- 显示时依赖父问题触发值 -->
<el-form-item v-if="form.ParentId && form.ShowQuestion===1" label="显示触发值" prop="ParentTriggerValueList">
<el-select v-model="form.ParentTriggerValueList" clearable multiple>
<el-option
v-for="item of parentTriggerValOptions"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item v-if="form.Type !== 'group' && form.Type !== 'table'" label="是否必填" prop="IsRequired">
<el-radio-group
v-model="form.IsRequired"
:disabled="form.IsJudgeQuestion===true || form.ShowQuestion===2"
@change="((val)=>{isRequiredChange(val, form)})"
>
<el-radio
v-for="item of $d.QuestionRequired"
:key="`QuestionRequired${item.value}`"
:label="item.value"
>
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<!-- 父问题 -->
<el-form-item
v-if="form.Type !== 'group' && form.IsRequired === 1"
label="必填依赖父问题"
prop="RelevanceId"
>
<el-select
v-model="form.RelevanceId"
clearable
@change="((val)=>{relevanceQuestionChange(val, form)})"
>
<el-option
v-for="item of parentOptions"
:key="`RelevanceId${item.QuestionId}`"
:label="item.QuestionName"
:value="item.QuestionId"
/>
</el-select>
</el-form-item>
<!-- 必填依赖的父问题触发值 -->
<el-form-item
v-if="form.RelevanceId && form.IsRequired === 1"
label="必填触发值"
prop="RelevanceValueList"
>
<el-select v-model="form.RelevanceValueList" clearable multiple>
<el-option
v-for="item of reParentTriggerValOptions"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="form.Type !== 'group'"
label="问题标识"
prop="QuestionMark"
>
<el-select
v-model="form.QuestionMark"
>
<el-option
v-for="item of CriterionDictionaryList.QuestionMark"
:key="item.Id"
:value="parseInt(item.Code)"
:label="item.ValueCN"
/>
</el-select>
</el-form-item>
<el-form-item v-if="form.Type === 'upload'" label="最大上传个数">
<el-input-number
v-model="form.ImageCount"
controls-position="right"
:min="1"
:max="10"
/>
</el-form-item>
<el-form-item v-if="form.Type === 'select' || form.Type === 'radio'" label="高亮标记值" prop="HighlightAnswerList">
<el-select v-model="form.HighlightAnswerList" clearable multiple>
<template v-if="form.TypeValue">
<el-option
v-for="item of form.TypeValue.split('|')"
:key="item"
:label="item"
:value="item"
/>
</template>
<template v-else-if="form.DictionaryCode">
<el-option
v-for="item of $d[form.DictionaryCode]"
:key="item.id"
:label="item.label"
:value="item.value.toString()"
/>
</template>
</el-select>
</el-form-item>
<el-form-item label="序号" prop="ShowOrder">
<el-input-number
v-model="form.ShowOrder"
controls-position="right"
:min="0"
/>
</el-form-item>
<el-form-item label="重复出现最大次数">
<el-input-number
v-model="form.MaxRowCount"
controls-position="right"
:min="0"
:max="10"
/>
</el-form-item>
<el-form-item label="限制编辑">
<el-radio-group v-model="form.LimitEdit">
<el-radio v-for="item of $d.LimitEdit" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="全局阅片是否显示">
<el-radio-group v-model="form.GlobalReadingShowType">
<el-radio v-for="item of $d.GlobalReadingShowType" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
<el-form-item>
<!-- 取消 -->
<el-button
size="small"
type="primary"
@click="close"
>
{{ $t('common:button:cancel') }}
</el-button>
<!-- 保存 -->
<el-button size="small" type="primary" :disabled="type === 'look'" @click="save">
{{ $t('common:button:save') }}
</el-button>
</el-form-item>
</div>
</el-form>
</template>
<script>
import { addOrUpdateReadingTableQuestionSystem, getReadingTableOtherQuestionSystem } from '@/api/trials'
import { getBasicConfigSelect, getCriterionDictionaryList, getCriterionDictionary } from '@/api/dictionary'
export default {
name: 'AddOrUpdateTableQs',
props: {
data: {
type: Object,
default() { return {} }
},
readingQuestionId: {
type: String,
required: true
},
criterionId: {
type: String,
required: true
},
type: {
type: String,
required: true
}
},
data() {
var validateTypeVal = (rule, value, callback) => {
if (value === '') {
callback(new Error(this.$t('common:ruleMessage:specify')))
} else {
var arr = value.split('|')
if (new Set(arr).size !== arr.length) {
callback(new Error('选项不允许存在相同值'))
} else {
callback()
}
}
}
return {
form: {
Id: '',
ReadingQuestionId: '',
QuestionName: '',
QuestionEnName: '',
Type: 'select',
TypeValue: '',
ValueType: '',
Unit: '',
ParentId: '',
ParentTriggerValue: '',
ShowOrder: 0,
ShowQuestion: null,
IsRequired: true,
Remark: '',
RelevanceId: '',
RelevanceValue: '',
RelevanceValueList: [],
ParentTriggerValueList: [],
DataTableName: '',
DataTableColumn: '',
DictionaryCode: '',
TableQuestionType: null,
MaxRowCount: null,
DependParentId: '',
QuestionMark: null,
LimitEdit: 0,
GlobalReadingShowType: null,
QuestionClassify: null,
HighlightAnswerList: []
// IsEnable: true
},
rules: {
Type: [
{ required: true, message: '请选择', trigger: 'blur' }
],
QuestionName: [{ required: true, message: '请注明', trigger: 'blur' },
{ max: 300, message: '最大长度为 300' }],
TypeValue: [{ required: true, message: '请注明', trigger: 'blur' },
{ validator: validateTypeVal, trigger: 'blur' },
{ max: 200, message: '最大长度为 200' }],
ShowQuestion: [{ required: true, message: '请选择', trigger: 'blur' }],
IsRequired: [{ required: true, message: '请选择', trigger: 'blur' }],
ParentId: [{ required: true, message: '请选择', trigger: 'blur' }],
ParentTriggerValueList: [
{ required: true, message: '请选择', trigger: 'blur' }
],
RelevanceId: [{ required: true, message: '请选择', trigger: 'blur' }],
RelevanceValueList: [{ required: true, message: '请选择', trigger: 'blur' }],
DataTableName: [{ required: true, message: '请选择', trigger: 'blur' }],
DataTableColumn: [{ required: true, message: '请选择', trigger: 'blur' }],
// DictionaryCode: [{ required: true, message: '请选择', trigger: 'blur' }],
DependParentId: [{ required: true, message: '请选择', trigger: 'blur' }]
},
loading: false,
parentOptions: [],
parentTriggerValOptions: [],
reParentTriggerValOptions: [],
tblOptions: [],
colOptions: [],
dicList: [],
CriterionDictionaryList: []
}
},
mounted() {
this.initForm()
this.getCriterionDictionary()
},
methods: {
getCriterionDictionary() {
getCriterionDictionary({
ReadingCriterionId: this.criterionId,
DictionaryCodeList: ['QuestionMark', 'OrganColumn']
}).then(res => {
this.CriterionDictionaryList = res.Result
})
},
async initForm() {
await this.getBasicConfigSelect()
await this.getParentQuestions()
if (Object.keys(this.data).length > 0) {
for (const k in this.form) {
if (this.data.hasOwnProperty(k)) {
this.form[k] = this.data[k]
}
}
if (this.form.ParentId) {
var index = this.parentOptions.findIndex(item => {
return item.QuestionId === this.form.ParentId
})
if (index !== -1) {
if (this.parentOptions[index].QuestionGenre === 3) {
this.parentTriggerValOptions = this.$d[this.parentOptions[index].DictionaryCode]
} else {
const options = []
this.parentOptions[index].TypeValue.split('|').forEach((item, index) => {
options.push({ id: index, label: item, value: item })
})
this.parentTriggerValOptions = options
}
}
}
if (this.form.RelevanceId) {
var i = this.parentOptions.findIndex(item => {
return item.QuestionId === this.form.RelevanceId
})
if (i !== -1) {
if (this.parentOptions[i].QuestionGenre === 3) {
console.log(this.$d[this.parentOptions[i].DictionaryCode])
this.reParentTriggerValOptions = this.$d[this.parentOptions[i].DictionaryCode]
} else {
const options = []
this.parentOptions[i].TypeValue.split('|').forEach((item, index) => {
options.push({ id: i, label: item, value: item })
})
this.reParentTriggerValOptions = options
}
}
}
}
},
save() {
this.$refs.tableQsForm.validate(valid => {
if (!valid) return
this.loading = true
this.form.SystemCriterionId = this.criterionId
this.form.ReadingQuestionId = this.readingQuestionId
addOrUpdateReadingTableQuestionSystem(this.form).then(res => {
this.$emit('getList')
this.loading = false
this.$emit('close')
this.$emit('reloadArbitrationRules')
this.$message.success(this.$t('common:message:savedSuccessfully'))
})
.catch(() => {
this.loading = false
})
})
},
getParentQuestions() {
return new Promise((resolve, reject) => {
this.loading = true
var param = {
readingQuestionId: this.readingQuestionId,
id: this.data.Id
}
getReadingTableOtherQuestionSystem(param).then(res => {
this.parentOptions = res.Result
this.loading = false
resolve()
}).catch(() => {
this.loading = false
reject()
})
})
},
getBasicConfigSelect() {
getCriterionDictionaryList({
CriterionId: this.criterionId,
SystemCriterionId: this.criterionId
}).then(res => {
this.dicList = res.Result
})
},
isShowQuestionChange(val, form) {
if (val === 2) {
form.IsRequired = 2
form.ParentId = ''
form.ParentTriggerValue = ''
} else {
form.ParentId = ''
form.ParentTriggerValue = ''
}
},
isRequiredChange(val, form) {
if (val !== 1) {
form.RelevanceId = ''
form.RelevanceValue = ''
}
},
parentQuestionChange(val, form) {
if (val) {
var index = this.parentOptions.findIndex(item => {
return item.QuestionId === val
})
if (index !== -1) {
if (this.parentOptions[index].QuestionGenre === 3) {
this.parentTriggerValOptions = this.$d[this.parentOptions[index].DictionaryCode]
} else {
const options = []
this.parentOptions[index].TypeValue.split('|').forEach((item, index) => {
options.push({ id: index, label: item, value: item })
})
this.parentTriggerValOptions = options
}
}
}
form.ParentTriggerValue = ''
},
relevanceQuestionChange(val, form) {
if (val) {
var index = this.parentOptions.findIndex(item => {
return item.QuestionId === val
})
console.log(this.$d[this.parentOptions[index].DictionaryCode], this.parentOptions[index].QuestionGenre)
if (index !== -1) {
if (this.parentOptions[index].QuestionGenre === 3) {
console.log(this.$d[this.parentOptions[index].DictionaryCode])
this.reParentTriggerValOptions = this.$d[this.parentOptions[index].DictionaryCode]
} else {
const options = []
this.parentOptions[index].TypeValue.split('|').forEach((item, index) => {
options.push({ id: index, label: item, value: item })
})
this.reParentTriggerValOptions = options
}
}
}
form.RelevanceValue = ''
},
tableQuestionTypeChange(val, form) {
form.DictionaryCode = ''
form.DataTableColumn = ''
form.DataTableName = ''
form.DependParentId = ''
form.TypeValue = ''
},
dataTableNameChange(val, form) {
if (val) {
var index = this.tblOptions.findIndex(item => {
return item.Id === val
})
if (index !== -1) {
this.colOptions = this.tblOptions[index].Columns
}
}
form.DataTableColumn = ''
},
qsTypeChange(val, form) {
form.TypeValue = ''
form.ValueType = ''
form.Unit = ''
form.TableQuestionType = null
form.DependParentId = ''
form.DataTableColumn = ''
form.DataTableName = ''
form.DictionaryCode = ''
},
close() {
this.$emit('close')
}
}
}
</script>
<style lang="scss" scoped>
</style>