feat: 灾毁分页查询

This commit is contained in:
niedongsheng 2026-04-24 17:41:05 +08:00
parent a08695997f
commit 9e8673cab3

View File

@ -12,35 +12,33 @@
</div>
<CurrentSite />
<div class="list-panel">
<CardItem v-for="(item, index) in list" :key="index" :title="getEventTitle(item)" @click="handleClickItem(item)">
<template #headerExtra>
<van-tag :type="getEventStatusType(item.eventStatus)" plain size="medium">
{{ getEventStatusText(item.eventStatus) }}
</van-tag>
</template>
<van-list :loading="loading" :finished="finished" finished-text="没有更多了" @load="handleLoadMore">
<CardItem v-for="(item, index) in list" :key="index" :title="item.eventName" @click="handleClickItem(item)">
<template #headerExtra>
<van-tag :type="getEventStatusType(item.eventStatus)" plain size="medium">
{{ getEventStatusText(item.eventStatus) }}
</van-tag>
</template>
<div class="info-block">
<div class="time-box">
<span class="info-label">发生时间</span>
<span class="info-value">{{ item.occurTime || '-' }}</span>
<div class="info-block">
<div class="time-box">
<span class="info-label">发生时间</span>
<span class="info-value">{{ item.occurTime || '-' }}</span>
</div>
<div class="time-box">
<span class="info-label">预计恢复时间</span>
<span class="info-value">{{ item.expectRecoverTime || '-' }}</span>
</div>
<div class="disaster-type-wrapper">
<van-tag class="tag" type="primary" size="medium" plain>{{ getDisasterTypeText(item) }}</van-tag>
</div>
</div>
<div class="time-box">
<span class="info-label">预计恢复时间</span>
<span class="info-value">{{ item.expectRecoverTime || '-' }}</span>
</div>
<div class="disaster-type-wrapper">
<van-tag class="tag" type="primary" size="medium" plain>{{ getDisasterTypeText(item) }}</van-tag>
</div>
</div>
<van-icon class="jump-icon-absolute" name="arrow" />
</CardItem>
<van-icon class="jump-icon-absolute" name="arrow" />
</CardItem>
</van-list>
<div v-if="loading" class="loading-wrapper">
<van-loading size="24px" vertical>加载中...</van-loading>
</div>
<EmptyBox v-if="!loading && list.length === 0" :placeholder="emptyText" />
<EmptyBox v-if="!loading && loaded && list.length === 0" :placeholder="emptyText" />
</div>
<van-button type="primary" class="footer-btn" @click="handleAdd">灾害填报</van-button>
@ -52,8 +50,8 @@
<script setup>
import { ref, onMounted } from 'vue'
import { RouterLink, useRouter } from 'vue-router'
import { showToast, Tag as VanTag, Loading as VanLoading, Icon as VanIcon, Button as VanButton, showImagePreview } from 'vant'
import { useRouter } from 'vue-router'
import { showToast, Tag as VanTag, List as VanList, Icon as VanIcon, Button as VanButton } from 'vant'
import PageContainer from '@/components/PageContainer.vue'
import SearchInput from '@/components/SearchInput.vue'
import CardItem from '@/components/CardItem.vue'
@ -73,6 +71,14 @@ const list = ref([])
//
const loading = ref(false)
const loaded = ref(false)
const finished = ref(false)
const pageNum = ref(1)
const pageSize = 10
//
const emptyText = ref('暂无相关灾毁信息')
@ -92,6 +98,7 @@ const disasterTypes = [
{ label: '行道树倒塌', value: '行道树倒塌' },
{ label: '积水', value: '积水' },
{ label: '积雪', value: '积雪' },
{ label: '冰雪灾害', value: '冰雪灾害' },
{ label: '其他', value: '其他' }
]
@ -138,18 +145,25 @@ const getShortTypeName = (type) => {
积水: '积水',
积雪: '积雪',
其他: '其他',
未抢险: '待抢险',
抢险中: '抢险中',
已完成: '已完成',
高速公路: '高速',
国道: '国道',
省道: '省道'
冰雪灾害: '冰雪'
}
return typeMap[type] || (type ? type.substring(0, 2) : '全部')
}
//
const getDisasterList = async (keyword = '', disasterType = null) => {
const getDisasterList = async ({ reset = false } = {}) => {
console.log("loading.value", loading.value)
if (loading.value) return
if (reset) {
pageNum.value = 1
finished.value = false
loaded.value = false
list.value = []
}
if (finished.value) return
loading.value = true
try {
@ -157,13 +171,14 @@ const getDisasterList = async (keyword = '', disasterType = null) => {
url: '/snow-ops-platform/unified-disaster/list',
method: 'get',
params: {
pageSize: 999,
keyword: keyword.trim(),
roadConditionType: disasterType || undefined
pageNum: pageNum.value,
pageSize,
keyword: searchValue.value.trim(),
roadConditionType: selectedDisasterType.value || undefined
}
})
if (result?.data?.records) {
list.value = result.data.records.map((item) => ({
const records = result.data.records.map((item) => ({
...item,
// 使
title: getEventTitle(item),
@ -171,28 +186,45 @@ const getDisasterList = async (keyword = '', disasterType = null) => {
occurTime: item.occurTime,
estimateRecoverTime: item.expectRecoverTime
}))
list.value = reset ? records : [...list.value, ...records]
const total = Number(result.data.total || 0)
finished.value = list.value.length >= total || records.length < pageSize
pageNum.value += 1
} else {
showToast(result.message || '获取数据失败')
list.value = []
if (reset) {
list.value = []
}
finished.value = true
}
} catch (error) {
console.error('获取灾毁列表失败:', error)
showToast('获取数据失败,请稍后重试')
list.value = []
if (reset) {
list.value = []
}
finished.value = true
} finally {
loading.value = false
loaded.value = true
}
}
//
const handleSearch = () => {
getDisasterList(searchValue.value, selectedDisasterType.value)
getDisasterList({ reset: true })
}
//
const handleFilterConfirm = (type) => {
// selectedDisasterType v-model
getDisasterList(searchValue.value, type)
selectedDisasterType.value = type
getDisasterList({ reset: true })
}
const handleLoadMore = () => {
if (!loaded.value) return
getDisasterList()
}
//
@ -227,16 +259,25 @@ const handleAdd = () => {
//
onMounted(() => {
getDisasterList()
getDisasterList({ reset: true })
})
</script>
<style lang="scss" scoped>
:deep(.page-content-wrapper) {
display: flex;
flex-direction: column;
}
.list-panel {
display: flex;
flex-direction: column;
gap: 8px;
padding-bottom: 80px;
overflow: auto;
box-sizing: border-box;
flex: 1;
min-height: 100px;
}
.filter-wrapper {
@ -321,12 +362,6 @@ onMounted(() => {
}
}
.loading-wrapper {
display: flex;
justify-content: center;
padding: 40px 0;
}
:deep(.van-button) {
&.active {
background-color: #1989fa;