UNIVPLMDataIntegration/Web/src/views/system/region/index.vue
2024-11-25 02:31:13 +08:00

271 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="sys-region-container">
<splitpanes class="default-theme">
<pane size="20" style="display: flex">
<RegionTree ref="regionTreeRef" @node-click="handleNodeChange" />
</pane>
<pane size="80" style="display: flex; flex-direction: column">
<el-card shadow="hover" :body-style="{ padding: '5px 5px 0 5px', display: 'flex', width: '100%', height: '100%', alignItems: 'start' }">
<el-form :model="state.queryParams" ref="queryForm" :show-message="false" :inlineMessage="true" label-width="auto" style="flex: 1 1 0%">
<el-row :gutter="10">
<el-col class="mb5" :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
<el-form-item label="行政名称" prop="name">
<el-input v-model="state.queryParams.name" placeholder="行政名称" clearable @keyup.enter.native="handleQuery(true)" />
</el-form-item>
</el-col>
<el-col class="mb5" :xs="24" :sm="12" :md="8" :lg="8" :xl="6">
<el-form-item label="行政代码" prop="code">
<el-input v-model="state.queryParams.code" placeholder="行政代码" clearable @keyup.enter.native="handleQuery(true)" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-divider style="height: calc(100% - 5px); margin: 0 10px" direction="vertical" />
<el-row>
<el-col>
<el-button-group>
<el-button type="primary" icon="ele-Search" @click="handleQuery(true)" v-auth="'sysRegion/page'" :loading="options.loading"> 查询 </el-button>
<el-button icon="ele-Refresh" @click="resetQuery" :loading="options.loading"> 重置 </el-button>
</el-button-group>
</el-col>
</el-row>
</el-card>
<el-card class="full-table" shadow="hover" style="margin-top: 5px; flex: 1">
<vxe-grid ref="xGrid" class="xGrid-style" v-bind="options" v-on="gridEvents" :tree-config="{ transform: true, parentField: 'pid' }">
<template #toolbar_buttons>
<el-button type="primary" icon="ele-Plus" @click="handleAdd" v-auth="'sysRegion/add'"> 新增 </el-button>
<el-button-group style="padding: 0 12px 0 12px">
<el-button type="primary" icon="ele-Expand" @click="handleExpand"> 全部展开 </el-button>
<el-button type="primary" icon="ele-Fold" @click="handleFold"> 全部折叠 </el-button>
</el-button-group>
<el-button type="danger" icon="ele-Lightning" @click="syncRegionGD" v-auth="'sysRegion/add'"> 同步高德地图 </el-button>
<el-button type="danger" icon="ele-Lightning" @click="syncRegionTianditu" v-auth="'sysRegion/add'"> 同步天地图 </el-button>
<el-button type="danger" icon="ele-Lightning" @click="syncRegionMca" v-auth="'sysRegion/add'"> 同步国家地名信息库 </el-button>
</template>
<template #toolbar_tools> </template>
<template #empty>
<el-empty :image-size="200" />
</template>
<template #row_buttons="{ row }">
<el-tooltip content="编辑" placement="top">
<el-button icon="ele-Edit" text type="primary" v-auth="'sysRegion/update'" @click="handleEdit(row)"> </el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button icon="ele-Delete" text type="danger" v-auth="'sysRegion/delete'" @click="handleDelete(row)"> </el-button>
</el-tooltip>
<el-button icon="ele-OfficeBuilding" text type="primary" v-auth="'sysOrg/add'" @click="genOrg(row)"> 生成组织架构 </el-button>
</template>
</vxe-grid>
</el-card>
</pane>
</splitpanes>
<EditRegion ref="editRegionRef" :title="state.title" @handleQuery="handleQuery" />
<SyncGdParam ref="syncGdParamRef" :title="state.title" @handleQuery="handleQuery" />
<SyncMcaParam ref="syncMcaParamRef" :title="state.title" @handleQuery="handleQuery" />
<SyncTdtParam ref="syncTdtParamRef" :title="state.title" @handleQuery="handleQuery" />
<GenOrgLevel ref="genOrgLevelRef" :title="state.title" @handleQuery="handleQuery" />
</div>
</template>
<script lang="ts" setup name="sysRegion">
import { nextTick, onMounted, reactive, ref } from 'vue';
import { ElMessageBox, ElMessage } from 'element-plus';
import { VxeGridInstance, VxeGridListeners, VxeGridPropTypes } from 'vxe-table';
import { useVxeTable } from '/@/hooks/useVxeTableOptionsHook';
import { Local } from '/@/utils/storage';
import { Splitpanes, Pane } from 'splitpanes';
import 'splitpanes/dist/splitpanes.css';
import RegionTree from './component/regionTree.vue';
import EditRegion from './component/editRegion.vue';
import SyncGdParam from './component/syncGdParam.vue';
import SyncMcaParam from './component/syncMcaParam.vue';
import SyncTdtParam from './component/syncTdtParam.vue';
import GenOrgLevel from './component/genOrgLevel.vue';
import { getAPI } from '/@/utils/axios-utils';
import { SysRegionApi } from '/@/api-services/api';
import { SysRegion, PageRegionInput } from '/@/api-services/models';
const xGrid = ref<VxeGridInstance>();
const editRegionRef = ref<InstanceType<typeof EditRegion>>();
const syncGdParamRef = ref<InstanceType<typeof SyncGdParam>>();
const syncMcaParamRef = ref<InstanceType<typeof SyncMcaParam>>();
const syncTdtParamRef = ref<InstanceType<typeof SyncTdtParam>>();
const genOrgLevelRef = ref<InstanceType<typeof GenOrgLevel>>();
const regionTreeRef = ref<InstanceType<typeof RegionTree>>();
const state = reactive({
queryParams: {
id: -1,
pid: undefined,
name: undefined,
code: undefined,
},
localPageParam: {
pageSize: 50 as number,
defaultSort: { field: 'orderNo', order: 'asc', descStr: 'desc' },
},
visible: false,
title: '',
});
// 本地存储参数
const localPageParamKey = 'localPageParam:sysRegion';
// 表格参数配置
const options = useVxeTable<SysRegion>(
{
id: 'sysRegion',
name: '区域信息',
columns: [
// { type: 'checkbox', width: 40, fixed: 'left' },
{ type: 'seq', title: '序号', width: 100, fixed: 'left' },
{ field: 'name', title: '行政名称', minWidth: 280, showOverflow: 'tooltip', treeNode: true },
{ field: 'code', title: '行政代码', minWidth: 120, showOverflow: 'tooltip' },
{ field: 'type', title: '类型', minWidth: 100, showOverflow: 'tooltip' },
{ field: 'orderNo', title: '排序', minWidth: 80, showOverflow: 'tooltip' },
{ field: 'cityCode', title: '区号', minWidth: 100, showOverflow: 'tooltip' },
// { field: 'createTime', title: '修改时间', minWidth: 150, showOverflow: 'tooltip' },
{ field: 'remark', title: '备注', minWidth: 300, showOverflow: 'tooltip' },
{ title: '操作', fixed: 'right', width: 200, showOverflow: true, slots: { default: 'row_buttons' } },
],
},
// vxeGrid配置参数(此处可覆写任何参数)参考vxe-table官方文档
{
stripe: false,
// 多选配置
checkboxConfig: { range: false },
// 代理配置
proxyConfig: { autoLoad: true, ajax: { query: ({ page, sort }) => handleQueryApi(page, sort) } },
// 排序配置
sortConfig: { defaultSort: Local.get(localPageParamKey)?.defaultSort || state.localPageParam.defaultSort },
// 分页配置
pagerConfig: { pageSize: Local.get(localPageParamKey)?.pageSize || state.localPageParam.pageSize },
// 工具栏配置
toolbarConfig: { export: false },
}
);
// 页面初始化
onMounted(() => {
state.localPageParam = Local.get(localPageParamKey) || state.localPageParam;
// 展开表格所有数据,数据量大时请勿开启
nextTick(() => {
setTimeout(() => {
xGrid.value?.setAllTreeExpand(true);
}, 1000);
});
});
// 查询api
const handleQueryApi = async (page: VxeGridPropTypes.ProxyAjaxQueryPageParams, sort: VxeGridPropTypes.ProxyAjaxQuerySortCheckedParams) => {
const params = Object.assign(state.queryParams, { page: page.currentPage, pageSize: page.pageSize, field: sort.field, order: sort.order, descStr: 'desc' }) as PageRegionInput;
return getAPI(SysRegionApi).apiSysRegionPagePost(params);
};
// 查询操作
const handleQuery = async (reset = false) => {
options.loading = true;
reset ? await xGrid.value?.commitProxy('reload') : await xGrid.value?.commitProxy('query');
options.loading = false;
};
// 重置操作
const resetQuery = async () => {
state.queryParams.id = -1;
state.queryParams.pid = undefined;
state.queryParams.name = undefined;
state.queryParams.code = undefined;
await xGrid.value?.commitProxy('reload');
};
// 打开新增页面
const handleAdd = () => {
state.title = '添加行政区域';
editRegionRef.value?.openDialog({ orderNo: 100 });
};
// 打开编辑页面
const handleEdit = (row: any) => {
state.title = '编辑行政区域';
editRegionRef.value?.openDialog(row);
};
// 删除
const handleDelete = (row: any) => {
ElMessageBox.confirm(`确定删除行政区域:【${row.name}】?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(async () => {
await getAPI(SysRegionApi).apiSysRegionDeletePost({ id: row.id });
await handleQuery();
// 编辑删除后更新机构数据
regionTreeRef.value?.fetchTreeData();
ElMessage.success('删除成功');
})
.catch(() => {});
};
// 表格事件
const gridEvents: VxeGridListeners<SysRegion> = {
// 只对 pager-config 配置时有效,分页发生改变时会触发该事件
async pageChange({ pageSize }) {
state.localPageParam.pageSize = pageSize;
Local.set(localPageParamKey, state.localPageParam);
},
// 当排序条件发生变化时会触发该事件
async sortChange({ field, order }) {
state.localPageParam.defaultSort = { field: field, order: order!, descStr: 'desc' };
Local.set(localPageParamKey, state.localPageParam);
},
};
// 树组件点击
const handleNodeChange = async (node: any) => {
state.queryParams.pid = node.id;
state.queryParams.name = undefined;
state.queryParams.code = undefined;
await handleQuery();
};
// 同步高德地图
const syncRegionGD = async () => {
state.title = '同步高德地图';
syncGdParamRef.value?.openDialog();
};
// 同步国家地名信息库
const syncRegionMca = async () => {
state.title = '同步国家地名信息库';
syncMcaParamRef.value?.openDialog();
};
// 同步天地图行政区划
const syncRegionTianditu = async () => {
state.title = '同步天地图行政区划';
syncTdtParamRef.value?.openDialog();
};
// 生成组织架构
const genOrg = (row: any) => {
state.title = '生成/更新系统组织架构';
genOrgLevelRef.value?.openDialog(row.id);
};
// 全部展开
const handleExpand = () => {
xGrid.value?.setAllTreeExpand(true);
};
// 全部折叠
const handleFold = () => {
xGrid.value?.clearTreeExpand();
};
</script>