This commit is contained in:
niedongsheng 2026-05-06 10:59:32 +08:00
commit fa880703b2
3 changed files with 335 additions and 245 deletions

View File

@ -5,8 +5,8 @@
<CurrentSite /> <CurrentSite />
<div class="list-panel"> <div class="list-panel">
<CardItem v-for="(item, index) in list" :key="index" :title="`${item.projectName}`" <van-list :loading="loading" :finished="finished" finished-text="没有更多了" @load="handleLoadMore">
@click="handleClickItem(item)"> <CardItem v-for="(item, index) in list" :key="index" :title="`${item.projectName}`" @click="handleClickItem(item)">
<template #headerExtra> <template #headerExtra>
<van-tag v-if="item.approvalStatus === 3 || item.approvalStatus === 1" type="success" plain size="medium">审批通过</van-tag> <van-tag v-if="item.approvalStatus === 3 || item.approvalStatus === 1" type="success" plain size="medium">审批通过</van-tag>
<van-tag v-else-if="item.approvalStatus === 2 || item.approvalStatus === 4" type="danger" plain size="medium">审批驳回</van-tag> <van-tag v-else-if="item.approvalStatus === 2 || item.approvalStatus === 4" type="danger" plain size="medium">审批驳回</van-tag>
@ -15,11 +15,19 @@
<div class="content"> <div class="content">
<div class="left-info"> <div class="left-info">
<div><span class="label">起止桩号</span><span class="value">{{ `${item.startStakeNo} - <div>
${item.endStakeNo}`}}</span> <span class="label">起止桩号</span
><span class="value">{{
`${item.startStakeNo} -
${item.endStakeNo}`
}}</span>
</div>
<div>
<span class="label">路况位置</span><span class="value">{{ item.roadLocation }}</span>
</div>
<div>
<span class="label">提交日期</span><span class="value">{{ item.submitTime }}</span>
</div> </div>
<div><span class="label">路况位置</span><span class="value">{{ item.roadLocation }}</span></div>
<div><span class="label">提交日期</span><span class="value">{{ item.submitTime }}</span></div>
</div> </div>
<div class="right-arrow" @click.stop="handleClickItem(item)"> <div class="right-arrow" @click.stop="handleClickItem(item)">
<van-icon name="arrow" /> <van-icon name="arrow" />
@ -28,12 +36,11 @@
</CardItem> </CardItem>
<!-- 空状态提示 --> <!-- 空状态提示 -->
<EmptyBox v-if="list.length === 0" placeholder="暂无相关预警信息" /> <!-- <EmptyBox v-if="list.length === 0" placeholder="暂无相关预警信息" /> -->
</van-list>
</div> </div>
<van-button type="primary" class="add-btn" icon="plus" @click="handleAddDevice"> <van-button type="primary" class="add-btn" icon="plus" @click="handleAddDevice"> 项目填报 </van-button>
项目填报
</van-button>
</PageContainer> </PageContainer>
</template> </template>
@ -45,29 +52,57 @@ import SearchInput from '@/components/SearchInput.vue'
import CurrentSite from '@/components/CurrentSite.vue' import CurrentSite from '@/components/CurrentSite.vue'
import CardItem from '@/components/CardItem.vue' import CardItem from '@/components/CardItem.vue'
import EmptyBox from '@/components/EmptyBox.vue' import EmptyBox from '@/components/EmptyBox.vue'
import { request } from "../../../../shared/utils/request"; import { request } from '../../../../shared/utils/request'
const router = useRouter() const router = useRouter()
const loading = ref(false)
const finished = ref(false)
const pageNum = ref(1)
const pageSize = 10
onMounted(() => { onMounted(() => {
getData() getData({ reset: true })
}) })
const getData = async () => { const getData = async ({ reset = false } = {}) => {
if (loading.value) return
if (reset) {
pageNum.value = 1
finished.value = false
list.value = []
}
if (finished.value) return
loading.value = true
try {
const params = { const params = {
pageNum: 1, pageNum: pageNum.value,
pageSize: 999, pageSize,
} }
if (searchValue.value) { if (searchValue.value) {
params.districtName = searchValue.value params.districtName = searchValue.value.trim()
} }
const res = await request({ const res = await request({
url: '/snow-ops-platform/recovery/list', url: '/snow-ops-platform/recovery/list',
method: 'GET', method: 'GET',
params params,
}) })
if (res.code === '00000') { if (res.code === '00000' && res.data?.records) {
list.value = res.data.records list.value = reset ? res.data.records : [...list.value, ...res.data.records]
const total = Number(res.data.total || 0)
finished.value = list.value.length >= total || res.data.records.length < pageSize
pageNum.value += 1
}
} catch (error) {
console.error('获取列表失败:', error)
showToast('获取数据失败,请稍后重试')
finished.value = true
} finally {
loading.value = false
} }
} }
@ -77,7 +112,6 @@ const searchValue = ref('')
// //
const list = ref([]) const list = ref([])
const handleClickBack = () => { const handleClickBack = () => {
router.push('/') router.push('/')
} }
@ -86,8 +120,8 @@ const handleClickItem = (item) => {
router.push({ router.push({
name: 'RebuildDetails', name: 'RebuildDetails',
params: { params: {
data: encodeURIComponent(JSON.stringify(item.id)) data: encodeURIComponent(JSON.stringify(item.id)),
} },
}) })
} }
@ -101,11 +135,17 @@ const handleAddDevice = () => {
// }); // });
} }
watch(() => searchValue.value, () => { const handleLoadMore = () => {
if (loading.value) return
getData() getData()
}) }
watch(
() => searchValue.value,
() => {
getData({ reset: true })
},
)
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@ -3,57 +3,107 @@
<div class="content"> <div class="content">
<PanelItem> <PanelItem>
<van-form ref="formRef" label-align="left" colon> <van-form ref="formRef" label-align="left" colon>
<van-field v-model="form.project.districtName" label="区县名称" center placeholder="请填写" required <van-field
:rules="[{ required: true, message: '请填写区县名称' }]" /> v-model="form.project.districtName"
<RoadRoutesPicker v-model="form.project.routeNo" label="线路编号" center placeholder="请选择" required label="区县名称"
:rules="[{ required: true, message: '请选择线路编号' }]" @change="handleRouteNoChange" /> center
<van-field v-model="form.project.startStakeNo" label="起点桩号" disabled center placeholder="请选择线路编号" placeholder="请填写"
required :rules="[{ required: true, message: '请填写起点桩号' }]" /> :rules="[{ required: true, message: '请填写区县名称' }]"
<van-field v-model="form.project.endStakeNo" label="止点桩号" disabled center placeholder="请选择线路编号" />
required :rules="[{ required: true, message: '请填写止点桩号' }]" /> <RoadRoutesPicker
<van-field v-model="form.project.implementMileage" label="实施里程" center placeholder="单位:公里" required v-model="form.project.routeNo"
type="number" :rules="[{ required: true, message: '请填写实施里程' }]"> label="线路编号"
<template #extra> center
公里 placeholder="请选择"
</template> :rules="[{ required: true, message: '请选择线路编号' }]"
@change="handleRouteNoChange"
/>
<van-field
v-model="form.project.startStakeNo"
label="起点桩号"
disabled
center
placeholder="请选择线路编号"
:rules="[{ required: true, message: '请填写起点桩号' }]"
/>
<van-field
v-model="form.project.endStakeNo"
label="止点桩号"
disabled
center
placeholder="请选择线路编号"
:rules="[{ required: true, message: '请填写止点桩号' }]"
/>
<van-field
v-model="form.project.implementMileage"
label="实施里程"
center
placeholder="单位:公里"
type="number"
:rules="[{ required: true, message: '请填写实施里程' }]"
>
<template #extra> 公里 </template>
</van-field> </van-field>
<van-field v-model="form.project.earthworkLoss" label="塌方及损失" center placeholder="(方/万元)" required <van-field
:rules="[{ required: true, message: '请填写塌方及损失' }]" /> v-model="form.project.earthworkLoss"
<van-field v-model="form.project.disasterType" label="灾害类型" center placeholder="请填写" required label="塌方及损失"
:rules="[{ required: true, message: '请填写灾害类型' }]" /> center
<van-field v-model="form.project.locationRoute" label="地点路线" center placeholder="请填写" required placeholder="(方/万元)"
:rules="[{ required: true, message: '请填写地点路线' }]" /> :rules="[{ required: true, message: '请填写塌方及损失' }]"
<van-field v-model="form.project.roadLocation" label="路况位置" center placeholder="请填写" required />
:rules="[{ required: true, message: '请填写路况位置' }]" /> <van-field
<van-field v-model="form.project.blockedPointName" label="阻断点小地名" center placeholder="请填写" required v-model="form.project.disasterType"
:rules="[{ required: true, message: '请填写阻断点小地名' }]" /> label="灾害类型"
<van-field v-model="form.project.estimatedCost" label="恢复重建预估费用" center placeholder="请填写" required center
:rules="[{ required: true, message: '请填写恢复重建预估费用' }]"> placeholder="请填写"
<template #extra> :rules="[{ required: true, message: '请填写灾害类型' }]"
万元 />
</template> <van-field
v-model="form.project.locationRoute"
label="地点路线"
center
placeholder="请填写"
:rules="[{ required: true, message: '请填写地点路线' }]"
/>
<van-field
v-model="form.project.roadLocation"
label="路况位置"
center
placeholder="请填写"
:rules="[{ required: true, message: '请填写路况位置' }]"
/>
<van-field
v-model="form.project.blockedPointName"
label="阻断点小地名"
center
placeholder="请填写"
:rules="[{ required: true, message: '请填写阻断点小地名' }]"
/>
<van-field
v-model="form.project.estimatedCost"
label="恢复重建预估费用"
center
placeholder="请填写"
:rules="[{ required: true, message: '请填写恢复重建预估费用' }]"
>
<template #extra> 万元 </template>
</van-field> </van-field>
<DisasterFileUpload label="附件上传" v-model="form.fileList"></DisasterFileUpload> <DisasterFileUpload label="附件上传" v-model="form.fileList"></DisasterFileUpload>
</van-form> </van-form>
</PanelItem> </PanelItem>
</div> </div>
<van-button type="primary" class="add-btn" icon="plus" @click="handleAdd"> <van-button type="primary" class="add-btn" icon="plus" @click="handleAdd"> 提交 </van-button>
提交
</van-button>
</PageContainer> </PageContainer>
</template> </template>
<script setup> <script setup>
import { ref, onMounted, watch, reactive, toRaw } from 'vue' import { ref, onMounted, watch, reactive, toRaw } from 'vue'
import { useRouter, useRoute } from 'vue-router' import { useRouter, useRoute } from 'vue-router'
import PageContainer from '@/components/PageContainer.vue' import PageContainer from '@/components/PageContainer.vue'
import { showToast, showLoadingToast } from "vant"; import { showToast, showLoadingToast } from 'vant'
import PanelItem from '@/components/PanelItem.vue' import PanelItem from '@/components/PanelItem.vue'
import { request } from "../../../../shared/utils/request"; import { request } from '../../../../shared/utils/request'
import RoadRoutesPicker from '../DisasterManagement/components/RoadRoutesPicker.vue' import RoadRoutesPicker from '../DisasterManagement/components/RoadRoutesPicker.vue'
import DisasterFileUpload from '../DisasterManagement/components/DisasterFileUpload.vue' import DisasterFileUpload from '../DisasterManagement/components/DisasterFileUpload.vue'
@ -74,9 +124,9 @@ const form = reactive({
blockedPointName: null, blockedPointName: null,
estimatedCost: null, estimatedCost: null,
}, },
fileList: [] fileList: [],
}) })
const formRef = ref(); const formRef = ref()
// //
const getDetail = async (id) => { const getDetail = async (id) => {
@ -85,8 +135,8 @@ const getDetail = async (id) => {
url: '/snow-ops-platform/water-damage/getById', url: '/snow-ops-platform/water-damage/getById',
method: 'GET', method: 'GET',
params: { params: {
id id,
} },
}) })
if (res.code === '00000') { if (res.code === '00000') {
form.project.districtName = res.data.event.district form.project.districtName = res.data.event.district
@ -106,18 +156,18 @@ const getDetail = async (id) => {
} }
} catch (error) { } catch (error) {
showToast({ showToast({
type: "fail", type: 'fail',
message: error.message, message: error.message,
}); })
} }
} }
onMounted(() => { onMounted(() => {
if (route.params.data) { if (route.params.data) {
const data = JSON.parse(decodeURIComponent(route.params.data)); const data = JSON.parse(decodeURIComponent(route.params.data))
// console.log('@@@@data', data); // console.log('@@@@data', data);
// //
getDetail(data); getDetail(data)
} else { } else {
// console.log(''); // console.log('');
} }
@ -134,46 +184,42 @@ const handleClickBack = () => {
const handleAdd = async () => { const handleAdd = async () => {
// //
if (!formRef.value) { if (!formRef.value) {
showToast('表单初始化失败'); showToast('表单初始化失败')
return; return
} }
try { try {
const isValid = await formRef.value.validate(); const isValid = await formRef.value.validate()
// //
const toast = showLoadingToast({ const toast = showLoadingToast({
message: "上报中...", message: '上报中...',
forbidClick: true, forbidClick: true,
duration: 0, // 0 duration: 0, // 0
}); })
console.log('表单校验通过,提交数据:', form); console.log('表单校验通过,提交数据:', form)
const res = await request({ const res = await request({
url: '/snow-ops-platform/recovery/add', url: '/snow-ops-platform/recovery/add',
method: 'POST', method: 'POST',
data: form data: form,
}) })
toast.close(); toast.close()
if (res.code === '00000') { if (res.code === '00000') {
showToast('提交成功'); showToast('提交成功')
handleClickBack(); handleClickBack()
} else { } else {
showToast('提交失败, 请稍后重试或联系管理员'); showToast('提交失败, 请稍后重试或联系管理员')
} }
} catch (error) { } catch (error) {
// console.log(':', error); // console.log(':', error);
showToast('请检查并完善表单信息'); showToast('请检查并完善表单信息')
} }
} }
const handleRouteNoChange = (item) => { const handleRouteNoChange = (item) => {
form.project.startStakeNo = item.startStakeNo form.project.startStakeNo = item.startStakeNo
form.project.endStakeNo = item.endStakeNo form.project.endStakeNo = item.endStakeNo
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@ -1,7 +1,7 @@
<template> <template>
<PageContainer title="项目填报" @click-back="handleClickBack"> <PageContainer title="项目填报" @click-back="handleClickBack">
<div class="content"> <div class="content">
<PanelItem> <PanelItem v-if="!loading">
<div class="detail"> <div class="detail">
<div class="header"> <div class="header">
<div class="header-title">{{ data.projectName }}</div> <div class="header-title">{{ data.projectName }}</div>
@ -26,7 +26,7 @@
<div class="item">恢复重建预估费用 {{ data.estimatedCost }}</div> <div class="item">恢复重建预估费用 {{ data.estimatedCost }}</div>
</div> </div>
</PanelItem> </PanelItem>
<PanelItem title="附件"> <PanelItem v-if="!loading" title="附件">
<div class="fileArea"> <div class="fileArea">
<van-image v-for="(item, index) in data?.fileList" :key="index" :src="item.fileUrl" fit="cover" <van-image v-for="(item, index) in data?.fileList" :key="index" :src="item.fileUrl" fit="cover"
width="100px" height="100px" style="margin: 10px" @click="showImage(item.fileUrl)"></van-image> width="100px" height="100px" style="margin: 10px" @click="showImage(item.fileUrl)"></van-image>
@ -56,6 +56,7 @@ const router = useRouter()
const route = useRoute() const route = useRoute()
const data = ref({}) const data = ref({})
const loading = ref(false)
onMounted(() => { onMounted(() => {
if (route.params.data) { if (route.params.data) {
@ -69,6 +70,7 @@ onMounted(() => {
const getDetaillData = async (id) => { const getDetaillData = async (id) => {
try { try {
loading.value = true
const res = await request({ const res = await request({
url: '/snow-ops-platform/recovery/getById', url: '/snow-ops-platform/recovery/getById',
method: 'GET', method: 'GET',
@ -82,6 +84,8 @@ const getDetaillData = async (id) => {
} catch (error) { } catch (error) {
showToast('获取详情失败,请稍后重试') showToast('获取详情失败,请稍后重试')
console.log('error', error); console.log('error', error);
} finally {
loading.value = false
} }
} }