<template> <a-card :bordered="false"> <!-- 操作按钮区域 --> <div class="table-operator"> <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> <a-button type="primary" icon="download" @click="handleExportXls('分类字典')">导出</a-button> <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel"> <a-button type="primary" icon="import">导入</a-button> </a-upload> <a-dropdown v-if="selectedRowKeys.length > 0"> <a-menu slot="overlay"> <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> </a-menu> <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> </a-dropdown> </div> <!-- table区域-begin --> <div> <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 <a style="margin-left: 24px" @click="onClearSelected">清空</a> </div> <a-table ref="table" size="middle" rowKey="id" :columns="columns" :dataSource="dataSource" :pagination="ipagination" :loading="loading" :expandedRowKeys="expandedRowKeys" @change="handleTableChange" @expand="handleExpand" v-bind="tableProps"> <span slot="action" slot-scope="text, record"> <a @click="handleEdit(record)">编辑</a> <a-divider type="vertical" /> <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record)"> <a>删除</a> </a-popconfirm> <a-divider type="vertical" /> <a @click="handleAddSub(record)">添加下级</a> </span> </a-table> </div> <sysCategory-modal ref="modalForm" @ok="modalFormOk"></sysCategory-modal> </a-card> </template> <script> import { getAction } from '@/api/manage' import { JeecgListMixin } from '@/mixins/JeecgListMixin' import SysCategoryModal from './modules/SysCategoryModal' import { deleteAction } from '@/api/manage' export default { name: "SysCategoryList", mixins:[JeecgListMixin], components: { SysCategoryModal }, data () { return { description: '分类字典管理页面', // 表头 columns: [ { title:'分类名称', align:"left", dataIndex: 'name' }, { title:'分类编码', align:"left", dataIndex: 'code' }, { title: '操作', dataIndex: 'action', align:"center", scopedSlots: { customRender: 'action' }, } ], url: { list: "/sys/category/rootList", childList: "/sys/category/childList", getChildListBatch: "/sys/category/getChildListBatch", delete: "/sys/category/delete", deleteBatch: "/sys/category/deleteBatch", exportXlsUrl: "/sys/category/exportXls", importExcelUrl: "sys/category/importExcel", }, expandedRowKeys:[], hasChildrenField:"hasChild", pidField:"pid", dictOptions:{ }, subExpandedKeys:[], } }, computed: { importExcelUrl(){ return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; }, tableProps() { let _this = this return { // 列表项是否可选择 rowSelection: { selectedRowKeys: _this.selectedRowKeys, onChange: (selectedRowKeys) => _this.selectedRowKeys = selectedRowKeys } } } }, methods: { loadData(arg){ if(arg==1){ this.ipagination.current=1 } this.loading = true let params = this.getQueryParams() return new Promise((resolve) => { getAction(this.url.list,params).then(res=>{ if(res.success){ let result = res.result if(Number(result.total)>0){ this.ipagination.total = Number(result.total) this.dataSource = this.getDataByResult(res.result.records) //update--begin--autor:lvdandan-----date:20201204------for:JT-31 删除成功后默认展开已展开信息 return this.loadDataByExpandedRows(this.dataSource) //update--end--autor:lvdandan-----date:20201204------for:JT-31 删除成功后默认展开已展开信息 }else{ this.ipagination.total=0 this.dataSource=[] } }else{ this.$message.warning(res.message) } }).finally(()=>{ this.loading = false }) }) }, getDataByResult(result){ return result.map(item=>{ //判断是否标记了带有子节点 if(item[this.hasChildrenField]=='1'){ let loadChild = { id: item.id+'_loadChild', name: 'loading...', isLoading: true } item.children = [loadChild] } return item }) }, handleExpand(expanded, record){ // 判断是否是展开状态 if (expanded) { this.expandedRowKeys.push(record.id) if (record.children.length>0 && record.children[0].isLoading === true) { let params = this.getQueryParams();//查询条件 params[this.pidField] = record.id getAction(this.url.childList,params).then((res)=>{ if(res.success){ if(res.result && res.result.length>0){ record.children = this.getDataByResult(res.result) this.dataSource = [...this.dataSource] }else{ record.children='' record.hasChildrenField='0' } }else{ this.$message.warning(res.message) } }) } }else{ let keyIndex = this.expandedRowKeys.indexOf(record.id) if(keyIndex>=0){ this.expandedRowKeys.splice(keyIndex, 1); } } }, initDictConfig(){ }, modalFormOk(formData,arr){ if(!formData.id){ this.addOk(formData,arr) }else{ this.editOk(formData,this.dataSource) this.dataSource=[...this.dataSource] } }, editOk(formData,arr){ if(arr && arr.length>0){ for(let i=0;i<arr.length;i++){ if(arr[i].id==formData.id){ arr[i]=formData break }else{ this.editOk(formData,arr[i].children) } } } }, async addOk(formData,arr){ if(!formData[this.pidField]){ this.loadData() }else{ this.expandedRowKeys=[] console.log("22222",arr) for(let i of arr){ await this.expandTreeNode(i) } } }, expandTreeNode(nodeId){ return new Promise((resolve,reject)=>{ this.getFormDataById(nodeId,this.dataSource) let row = this.parentFormData this.expandedRowKeys.push(nodeId) let params = this.getQueryParams();//查询条件 params[this.pidField] = nodeId getAction(this.url.childList,params).then((res)=>{ console.log("11111",res) if(res.success){ if(res.result && res.result.length>0){ row.children = this.getDataByResult(res.result) this.dataSource = [...this.dataSource] resolve() }else{ row.children='' row.hasChildrenField='0' reject() } }else{ reject() } }) }) }, getFormDataById(id,arr){ if(arr && arr.length>0){ for(let i=0;i<arr.length;i++){ if(arr[i].id==id){ this.parentFormData = arr[i] }else{ this.getFormDataById(id,arr[i].children) } } } }, handleAddSub(record){ this.subExpandedKeys = []; this.getExpandKeysByPid(record.id,this.dataSource,this.dataSource) this.$refs.modalForm.subExpandedKeys = this.subExpandedKeys; this.$refs.modalForm.title = "添加子分类"; this.$refs.modalForm.edit({'pid':record.id}); this.$refs.modalForm.disableSubmit = false; }, handleDelete: function (record) { let that = this; deleteAction(that.url.delete, {id: record.id}).then((res) => { if (res.success) { //update--begin--autor:lvdandan-----date:20201204------for:JT-31 删除成功后默认展开已展开信息 that.loadData(); //update--end--autor:lvdandan-----date:20201204------for:JT-31 删除成功后默认展开已展开信息 } else { that.$message.warning(res.message); } }); }, // 添加子分类时获取所有父级id getExpandKeysByPid(pid,arr,all){ if(pid && arr && arr.length>0){ for(let i=0;i<arr.length;i++){ if(arr[i].id==pid){ this.subExpandedKeys.push(arr[i].id) this.getExpandKeysByPid(arr[i]['pid'],all,all) }else{ this.getExpandKeysByPid(pid,arr[i].children,all) } } } }, // 根据已展开的行查询数据(用于保存后刷新时异步加载子级的数据) loadDataByExpandedRows(dataList) { if (this.expandedRowKeys.length > 0) { return getAction(this.url.getChildListBatch,{ parentIds: this.expandedRowKeys.join(',') }).then(res=>{ if (res.success && res.result.records.length>0) { //已展开的数据批量子节点 let records = res.result.records const listMap = new Map(); for (let item of records) { let pid = item[this.pidField]; if (this.expandedRowKeys.join(',').includes(pid)) { let mapList = listMap.get(pid); if (mapList == null) { mapList = []; } mapList.push(item); listMap.set(pid, mapList); } } let childrenMap = listMap; let fn = (list) => { if(list) { list.forEach(data => { if (this.expandedRowKeys.includes(data.id)) { data.children = this.getDataByResult(childrenMap.get(data.id)) fn(data.children) } }) } } fn(dataList) } }) } else { return Promise.resolve() } }, } } </script> <style scoped> @import '~@assets/less/common.less' </style>