From 5368b1c5e6ef242141dba7a5272e2d682cee414c Mon Sep 17 00:00:00 2001 From: huangchenhao <123673748@qq.com> Date: Fri, 10 Apr 2026 17:47:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=93=8D=E5=BA=94=E9=A2=84=E8=AD=A6=20?= =?UTF-8?q?=E5=BB=BA=E8=AE=BE=E5=A4=84=E3=80=81=E5=8C=BA=E5=8E=BF=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen/src/component/Breadcrumb/index.vue | 131 +++--- .../screen/src/component/MyDialog/index.vue | 2 +- .../screen/src/component/MyDrawer/index.vue | 4 +- packages/screen/src/router/index.js | 36 +- .../src/views/LedgerManagement/index.js | 110 +++-- .../src/views/LedgerManagement/index.vue | 30 +- .../business/index.js | 4 + .../district/index.js | 4 + .../district/projectDetailPage.vue | 10 +- .../{ => construction}/addDialog.vue | 0 .../construction/detailDrawer.vue | 159 +++++++ .../{ => construction}/index.js | 104 +++-- .../WarningManagement/construction/index.vue | 59 +++ .../WarningManagement/district/addDialog.vue | 392 ++++++++++++++++++ .../district/detailDrawer.vue | 159 +++++++ .../views/WarningManagement/district/index.js | 251 +++++++++++ .../{ => district}/index.vue | 11 +- 17 files changed, 1279 insertions(+), 187 deletions(-) rename packages/screen/src/views/WarningManagement/{ => construction}/addDialog.vue (100%) create mode 100644 packages/screen/src/views/WarningManagement/construction/detailDrawer.vue rename packages/screen/src/views/WarningManagement/{ => construction}/index.js (64%) create mode 100644 packages/screen/src/views/WarningManagement/construction/index.vue create mode 100644 packages/screen/src/views/WarningManagement/district/addDialog.vue create mode 100644 packages/screen/src/views/WarningManagement/district/detailDrawer.vue create mode 100644 packages/screen/src/views/WarningManagement/district/index.js rename packages/screen/src/views/WarningManagement/{ => district}/index.vue (81%) diff --git a/packages/screen/src/component/Breadcrumb/index.vue b/packages/screen/src/component/Breadcrumb/index.vue index 3c4615a..7b8c80a 100644 --- a/packages/screen/src/component/Breadcrumb/index.vue +++ b/packages/screen/src/component/Breadcrumb/index.vue @@ -36,6 +36,11 @@ import { ref, watch, onMounted } from 'vue' import { useRouter, useRoute } from 'vue-router' import { Close } from '@element-plus/icons-vue' +// 从路由实例获取所有路由配置 +const router = useRouter() +const routes = router.getRoutes() +const route = useRoute() + const props = defineProps({ homeTitle: { type: String, @@ -45,98 +50,57 @@ const props = defineProps({ const emit = defineEmits(['breadcrumb-change']) -const router = useRouter() -const route = useRoute() - const breadcrumbList = ref([]) const currentIndex = ref(0) -// 生成面包屑数据 -const generateBreadcrumb = () => { - const matched = route.matched.filter(item => item.meta && item.meta.breadcrumb !== false) + // 生成面包屑数据 + const generateBreadcrumb = () => { + const matched = route.matched.filter(item => item.meta && item.meta.breadcrumb !== false) - // 基础面包屑:首页 - breadcrumbList.value = [ - { - title: props.homeTitle, - path: '/', - name: 'Home' - } - ] + // 基础面包屑:首页 + breadcrumbList.value = [ + { + title: props.homeTitle, + path: '/', + name: 'Home' + } + ] - const currentPath = route.path + const currentRoute = route.matched[route.matched.length - 1] + const currentPath = route.path - // 特殊处理:驻地台账页面(响应预警的子页面) - if (currentPath.includes('/ledgerManagement')) { - // 添加响应预警(父级) - breadcrumbList.value.push({ - title: '响应预警', - path: '/warningManagement', - name: 'warningManagement', - meta: { title: '响应预警' } - }) - - // 添加驻地台账(当前页) - breadcrumbList.value.push({ - title: '驻地台账', - path: currentPath, - name: 'ledgerManagement', - meta: { title: '驻地台账' } - }) - } else if (currentPath.includes('/projectAdd')) { - // 特殊处理:项目填报页面(项目管理的子页面) - // 添加项目管理(父级) - breadcrumbList.value.push({ - title: '项目管理', - path: '/projectManagement', - name: 'projectManagement', - meta: { title: '项目管理' } - }) - - // 添加项目填报(当前页) - breadcrumbList.value.push({ - title: '项目填报', - path: currentPath, - name: 'projectAdd', - meta: { title: '项目填报' } - }) - } else if (currentPath.includes('/projectDetail')) { - // 特殊处理:项目详情页面(项目管理的子页面) - // 现在使用独立的路由,直接根据路由名称判断父级 - let projectManagementPath = '/projectManagement' - let projectManagementName = 'projectManagement' - let projectManagementTitle = '项目管理' - - // 如果是projectDetail2路由,则对应projectManagement2 - if (currentPath.includes('/projectDetail2')) { - projectManagementPath = '/projectManagement2' - projectManagementName = 'projectManagement2' + // 如果有父路由配置,自动构建父子结构 + if (currentRoute && currentRoute.meta && currentRoute.meta.parentRoute) { + const parentRouteName = currentRoute.meta.parentRoute + + // 查找父路由信息 + const parentRoute = routes.find(r => r.name === parentRouteName) + if (parentRoute && parentRoute.meta && parentRoute.meta.title) { + // 添加父级路由 + breadcrumbList.value.push({ + title: parentRoute.meta.title, + path: parentRoute.path, + name: parentRoute.name, + meta: parentRoute.meta + }) + } } - // 添加项目管理(父级) - breadcrumbList.value.push({ - title: projectManagementTitle, - path: projectManagementPath, - name: projectManagementName, - meta: { title: projectManagementTitle } - }) - - // 添加项目详情(当前页) - const detailName = currentPath.includes('/projectDetail2') ? 'projectDetail2' : 'projectDetail' - breadcrumbList.value.push({ - title: '项目详情', - path: currentPath, - name: detailName, - meta: { title: '项目详情' } - }) - } - else { - // 普通路由处理 + // 普通路由处理(包括子页面) matched.forEach((record, index) => { // 跳过根路径(已经在上面添加了首页) if (record.path === '/') return + // 如果是子页面且已经有父级,跳过重复添加 + if (index === matched.length - 1 && currentRoute && currentRoute.meta && currentRoute.meta.parentRoute) { + // 检查当前记录是否就是父路由本身,如果是则跳过(因为上面已经添加了) + const isParentAlreadyAdded = breadcrumbList.value.some(item => item.name === currentRoute.meta.parentRoute) + if (isParentAlreadyAdded && record.name === currentRoute.meta.parentRoute) { + return + } + } + if (record.meta && record.meta.title) { let fullPath = record.path @@ -156,12 +120,11 @@ const generateBreadcrumb = () => { }) } }) - } - // 更新当前索引 - const currentIndexInList = breadcrumbList.value.findIndex(item => item.path === currentPath) - currentIndex.value = currentIndexInList >= 0 ? currentIndexInList : breadcrumbList.value.length - 1 -} + // 更新当前索引 + const currentIndexInList = breadcrumbList.value.findIndex(item => item.path === currentPath) + currentIndex.value = currentIndexInList >= 0 ? currentIndexInList : breadcrumbList.value.length - 1 + } // 处理面包屑点击 const handleBreadcrumbClick = (item, index) => { diff --git a/packages/screen/src/component/MyDialog/index.vue b/packages/screen/src/component/MyDialog/index.vue index f65f55b..afb6386 100644 --- a/packages/screen/src/component/MyDialog/index.vue +++ b/packages/screen/src/component/MyDialog/index.vue @@ -24,7 +24,7 @@ diff --git a/packages/screen/src/component/MyDrawer/index.vue b/packages/screen/src/component/MyDrawer/index.vue index 88237c8..be7784f 100644 --- a/packages/screen/src/component/MyDrawer/index.vue +++ b/packages/screen/src/component/MyDrawer/index.vue @@ -15,8 +15,8 @@ diff --git a/packages/screen/src/router/index.js b/packages/screen/src/router/index.js index 05778b8..0066cac 100644 --- a/packages/screen/src/router/index.js +++ b/packages/screen/src/router/index.js @@ -117,17 +117,17 @@ const routes = [ }, component: () => import('../views/ConstructionDepartment/ConstructionDepartment.vue') }, - // 响应预警 + // 响应预警 - 建设处 { path: '/warningManagement', name: 'warningManagement', - component: () => import('../views/WarningManagement/index.vue'), + component: () => import('../views/WarningManagement/construction/index.vue'), meta: { title: '响应预警', breadcrumb: true } }, - // 驻地台账 - 作为独立的页面,但在面包屑中显示为响应预警的子页面 + // 驻地台账 - 建设处 { path: '/ledgerManagement', name: 'ledgerManagement', @@ -135,9 +135,31 @@ const routes = [ meta: { title: '驻地台账', breadcrumb: true, - parentRoute: 'warningManagement' // 用于在面包屑中建立父子关系 + parentRoute: 'warningManagement' } }, + // 响应预警 - 区县级 + { + path: '/warningManagement2', + name: 'warningManagement2', + component: () => import('../views/WarningManagement/district/index.vue'), + meta: { + title: '响应预警', + breadcrumb: true + } + }, + // 驻地台账 - 区县级 + { + path: '/ledgerManagement2', + name: 'ledgerManagement2', + component: () => import('../views/LedgerManagement/index.vue'), + meta: { + title: '驻地台账', + breadcrumb: true, + parentRoute: 'warningManagement2' + } + }, + // 项目管理 - 区县 { path: '/projectManagement', @@ -155,7 +177,7 @@ const routes = [ meta: { title: '项目填报', breadcrumb: true, - parentRoute: 'projectManagement' // 用于在面包屑中建立父子关系 + parentRoute: 'projectManagement' } }, // 项目详情 - 区县版本 @@ -166,7 +188,7 @@ const routes = [ meta: { title: '项目详情', breadcrumb: true, - parentRoute: 'projectManagement' // 明确指定父级路由 + parentRoute: 'projectManagement' } }, // 项目管理 - 业务部门 @@ -187,7 +209,7 @@ const routes = [ meta: { title: '项目详情', breadcrumb: true, - parentRoute: 'projectManagement2' // 明确指定父级路由为projectManagement2 + parentRoute: 'projectManagement2' } }, diff --git a/packages/screen/src/views/LedgerManagement/index.js b/packages/screen/src/views/LedgerManagement/index.js index b386f22..784c27d 100644 --- a/packages/screen/src/views/LedgerManagement/index.js +++ b/packages/screen/src/views/LedgerManagement/index.js @@ -1,6 +1,7 @@ import { h, ref, onMounted, reactive, watch, toRaw, nextTick } from "vue"; import { request } from "@/utils/request"; import { useRoute, useRouter } from 'vue-router' +import { ElMessage } from "element-plus"; const tableData = ref([]); // 表格数据 @@ -18,7 +19,7 @@ const model = reactive({ const form = reactive({ }); const INIT_FORM = { - + }; // 抽屉内容 const drawer = reactive({ @@ -35,101 +36,105 @@ const drawerRef = ref(null); // 抽屉实例 const columns = [ { - prop: "xxx", + prop: "county", label: "所属区县", }, { - prop: "xxx", + prop: "projectName", label: "项目名称", }, { - prop: "xxx", + prop: "siteName", label: "驻地名称", }, { - prop: "xxx", + prop: "siteType", label: "驻地类型", }, { - prop: "xxx", + prop: "coordinatePoint", label: "坐标点位", }, { - prop: "xxx", + prop: "subProjectName", label: "所属项目名称", }, { - prop: "xxx", + prop: "projectType", label: "项目类型", }, { - prop: "xxx", + prop: "constructionUnit", label: "建设单位", }, { - prop: "xxx", + prop: "constructionCompany", label: "施工单位", }, { - prop: "xxx", + prop: "siteAddress", label: "驻地地址", }, { - prop: "xxx", + prop: "town", + label: "乡镇名称", + }, + { + prop: "streetName", + label: "街道名称", + }, + { + prop: "administrativeRegion", label: "行政区域", }, { - prop: "xxx", + prop: "sitePopulation", label: "驻地人数", }, { - prop: "xxx", + prop: "riskLevel", label: "驻地风险等级", }, { - prop: "xxx", + prop: "buildingType", label: "房建类型", }, { - prop: "xxx", + prop: "relocationStatus", label: "搬迁状态", }, { - prop: "xxx", label: "吹哨人/电话", + formatter: (row) => `${row.whistleblowerName || ''}/${row.whistleblowerPhone || ''}`, }, { - prop: "xxx", label: "建设单位包保责任人/电话", + formatter: (row) => `${row.ownerResponsiblePerson || ''}/${row.ownerResponsiblePhone || ''}`, }, { - prop: "xxx", label: "施工单位包保责任人/电话", + formatter: (row) => `${row.constructorResponsiblePerson || ''}/${row.constructorResponsiblePhone || ''}`, }, { - prop: "xxx", label: "驻地包保责任人/电话", + formatter: (row) => `${row.siteResponsiblePerson || ''}/${row.siteResponsiblePhone || ''}`, }, { - prop: "xxx", label: "区县级包保责任人/电话", + formatter: (row) => `${row.districtResponsiblePerson || ''}/${row.districtResponsiblePhone || ''}`, }, { - prop: "xxx", label: "市级包保责任人/电话", + formatter: (row) => `${row.cityResponsiblePerson || ''}/${row.cityResponsiblePhone || ''}`, }, { - prop: "xxx", + prop: "remarks", label: "备注", }, ] // 过滤条件 -const filterData = reactive({ - title: "", - type: "", - warningLevel: "", -}) +const filterData = reactive({}) // 分页 const pagination = reactive({ current: 1, @@ -145,17 +150,33 @@ const pagination = reactive({ }); // 获取列表 -const getTableData = async (filterData) => { +const getTableData = async (filterData = {}) => { try { + // 过滤空字符串属性 + const filteredParams = {}; + Object.keys(filterData).forEach(key => { + if (filterData[key] !== '' && filterData[key] != null) { + filteredParams[key] = filterData[key]; + } + }); const res = await request({ - url: '', + url: '/snow-ops-platform/site-ledger/list', method: "GET", params: { - + ...filteredParams, + pageNum: pagination.current, + pageSize: pagination.pageSize, } }) + if (res.code === '00000') { + tableData.value = res.data.records + pagination.total = res.data.total + } else { + throw new Error(res.message) + } } catch (error) { - + ElMessage.error(error.message) + console.error('获取列表失败:', error); } } @@ -182,8 +203,31 @@ const warningLevelOptions = [ ] +const exportExcel = async () => { + try { + const res = await request({ + url: '/snow-ops-platform/site-ledger/export', + method: 'GET' + }) + } catch (error) { + + } +} + + export default () => { + + onMounted(() => { + getTableData(); + }) + + + watch(filterData, (val) => { + getTableData(filterData); + }, { deep: true }) + + return { modelVisible, model, @@ -197,5 +241,7 @@ export default () => { filterData, pagination, columns, + + exportExcel, } } \ No newline at end of file diff --git a/packages/screen/src/views/LedgerManagement/index.vue b/packages/screen/src/views/LedgerManagement/index.vue index 868917f..ec6de9c 100644 --- a/packages/screen/src/views/LedgerManagement/index.vue +++ b/packages/screen/src/views/LedgerManagement/index.vue @@ -1,37 +1,37 @@