Compare commits

...

2 Commits

11 changed files with 814 additions and 113 deletions

View File

@ -65,7 +65,14 @@
:key="tab.key"
class="hierarchy-tab"
:class="{ active: activeHierarchyTab === tab.key }"
@click="activeHierarchyTab = tab.key"
@click="
activeHierarchyTab = tab.key;
if (tab.key == 'city-dept') {
activeImpactTab = 'point';
} else {
activeImpactTab = 'aiiType';
}
"
>
{{ tab.label }}
</div>
@ -78,7 +85,10 @@
:key="tab.key"
class="hierarchy-tab"
:class="{ active: activeHierarchyTab === tab.key }"
@click="activeHierarchyTab = tab.key"
@click="
activeHierarchyTab = tab.key;
activeImpactTab = 'point';
"
>
{{ tab.label }}
</div>
@ -91,7 +101,12 @@
:key="tab.key"
class="hierarchy-tab"
:class="{ active: activeHierarchyTab === tab.key }"
@click="activeHierarchyTab = tab.key"
@click="
activeHierarchyTab = tab.key;
if (tab.key == 'frontline-whistle' || tab.key == 'frontline-guard') {
activeImpactTab = 'project';
}
"
>
{{ tab.label }}
</div>
@ -163,7 +178,9 @@
'city-dept' == activeHierarchyTab ||
'city-emergency' == activeHierarchyTab ||
'district-leader' == activeHierarchyTab ||
'district-person' == activeHierarchyTab
'district-person' == activeHierarchyTab ||
'frontline-whistle' == activeHierarchyTab ||
'frontline-contractor' == activeHierarchyTab
"
>
<div class="display jc_sb ai_center">
@ -171,7 +188,8 @@
<div
class="impact-tabs"
v-if="
'city-leader' == activeHierarchyTab || 'city-emergency' == activeHierarchyTab
'district-leader' == activeHierarchyTab ||
'district-person' == activeHierarchyTab
"
>
<div
@ -194,26 +212,41 @@
'city-dept' == activeHierarchyTab ||
'city-emergency' == activeHierarchyTab ||
'district-leader' == activeHierarchyTab ||
'district-person' == activeHierarchyTab
'district-person' == activeHierarchyTab ||
'frontline-whistle' == activeHierarchyTab ||
'frontline-contractor' == activeHierarchyTab
"
>
<el-table
v-if="activeImpactTab === 'point'"
:data="currentImpactData"
v-if="activeImpactTab === 'aiiType'"
:data="aiiTypeArr"
style="background: transparent; width: 368px"
:header-cell-style="headerCellStyle"
:cell-style="cellStyle"
size="small"
height="150"
>
<el-table-column type="index" label="序号" width="50" align="center" />
<el-table-column prop="area" label="影响区域" width="80" align="center" />
<el-table-column prop="roadCode" label="线路编号" width="70" align="center" />
<el-table-column prop="type" label="类型" width="60" align="center" />
<el-table-column prop="label" label="类型" width="" align="center" />
<el-table-column prop="number" label="数量" width="" align="center" />
</el-table>
<el-table
v-if="activeImpactTab === 'point'"
:data="currentImpactData"
style="background: transparent"
:header-cell-style="headerCellStyle"
:cell-style="cellStyle"
size="small"
height="150"
>
<el-table-column type="index" label="序号" width="" align="center" />
<el-table-column prop="area" label="影响区域" width="" align="center" />
<el-table-column prop="roadCode" label="线路编号" width="" align="center" />
<el-table-column prop="type" label="类型" width="" align="center" />
<el-table-column
prop="stake"
label="桩号"
width="108"
width=""
align="center"
show-overflow-tooltip
/>
@ -221,25 +254,25 @@
<el-table
v-if="activeImpactTab === 'project'"
:data="impactProjectDataTable"
style="background: transparent; width: 368px"
style="background: transparent"
:header-cell-style="headerCellStyle"
:cell-style="cellStyle"
size="small"
height="150"
>
<el-table-column type="index" label="序号" width="50" align="center" />
<el-table-column prop="area" label="影响区域" width="80" align="center" />
<el-table-column type="index" label="序号" width="" align="center" />
<el-table-column prop="area" label="影响区域" width="" align="center" />
<el-table-column prop="projectName" label="项目名称" width="70" align="center" />
<el-table-column
prop="projectAddress"
label="项目地址"
width="60"
width=""
align="center"
/>
<el-table-column
prop="lineNumber"
label="线路编号"
width="108"
width=""
align="center"
show-overflow-tooltip
/>
@ -347,7 +380,9 @@ const warningTabs = ref([
guard:
'按照相关要求启动I级防御响应并请及时关注地质、水文等风险提示信息落实主动封闭管控措施请立即按照2小时一次频率对你管养的重点路段进行巡查重点巡查较高及以上风险路段、涉灾隐患点、地质条件复杂路段、临河临崖路段重点关注涉水桥梁基础及墩台、不良地质隧道、隧道洞口边仰坡及侧切结构、高陡边坡支挡防护以及防排水设施发现异常情况立即向上报告采取紧急排危、告警阻拦、交通管控等措施并及时报送工作开展情况。',
whistle:
'按照相关要求启动I级防御响应并请及时关注地质、水文等风险提示信息落实主动“关停撤转”措施应急抢险人员和吹哨人全员在岗值班做好应急装备物资检修并请立即对你项目的重点部位进行巡查重点巡查两区三厂、大型设施设备、取弃土场、砂石料场、涉水桥梁、富水隧道、围堰、支架脚手架、高切坡、深基坑、滑坡处置等部位发现异常情况立即向上报告采取紧急排危、吹哨撤转等措施并及时报送工作开展情况。',
'按照相关指南,请根据暴雨预警级别启动相应等级防御响应,请及时关注地质、水文等风险提示信息,做好会商研判,严格值班值守,落实预警叫应、部署调度、督导帮扶、力量预置、巡查排危和“关停撤转”等措施,及时跟踪分析、研究部署防范应对、受灾和抢险救援保通工作。',
contractor:
'按照相关指南,请根据暴雨预警级别启动相应等级防御响应,请及时关注地质、水文等风险提示信息,做好会商研判,严格值班值守,落实预警叫应、部署调度、督导帮扶、力量预置、巡查排危和“关停撤转”等措施,及时跟踪分析、研究部署防范应对、受灾和抢险救援保通工作。',
},
{ key: 'dept', label: '处室负责人', content: '', suggestion: '' },
@ -366,13 +401,20 @@ const impactTabs = ref([
{ key: 'point', label: '影响点' },
{ key: 'project', label: '影响项目' },
]);
const activeImpactTab = ref('point');
const activeImpactTab = ref('project');
//
const impactPointData = ref([]);
//
const impactProjectData = ref([]);
const aiiTypeArr = ref([
{ number: '2', label: '影响区县' },
{ number: '21', label: '风险路段' },
{ number: '21', label: '桥梁' },
{ number: '21', label: '隧道' },
{ number: '21', label: '项目' },
]);
//
const impactProjectDataTable = ref([
{

View File

@ -1,7 +1,7 @@
<template>
<base-dialog
v-model:visible="props.visible"
title="抢通情况"
title="管控情况"
:table-data="tableData"
:table-columns="tableColumns"
:table-height="tableHeight"
@ -279,7 +279,7 @@ const fetchData = async () => {
total.value = data.total;
}
} catch (error) {
console.error('获取抢通情况数据失败:', error);
console.error('获取管控情况数据失败:', error);
}
};

View File

@ -0,0 +1,227 @@
<template>
<base-dialog
v-model:visible="props.visible"
title="抽查人次"
:table-data="tableData"
:table-columns="tableColumns"
:table-height="tableHeight"
:total="total"
:current-page="currentPage"
:page-size="pageSize"
max-width="800px"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
@close="handleClose"
>
<!-- 筛选区域 -->
<template #filter>
<div class="filter-row">
<div class="filter-item">
<span class="filter-label">抽查区县</span>
<el-select
:teleported="false"
v-model="filterForm.district"
placeholder="请选择"
class="filter-select"
clearable
@change="handleFilterChange"
>
<el-option
v-for="item in districtOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</div>
</template>
</base-dialog>
</template>
<script setup>
import { ref, watch } from 'vue';
import BaseDialog from '../component/baseDialog.vue';
import { request } from '@/utils/request';
const props = defineProps({
visible: {
type: Boolean,
default: false,
},
});
const emit = defineEmits(['update:visible', 'close']);
//
const filterForm = ref({
district: '',
});
//
const districtOptions = ref([
{ label: '万州区', value: 'wanzhou' },
{ label: '黔江区', value: 'qianjiang' },
{ label: '涪陵区', value: 'fuling' },
{ label: '渝中区', value: 'yuzhong' },
{ label: '大渡口区', value: 'dadukou' },
{ label: '江北区', value: 'jiangbei' },
{ label: '沙坪坝区', value: 'shapingba' },
{ label: '九龙坡区', value: 'jiulongpo' },
{ label: '南岸区', value: 'nanan' },
{ label: '北碚区', value: 'beibei' },
{ label: '渝北区', value: 'yubei' },
{ label: '巴南区', value: 'banan' },
{ label: '长寿区', value: 'changshou' },
{ label: '江津区', value: 'jiangjin' },
{ label: '合川区', value: 'hechuan' },
{ label: '永川区', value: 'yongchuan' },
{ label: '南川区', value: 'nanchuan' },
{ label: '綦江区', value: 'qijiang' },
{ label: '大足区', value: 'dazu' },
{ label: '璧山区', value: 'bishan' },
{ label: '铜梁区', value: 'tongliang' },
{ label: '潼南区', value: 'tongnan' },
{ label: '荣昌区', value: 'rongchang' },
{ label: '开州区', value: 'kaizhou' },
{ label: '梁平区', value: 'liangping' },
{ label: '武隆区', value: 'wulong' },
]);
//
const tableHeight = ref(300);
// -
const tableColumns = ref([
{ prop: 'id', label: '序号' },
{ prop: 'district', label: '抽查区县' },
{ prop: 'inspectTime', label: '抽查时间' },
{ prop: 'inspectedPerson', label: '被抽查人' },
{ prop: 'contactPhone', label: '联系电话' },
]);
//
const tableData = ref([]);
//
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(0);
//
const handleClose = () => {
emit('update:visible', false);
emit('close');
};
//
const handleSizeChange = val => {
pageSize.value = val;
fetchData();
};
const handleCurrentChange = val => {
currentPage.value = val;
fetchData();
};
//
const handleFilterChange = () => {
currentPage.value = 1;
fetchData();
};
//
const fetchData = async () => {
try {
const res = await request({
url: '/snow-ops-platform/inspection/personnel-list',
method: 'GET',
params: {
pageNum: currentPage.value,
pageSize: pageSize.value,
districtCode: filterForm.value.district,
},
});
if (res.code === '00000' && res.data) {
const data = res.data;
tableData.value = data.records.map((item, index) => {
return {
id: currentPage.value * pageSize.value - (pageSize.value - index - 1),
district: item.districtName || '-',
inspectTime: item.inspectTime || '-',
inspectedPerson: item.inspectedPerson || '-',
contactPhone: item.contactPhone || '-',
};
});
total.value = data.total;
}
} catch (error) {
console.error('获取抽查人次数据失败:', error);
}
};
// visible
watch(
() => props.visible,
newVal => {
if (newVal) {
currentPage.value = 1;
fetchData();
}
}
);
</script>
<style lang="scss" scoped>
//
.filter-section {
margin-bottom: 16px;
.filter-row {
width: 700px;
display: flex;
gap: 12px;
flex-wrap: wrap;
}
.filter-item {
display: flex;
align-items: center;
gap: 8px;
.filter-label {
font-size: 13px;
color: rgba(255, 255, 255, 0.8);
white-space: nowrap;
}
.filter-select {
width: 160px;
:deep(.el-input__wrapper) {
background-color: rgba(30, 70, 120, 0.4);
border: 1px solid rgba(64, 169, 255, 0.3);
box-shadow: none;
border-radius: 4px;
.el-input__inner {
color: #fff;
font-size: 13px;
&::placeholder {
color: rgba(255, 255, 255, 0.4);
}
}
.el-input__suffix {
.el-icon {
color: rgba(255, 255, 255, 0.6);
}
}
}
}
}
}
</style>

View File

@ -83,7 +83,7 @@
</div>
<!-- 填报动态信息 -->
<div class="section">
<div class="section" v-if="dynamicRecords.length > 0">
<div class="section-title">
<span class="title-icon"></span>
填报动态信息
@ -169,13 +169,13 @@ const emit = defineEmits(['update:visible', 'close']);
//
const basicInfo = ref({
district: '合川区',
level: '一般隐患',
levelClass: 'level-normal',
roadCode: 'G348',
location: '丁吴路(K116+656至K116+739)',
riskDesc: '未回应',
discoverTime: '立即启动防汛Ⅰ级应急响应,立即转移危险区群众,医疗机构做好应急准备',
district: '',
level: '',
levelClass: '',
roadCode: '',
location: '',
riskDesc: '',
discoverTime: '',
});
//
@ -183,22 +183,22 @@ const photoList = ref([]);
//
const dynamicRecords = ref([
{
type: '首报',
patrolTime: '2026-03-28 14:30:00',
patrolPerson: '刘伟',
description: '设置警示标识,半幅通行',
hasProblem: true,
image: 'https://via.placeholder.com/80x60/40a9ff/ffffff?text=现场',
},
{
type: '续报',
patrolTime: '2026-03-28 14:30:00',
patrolPerson: '刘伟',
description: '设置警示标识,半幅通行',
hasProblem: false,
image: null,
},
// {
// type: '',
// patrolTime: '2026-03-28 14:30:00',
// patrolPerson: '',
// description: '',
// hasProblem: true,
// image: 'https://via.placeholder.com/80x60/40a9ff/ffffff?text=',
// },
// {
// type: '',
// patrolTime: '2026-03-28 14:30:00',
// patrolPerson: '',
// description: '',
// hasProblem: false,
// image: null,
// },
]);
//
@ -277,19 +277,17 @@ const getAffectedObjectTypeId = data => {
photoList.value = photos.length > 0 ? photos : [];
// - 使
dynamicRecords.value = [
{
type: '桥梁信息',
patrolTime: data.GL1_JCTCRQ || '-', //
patrolPerson: data.GL1_QLZRR || '-', //
description: `桥梁全长:${data.GL1_QLQC || '-'}m跨径总长${data.GL1_KJZC || '-'}m上部结构${data.GL1_SBJGLXMC || '-'}`,
hasProblem: false,
image: null,
},
];
// dynamicRecords.value = [
// {
// type: '',
// patrolTime: data.GL1_JCTCRQ || '-', //
// patrolPerson: data.GL1_QLZRR || '-', //
// description: `${data.GL1_QLQC || '-'}m${data.GL1_KJZC || '-'}m${data.GL1_SBJGLXMC || '-'}`,
// hasProblem: false,
// image: null,
// },
// ];
} else if (pointType === '边坡') {
//
const data = resData || {};
// -
basicInfo.value = {
district: data.GL1_QXMC || '-', //
@ -312,16 +310,16 @@ const getAffectedObjectTypeId = data => {
photoList.value = photos.length > 0 ? photos : [];
// -
dynamicRecords.value = [
{
type: '边坡信息',
patrolTime: data.GL1_BPPGC || '-', //
patrolPerson: data.GL1_ZRRXM || '-', //
description: `起点桩号:${data.GL1_QDZH || '-'},终点桩号:${data.GL1_ZDZH || '-'},起点经度:${data.GL1_QDJD || '-'},起点纬度:${data.GL1_QDWD || '-'},监测设施:${data.GL1_JCSSSZ || '-'},综合措施:${data.GL1_ZHXS || '-'}`,
hasProblem: data.GL1_JCSSSZ !== '无' && data.GL1_JCSSSZ !== null,
image: null,
},
];
// dynamicRecords.value = [
// {
// type: '',
// patrolTime: data.GL1_BPPGC || '-', //
// patrolPerson: data.GL1_ZRRXM || '-', //
// description: `${data.GL1_QDZH || '-'}${data.GL1_ZDZH || '-'}${data.GL1_QDJD || '-'}${data.GL1_QDWD || '-'}${data.GL1_JCSSSZ || '-'}${data.GL1_ZHXS || '-'}`,
// hasProblem: data.GL1_JCSSSZ !== '' && data.GL1_JCSSSZ !== null,
// image: null,
// },
// ];
} else if (pointType === '隧道') {
// -
basicInfo.value = {
@ -352,45 +350,42 @@ const getAffectedObjectTypeId = data => {
photoList.value = photos.length > 0 ? photos : [];
// -
dynamicRecords.value = [
{
type: '隧道信息',
patrolTime: data.GL1_XCTCSJ || '-', //
patrolPerson: data.GL1_GLDW || '-', //
description: `隧道全长:${data.GL1_SDC || '-'}m隧道净宽${data.GL1_SDJK || '-'}m围岩等级${data.GL1_WYDJ || '-'},衬砌类型:${data.GL1_CQLXMC || '-'}`,
hasProblem: false,
image: null,
},
];
// dynamicRecords.value = [
// {
// type: '',
// patrolTime: data.GL1_XCTCSJ || '-', //
// patrolPerson: data.GL1_GLDW || '-', //
// description: `${data.GL1_SDC || '-'}m${data.GL1_SDJK || '-'}m${data.GL1_WYDJ || '-'}${data.GL1_CQLXMC || '-'}`,
// hasProblem: false,
// image: null,
// },
// ];
} else if (pointType === '路段') {
//
const data = resData || {};
// -
basicInfo.value = {
district: data.GL1_QDMC || '-', //
level: leveltext(data.GL1_JSDJ) || '未评定', //
levelClass:
data.GL1_JSDJ === '一级' || data.GL1_JSDJ === '二级' ? 'level-normal' : 'level-serious', //
level: data.GL1_JSDJ || '未评定', //
levelClass: data.GL1_JSDJ, //
roadCode: data.GL1_LXBH || '-', // 线
location: `${data.GL1_QDMC || '-'} - ${data.GL1_ZDMC || '-'}`, //
riskDesc: data.GL1_TZSJ || '-', // /
discoverTime: data.GL1_XZDJ || '-', //
riskDesc: '-', //
discoverTime: '-', //
};
// -
photoList.value = [];
// -
dynamicRecords.value = [
{
type: '路段信息',
patrolTime: data.GL1_TZSJ || '-', //
patrolPerson: data.GL1_XZDJ || '-', //
description: `路段长度:${data.GL1_LDLC || '-'}km路面宽度${data.GL1_LMKD || '-'}m路面类型${data.GL1_LMLX || '-'},车道数量:${data.GL1_CDSL || '-'}`,
hasProblem: false,
image: null,
},
];
// dynamicRecords.value = [
// {
// type: '',
// patrolTime: data.GL1_TZSJ || '-', //
// patrolPerson: data.GL1_XZDJ || '-', //
// description: `${data.GL1_LDLC || '-'}km${data.GL1_LMKD || '-'}m${data.GL1_LMLX || '-'}${data.GL1_CDSL || '-'}`,
// hasProblem: false,
// image: null,
// },
// ];
}
};
@ -449,6 +444,7 @@ watch(
<style lang="scss" scoped>
.content-wrapper {
height: 500px;
width: 600px;
overflow-y: auto;
//

View File

@ -680,13 +680,13 @@ const processUnifiedData = (item, type) => {
},
// - 使GL1_HLXMGL1_HLDH
roadKeeper: {
name: item.GL1_HLXM || '-',
phone: item.GL1_HLDH || '-',
name: item.GL1_HLXM || item.ROAD_PATROL_WORKER_NAME || '-',
phone: item.GL1_HLDH || item.ROAD_PATROL_WORKER_PHONE || '-',
},
// - 使
//
generalStaff: {
name: item.GL1_FXLX || '-',
phone: item.GL1_FXMS || '-',
name: item.ROAD_SECTION_CHIEF_NAME || '-',
phone: item.ROAD_SECTION_CHIEF_PHONE || '-',
},
};
}

View File

@ -0,0 +1,304 @@
<template>
<base-dialog
v-model:visible="props.visible"
title="巡查里程"
:table-data="tableData"
:table-columns="tableColumns"
:table-height="tableHeight"
:total="total"
:current-page="currentPage"
:page-size="pageSize"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
@close="handleClose"
>
<!-- 统计卡片区域 -->
<template #header>
<div class="stats-cards">
<div class="stats-card">
<span class="stats-icon road-icon"></span>
<span class="stats-label">国省道:</span>
<span class="stats-value">{{ nationalRoadMileage }}km</span>
</div>
<div class="stats-card">
<span class="stats-icon rural-icon"></span>
<span class="stats-label">农村公路:</span>
<span class="stats-value">{{ ruralRoadMileage }}km</span>
</div>
</div>
</template>
<!-- 筛选区域 -->
<template #filter>
<div class="filter-row">
<div class="filter-item">
<span class="filter-label">帮扶区县</span>
<el-select
:teleported="false"
v-model="filterForm.district"
placeholder="请选择"
class="filter-select"
clearable
@change="handleFilterChange"
>
<el-option
v-for="item in districtOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</div>
</template>
</base-dialog>
</template>
<script setup>
import { ref, watch } from 'vue';
import BaseDialog from '../component/baseDialog.vue';
import { request } from '@/utils/request';
const props = defineProps({
visible: {
type: Boolean,
default: false,
},
});
const emit = defineEmits(['update:visible', 'close']);
//
const nationalRoadMileage = ref(345);
const ruralRoadMileage = ref(4333);
//
const filterForm = ref({
district: '',
});
//
const districtOptions = ref([
{ label: '万州区', value: 'wanzhou' },
{ label: '黔江区', value: 'qianjiang' },
{ label: '涪陵区', value: 'fuling' },
{ label: '渝中区', value: 'yuzhong' },
{ label: '大渡口区', value: 'dadukou' },
{ label: '江北区', value: 'jiangbei' },
{ label: '沙坪坝区', value: 'shapingba' },
{ label: '九龙坡区', value: 'jiulongpo' },
{ label: '南岸区', value: 'nanan' },
{ label: '北碚区', value: 'beibei' },
{ label: '渝北区', value: 'yubei' },
{ label: '巴南区', value: 'banan' },
{ label: '长寿区', value: 'changshou' },
{ label: '江津区', value: 'jiangjin' },
{ label: '合川区', value: 'hechuan' },
{ label: '永川区', value: 'yongchuan' },
{ label: '南川区', value: 'nanchuan' },
{ label: '綦江区', value: 'qijiang' },
{ label: '大足区', value: 'dazu' },
{ label: '璧山区', value: 'bishan' },
{ label: '铜梁区', value: 'tongliang' },
{ label: '潼南区', value: 'tongnan' },
{ label: '荣昌区', value: 'rongchang' },
{ label: '开州区', value: 'kaizhou' },
{ label: '梁平区', value: 'liangping' },
{ label: '武隆区', value: 'wulong' },
]);
//
const tableHeight = ref(300);
// -
const tableColumns = ref([
{ prop: 'id', label: '序号' },
{ prop: 'district', label: '所属区县' },
{ prop: 'mileage', label: '巡查里程' },
]);
//
const tableData = ref([]);
//
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(0);
//
const handleClose = () => {
emit('update:visible', false);
emit('close');
};
//
const handleSizeChange = val => {
pageSize.value = val;
fetchData();
};
const handleCurrentChange = val => {
currentPage.value = val;
fetchData();
};
//
const handleFilterChange = () => {
currentPage.value = 1;
fetchData();
};
//
const fetchStatsData = async () => {
try {
const res = await request({
url: '/snow-ops-platform/patrol/mileage-stats',
method: 'GET',
});
if (res.code === '00000' && res.data) {
nationalRoadMileage.value = res.data.nationalRoadMileage || 345;
ruralRoadMileage.value = res.data.ruralRoadMileage || 4333;
}
} catch (error) {
console.error('获取巡查里程统计数据失败:', error);
}
};
//
const fetchData = async () => {
try {
const res = await request({
url: '/snow-ops-platform/patrol/mileage-list',
method: 'GET',
params: {
pageNum: currentPage.value,
pageSize: pageSize.value,
districtCode: filterForm.value.district,
},
});
if (res.code === '00000' && res.data) {
const data = res.data;
tableData.value = data.records.map((item, index) => {
return {
id: currentPage.value * pageSize.value - (pageSize.value - index - 1),
district: item.districtName || '-',
mileage: item.mileage ? `${item.mileage}公里` : '-',
};
});
total.value = data.total;
}
} catch (error) {
console.error('获取巡查里程列表数据失败:', error);
}
};
// visible
watch(
() => props.visible,
newVal => {
if (newVal) {
currentPage.value = 1;
fetchStatsData();
fetchData();
}
}
);
</script>
<style lang="scss" scoped>
//
.stats-cards {
display: flex;
gap: 16px;
margin-bottom: 16px;
padding: 0 4px;
.stats-card {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 16px;
background: linear-gradient(135deg, rgba(64, 169, 255, 0.15) 0%, rgba(24, 144, 255, 0.1) 100%);
border: 1px solid rgba(64, 169, 255, 0.3);
border-radius: 6px;
.stats-icon {
width: 20px;
height: 20px;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
&.road-icon {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%2340a9ff"><path d="M18.92 6.01C18.72 5.42 18.16 5 17.5 5h-11c-.66 0-1.21.42-1.42 1.01L3 12v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 16c-.83 0-1.5-.67-1.5-1.5S5.67 13 6.5 13s1.5.67 1.5 1.5S7.33 16 6.5 16zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 11l1.5-4.5h11L19 11H5z"/></svg>');
}
&.rural-icon {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%2340a9ff"><path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"/></svg>');
}
}
.stats-label {
font-size: 14px;
color: rgba(255, 255, 255, 0.8);
}
.stats-value {
font-size: 16px;
font-weight: 600;
color: #40a9ff;
}
}
}
//
.filter-section {
margin-bottom: 16px;
.filter-row {
display: flex;
gap: 12px;
flex-wrap: wrap;
}
.filter-item {
display: flex;
align-items: center;
gap: 8px;
.filter-label {
font-size: 13px;
color: rgba(255, 255, 255, 0.8);
white-space: nowrap;
}
.filter-select {
width: 160px;
:deep(.el-input__wrapper) {
background-color: rgba(30, 70, 120, 0.4);
border: 1px solid rgba(64, 169, 255, 0.3);
box-shadow: none;
border-radius: 4px;
.el-input__inner {
color: #fff;
font-size: 13px;
&::placeholder {
color: rgba(255, 255, 255, 0.4);
}
}
.el-input__suffix {
.el-icon {
color: rgba(255, 255, 255, 0.6);
}
}
}
}
}
}
</style>

View File

@ -0,0 +1,112 @@
<template>
<base-dialog
v-model:visible="props.visible"
title="巡查情况"
:table-data="tableData"
:table-columns="tableColumns"
:table-height="tableHeight"
:total="total"
:current-page="currentPage"
:page-size="pageSize"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
@close="handleClose"
/>
</template>
<script setup>
import { ref, watch } from 'vue';
import BaseDialog from '../component/baseDialog.vue';
import { request } from '@/utils/request';
const props = defineProps({
visible: {
type: Boolean,
default: false,
},
});
const emit = defineEmits(['update:visible', 'close']);
//
const tableHeight = ref(350);
// -
const tableColumns = ref([
{ prop: 'id', label: '序号' },
{ prop: 'type', label: '类型' },
{ prop: 'nationalRoad', label: '国省道' },
{ prop: 'ruralRoad', label: '农村公路' },
{ prop: 'total', label: '总数' },
]);
//
const tableData = ref([]);
//
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(0);
//
const handleClose = () => {
emit('update:visible', false);
emit('close');
};
//
const handleSizeChange = val => {
pageSize.value = val;
fetchData();
};
const handleCurrentChange = val => {
currentPage.value = val;
fetchData();
};
//
const fetchData = async () => {
try {
const res = await request({
url: '/snow-ops-platform/patrol/situation-list',
method: 'GET',
params: {
pageNum: currentPage.value,
pageSize: pageSize.value,
},
});
if (res.code === '00000' && res.data) {
const data = res.data;
tableData.value = data.records.map((item, index) => {
return {
id: currentPage.value * pageSize.value - (pageSize.value - index - 1),
type: item.type || '-',
nationalRoad: item.nationalRoadNo || item.nationalRoad || '-',
ruralRoad: item.ruralRoadValue || item.ruralRoad || '-',
total: item.totalValue ? `${item.totalValue}公里` : item.total || '-',
};
});
total.value = data.total;
}
} catch (error) {
console.error('获取巡查情况数据失败:', error);
}
};
// visible
watch(
() => props.visible,
newVal => {
if (newVal) {
currentPage.value = 1;
fetchData();
}
}
);
</script>
<style lang="scss" scoped>
//
</style>

View File

@ -230,6 +230,8 @@ const tableColumns = ref([
{ prop: 'roadOrg', label: '公路机构责任人', width: '100px', slot: 'roadOrg' },
{ prop: 'maintenance', label: '养护站负责人', width: '100px', slot: 'maintenance' },
{ prop: 'roadKeeper', label: '护路员', width: '100px', slot: 'roadKeeper' },
{ prop: 'generalStaff', label: '一般人员(路长履职)', width: '100px', slot: 'generalStaff' },
{ prop: 'urgeTime', label: '最新催告时间', width: '', slot: 'urgeTime' },
{ prop: 'operation', label: '操作', width: '', slot: 'operation' },
]);
@ -370,6 +372,11 @@ const fetchData = async () => {
img: roadKeeperEvent.replyState === 'read' ? respondedIcon : notRespondedIcon,
isResponded: roadKeeperEvent.replyState === 'read',
},
generalStaff:{
name: item.GL1_QLGCS || "-",
phone: item.GL1_QLGCSDH || "-",
},
urgeTime: {
date: urgeTimeParts[0] || '-',
time: urgeTimeParts[1] ? urgeTimeParts[1].substring(0, 8) : '-',

View File

@ -38,6 +38,7 @@
@openDispatchDistrict="openDialog('dispatchDistrict')"
@showCenterCard="item => handleCenterCardClick(item)"
@openOfflineHelp="openDialog('offlineHelp')"
@openImageInspection="openDialog('imageInspection')"
></left>
</div>
<div class="right">
@ -194,7 +195,7 @@
@close="closeDialog('tongnanProjectPerson')"
/>
<!-- 抢通情况对话框 -->
<!-- 管控情况对话框 -->
<clearanceSituationDialog
:dateRange="rightDateRange"
v-model:visible="dialogVisible.clearanceSituation"
@ -256,6 +257,12 @@
v-model:visible="dialogVisible.offlineHelp"
@close="closeDialog('offlineHelp')"
/>
<!-- 抽查人次对话框 -->
<imageInspectionDialog
v-model:visible="dialogVisible.imageInspection"
@close="closeDialog('imageInspection')"
/>
</div>
</div>
</template>
@ -300,6 +307,7 @@ import centerInfoCard from './Dialog/centerInfoCard.vue';
import tongnanProjectPersonDialog from './Dialog/tongnanProjectPersonDialog.vue';
import hazardPointSituationDialog from './Dialog/hazardPointSituationDialog.vue';
import offlineHelpDialog from './Dialog/offlineHelpDialog.vue';
import imageInspectionDialog from './Dialog/imageInspectionDialog.vue';
import './component/el-select.scss';
import './component/date-picker-theme.scss';
@ -329,6 +337,7 @@ const dialogVisible = ref({
tongnanProjectPerson: false,
hazardPointSituation: false,
offlineHelp: false,
imageInspection: false,
});
const activeitem = ref({});
@ -706,7 +715,6 @@ onMounted(() => {
position: absolute;
bottom: 5px;
left: 25%;
width: 20%;
height: 43%;
}
.weather-warning-table {

View File

@ -115,11 +115,7 @@
:key="index"
class="stat-item"
:class="{
clickable:
item.label === '叫应总数' ||
item.label === '已回应数' ||
item.label === '调度区县数' ||
item.label === '线下帮扶数',
clickable: true,
}"
@click="handleStatClick(item)"
>
@ -206,6 +202,7 @@ const emit = defineEmits([
'warningClick',
'dispatchDateRange',
'openOfflineHelp',
'openImageInspection',
]);
//
@ -220,6 +217,8 @@ const handleStatClick = item => {
emit('openDispatchDistrict');
} else if (item.label === '线下帮扶数') {
emit('openOfflineHelp');
} else if (item.label === '抽查人次') {
emit('openImageInspection');
}
};

View File

@ -39,10 +39,11 @@
:key="index"
class="control-item"
:class="{
clickable: item.label === '封闭管控数',
clickable: true,
}"
@click="handleControlClick(item)"
>
<!-- item.label === '封闭管控数' -->
<div class="control-value">{{ item.value }}</div>
<div class="control-label">{{ item.label }}</div>
</div>
@ -55,7 +56,7 @@
:key="index"
class="control-item"
:class="{
clickable: item.label === '关闭驻地数',
clickable: item.label == '停工项目数' || item.label == '关闭驻地数',
}"
@click="handleControlClick(item)"
>
@ -524,10 +525,15 @@ const extractAndSumNumbers = value => {
//
const handleControlClick = item => {
if (item.label === '封闭管控数') {
if (
item.label === '封闭管控数' ||
item.label === '半幅通行数' ||
item.label === '限速(限车型)数' ||
item.label === '告警阻拦处数'
) {
emit('openClearanceSituation');
emit('update:dateRange', getdateRange.value || []);
} else if (item.label === '关闭驻地数') {
} else if (item.label === '停工项目数' || item.label === '关闭驻地数') {
emit('openControlSituation');
}
};
@ -663,8 +669,8 @@ const blockData = ref([
{ label: '本轮累计阻断数', current: '10', total: '23' },
]);
//
const deathData = ref({ label: '本轮因灾亡人数', value: '5' });
//
const deathData = ref({ label: '本轮因灾亡人数', value: '5' });
//
const damageData = ref([