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