middleground_code_v2/src/views/DataCenterOptions/dataOrigin/sonTable.vue

867 lines
23 KiB
Vue
Raw Normal View History

<template>
<div class="sonTable">
<div class="optionForm">
<baseNewForm
ref="optionForm"
:spanNumber="24"
:isFunBtn="false"
:formRow="optionFormRow"
:ruleForm="optionRuleForm"
:labelPosition="'top'"
@onSelect="selectChangeHanlde"
@inputBlur="optionFormInputBlur"
@onSubmit="optionOnSubmit"
:rules="rules"
>
</baseNewForm>
<baseNewForm
:rules="rules"
ref="typeOptionForm"
:spanNumber="24"
:isFunBtn="false"
:formRow="typeOptionFormRow"
:ruleForm="typeOptionRuleForm"
:labelPosition="'top'"
@onSelect="typeSelectChangeHanlde"
@onSubmit="typeOptionOnSubmit"
>
</baseNewForm>
<baseNewForm
:rules="rules"
ref="propertyForm"
:spanNumber="24"
:isFunBtn="false"
:formRow="propertyFormRow"
:ruleForm="propertyRuleForm"
:labelPosition="'top'"
@onSubmit="propertyOnSubmit"
>
</baseNewForm>
</div>
<div class="smtitle">
可选控间属性
</div>
<div class="checkBoxList">
<el-checkbox-group v-model="propertyActiveList"
@change="propertyActiveListChangeHanlde"
>
<el-checkbox v-for="(item,index) in propertyList" :label="item.id" :key="item.id">{{
item.label
}}
</el-checkbox>
</el-checkbox-group>
</div>
</div>
</template>
<script>
import baseNewForm from '../compoments/baseNewForm.vue'
import { deepClone } from '@/utils'
import { getApiModuleApi } from '@/api/apiChunks'
export default {
name: 'sonTable',
props: {
activedTableData: {
type: Array,
default: () => {
return []
}
},
mainTempClick: {
type: Object,
default: () => {
return {}
}
}
},
data() {
return {
rules:{
chName: [{
required: true,
message: '请输入源数据',
trigger: 'blur'
}],
enName: [{
required: true,
message: '请输入源数据',
trigger: 'blur'
}],
filedType: [{
required: true,
message: '请输入源数据',
trigger: 'blur'
}],
filedLength: [{
required: true,
message: '请输入源数据',
trigger: 'blur'
}],
title: [{
required: true,
message: '请输入源数据',
trigger: 'blur'
}],
row: [{
required: true,
message: '请输入源数据',
trigger: 'blur'
}],
type: [{
required: true,
message: '请输入源数据',
trigger: 'blur'
}],
service: [{
required: true,
message: '请输入源数据',
trigger: 'blur'
}],
label: [{
required: true,
message: '请输入源数据',
trigger: 'blur'
}],
upId: [{
required: true,
message: '请输入源数据',
trigger: 'blur'
}],
},
activedTableRow: {},//当前选中行
optionFormRow: [
{
elCol: [
{
type: 'input',
title: '中文名称',
id: 'chName',
row: 24,
disabled: false,
required: true,
fontSize: 16
}
]
},
{
elCol: [
{
type: 'input',
title: '英文名称',
id: 'enName',
row: 24,
disabled: false,
required: true,
fontSize: 16,
pattern: /^[a-z][a-z0-9_]{0,50}$/,
message: '必须以小写字母开头,只能包含小写字母、数字和下划线,不能包含中文字符或其他符号。',
disabledOfId: true
}
]
},
{
elCol: [
{
type: 'select',
title: '字段类型',
id: 'filedType',
row: 24,
disabled: false,
required: true,
fontSize: 16,
options: []
}
]
},
{
elCol: [
{
type: 'num',
title: '长度',
id: 'filedLength',
row: 24,
disabled: false,
required: true,
fontSize: 16,
max: 255
}
]
},
{
elCol: [
{
type: 'input',
title: '显示名',
id: 'title',
row: 24,
disabled: false,
required: true,
fontSize: 16
}
]
}
, {
elCol: [
{
type: 'select',
title: '宽度',
id: 'row',
row: 24,
disabled: false,
required: true,
fontSize: 16,
options: [
{
label: '3',
id: '3'
}, {
label: '6',
id: '6'
}, {
label: '9',
id: '9'
}, {
label: '12',
id: '12'
}, {
label: '15',
id: '15'
}, {
label: '18',
id: '18'
}, {
label: '21',
id: '21'
}, {
label: '24',
id: '24'
}
]
}
]
},
{
elCol: [
{
type: 'num',
title: '单元格宽度',
id: 'width',
row: 24,
disabled: false,
required: false,
fontSize: 16,
message: 'px'
}
]
},
{
elCol: [
{
type: 'select',
title: '数据类型',
id: 'type',
row: 24,
disabled: false,
required: true,
fontSize: 16,
options: [
{
label: 'input',
id: 'input'
}, {
label: 'datepick',
id: 'datepick'
},
// {
// label: 'daterange',
// id: 'daterange'
// },
{
label: 'radio',
id: 'radio'
}, {
label: 'textrea',
id: 'textrea'
}, {
label: 'select',
id: 'select'
}, {
label: 'treeselect',
id: 'treeselect'
},
{
label: 'number',
id: 'num'
}
]
}
]
},
{
elCol: [
{
type: 'onecheck',
title: '必填',
id: 'required',
row: 24,
disabled: false,
required: false,
fontSize: 16,
options: [
{
label: '是',
id: 'true'
}, {
label: '否',
id: 'false'
}
]
}
]
},
{
elCol: [
{
type: 'onecheck',
title: '禁止修改',
id: 'disabled',
row: 24,
disabled: false,
required: false,
fontSize: 16,
options: [
{
label: '是',
id: 'true'
}
]
}
]
}
],
optionRuleForm: {},//表字段options数据
//type选中后的表
typeOptionFormRow: [],
typeOptionRuleForm: {},//表字段根据type数据
propertyFormRow: [],//可选属性表表格(渲染)
propertyRuleForm: {},//可选属性表数据
propertyActiveList: [],//可选属性选中列表v-model)
propertyList: [
{
label: '大于',
id: 'up'
}, {
label: '小于',
id: 'low'
},
{
label: '正则',
id: 'pattern'
},
{ label: '正则提示', id: 'message' }
],//可选属性列表
//可选属性表数据字典
typeDist: {
select: [
{
type: 'select',
id: 'service',
title: '服务名称',
row: 24,
disabled: false,
required: true,
fontSize: 16,
options: []
},
{
type: 'select',
id: 'label',
title: 'label',
row: 24,
disabled: false,
required: true,
fontSize: 16,
options: []
}, {
type: 'input',
id: 'value',
title: 'value',
row: 24,
disabled: true,
required: true,
fontSize: 16,
options: []
}
],
radio: [
{
type: 'select',
id: 'service',
title: '服务名称',
row: 24,
disabled: false,
required: true,
fontSize: 16,
options: []
},
{
type: 'select',
id: 'label',
title: 'label',
row: 24,
disabled: false,
required: true,
fontSize: 16,
options: []
}, {
type: 'input',
id: 'value',
title: 'value',
row: 24,
disabled: true,
required: true,
fontSize: 16,
options: []
}
],
treeselect: [
{
type: 'select',
id: 'service',
title: '服务名称',
row: 24,
disabled: false,
required: true,
fontSize: 16,
options: []
},
{
type: 'select',
id: 'label',
title: 'label',
row: 24,
disabled: false,
required: true,
fontSize: 16,
options: []
}, {
type: 'input',
id: 'value',
title: 'value',
row: 24,
disabled: true,
required: false,
fontSize: 16,
options: []
},
{
type: 'select',
id: 'upId',
title: 'upId',
row: 24,
disabled: false,
required: true,
fontSize: 16,
options: []
}
]
},
serviceOptions: [], //服务下啦
//radiolist属性数字字典
propertyDist: {
up: {
type: 'select',
id: 'up',
title: '大于',
row: 24,
disabled: false,
required: true,
fontSize: 16,
options: []
},
low: {
type: 'select',
id: 'low',
title: '小于',
row: 24,
disabled: false,
required: true,
fontSize: 16,
options: []
},
pattern: {
type: 'input',
id: 'pattern',
title: '正则',
row: 24,
disabled: false,
required: true,
fontSize: 16
},
message: {
type: 'input',
id: 'message',
title: '正则提示',
row: 24,
disabled: false,
required: true,
fontSize: 16
}
}
}
},
methods: {
//回显事件
activedOnClick(val) {
this.activedTableRow = val
//清空type带出来的ruleForm
this.typeOptionFormRow = []
this.typeOptionRuleForm = {
value: 'id'
}
this.propertyFormRow = []
this.propertyRuleForm = {}
this.propertyActiveList = []
let propertyRuleForm = []
let optionRuleForm = []
let typeOptionRuleForm = []
this.$nextTick(() => {
// 重置表单
this.$refs.optionForm.resetForm()
this.optionRuleForm = deepClone(val)
console.log(this.optionRuleForm, 'this.optionRuleForm')
let dom = document.querySelector('.optionForm')
dom.scrollTo({
top: 0,
behavior: 'smooth'
})
//表单规则处理
if (!val.mdmModuleDbFiledsRules) return
val.mdmModuleDbFiledsRules.forEach(item => {
if (item.ruleCode === 'required' || item.ruleCode === 'disabled') {
if (!item.ruleValue) {
this.$set(this[item.formName], item.ruleCode, false)
} else if (typeof item.ruleValue === 'boolean') {
this.$set(this[item.formName], item.ruleCode, item.ruleValue)
} else {
this.$set(this[item.formName], item.ruleCode, JSON.parse(item.ruleValue))
}
} else {
this.$set(this[item.formName], item.ruleCode, item.ruleValue)
}
if (item.formName === 'propertyRuleForm') {
propertyRuleForm.push(item.ruleCode)
}
})
if (this.typeOptionRuleForm.service) {
this.typeSelectChangeHanlde(this.typeOptionRuleForm.service, '', '', {
id: 'service',
options: this.serviceOptions
}, true)
}
this.selectChangeHanlde(this.optionRuleForm.type, '', '', { id: 'type' }, true)
this.selectChangeHanlde(this.optionRuleForm.filedType, '', '', { id: 'filedType' }, true)
this.propertyActiveList = propertyRuleForm
this.propertyActiveListChangeHanlde(this.propertyActiveList)
})
},
//表字段下拉触发根据type类型动态对表
selectChangeHanlde(val, index, indexRow, row, init = false) {
if (row.id === 'type') {
this.typeOptionFormRow = []
if (!init) {
this.typeOptionRuleForm = {
value: 'id'
}
}
if (val && this.typeDist[val]) {
this.typeDist[val].forEach(item => {
// 如果是服务名称则将请求下来的服务名用上
if (item.id === 'service') {
item.options = deepClone(this.serviceOptions)
}
let tempObj = {
elCol: [
{
...item
}
]
}
this.typeOptionFormRow.push(tempObj)
})
}
}
//字段类型下啦改变时 将数据类型下啦重置
if (row.id === 'filedType') {
if (val) {
let dist = {
1: [
{
label: 'number',
id: 'num'
}
],
2: [
{
label: 'number',
id: 'num'
}
],
3: [
{
label: 'input',
id: 'input'
},
{
label: 'radio',
id: 'radio'
},
{
label: 'textrea',
id: 'textrea'
},
{
label: 'select',
id: 'select'
},
{
label: 'treeselect',
id: 'treeselect'
}
],
4: [
{
label: 'datepick',
id: 'datepick'
}
// {
// label: 'daterange',
// id: 'daterange'
// }
]
}
this.optionFormRow[7].elCol[0].options = dist[val]
if (val == 4) {
this.optionFormRow[3].elCol[0].disabled = true
this.optionFormRow[3].elCol[0].required = false
this.$set(this.optionRuleForm, 'filedLength', '')
} else {
this.optionFormRow[3].elCol[0].disabled = false
this.optionFormRow[3].elCol[0].required = true
}
} else {
this.optionFormRow[3].elCol[0].disabled = false
this.optionFormRow[3].elCol[0].required = true
}
if (!init) {
this.$set(this.optionRuleForm, 'type', '')
this.typeOptionFormRow = []
this.typeOptionRuleForm = {}
}
}
}
,
//表单输入框失焦事件(为了让中文名称可以给显示名)
optionFormInputBlur(id, row) {
if (id === 'chName' && !row.title) {
this.$set(row, 'title', row['chName'])
}
}
,
//配置项表通过
optionOnSubmit() {
this.$refs.typeOptionForm.submitForm()
}
,
//type表下拉触发目的是为了服务名称下拉后拿到label
async typeSelectChangeHanlde(val, index, indexRow, row, initFlag = false) {
if (row.id === 'service') {
if (val) {
let obj = row.options.find(item => {
return val === item.id
})
console.log(obj, 'obj')
const res = await getApiModuleApi({
tl: 'mdmModuleService',
as: '',
dj: 'queryMdmServiceField'
}, { mdmId: obj.mdmId, dbId: obj.dbId })
this.labelOptions = []
res.attribute.forEach(item => {
this.labelOptions.push({
id: item.enName,
label: item.chName
})
})
} else {
this.labelOptions = []
}
this.typeOptionFormRow.forEach(item => {
if (item.elCol[0].id === 'label' || item.elCol[0].id === 'upId') {
if (!initFlag) {
this.$set(this.typeOptionRuleForm, item.elCol[0].id, '')
}
item.elCol[0].options = deepClone(this.labelOptions)
}
})
}
}
,
//type表通过
typeOptionOnSubmit() {
this.$refs.propertyForm.submitForm()
}
,
//可选属性表通过校验 准备开始保存
propertyOnSubmit() {
console.log('进入保存方法', this.activedTableRow)
let params = {
mdmId: this.$route.query.id,
dbId: this.mainTempClick.id,
dbType: this.mainTempClick.dbType,
dbName: this.mainTempClick.dbName,
id: this.activedTableRow.id
}
//开始暂存
let tempDist = {
title: true,
row: true,
type: true,
required: true,
disabled: true,
width: true
}
let tempArr = []
let disabledWords = ['id', 'formmain_id', 'data_status', 'sorts', 'create_user_id', 'create_time', 'modify_user_id', 'modify_time', 'sts', 'org_id', 'company_id', 'data_id']
if (disabledWords.includes(this.optionRuleForm.enName)) {
this.$vmNews(`暂存失败,英文名${this.optionRuleForm.enName}不合法。`)
return
}
if (this.optionRuleForm.type === 'datepick' || this.optionRuleForm.type === 'daterange') {
if (this.optionRuleForm.filedType != 4) {
this.$vmNews('字段类型与数据类型不合法,请选择日期类型', 'warning')
return
}
}
if (this.optionRuleForm.filedType == 4) {
if (this.optionRuleForm.type !== 'datepick' && this.optionRuleForm.type !== 'daterange') {
this.$vmNews('字段类型与数据类型不合法', 'warning')
return
}
}
if (this.optionRuleForm.filedLength * 1 > 255) {
this.$vmNews('长度不能大于255')
return
}
if (this.optionRuleForm.filedType == 2 && this.optionRuleForm.filedLength * 1 > 65) {
this.$vmNews('当字段类型为金额时长度不得大于65')
return
}
this.$set(params, 'chName', this.optionRuleForm.chName)
this.$set(params, 'enName', this.optionRuleForm.enName)
this.$set(params, 'filedType', this.optionRuleForm.filedType)
this.$set(params, 'filedLength', this.optionRuleForm.filedLength)
this.optionFormRow.forEach(item => {
if (tempDist[item.elCol[0].id]) {
tempArr.push({
ruleName: item.elCol[0].title,
ruleCode: item.elCol[0].id,
ruleValue: this.optionRuleForm[item.elCol[0].id],
ruleType: 2,
formName: 'optionRuleForm'
})
}
})
this.typeOptionFormRow.forEach(item => {
tempArr.push({
ruleName: item.elCol[0].title,
ruleCode: item.elCol[0].id,
ruleValue: this.typeOptionRuleForm[item.elCol[0].id],
ruleType: 2,
formName: 'typeOptionRuleForm'
})
})
this.propertyFormRow.forEach(item => {
tempArr.push({
ruleName: item.elCol[0].title,
ruleCode: item.elCol[0].id,
ruleValue: this.propertyRuleForm[item.elCol[0].id],
ruleType: 2,
formName: 'propertyRuleForm'
})
})
params.mdmModuleDbFiledsRules = tempArr
console.log(params)
this.$emit('sonSaveHandle', params)
}
,
// 可选属性表变更方法
propertyActiveListChangeHanlde(val) {
this.propertyFormRow = []
// 消除表单里被取消的值
Object.keys(this.propertyRuleForm).forEach(item => {
if (!val.includes(item)) {
this.$delete(this.propertyRuleForm, item)
}
})
if (val === 'up' || val === 'low') {
this.activedTableData.forEach(item => {
tempOptions.push({ label: item.id, chName: item.enName })
})
}
// 通过字典找到值的类型渲染在表单上
val.forEach(item => {
let tempOptions = []
//若是大于和小于则需要将datepick拿到放进来选
if (item === 'up' || item === 'low') {
this.activedTableData.some(ele => {
console.log(ele, 'ele')
if (this.activedTableRow.id === ele.id || !ele.mdmModuleDbFiledsRules) return false
ele.mdmModuleDbFiledsRules.forEach(ele02 => {
if (ele02.ruleValue === 'datepick') {
tempOptions.push({ label: ele.chName, id: ele.enName })
}
})
})
}
let tempObj = {
elCol: [
{
...this.propertyDist[item],
options: tempOptions
}
]
}
this.propertyFormRow.push(tempObj)
})
}
},
components: {
baseNewForm
}
}
</script>
<style scoped lang="scss">
.smtitle {
color: #333;
font-weight: 400;
padding: 20px 0;
border-top: 1px solid #EBEBEB;
}
.checkBoxList {
padding-bottom: 50px;
}
</style>