de/frontend/src/views/system/SysParam/MapSetting/MapSettingRight.vue

355 lines
10 KiB
Vue

<template>
<div>
<!--基础配置表单-->
<el-form
v-if="status !== 'empty' && status !== 'read-only'"
ref="formInline"
v-loading="loading"
:model="formInline"
:rules="rules"
class="demo-form-inline"
size="small"
>
<el-input v-show="false" v-model="formInline.pLevel" />
<el-row>
<el-row>
<el-col>
<el-form-item :label="$t('map_setting.parent_area')" prop="pCode">
<el-tree-select
v-if="treeShow"
ref="deSelectTree"
v-model="formInline.pCode"
:popper-append-to-body="true"
popover-class="map-class-wrap"
:data="treeDatas"
:select-params="selectParams"
:tree-params="treeParams"
:filter-node-method="_filterFun"
:tree-render-fun="_renderFun"
@searchFun="_searchFun"
@node-click="changeNode"
@select-clear="selectClear"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col>
<el-form-item :label="$t('map_setting.area_code')" prop="code">
<el-input v-model="formInline.code" :placeholder="$t('map_setting.please_input')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col>
<el-form-item :label="$t('map_setting.area_name')" prop="name">
<el-input v-model="formInline.name" maxlength="30" show-word-limit :placeholder="$t('map_setting.please_input')" />
</el-form-item>
</el-col>
</el-row>
</el-row>
<el-row>
<el-col>
<el-form-item :label="$t('map_setting.geo_json')">
<el-upload
style="float: right;margin-left: 10px"
class="upload-demo"
action=""
accept=".json"
:on-exceed="handleExceed"
:before-upload="uploadValidate"
:on-error="handleError"
:show-file-list="false"
:file-list="filesTmp"
:http-request="uploadMapFile"
>
<el-button style="display: inline-block" size="mini" type="success" plain>
{{ $t('commons.upload') }}
</el-button>
</el-upload>
<el-button
style="float:right;margin-top: 3px"
size="mini"
type="danger"
plain
@click="removeFile"
>
{{ $t('commons.clear') }}
</el-button>
<el-input
v-model="formInline.fileName"
:disabled="true"
/>
</el-form-item>
</el-col>
</el-row>
<div>
<el-button type="success" size="small" @click="save('formInline')">
{{ $t('commons.save') }}
</el-button>
</div>
</el-form>
<el-descriptions v-else-if="status === 'read-only'" title="区域信息" :column="1">
<el-descriptions-item :label="$t('map_setting.area_code')">{{ nodeInfo.code }}</el-descriptions-item>
<el-descriptions-item :label="$t('map_setting.area_name')">{{ nodeInfo.name }}</el-descriptions-item>
<el-descriptions-item :label="$t('map_setting.parent_name')">{{ nodeInfo.pname }}</el-descriptions-item>
<el-descriptions-item :label="$t('map_setting.geo_json')">
<json-view :data="json" />
</el-descriptions-item>
</el-descriptions>
<el-empty v-else-if="status === 'empty'" description="请在左侧选择区域" />
</div>
</template>
<script>
import jsonView from 'vue-json-views'
import { geoJson, saveMap } from '@/api/map/map'
import ElTreeSelect from '@/components/ElTreeSelect'
export default {
name: 'MapSettingRight',
components: { jsonView, ElTreeSelect },
props: {
status: {
type: String,
default: 'empty'
},
treeDatas: {
type: Array,
default: () => []
}
},
data() {
return {
formInline: { pCode: '', fileName: '' },
loading: false,
rules: {
pCode: [
{ required: true, message: this.$t('map_setting.parent_name') + this.$t('commons.cannot_be_null'), trigger: 'change' }
],
code: [
{ required: true, message: this.$t('map_setting.area_code') + this.$t('commons.cannot_be_null'), trigger: ['change', 'blur'] },
{ pattern: /^\d{9}$/, message: this.$t('map_setting.area_code_tip'), trigger: ['change', 'blur'] }
],
name: [
{ required: true, message: this.$t('map_setting.area_name') + this.$t('commons.cannot_be_null'), trigger: ['change', 'blur'] }
],
fileName: [
{ required: true, message: this.$t('map_setting.geo_json') + this.$t('commons.cannot_be_null'), trigger: 'change' }
]
},
levelOptions: [
{ value: 1, label: '国家' },
{ value: 2, label: '一级行政区划(省)' },
{ value: 3, label: '二级行政区划(市)' },
{ value: 4, label: '三级行政区划(区县)' },
{ value: 5, label: '四级行政区划(乡镇)' }
],
suffixes: new Set(['json']),
errList: [],
filesTmp: [],
nodeInfo: {
code: -1,
name: '',
level: -1,
pcode: -1,
pname: ''
},
noGsoJson: { success: false, message: 'no json file' },
json: {},
selectParams: {
clearable: true,
placeholder: this.$t('commons.please_select') + this.$t('map_setting.parent_name')
},
treeParams: {
showParent: true,
clickParent: true,
filterable: true,
// 只想要子节点,不需要父节点
leafOnly: false,
includeHalfChecked: false,
'check-strictly': false,
'default-expand-all': false,
'expand-on-click-node': false,
'render-content': this._renderFun,
data: [],
props: {
children: 'children',
label: 'name',
rootId: '000000000',
disabled: 'disabled',
parentId: 'pcode',
value: 'code'
}
},
treeShow: true
}
},
watch: {
treeDatas: function(val) {
this.treeParams.data = val
}
},
created() {
// this.query()
},
methods: {
handleExceed(files, fileList) {
this.$warning(this.$t('test_track.case.import.upload_limit_count'))
},
handleError() {
this.$warning(this.$t('test_track.case.import.upload_limit_count'))
},
uploadValidate(file) {
const suffix = file.name.substring(file.name.lastIndexOf('.') + 1)
if (!this.suffixes.has(suffix)) {
this.$warning(this.$t('test_track.case.import.upload_limit_format'))
return false
}
if (file.size / 1024 / 1024 > 30) {
this.$warning(this.$t('test_track.case.import.upload_limit_size'))
return false
}
this.errList = []
return true
},
uploadMapFile(file) {
this.$set(this.formInline, 'fileName', file.file.name)
this.formInline.file = file.file
},
removeFile() {
this.formInline.fileName = null
this.formInline.file = null
},
buildFormData(file, files, param) {
const formData = new FormData()
if (file) {
formData.append('file', file)
}
if (files) {
files.forEach(f => {
formData.append('files', f)
})
}
formData.append('request', new Blob([JSON.stringify(param)], { type: 'application/json' }))
return formData
},
save(formInline) {
const param = {
code: this.formInline.code,
name: this.formInline.name,
pcode: this.formInline.pCode,
plevel: this.formInline.pLevel
}
this.$refs[formInline].validate(valid => {
if (valid) {
this.saveHandler(param)
} else {
// this.result = false
}
})
},
saveHandler(param) {
const formData = this.buildFormData(this.formInline.file, null, param)
saveMap(formData).then(response => {
const flag = response.success
if (flag) {
this.$emit('refresh-tree', param)
this.$success(this.$t('commons.save_success'))
} else {
this.$message.error(this.$t('commons.save_failed'))
}
})
},
emitAdd(form) {
this.formInline = JSON.parse(JSON.stringify(form))
this.treeShow = false
this.$nextTick(() => {
this.treeShow = true
})
},
loadForm(form) {
if (form && form.code) {
this.nodeInfo = JSON.parse(JSON.stringify(form))
this.setGeoJson()
}
},
setGeoJson() {
if (!this.nodeInfo || !this.nodeInfo.code) {
this.json = JSON.parse(JSON.stringify(this.noGsoJson))
return
}
const cCode = this.nodeInfo.code
if (this.$store.getters.geoMap[cCode]) {
const json = this.$store.getters.geoMap[cCode]
this.json = JSON.parse(JSON.stringify(json))
return
}
geoJson(cCode).then(res => {
this.$store.dispatch('map/setGeo', {
key: cCode,
value: res
}).then(() => {
this.json = JSON.parse(JSON.stringify(res))
})
})
},
_filterFun(value, data, node) {
if (!value) return true
return data.id.toString().indexOf(value.toString()) !== -1
},
// 树点击
_nodeClickFun(data, node, vm) {
},
// 树过滤
_searchFun(value) {
this.$refs.deSelectTree.filterFun(value)
},
// 自定义render
_renderFun(h, { node, data, store }) {
const { props, clickParent } = this.treeParams
return (
<span class={['custom-tree-node', !clickParent && data[props.children] && data[props.children].length ? 'disabled' : null]}>
<span>{node.label}</span>
</span>
)
},
changeNode(data, node) {
if (node.level > 4) {
this.$error('不支持4级行政级别')
this.formInline.pLevel = null
this.formInline.pCode = null
return
}
this.formInline.pLevel = node.level
}
}
}
</script>
<style lang="scss" scoped>
.map-class-wrap{
top: 65px !important;
left: 0px !important;
}
</style>