You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
511 lines
15 KiB
511 lines
15 KiB
<template>
|
|
<div v-if="list.length > 0" class="diy-container">
|
|
<el-tabs v-model="activeName">
|
|
<el-tab-pane label="自定义模板" name="first">
|
|
<div class="diy-wr">
|
|
<div class="left">
|
|
<el-tabs v-model="leftActive" tab-position="left" class="left-h" @tab-click="handleTabsClick">
|
|
<el-tab-pane v-for="item in leftList" :key="item.id" :label="item.label" :name="item.id">
|
|
<div class="pd10 dialog-h-content scroll-h">
|
|
<checkBox v-if="item.queryItemList.length > 0" :ref="'checkbox' + item.id"
|
|
:list="item.queryItemList" @change="handleChangeBox" />
|
|
</div>
|
|
</el-tab-pane>
|
|
|
|
</el-tabs>
|
|
</div>
|
|
<div class="right">
|
|
<div class="right-header">
|
|
<div class="title">导出信息</div>
|
|
<el-button plain @click="handlePreview('')">预览</el-button>
|
|
</div>
|
|
<div class="h80 scroll-h">
|
|
<el-collapse v-model="activeCollapse" id="collapsWr">
|
|
<el-collapse-item v-for="item in rightList" :key="item.id"
|
|
:title="item.label" :name="item.id" class="col-h">
|
|
<dragItem :ref="'drag' + item.id" :list="item.queryItemList" :id="item.id"
|
|
@del="handleDelItem"
|
|
@drag="handleDrag($event, item)"></dragItem>
|
|
</el-collapse-item>
|
|
</el-collapse>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</el-tab-pane>
|
|
<el-tab-pane label="模板列表" name="second">
|
|
<el-table
|
|
:data="tableData"
|
|
height="calc(80vh - 140px)"
|
|
style="width: 100%">
|
|
<el-table-column
|
|
type="index"
|
|
label="序号"
|
|
align="center"
|
|
width="50">
|
|
</el-table-column>
|
|
<el-table-column
|
|
prop="name"
|
|
label="模板名称"
|
|
align="center"
|
|
min-width="180">
|
|
</el-table-column>
|
|
<el-table-column
|
|
prop="createdBy"
|
|
align="center"
|
|
label="创建者"
|
|
width="180">
|
|
</el-table-column>
|
|
<el-table-column
|
|
align="center"
|
|
prop="createdTime"
|
|
label="创建时间"
|
|
width="180">
|
|
</el-table-column>
|
|
<el-table-column
|
|
align="center"
|
|
label="操作"
|
|
width="160">
|
|
<template slot-scope="scope">
|
|
<el-button v-if="scope.row.isSelf" type="text" size="small" class="div-table-button--delete"
|
|
@click="handleDeltemplate(scope.row.id)">删除</el-button>
|
|
<el-button type="text" size="small" class="div-table-button--detail"
|
|
@click="handlePreview(scope.row.id)">预览</el-button>
|
|
<el-button
|
|
type="text"
|
|
size="small"
|
|
class="div-table-button--edit" @click="handleExportTemplate(scope.row.id)">导出</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</el-tab-pane>
|
|
</el-tabs>
|
|
<div v-if="activeName == 'first'" class="diy-footer">
|
|
<div class="left">
|
|
<div class="flex-div">
|
|
<div>模板名称:</div>
|
|
<el-input v-model="form.name" maxlength="20" class="wd200 mr10" />
|
|
<el-checkbox v-model="form.isSaveTemp">保存为常用模板</el-checkbox>
|
|
</div>
|
|
</div>
|
|
<el-button class="diy-button--delete" :loading="exportLoading" @click="handleExport">导出</el-button>
|
|
</div>
|
|
<el-dialog :visible.sync="diyDialog"
|
|
:close-on-click-modal="false"
|
|
:close-on-press-escape="false"
|
|
width="1150px"
|
|
append-to-body
|
|
top="5vh"
|
|
class="dialog-h"
|
|
@close="handleClose"
|
|
>
|
|
<div style="padding: 20px;">
|
|
<el-table
|
|
:data="tableData"
|
|
height="calc(80vh - 140px)"
|
|
style="width: 100%">
|
|
<el-table-column
|
|
v-for="(item, index) in previewList"
|
|
:label="item.label"
|
|
:key="index"
|
|
align="center"
|
|
min-width="120">
|
|
<el-table-column
|
|
v-for="(n, i) in item.children"
|
|
:label="n.label"
|
|
:key="i"
|
|
align="center"
|
|
min-width="120">
|
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
|
</el-table>
|
|
</div>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import checkBox from '../../components/checkBox.vue'
|
|
import dragItem from '../../components/dragItem.vue'
|
|
import Sortable from 'sortablejs'
|
|
import { requestPost } from "@/js/dai/request"
|
|
export default {
|
|
props: {
|
|
list: {
|
|
type: Array,
|
|
default: () => []
|
|
},
|
|
search: {
|
|
type: Object,
|
|
default: () => {}
|
|
}
|
|
},
|
|
components: {
|
|
checkBox,
|
|
dragItem
|
|
},
|
|
data() {
|
|
return {
|
|
exportLoading: false,
|
|
activeCollapse: ['1'],
|
|
activeName: 'first',
|
|
leftActive: '',
|
|
info: {},
|
|
rightList: [],
|
|
leftList: [],
|
|
form: {
|
|
isSaveTemp: false,
|
|
name: '',
|
|
itemList: []
|
|
},
|
|
tableData: [],
|
|
previewList: [],
|
|
diyDialog: false,
|
|
}
|
|
},
|
|
async created() {
|
|
this.list.forEach(item => {
|
|
this.$set(this.info, item.id, [])
|
|
})
|
|
this.leftActive = this.list[0].id
|
|
this.leftList = [...this.list]
|
|
this.leftList[0].queryItemList = await this.getExportChildList(this.leftList[0].id)
|
|
console.log('infodiy----', this.leftList)
|
|
this.getTemplateList()
|
|
},
|
|
watch: {
|
|
rightList: {
|
|
handler(val) {
|
|
if (val.length > 0) this.dragSort()
|
|
|
|
},
|
|
deep: true
|
|
},
|
|
// list: {
|
|
// handler(val) {
|
|
// if (val.length > 0) {
|
|
// this.leftList = [...val]
|
|
// this.leftList[0].queryItemList = this.getExportChildList(this.leftList[0].id)
|
|
// }
|
|
// },
|
|
// deep: true,
|
|
// // immediate: true
|
|
// },
|
|
},
|
|
methods: {
|
|
handleChangeBox({list, pid}) {
|
|
console.log('ccccc----', list)
|
|
// if (list.length == 0) return
|
|
let obj = {}
|
|
this.leftList.forEach(item =>{
|
|
if (item.id == pid) obj = { ...item, queryItemList: [...list] }
|
|
})
|
|
const groups = this.rightList.map(item => item.id)
|
|
if (groups.includes(pid)) {
|
|
this.rightList.forEach((item, i) => {
|
|
if (item.id == pid ) {
|
|
item.queryItemList = [...list]
|
|
if (list.length == 0) this.rightList.splice(i, 1)
|
|
}
|
|
})
|
|
} else {
|
|
this.rightList.push(obj)
|
|
|
|
this.$nextTick(() => {
|
|
console.log('itemttt------', this.$refs[`drag${pid}`])
|
|
this.$refs[`drag${pid}`][0].dragSort()
|
|
})
|
|
}
|
|
this.activeCollapse = [...this.activeCollapse, pid]
|
|
},
|
|
handleTabsClick(val) {
|
|
console.log('tabs-----', val)
|
|
this.leftList.forEach(async item => {
|
|
if (item.id == val.name) {
|
|
if (item.queryItemList.length == 0) item.queryItemList = await this.getExportChildList(item.id)
|
|
}
|
|
})
|
|
},
|
|
handleDelItem(val) {
|
|
const { item, index } = val
|
|
console.log('item------', item, this.$refs[`checkbox${item.itemGroupId}`])
|
|
let checkList = this.$refs[`checkbox${item.itemGroupId}`][0].checkedList
|
|
checkList.forEach((n, i) => {
|
|
if (n == item.itemId) {
|
|
checkList.splice(i, 1)
|
|
this.$refs[`checkbox${item.itemGroupId}`][0].handleChange(checkList)
|
|
}
|
|
})
|
|
this.rightList.forEach((n, i) => {
|
|
if (n.id === item.itemGroupId) {
|
|
n.queryItemList.splice(index, 1)
|
|
if (n.queryItemList.length === 0) this.rightList.splice(i, 1)
|
|
}
|
|
})
|
|
|
|
},
|
|
dragSort() {
|
|
const el = document.getElementById('collapsWr')
|
|
this.sortTable = Sortable.create(el, {
|
|
group: 'el-collapse-item',
|
|
ghostClass: 'sortable-ghost', // Class name for the drop placeholder,
|
|
animation: 500,
|
|
delay: 0,
|
|
onEnd: evt => {
|
|
console.log('evt----', evt)
|
|
const targetRow = this.rightList.splice(evt.oldIndex, 1)[0]
|
|
this.rightList.splice(evt.newIndex, 0, targetRow)
|
|
}
|
|
})
|
|
},
|
|
handleDrag(val, item) {
|
|
console.log('drag-----', val)
|
|
console.log('drag-----', item)
|
|
this.rightList.forEach((n, i) => {
|
|
if (item.id == n.id) n.queryItemList = [...val]
|
|
})
|
|
},
|
|
handleClose() {
|
|
this.previewList = []
|
|
this.diyDialog = false
|
|
},
|
|
handleDeltemplate(id) {
|
|
this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
this.delTemplate(id)
|
|
}).catch(() => {
|
|
this.$message({
|
|
type: 'info',
|
|
message: '已取消删除'
|
|
});
|
|
})
|
|
},
|
|
handlePreview(id) {
|
|
if (id) this.getPreview(id)
|
|
else {
|
|
if (this.rightList.length == 0) return this.$message.error('请选择导出信息')
|
|
this.previewList = this.rightList.map(item => {
|
|
return {
|
|
label: item.label,
|
|
children: item.queryItemList
|
|
}
|
|
})
|
|
}
|
|
this.diyDialog = true
|
|
},
|
|
handleExport() {
|
|
if (this.rightList.length === 0) return this.$message.error('请选择导出信息')
|
|
if (this.form.isSaveTemp && !this.form.name) return this.$message.error('请输入模板名称')
|
|
this.exportLoading = true
|
|
this.exportTemplate()
|
|
|
|
},
|
|
handleExportTemplate(id) {
|
|
this.exportTemplate(id)
|
|
},
|
|
async exportTemplate(id) {
|
|
let url = "/epmetuser/icresiuser/exportExcelCustom"
|
|
|
|
let params = {
|
|
templateId: id || '',
|
|
searchForm: {...this.search},
|
|
exportConfig: {
|
|
...this.form,
|
|
formCode: 'resi_base_info',
|
|
itemList: this.rightList.map(item => {
|
|
return {
|
|
itemId: item.id,
|
|
label: item.label,
|
|
tableName: item.queryItemList[0].tableName,
|
|
children: item.queryItemList,
|
|
supportAdd: item.supportAdd
|
|
}
|
|
})
|
|
}
|
|
}
|
|
await this.$http({
|
|
method: 'POST',
|
|
url,
|
|
// responseType: 'blob',
|
|
data: params
|
|
})
|
|
.then(res => {
|
|
console.log('res----dddd', res)
|
|
// this.download(res.data, title + '.xls')
|
|
// this.getTemplateList()
|
|
this.exportLoading = false
|
|
if (res.data.code && res.data.code == 9999) {
|
|
return this.$message.error(res.data.msg)
|
|
}
|
|
if (res.headers["content-disposition"]) {
|
|
let fileName = window.decodeURI(res.headers["content-disposition"].split(";")[1].split("=")[1])
|
|
console.log('filename', fileName)
|
|
let blob = new Blob([res.data], { type: 'application/vnd.ms-excel' })
|
|
var url = window.URL.createObjectURL(blob)
|
|
var aLink = document.createElement('a')
|
|
aLink.style.display = 'none'
|
|
aLink.href = url
|
|
aLink.setAttribute('download', fileName)
|
|
document.body.appendChild(aLink)
|
|
aLink.click()
|
|
document.body.removeChild(aLink) //下载完成移除元素
|
|
window.URL.revokeObjectURL(url) //释放掉blob对象
|
|
this.$message.success('导出成功')
|
|
this.$emit('close')
|
|
} else this.$message.error('下载失败')
|
|
})
|
|
.catch(err => {
|
|
console.log('err', err)
|
|
this.exportLoading = false
|
|
return this.$message.error('网络错误')
|
|
})
|
|
},
|
|
async getTemplateList () {
|
|
let params = {
|
|
formCode: 'resi_base_info'
|
|
}
|
|
await this.$http
|
|
.post('/oper/customize/icExportTemplate/templateList', params)
|
|
.then(({ data: res }) => {
|
|
if (res.code !== 0) {
|
|
return this.$message.error(res.msg)
|
|
} else {
|
|
this.tableData = res.data
|
|
}
|
|
})
|
|
.catch(() => {
|
|
return this.$message.error('网络错误')
|
|
})
|
|
},
|
|
async getPreview (id) {
|
|
let params = {
|
|
id: id || ''
|
|
}
|
|
await this.$http
|
|
.post('/oper/customize/icExportTemplate/templateDetail', params)
|
|
.then(({ data: res }) => {
|
|
if (res.code !== 0) {
|
|
return this.$message.error(res.msg)
|
|
} else {
|
|
this.previewList = res.data
|
|
}
|
|
})
|
|
.catch(() => {
|
|
return this.$message.error('网络错误')
|
|
})
|
|
},
|
|
async delTemplate(id) {
|
|
let params = [id]
|
|
await this.$http
|
|
.post('/oper/customize/icExportTemplate/delete', params)
|
|
.then(({ data: res }) => {
|
|
if (res.code !== 0) {
|
|
return this.$message.error(res.msg)
|
|
} else {
|
|
this.$message({
|
|
type: 'success',
|
|
message: '删除成功!'
|
|
});
|
|
this.getTemplateList()
|
|
}
|
|
})
|
|
.catch(() => {
|
|
return this.$message.error('网络错误')
|
|
})
|
|
},
|
|
async getExportChildList (groupId) {
|
|
const url = `/oper/customize/icformitem/getItemList/${groupId}`
|
|
let params = {}
|
|
|
|
const { data, code, msg } = await requestPost(url, params)
|
|
|
|
if (code === 0) {
|
|
|
|
return data
|
|
|
|
} else {
|
|
this.$message.error(msg)
|
|
}
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.diy-container {
|
|
padding: 20px 20px 0 20px;
|
|
}
|
|
.diy-wr {
|
|
display: flex;
|
|
width: 100%;
|
|
height: calc(80vh - 120px);
|
|
.left {
|
|
width: 49%;
|
|
}
|
|
.right {
|
|
flex-shrink: 0;
|
|
width: 50%;
|
|
height: 100%;
|
|
box-sizing: border-box;
|
|
margin-left: 20px;
|
|
padding: 0 20px;
|
|
border-left: 1px solid #eee;
|
|
.right-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding-bottom: 10px;
|
|
// border-bottom: 1px solid #eee;
|
|
.title {
|
|
font-weight: 500;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.h80 {
|
|
height: calc(80vh - 160px);
|
|
overflow: auto;
|
|
}
|
|
.diy-footer {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
margin-top: 10px;
|
|
}
|
|
.left-h {
|
|
|
|
::v-deep .el-tabs__header.is-left,
|
|
::v-deep .el-tabs__nav-wrap.is-left::after {
|
|
height: calc(80vh - 120px);
|
|
}
|
|
}
|
|
.flex-div {
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
// #collapsWr {
|
|
// .col-h {
|
|
// ::v-deep .el-collapse-item__wrap {
|
|
// max-height: calc(80vh - 220px);
|
|
// // overflow: auto;
|
|
// }
|
|
|
|
// }
|
|
// }
|
|
.mb10 {
|
|
margin-bottom: 10px;
|
|
}
|
|
.pd10 {
|
|
padding: 10px;
|
|
}
|
|
.mr10 {
|
|
margin-right: 10px;
|
|
}
|
|
.wd200 {
|
|
width: 200px;
|
|
}
|
|
</style>
|