Merge branch 'dev' of http://222.212.85.86:8222/bdzl2/bxztApp into dev
This commit is contained in:
commit
2276895eeb
@ -6,7 +6,6 @@
|
||||
<!-- 基本信息 -->
|
||||
<PanelItem title="基本信息">
|
||||
<template #headerExtra>
|
||||
<!-- 状态标签(需要从续报中判断是否已解除,或接口增加 eventStatus 字段) -->
|
||||
<div class="status-wrapper">
|
||||
<van-tag :type="getEventStatusType()" size="medium" plain>
|
||||
{{ getEventStatusText() }}
|
||||
@ -38,11 +37,10 @@
|
||||
<span class="info-value">{{ detailData.event?.repairProgress || '-' }}</span>
|
||||
</div>
|
||||
|
||||
<!-- 处理措施(从首报中获取) -->
|
||||
<div class="info-row">
|
||||
<!-- <div class="info-row">
|
||||
<span class="info-label">处理措施:</span>
|
||||
<span class="info-value">{{ formatDisposalMeasures(firstReport?.disposalMeasures) || '-' }}</span>
|
||||
</div>
|
||||
<span class="info-value">{{ formatDisposalMeasures(detailData.event?.disposalMeasures) || '-' }}</span>
|
||||
</div> -->
|
||||
|
||||
<!-- 水毁处数 -->
|
||||
<div class="info-row">
|
||||
@ -159,63 +157,10 @@
|
||||
|
||||
<!-- 填报信息 -->
|
||||
<PanelItem title="填报信息">
|
||||
<!-- 首报信息 -->
|
||||
<div class="report-section" v-if="firstReport">
|
||||
<!-- 遍历所有填报记录(首报 + 续报) -->
|
||||
<div v-for="(report, index) in allReports" :key="index" class="report-section">
|
||||
<div class="report-header">
|
||||
<span class="report-title">首报</span>
|
||||
<span class="report-meta">{{ firstReport.reporterName || '-' }} {{ firstReport.reportTime || '-' }}</span>
|
||||
</div>
|
||||
<div class="report-content">
|
||||
<div class="info-row">
|
||||
<span class="info-label">处置情况:</span>
|
||||
<span class="info-value">{{ formatDisposalMeasures(firstReport.disposalMeasures) || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="info-label">塌方及损失:</span>
|
||||
<span class="info-value">{{ getLossDescription(firstReport) }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="info-label">路产损失:</span>
|
||||
<span class="info-value">{{ firstReport.totalLossAmount ? firstReport.totalLossAmount + '万元' : '-' }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="info-label">有无车辆滞留:</span>
|
||||
<span class="info-value">{{ getVehicleStrandedText(firstReport) }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="info-label">滞留车辆:</span>
|
||||
<span class="info-value">{{ firstReport.strandedVehicleCount || 0 }}辆</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="info-label">预计恢复时间:</span>
|
||||
<span class="info-value">{{ firstReport.expectRecoverTime || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="info-label">实际恢复时间:</span>
|
||||
<span class="info-value">{{ firstReport.actualRecoverTime || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="info-label">现场描述:</span>
|
||||
<span class="info-value">{{ firstReport.siteDescription || '-' }}</span>
|
||||
</div>
|
||||
<!-- 附件 -->
|
||||
<div class="info-row" v-if="firstReport.fileList && firstReport.fileList.length > 0">
|
||||
<span class="info-label">附件:</span>
|
||||
<div class="attachment-list">
|
||||
<div v-for="(file, index) in firstReport.fileList" :key="index" class="attachment-item">
|
||||
<van-icon :name="file.fileType === 1 ? 'photo-o' : 'video-o'" />
|
||||
<span class="file-name">{{ file.fileName }}</span>
|
||||
<van-button size="mini" type="primary" plain @click="previewFile(file)">预览</van-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 续报列表 -->
|
||||
<div v-for="(report, index) in continueReports" :key="index" class="report-section">
|
||||
<div class="report-header">
|
||||
<span class="report-title">续报{{ index + 1 }}</span>
|
||||
<span class="report-title">{{ report?.title }}</span>
|
||||
<span class="report-meta">{{ report.reporterName || '-' }} {{ report.reportTime || '-' }}</span>
|
||||
</div>
|
||||
<div class="report-content">
|
||||
@ -270,8 +215,8 @@
|
||||
</PanelItem>
|
||||
|
||||
<!-- 底部按钮:未解除状态显示续报按钮 -->
|
||||
<div class="footer-buttons" v-if="!isEventResolved">
|
||||
<van-button type="primary" class="footer-btn" @click="handleContinueReport">续报</van-button>
|
||||
<div class="footer-buttons">
|
||||
<van-button type="primary" class="footer-btn" @click="handleContinueReport">续报</van-button>
|
||||
</div>
|
||||
</PageContainer>
|
||||
</template>
|
||||
@ -292,8 +237,7 @@ const route = useRoute()
|
||||
// 详情数据(对应 Data 接口)
|
||||
const detailData = ref({
|
||||
event: null, // Event 对象
|
||||
report: null, // Report 对象(首报)
|
||||
reportList: [], // 续报列表(可选,如果接口返回)
|
||||
reportList: [], // 填报列表(包含首报和续报)
|
||||
fileList: [], // 附件列表
|
||||
lossList: [], // 损失列表
|
||||
occurLocation: '',
|
||||
@ -302,42 +246,28 @@ const detailData = ref({
|
||||
routeNo: ''
|
||||
})
|
||||
|
||||
// 首报(优先使用 report,如果没有则从 reportList 中找 reportType === 1)
|
||||
const firstReport = computed(() => {
|
||||
if (detailData.value.report) {
|
||||
return detailData.value.report
|
||||
}
|
||||
return detailData.value.reportList?.find(r => r.reportType === 1)
|
||||
})
|
||||
|
||||
// 续报列表(reportType === 2)
|
||||
const continueReports = computed(() => {
|
||||
return detailData.value.reportList?.filter(r => r.reportType === 2) || []
|
||||
const allReports = computed(() => {
|
||||
const reports = detailData.value.reportList?.map((item, index)=>{
|
||||
item.title = index == 0 ? '首报' : ('续报' + index)
|
||||
return item
|
||||
}) || []
|
||||
return reports.reverse()
|
||||
})
|
||||
|
||||
// 是否有填报数据
|
||||
const hasReportData = computed(() => {
|
||||
return firstReport.value || continueReports.value.length > 0
|
||||
return allReports.value.length > 0
|
||||
})
|
||||
|
||||
// 判断事件是否已解除(根据实际恢复时间或续报状态判断)
|
||||
const isEventResolved = computed(() => {
|
||||
// 如果首报有实际恢复时间且不为空,则认为已解除
|
||||
// if (firstReport.value?.actualRecoverTime) {
|
||||
// return true
|
||||
// }
|
||||
// // 检查续报中是否有实际恢复时间
|
||||
// return continueReports.value.some(r => r.actualRecoverTime)
|
||||
})
|
||||
|
||||
// 获取事件状态文本
|
||||
const getEventStatusText = () => {
|
||||
return isEventResolved.value ? '已解除' : '未解除'
|
||||
return detailData.eventStatus === 1 ? '已解除' : '未解除'
|
||||
}
|
||||
|
||||
// 获取事件状态类型
|
||||
const getEventStatusType = () => {
|
||||
return isEventResolved.value ? 'success' : 'danger'
|
||||
return detailData.eventStatus === 1 ? 'success' : 'danger'
|
||||
}
|
||||
|
||||
// 格式化处置措施(逗号分隔转中文)
|
||||
@ -396,8 +326,7 @@ const getDisasterDetail = async () => {
|
||||
const data = result.data
|
||||
detailData.value = {
|
||||
event: data.event || null,
|
||||
report: data.report || null,
|
||||
reportList: data.reportList || [],
|
||||
reportList: data.report || [], // 直接使用 reportList,包含首报和续报
|
||||
fileList: data.fileList || [],
|
||||
lossList: data.lossList || [],
|
||||
occurLocation: data.occurLocation || '',
|
||||
|
||||
@ -58,7 +58,7 @@
|
||||
<span>校准经纬度</span>
|
||||
</div>
|
||||
|
||||
<!-- 路况位置 (event.endStakeNo) -->
|
||||
<!-- 路况位置 (occurLocation) -->
|
||||
<van-field v-model="formData.occurLocation" label="路况位置" placeholder="请填写" />
|
||||
|
||||
<!-- 阻断点小地名 (event.blockedPointName) -->
|
||||
@ -71,12 +71,13 @@
|
||||
<div class="disposal-measures">
|
||||
<span class="measures-label">处置措施</span>
|
||||
<div class="measures-options">
|
||||
<van-checkbox-group v-model="disposalMeasuresArray" direction="horizontal">
|
||||
<van-checkbox name="halfClose">半幅封闭</van-checkbox>
|
||||
<van-checkbox name="fullClose">全副封闭</van-checkbox>
|
||||
<van-checkbox name="bypass">便道通行</van-checkbox>
|
||||
<van-checkbox name="normal">正常通行</van-checkbox>
|
||||
</van-checkbox-group>
|
||||
<!-- 改为单选,使用 van-radio-group -->
|
||||
<van-radio-group v-model="disposalMeasureValue" direction="horizontal">
|
||||
<van-radio name="halfClose">半幅封闭</van-radio>
|
||||
<van-radio name="fullClose">全副封闭</van-radio>
|
||||
<van-radio name="bypass">便道通行</van-radio>
|
||||
<van-radio name="normal">正常通行</van-radio>
|
||||
</van-radio-group>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -198,8 +199,8 @@ const route = useRoute()
|
||||
// 是否为续报
|
||||
const isContinue = computed(() => route.query.isContinue)
|
||||
|
||||
// 处置措施数组(用于多选框组,需要转换为逗号分隔的字符串)
|
||||
const disposalMeasuresArray = ref([])
|
||||
// 处置措施单选值(用于单选组件)
|
||||
const disposalMeasureValue = ref('')
|
||||
|
||||
// 附件列表
|
||||
const imageFileList = ref([])
|
||||
@ -240,7 +241,7 @@ const formData = reactive({
|
||||
actualRecoverTime: '', // 实际恢复时间
|
||||
damagedVehicleCount: '', // 损坏车辆
|
||||
deadCount: '', // 死亡人员
|
||||
disposalMeasures: '', // 处置措施(逗号分隔)
|
||||
disposalMeasures: '', // 处置措施(单个值,不再用逗号分隔)
|
||||
expectRecoverTime: '', // 预计恢复时间
|
||||
injuredCount: '', // 受伤人员
|
||||
investedFunds: '', // 已投资金
|
||||
@ -260,14 +261,10 @@ const formData = reactive({
|
||||
fileList: []
|
||||
})
|
||||
|
||||
// 监听处置措施数组变化,转换为逗号分隔的字符串存到 report.disposalMeasures
|
||||
watch(
|
||||
disposalMeasuresArray,
|
||||
(newVal) => {
|
||||
formData.report.disposalMeasures = newVal.join(',')
|
||||
},
|
||||
{ deep: true }
|
||||
)
|
||||
// 监听处置措施单选值变化,直接赋值给 report.disposalMeasures
|
||||
watch(disposalMeasureValue, (newVal) => {
|
||||
formData.report.disposalMeasures = newVal
|
||||
})
|
||||
|
||||
// 监听附件变化,同步到 fileList
|
||||
watch(
|
||||
@ -313,12 +310,12 @@ watch(
|
||||
{ deep: true }
|
||||
)
|
||||
|
||||
// 从 report.disposalMeasures 初始化处置措施数组
|
||||
// 从 report.disposalMeasures 初始化处置措施单选值
|
||||
watch(
|
||||
() => formData.report.disposalMeasures,
|
||||
(newVal) => {
|
||||
if (newVal && typeof newVal === 'string') {
|
||||
disposalMeasuresArray.value = newVal.split(',').filter(Boolean)
|
||||
disposalMeasureValue.value = newVal
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
@ -368,9 +365,9 @@ const initFormData = (newVal) => {
|
||||
fileList: newVal.fileList || []
|
||||
})
|
||||
|
||||
// 初始化处置措施数组
|
||||
// 初始化处置措施单选值(直接赋值,不再需要 split)
|
||||
if (newVal.report?.disposalMeasures) {
|
||||
disposalMeasuresArray.value = newVal.report.disposalMeasures.split(',').filter(Boolean)
|
||||
disposalMeasureValue.value = newVal.report.disposalMeasures
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -480,12 +477,12 @@ defineExpose({
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.measures-options {
|
||||
:deep(.van-checkbox-group) {
|
||||
:deep(.van-radio-group) {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 16px;
|
||||
}
|
||||
:deep(.van-checkbox) {
|
||||
:deep(.van-radio) {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
@ -526,4 +523,4 @@ defineExpose({
|
||||
width: 110px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
@ -5,20 +5,21 @@
|
||||
<CurrentSite />
|
||||
|
||||
<div class="list-panel">
|
||||
<CardItem v-for="(item, index) in list" :key="index" :title="`${item.area} ${item.rNumber} ${item.type}`"
|
||||
<CardItem v-for="(item, index) in list" :key="index" :title="`${item.projectName}`"
|
||||
@click="handleClickItem(item)">
|
||||
<template #headerExtra>
|
||||
<van-tag v-if="item.status === '审批通过'" type="success" plain size="medium">{{ item.status }}</van-tag>
|
||||
<van-tag v-else-if="item.status === '审批驳回'" type="danger" plain size="medium">{{ item.status
|
||||
}}</van-tag>
|
||||
<van-tag v-else type="warning" plain size="medium">{{ item.status }}</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 type="warning" plain size="medium">待审批</van-tag>
|
||||
</template>
|
||||
|
||||
<div class="content">
|
||||
<div class="left-info">
|
||||
<div><span class="label">起止桩号:</span><span class="value">{{ item.stationNumber }}</span></div>
|
||||
<div><span class="label">路况位置:</span><span class="value">{{ item.position }}</span></div>
|
||||
<div><span class="label">提交日期:</span><span class="value">{{ item.publishTime }}</span></div>
|
||||
<div><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 class="right-arrow" @click.stop="handleClickItem(item)">
|
||||
<van-icon name="arrow" />
|
||||
@ -44,6 +45,7 @@ import SearchInput from '@/components/SearchInput.vue'
|
||||
import CurrentSite from '@/components/CurrentSite.vue'
|
||||
import CardItem from '@/components/CardItem.vue'
|
||||
import EmptyBox from '@/components/EmptyBox.vue'
|
||||
import { request } from "../../../../shared/utils/request";
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
@ -52,44 +54,28 @@ onMounted(() => {
|
||||
})
|
||||
|
||||
const getData = async () => {
|
||||
const params = {
|
||||
pageNum: 1,
|
||||
pageSize: 999,
|
||||
}
|
||||
if (searchValue.value) {
|
||||
params.districtName = searchValue.value
|
||||
}
|
||||
const res = await request({
|
||||
url: '/snow-ops-platform/recovery/list',
|
||||
method: 'GET',
|
||||
params
|
||||
})
|
||||
if (res.code === '00000') {
|
||||
list.value = res.data.records
|
||||
}
|
||||
}
|
||||
|
||||
// 搜索关键词
|
||||
const searchValue = ref('')
|
||||
|
||||
// 预警列表数据
|
||||
const list = ref([
|
||||
{
|
||||
id: 1,
|
||||
area: '彭水',
|
||||
rNumber: 'G211',
|
||||
type: '发生水毁道路崩塌恢复重建',
|
||||
stationNumber: 'K1674.16-1678.84',
|
||||
position: '徐家镇村口南分叉路口',
|
||||
publishTime: '2025-05-20',
|
||||
status: '审批通过'
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
area: '巴南',
|
||||
rNumber: 'S303',
|
||||
type: '道路发生边坡坍塌',
|
||||
stationNumber: 'K1674.16-1678.84',
|
||||
position: '徐家镇村口南分叉路口',
|
||||
publishTime: '2025-05-20',
|
||||
status: '审批驳回'
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
area: '彭水',
|
||||
rNumber: 'G211',
|
||||
type: '道路崩塌改造工程',
|
||||
stationNumber: 'K1674.16-1678.84',
|
||||
position: '徐家镇村口南分叉路口',
|
||||
publishTime: '2025-05-20',
|
||||
status: '审批通过'
|
||||
},
|
||||
])
|
||||
const list = ref([])
|
||||
|
||||
|
||||
const handleClickBack = () => {
|
||||
@ -115,6 +101,10 @@ const handleAddDevice = () => {
|
||||
// });
|
||||
}
|
||||
|
||||
watch(() => searchValue.value, () => {
|
||||
getData()
|
||||
})
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
@ -2,34 +2,32 @@
|
||||
<PageContainer title="项目填报" @click-back="handleClickBack">
|
||||
<div class="content">
|
||||
<PanelItem>
|
||||
<van-form label-align="left" colon>
|
||||
<van-field v-model="form.name" label="区县名称" center placeholder="请填写" required
|
||||
<van-form ref="formRef" label-align="left" colon>
|
||||
<van-field v-model="form.project.districtName" label="区县名称" center placeholder="请填写" required
|
||||
:rules="[{ required: true, message: '请填写区县名称' }]" />
|
||||
<van-field v-model="form.name" label="线路编号" center placeholder="请填写" required
|
||||
<van-field v-model="form.project.routeNo" label="线路编号" center placeholder="请填写" required
|
||||
:rules="[{ required: true, message: '请填写线路编号' }]" />
|
||||
<van-field v-model="form.name" label="起点桩号" center placeholder="请填写" required
|
||||
<van-field v-model="form.project.startStakeNo" label="起点桩号" center placeholder="请填写" required
|
||||
:rules="[{ required: true, message: '请填写起点桩号' }]" />
|
||||
<van-field v-model="form.name" label="止点桩号" center placeholder="请填写" required
|
||||
<van-field v-model="form.project.endStakeNo" label="止点桩号" center placeholder="请填写" required
|
||||
:rules="[{ required: true, message: '请填写止点桩号' }]" />
|
||||
<van-field v-model="form.name" label="止点桩号" center placeholder="请填写" required
|
||||
:rules="[{ required: true, message: '请填写止点桩号' }]" />
|
||||
<van-field v-model="form.number" label="实施里程" center placeholder="单位:公里" required type="number"
|
||||
:rules="[{ required: true, message: '请填写实施里程' }]">
|
||||
<van-field v-model="form.project.implementMileage" label="实施里程" center placeholder="单位:公里" required
|
||||
type="number" :rules="[{ required: true, message: '请填写实施里程' }]">
|
||||
<template #extra>
|
||||
公里
|
||||
</template>
|
||||
</van-field>
|
||||
<van-field v-model="form.name" label="塌方及损失" center placeholder="(方/万元)" required
|
||||
<van-field v-model="form.project.earthworkLoss" label="塌方及损失" center placeholder="(方/万元)" required
|
||||
:rules="[{ required: true, message: '请填写塌方及损失' }]" />
|
||||
<van-field v-model="form.name" label="灾害类型" center placeholder="请填写" required
|
||||
<van-field v-model="form.project.disasterType" label="灾害类型" center placeholder="请填写" required
|
||||
:rules="[{ required: true, message: '请填写灾害类型' }]" />
|
||||
<van-field v-model="form.name" label="地点路线" center placeholder="请填写" required
|
||||
<van-field v-model="form.project.locationRoute" label="地点路线" center placeholder="请填写" required
|
||||
:rules="[{ required: true, message: '请填写地点路线' }]" />
|
||||
<van-field v-model="form.name" label="路况位置" center placeholder="请填写" required
|
||||
<van-field v-model="form.project.roadLocation" label="路况位置" center placeholder="请填写" required
|
||||
:rules="[{ required: true, message: '请填写路况位置' }]" />
|
||||
<van-field v-model="form.name" label="阻断点小地名" center placeholder="请填写" required
|
||||
<van-field v-model="form.project.blockedPointName" label="阻断点小地名" center placeholder="请填写" required
|
||||
:rules="[{ required: true, message: '请填写阻断点小地名' }]" />
|
||||
<van-field v-model="form.name" label="恢复重建预估费用" center placeholder="请填写" required
|
||||
<van-field v-model="form.project.estimatedCost" label="恢复重建预估费用" center placeholder="请填写" required
|
||||
:rules="[{ required: true, message: '请填写恢复重建预估费用' }]">
|
||||
<template #extra>
|
||||
万元
|
||||
@ -37,9 +35,8 @@
|
||||
</van-field>
|
||||
<van-field label="附件" center>
|
||||
<template #input>
|
||||
<van-uploader v-model="fileList" @delete="handleDelete" name="photos" :file-list="fileList"
|
||||
:file-type="['image/jpeg', 'image/png']" :after-read="afterRead" multiple
|
||||
:max-count="6" />
|
||||
<van-uploader v-model="fileList" @delete="handleDelete" name="files" :file-list="fileList"
|
||||
accept=".png,.jpg,.mp4" :after-read="afterRead" multiple :max-count="6" />
|
||||
</template>
|
||||
</van-field>
|
||||
</van-form>
|
||||
@ -56,17 +53,34 @@
|
||||
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted, watch } from 'vue'
|
||||
import { ref, onMounted, watch, reactive, toRaw } from 'vue'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import PageContainer from '@/components/PageContainer.vue'
|
||||
import { showToast, showLoadingToast } from "vant";
|
||||
import PanelItem from '@/components/PanelItem.vue'
|
||||
import { request } from "../../../../shared/utils/request";
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
|
||||
const form = ref({})
|
||||
const form = reactive({
|
||||
project: {
|
||||
districtName: null,
|
||||
routeNo: null,
|
||||
startStakeNo: null,
|
||||
endStakeNo: null,
|
||||
implementMileage: null,
|
||||
earthworkLoss: null,
|
||||
disasterType: null,
|
||||
locationRoute: null,
|
||||
roadLocation: null,
|
||||
blockedPointName: null,
|
||||
estimatedCost: null,
|
||||
},
|
||||
fileList: []
|
||||
})
|
||||
const fileList = ref([]);
|
||||
const formRef = ref();
|
||||
|
||||
onMounted(() => {
|
||||
if (route.params.data) {
|
||||
@ -74,7 +88,7 @@ onMounted(() => {
|
||||
console.log('@@@@data', data);
|
||||
// todo 在有传参的时候 调用接口去获取数据 并且初始化表单
|
||||
} else {
|
||||
console.log('无传入数据');
|
||||
// console.log('无传入数据');
|
||||
}
|
||||
})
|
||||
|
||||
@ -89,21 +103,21 @@ const handleClickBack = () => {
|
||||
// 文件删除
|
||||
const handleDelete = (file) => {
|
||||
if (file.serverUrl) {
|
||||
const index = form.photos.findIndex((p) => p.photoUrl === file.serverUrl);
|
||||
const index = form.fileList.findIndex((p) => p.fileUrl === file.serverUrl);
|
||||
if (index !== -1) {
|
||||
form.photos.splice(index, 1);
|
||||
form.fileList.splice(index, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 文件上传
|
||||
const afterRead = async (file) => {
|
||||
const toast = showLoadingToast({
|
||||
message: "上传中...",
|
||||
forbidClick: true,
|
||||
duration: 0, // 设置为0表示不会自动关闭
|
||||
});
|
||||
try {
|
||||
const toast = showLoadingToast({
|
||||
message: "上传中...",
|
||||
forbidClick: true,
|
||||
duration: 0, // 设置为0表示不会自动关闭
|
||||
});
|
||||
const formData = new FormData();
|
||||
formData.append("file", file.file);
|
||||
const res = await request({
|
||||
@ -113,14 +127,23 @@ const afterRead = async (file) => {
|
||||
});
|
||||
toast.close();
|
||||
if (res.code === "00000") {
|
||||
form.photos.push({ photoUrl: res.data });
|
||||
// 根据文件类型设置fileType: 1-图片 2-视频
|
||||
console.log('file', file)
|
||||
let fileTypeValue = 1; // 默认图片
|
||||
if (file.file.type.startsWith('video/')) {
|
||||
fileTypeValue = 2; // 视频
|
||||
}
|
||||
form.fileList.push({
|
||||
fileUrl: res.data,
|
||||
fileType: fileTypeValue,
|
||||
fileName: file.file.name,
|
||||
});
|
||||
const index = fileList.value.findIndex((f) => f.file === file.file);
|
||||
if (index !== -1) {
|
||||
fileList.value[index].serverUrl = res.data;
|
||||
}
|
||||
|
||||
console.log("form.photos", toRaw(form.photos));
|
||||
console.log("fileList.value", fileList.value);
|
||||
// console.log("form.fileList", toRaw(form.fileList));
|
||||
// console.log("fileList.value", fileList.value);
|
||||
} else {
|
||||
throw new Error(res.message);
|
||||
}
|
||||
@ -132,6 +155,45 @@ const afterRead = async (file) => {
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
const handleAdd = async () => {
|
||||
// 先进行表单校验
|
||||
if (!formRef.value) {
|
||||
showToast('表单初始化失败');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const isValid = await formRef.value.validate();
|
||||
// 表单校验通过,继续处理提交逻辑
|
||||
const toast = showLoadingToast({
|
||||
message: "上报中...",
|
||||
forbidClick: true,
|
||||
duration: 0, // 设置为0表示不会自动关闭
|
||||
});
|
||||
console.log('表单校验通过,提交数据:', form);
|
||||
|
||||
const res = await request({
|
||||
url: '/snow-ops-platform/recovery/add',
|
||||
method: 'POST',
|
||||
data: form
|
||||
})
|
||||
toast.close();
|
||||
if(res.code === '00000'){
|
||||
showToast('提交成功');
|
||||
handleClickBack();
|
||||
}else{
|
||||
showToast('提交失败, 请稍后重试或联系管理员');
|
||||
}
|
||||
} catch (error) {
|
||||
// console.log('表单校验失败:', error);
|
||||
showToast('请检查并完善表单信息');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
||||
@ -4,33 +4,38 @@
|
||||
<PanelItem>
|
||||
<div class="detail">
|
||||
<div class="header">
|
||||
<div class="header-title">{{ `${data.area} ${data.rNumber} ${data.type}` }}</div>
|
||||
<div class="header-title">{{ data.projectName }}</div>
|
||||
<div class="header-extra">
|
||||
<van-tag v-if="data.status === '审批通过'" type="success" plain size="medium">{{ data.status
|
||||
}}</van-tag>
|
||||
<van-tag v-else-if="data.status === '审批驳回'" type="danger" plain size="medium">{{ data.status
|
||||
}}</van-tag>
|
||||
<van-tag v-else type="warning" plain size="medium">{{ data.status }}</van-tag>
|
||||
<van-tag v-if="data.approvalStatus === 3 || data.approvalStatus === 1" type="success" plain
|
||||
size="medium">审批通过</van-tag>
|
||||
<van-tag v-else-if="data.approvalStatus === 2 || data.approvalStatus === 4" type="danger"
|
||||
plain size="medium">审批驳回</van-tag>
|
||||
<van-tag v-else type="warning" plain size="medium">待审批</van-tag>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">区县名称: {{ data.area }}</div>
|
||||
<div class="item">线路编号: {{ data.area }}</div>
|
||||
<div class="item">起点桩号: {{ data.area }}</div>
|
||||
<div class="item">止点桩号: {{ data.area }}</div>
|
||||
<div class="item">实施里程: {{ data.area }}</div>
|
||||
<div class="item">塌方及损失: {{ data.area }}</div>
|
||||
<div class="item">灾害类型: {{ data.area }}</div>
|
||||
<div class="item">地点路线: {{ data.area }}</div>
|
||||
<div class="item">阻断点小地名: {{ data.area }}</div>
|
||||
<div class="item">提交时间: {{ data.area }}</div>
|
||||
<div class="item">恢复重建预估费用: {{ data.area }}</div>
|
||||
<div class="item">区县名称: {{ data.districtName }}</div>
|
||||
<div class="item">线路编号: {{ data.routeNo }}</div>
|
||||
<div class="item">起点桩号: {{ data.startStakeNo }}</div>
|
||||
<div class="item">止点桩号: {{ data.endStakeNo }}</div>
|
||||
<div class="item">实施里程: {{ `${data.implementMileage} 公里` }}</div>
|
||||
<div class="item">塌方及损失: {{ data.earthworkLoss }}</div>
|
||||
<div class="item">灾害类型: {{ data.disasterType }}</div>
|
||||
<div class="item">地点路线: {{ data.locationRoute }}</div>
|
||||
<div class="item">阻断点小地名: {{ data.blockedPointName }}</div>
|
||||
<div class="item">提交时间: {{ data.submitTime }}</div>
|
||||
<div class="item">恢复重建预估费用: {{ data.estimatedCost }}</div>
|
||||
</div>
|
||||
</PanelItem>
|
||||
<PanelItem title="附件">
|
||||
<!-- 附件 -->
|
||||
<div class="fileArea">
|
||||
<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>
|
||||
</div>
|
||||
</PanelItem>
|
||||
<PanelItem v-if="data.xxx">
|
||||
<!-- 驳回理由 -->
|
||||
<PanelItem v-if="data.rejectReason">
|
||||
<div class="detail">
|
||||
<div class="item">驳回理由: {{ data.rejectReason }}</div>
|
||||
</div>
|
||||
</PanelItem>
|
||||
</div>
|
||||
|
||||
@ -43,32 +48,50 @@
|
||||
import { ref, onMounted, watch } from 'vue'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import PageContainer from '@/components/PageContainer.vue'
|
||||
import { showToast, showLoadingToast } from "vant";
|
||||
import { showToast, showLoadingToast, showImagePreview } from "vant";
|
||||
import PanelItem from '@/components/PanelItem.vue'
|
||||
import { request } from "../../../../shared/utils/request";
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
|
||||
const data = ref({
|
||||
area: '',
|
||||
rNumber: '',
|
||||
type: '',
|
||||
status: '审批通过',
|
||||
})
|
||||
const data = ref({})
|
||||
|
||||
onMounted(() => {
|
||||
if (route.params.data) {
|
||||
const data = JSON.parse(decodeURIComponent(route.params.data));
|
||||
console.log('@@@@data', data);
|
||||
// todo 在有传参的时候 调用接口去获取数据 并且初始化表单
|
||||
getDetaillData(data)
|
||||
|
||||
} else {
|
||||
console.log('无传入数据');
|
||||
}
|
||||
})
|
||||
|
||||
const getDetaillData = async (id) => {
|
||||
try {
|
||||
const res = await request({
|
||||
url: '/snow-ops-platform/recovery/getById',
|
||||
method: 'GET',
|
||||
params: {
|
||||
id: id
|
||||
}
|
||||
})
|
||||
if (res.code === '00000') {
|
||||
data.value = res.data
|
||||
}
|
||||
} catch (error) {
|
||||
showToast('获取详情失败,请稍后重试')
|
||||
console.log('error', error);
|
||||
}
|
||||
}
|
||||
|
||||
const handleClickBack = () => {
|
||||
router.push('/rebuild')
|
||||
}
|
||||
|
||||
const showImage = (url) => {
|
||||
showImagePreview([url]);
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
@ -101,4 +124,10 @@ const handleClickBack = () => {
|
||||
.item {
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
.fileArea {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: 20px;
|
||||
}
|
||||
</style>
|
||||
|
||||
47
packages/screen/src/component/BlockItem.vue
Normal file
47
packages/screen/src/component/BlockItem.vue
Normal file
@ -0,0 +1,47 @@
|
||||
<template>
|
||||
<div class="block-item">
|
||||
<slot v-if="title" name="header">
|
||||
<div class="header">
|
||||
<div class="header-title">{{ title }}</div>
|
||||
<div class="header-extra" v-if="$slots.headerExtra">
|
||||
<slot name="headerExtra"></slot>
|
||||
</div>
|
||||
</div>
|
||||
</slot>
|
||||
|
||||
<slot />
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { onMounted, ref } from 'vue'
|
||||
|
||||
const props = defineProps({
|
||||
title: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
})
|
||||
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
.block-item {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
|
||||
& + .block-item {
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
.header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
.header-title {
|
||||
font-weight: 500;
|
||||
font-size: 15px;
|
||||
color: #4a4a4a;
|
||||
line-height: 16px;
|
||||
}
|
||||
</style>
|
||||
@ -52,19 +52,6 @@ const route = useRoute()
|
||||
const breadcrumbList = ref([])
|
||||
const currentIndex = ref(0)
|
||||
|
||||
// 路由配置映射表(用于查找父级路由)
|
||||
const routeMap = {
|
||||
'warningManagement': {
|
||||
path: '/warningManagement',
|
||||
name: 'warningManagement',
|
||||
meta: { title: '响应预警' }
|
||||
},
|
||||
'ledgerManagement': {
|
||||
path: '/ledgerManagement',
|
||||
name: 'ledgerManagement',
|
||||
meta: { title: '驻地台账' }
|
||||
}
|
||||
}
|
||||
|
||||
// 生成面包屑数据
|
||||
const generateBreadcrumb = () => {
|
||||
|
||||
@ -163,7 +163,16 @@ const routes = [
|
||||
name: 'DisasterReport',
|
||||
component: () => import('../views/DisasterManagement/DisasterReport/DisasterReport.vue'),
|
||||
meta: {
|
||||
title: '水毁事件填报',
|
||||
title: '灾毁事件填报',
|
||||
breadcrumb: true
|
||||
}
|
||||
},
|
||||
{
|
||||
path: '/waterDisasterDetail',
|
||||
name: 'WaterDisasterDetail',
|
||||
component: () => import('../views/DisasterManagement/DisasterDetail/WaterDisasterDetail.vue'),
|
||||
meta: {
|
||||
title: '水毁事件详情',
|
||||
breadcrumb: true
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,473 @@
|
||||
<template>
|
||||
<div class="water-disaster-pc">
|
||||
<!-- 合并后的单个卡片 -->
|
||||
<el-card class="form-card" shadow="never">
|
||||
<div slot="header" class="card-header">
|
||||
<span>续保信息</span>
|
||||
</div>
|
||||
|
||||
<!-- 所有表单项合并到一个区域,每行一个 -->
|
||||
<el-form :model="formData" label-width="120px" size="small">
|
||||
<!-- 处置措施 -->
|
||||
<el-form-item label="处置措施">
|
||||
<el-radio-group v-model="disposalMeasureValue">
|
||||
<el-radio label="halfClose">半幅封闭</el-radio>
|
||||
<el-radio label="fullClose">全副封闭</el-radio>
|
||||
<el-radio label="bypass">便道通行</el-radio>
|
||||
<el-radio label="normal">正常通行</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 预计恢复时间 -->
|
||||
<el-form-item label="预计恢复时间">
|
||||
<el-date-picker
|
||||
v-model="formData.report.expectRecoverTime"
|
||||
type="datetime"
|
||||
placeholder="请选择时间"
|
||||
value-format="yyyy-MM-dd HH:mm"
|
||||
:picker-options="pickerOptions"
|
||||
style="width: 100%"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 实际恢复时间 -->
|
||||
<el-form-item label="实际恢复时间">
|
||||
<el-date-picker
|
||||
v-model="formData.report.actualRecoverTime"
|
||||
type="datetime"
|
||||
placeholder="请选择时间"
|
||||
value-format="yyyy-MM-dd HH:mm"
|
||||
:picker-options="pickerOptions"
|
||||
style="width: 100%"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 受伤人员 -->
|
||||
<el-form-item label="受伤人员">
|
||||
<el-input-number v-model="formData.report.injuredCount" :min="0" :controls="false" placeholder="请填写" style="width: 300px">
|
||||
<template slot="append">人</template>
|
||||
</el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 死亡人员 -->
|
||||
<el-form-item label="死亡人员">
|
||||
<el-input-number v-model="formData.report.deadCount" :min="0" :controls="false" placeholder="请填写" style="width: 300px">
|
||||
<template slot="append">人</template>
|
||||
</el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 滞留人员 -->
|
||||
<el-form-item label="滞留人员">
|
||||
<el-input-number v-model="formData.report.strandedPersonCount" :min="0" :controls="false" placeholder="请填写" style="width: 300px">
|
||||
<template slot="append">人</template>
|
||||
</el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 损坏车辆 -->
|
||||
<el-form-item label="损坏车辆">
|
||||
<el-input-number v-model="formData.report.damagedVehicleCount" :min="0" :controls="false" placeholder="请填写" style="width: 300px">
|
||||
<template slot="append">辆</template>
|
||||
</el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 滞留车辆 -->
|
||||
<el-form-item label="滞留车辆">
|
||||
<el-input-number v-model="formData.report.strandedVehicleCount" :min="0" :controls="false" placeholder="请填写" style="width: 300px">
|
||||
<template slot="append">辆</template>
|
||||
</el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 损失列表组件 -->
|
||||
<loss-list :col-span="24" v-model="formData.lossList" />
|
||||
|
||||
<!-- 处理情况 -->
|
||||
<el-form-item label="处理情况">
|
||||
<el-input v-model="formData.report.remark" type="textarea" :rows="2" placeholder="请填写(选填)" style="width: 60%" />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 损失总金额 -->
|
||||
<el-form-item label="损失总金额">
|
||||
<el-input v-model="formData.report.totalLossAmount" placeholder="请填写(选填)" style="width: 300px">
|
||||
<template slot="append">万元</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 已投机械 -->
|
||||
<el-form-item label="已投机械">
|
||||
<el-input v-model="formData.report.investedMachinery" placeholder="请填写" style="width: 300px">
|
||||
<template slot="append">台/班</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 已投入力 -->
|
||||
<el-form-item label="已投入力">
|
||||
<el-input-number v-model="formData.report.investedManpower" :min="0" :controls="false" placeholder="请填写" style="width: 300px">
|
||||
<template slot="append">人次</template>
|
||||
</el-input-number>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 已投资金 -->
|
||||
<el-form-item label="已投资金">
|
||||
<el-input v-model="formData.report.investedFunds" placeholder="请填写" style="width: 300px">
|
||||
<template slot="append">万元</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 现场描述 -->
|
||||
<el-form-item label="现场描述">
|
||||
<el-input v-model="formData.report.siteDescription" type="textarea" :rows="2" placeholder="请填写" style="width: 60%" />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 是否需要恢复重建 -->
|
||||
<el-form-item label="是否需要恢复重建">
|
||||
<el-radio-group v-model="formData.event.needsRecovery">
|
||||
<el-radio :label="true">是</el-radio>
|
||||
<el-radio :label="false">否</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleSubmit">追加记录</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, watch, computed } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { request } from '@shared/utils/request'
|
||||
import LossList from '../DisasterReport/LossList.vue'
|
||||
|
||||
// Props 定义
|
||||
const props = defineProps({
|
||||
value: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
|
||||
// Emits 定义
|
||||
const emit = defineEmits(['input', 'change', 'submit'])
|
||||
|
||||
// 表单数据
|
||||
const formData = reactive({
|
||||
occurLocation: '',
|
||||
occurTime: '',
|
||||
roadConditionType: '',
|
||||
routeNo: '',
|
||||
event: {
|
||||
blockedMileage: '',
|
||||
blockedPointName: '',
|
||||
contactPerson: '',
|
||||
contactPhone: '',
|
||||
damageCount: '',
|
||||
district: '',
|
||||
endStakeLat: '',
|
||||
endStakeLng: '',
|
||||
endStakeNo: '',
|
||||
estimatedRecoveryCost: '',
|
||||
inspectionMileage: '',
|
||||
isBlocked: '',
|
||||
needsRecovery: '',
|
||||
repairProgress: '',
|
||||
reporterUnit: '',
|
||||
startStakeLat: '',
|
||||
startStakeLng: '',
|
||||
startStakeNo: ''
|
||||
},
|
||||
report: {
|
||||
actualRecoverTime: '',
|
||||
damagedVehicleCount: '',
|
||||
deadCount: '',
|
||||
disposalMeasures: '',
|
||||
expectRecoverTime: '',
|
||||
injuredCount: '',
|
||||
investedFunds: '',
|
||||
investedMachinery: '',
|
||||
investedManpower: '',
|
||||
remark: '',
|
||||
siteDescription: '',
|
||||
strandedPersonCount: '',
|
||||
strandedVehicleCount: '',
|
||||
totalLossAmount: ''
|
||||
},
|
||||
lossList: [],
|
||||
fileList: []
|
||||
})
|
||||
|
||||
// 处置措施单选值
|
||||
const disposalMeasureValue = ref('')
|
||||
|
||||
// 下拉选项
|
||||
const roadConditionOptions = [
|
||||
{ label: '高速公路', value: '高速公路' },
|
||||
{ label: '国道', value: '国道' },
|
||||
{ label: '省道', value: '省道' },
|
||||
{ label: '县道', value: '县道' },
|
||||
{ label: '乡道', value: '乡道' },
|
||||
{ label: '村道', value: '村道' }
|
||||
]
|
||||
|
||||
const blockedOptions = [
|
||||
{ label: '是', value: true },
|
||||
{ label: '否', value: false }
|
||||
]
|
||||
|
||||
const repairProgressOptions = [
|
||||
{ label: '未抢修', value: '未抢修' },
|
||||
{ label: '抢修中', value: '抢修中' },
|
||||
{ label: '已完成', value: '已完成' }
|
||||
]
|
||||
|
||||
// 日期选择器配置
|
||||
const pickerOptions = {
|
||||
disabledDate(time) {
|
||||
return time.getTime() < new Date(2020, 0, 1) || time.getTime() > new Date(2030, 11, 31)
|
||||
}
|
||||
}
|
||||
|
||||
// 监听处置措施单选值变化
|
||||
watch(disposalMeasureValue, (newVal) => {
|
||||
formData.report.disposalMeasures = newVal
|
||||
})
|
||||
|
||||
// 监听外部传入的值
|
||||
watch(
|
||||
() => props.value,
|
||||
(newVal) => {
|
||||
if (newVal && Object.keys(newVal).length > 0) {
|
||||
initFormData(newVal)
|
||||
}
|
||||
},
|
||||
{ immediate: true, deep: true }
|
||||
)
|
||||
|
||||
// 监听表单数据变化,向外传递
|
||||
watch(
|
||||
() => formData,
|
||||
(newVal) => {
|
||||
emit('input', newVal)
|
||||
emit('change', newVal)
|
||||
},
|
||||
{ deep: true }
|
||||
)
|
||||
|
||||
// 从 report.disposalMeasures 初始化处置措施单选值
|
||||
watch(
|
||||
() => formData.report.disposalMeasures,
|
||||
(newVal) => {
|
||||
if (newVal && typeof newVal === 'string') {
|
||||
disposalMeasureValue.value = newVal
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
|
||||
// 初始化表单数据
|
||||
const initFormData = (data) => {
|
||||
Object.assign(formData, {
|
||||
occurLocation: data.occurLocation || '',
|
||||
occurTime: data.occurTime || '',
|
||||
roadConditionType: data.roadConditionType || '',
|
||||
routeNo: data.routeNo || '',
|
||||
event: { ...formData.event, ...(data.event || {}) },
|
||||
report: { ...formData.report, ...(data.report || {}) },
|
||||
lossList: data.lossList || [],
|
||||
fileList: data.fileList || []
|
||||
})
|
||||
|
||||
if (data.report?.disposalMeasures) {
|
||||
disposalMeasureValue.value = data.report.disposalMeasures
|
||||
}
|
||||
}
|
||||
|
||||
// 校准时间
|
||||
const calibrateTime = () => {
|
||||
const now = new Date()
|
||||
const year = now.getFullYear()
|
||||
const month = String(now.getMonth() + 1).padStart(2, '0')
|
||||
const day = String(now.getDate()).padStart(2, '0')
|
||||
const hours = String(now.getHours()).padStart(2, '0')
|
||||
const minutes = String(now.getMinutes()).padStart(2, '0')
|
||||
formData.occurTime = `${year}-${month}-${day} ${hours}:${minutes}`
|
||||
ElMessage.success('时间已校准为当前时间')
|
||||
}
|
||||
|
||||
// 校准起点经纬度
|
||||
const calibrateStartCoord = () => {
|
||||
formData.event.startStakeLng = '108.41763025'
|
||||
formData.event.startStakeLat = '108.41763025'
|
||||
ElMessage.success('起点经纬度已校准')
|
||||
}
|
||||
|
||||
// 校准止点经纬度
|
||||
const calibrateEndCoord = () => {
|
||||
formData.event.endStakeLng = '108.41763025'
|
||||
formData.event.endStakeLat = '108.41763025'
|
||||
ElMessage.success('止点经纬度已校准')
|
||||
}
|
||||
|
||||
// 表单验证
|
||||
const validate = () => {
|
||||
if (!formData.occurTime) {
|
||||
ElMessage.warning('请填写发生时间')
|
||||
return false
|
||||
}
|
||||
if (!formData.routeNo) {
|
||||
ElMessage.warning('请填写线路编号')
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// 获取表单数据
|
||||
const getFormData = () => {
|
||||
return { ...formData }
|
||||
}
|
||||
|
||||
// 重置表单
|
||||
const resetForm = () => {
|
||||
Object.assign(formData, {
|
||||
occurLocation: '',
|
||||
occurTime: '',
|
||||
roadConditionType: '',
|
||||
routeNo: '',
|
||||
event: {
|
||||
blockedMileage: '',
|
||||
blockedPointName: '',
|
||||
contactPerson: '',
|
||||
contactPhone: '',
|
||||
damageCount: '',
|
||||
district: '',
|
||||
endStakeLat: '',
|
||||
endStakeLng: '',
|
||||
endStakeNo: '',
|
||||
estimatedRecoveryCost: '',
|
||||
inspectionMileage: '',
|
||||
isBlocked: '',
|
||||
needsRecovery: '',
|
||||
repairProgress: '',
|
||||
reporterUnit: '',
|
||||
startStakeLat: '',
|
||||
startStakeLng: '',
|
||||
startStakeNo: ''
|
||||
},
|
||||
report: {
|
||||
actualRecoverTime: '',
|
||||
damagedVehicleCount: '',
|
||||
deadCount: '',
|
||||
disposalMeasures: '',
|
||||
expectRecoverTime: '',
|
||||
injuredCount: '',
|
||||
investedFunds: '',
|
||||
investedMachinery: '',
|
||||
investedManpower: '',
|
||||
remark: '',
|
||||
siteDescription: '',
|
||||
strandedPersonCount: '',
|
||||
strandedVehicleCount: '',
|
||||
totalLossAmount: ''
|
||||
},
|
||||
lossList: [],
|
||||
fileList: []
|
||||
})
|
||||
disposalMeasureValue.value = ''
|
||||
}
|
||||
|
||||
// 提交方法
|
||||
const submit = () => {
|
||||
if (validate()) {
|
||||
emit('submit', getFormData())
|
||||
}
|
||||
}
|
||||
|
||||
const handleSubmit = async () => {
|
||||
// 验证表单
|
||||
if (!validate()) {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
// 获取表单数据
|
||||
|
||||
// 添加事件类型和站点信息
|
||||
const submitData = {
|
||||
...formData
|
||||
// 可以在这里添加站点信息等其他数据
|
||||
}
|
||||
|
||||
const res = await request({
|
||||
url: '/snow-ops-platform/water-damage/addOrUpdate',
|
||||
method: 'post',
|
||||
data: submitData
|
||||
})
|
||||
|
||||
if (res?.code === '00000') {
|
||||
ElMessage.success('提交成功')
|
||||
|
||||
emit("refresh")
|
||||
} else {
|
||||
ElMessage.error(res.message)
|
||||
}
|
||||
} catch (error) {
|
||||
ElMessage.error('提交失败,请重试')
|
||||
console.error('提交失败:', error)
|
||||
} finally {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
validate,
|
||||
initFormData,
|
||||
getFormData,
|
||||
resetForm,
|
||||
calibrateTime,
|
||||
calibrateStartCoord,
|
||||
calibrateEndCoord
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.water-disaster-pc {
|
||||
background-color: #f5f7fa;
|
||||
height: 100%;
|
||||
|
||||
.form-card {
|
||||
border-radius: 8px;
|
||||
|
||||
.card-header {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #303133;
|
||||
border-left: 4px solid #409eff;
|
||||
padding-left: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
margin-bottom: 22px;
|
||||
}
|
||||
|
||||
::v-deep .el-input-group__append {
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-input-number {
|
||||
width: 300px;
|
||||
|
||||
.el-input-group__append {
|
||||
padding: 0 10px;
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep .el-radio-group {
|
||||
.el-radio {
|
||||
margin-right: 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -0,0 +1,618 @@
|
||||
<template>
|
||||
<div class="web-detail-container">
|
||||
<!-- 页面头部 -->
|
||||
<div class="page-header">
|
||||
<div class="header-left">
|
||||
<el-button :icon="ArrowLeft" @click="handleClickBack">返回</el-button>
|
||||
<h2 class="page-title">灾毁详情</h2>
|
||||
</div>
|
||||
<div class="header-right">
|
||||
<el-tag :type="getEventStatusType()" size="large">
|
||||
{{ getEventStatusText() }}
|
||||
</el-tag>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content-container">
|
||||
<div class="left-panel">
|
||||
<!-- 基本信息卡片 -->
|
||||
<el-card class="info-card" shadow="never">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span class="card-title">基本信息</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<el-row :gutter="20" class="info-row">
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">事件类型:</span>
|
||||
<span class="info-value">水毁事件</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">路况类别:</span>
|
||||
<span class="info-value">{{ detailData.roadConditionType || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">是否阻断:</span>
|
||||
<span class="info-value">{{ detailData.event?.isBlocked ? '是' : '否' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="20" class="info-row">
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">抢修进度:</span>
|
||||
<span class="info-value">{{ detailData.event?.repairProgress || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">水毁处数:</span>
|
||||
<span class="info-value">{{ detailData.event?.damageCount || 0 }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">阻断里程:</span>
|
||||
<span class="info-value">{{ detailData.event?.blockedMileage ? detailData.event.blockedMileage + '公里' : '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="20" class="info-row">
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">发生时间:</span>
|
||||
<span class="info-value">{{ detailData.occurTime || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">线路编号:</span>
|
||||
<span class="info-value">{{ detailData.routeNo || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">地点路线:</span>
|
||||
<span class="info-value">{{ detailData.occurLocation || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="20" class="info-row">
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">起点桩号:</span>
|
||||
<span class="info-value">{{ detailData.event?.startStakeNo || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">起点桩经度:</span>
|
||||
<span class="info-value">{{ detailData.event?.startStakeLng || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">起点桩纬度:</span>
|
||||
<span class="info-value">{{ detailData.event?.startStakeLat || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="20" class="info-row">
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">止点桩号:</span>
|
||||
<span class="info-value">{{ detailData.event?.endStakeNo || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">止点桩经度:</span>
|
||||
<span class="info-value">{{ detailData.event?.endStakeLng || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">止点桩纬度:</span>
|
||||
<span class="info-value">{{ detailData.event?.endStakeLat || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="20" class="info-row">
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">路况位置:</span>
|
||||
<span class="info-value">{{ detailData.event?.blockedPointName || detailData.occurLocation || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">阻断点小地名:</span>
|
||||
<span class="info-value">{{ detailData.event?.blockedPointName || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">上报区县:</span>
|
||||
<span class="info-value">{{ detailData.event?.district || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="20" class="info-row">
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">巡查里程:</span>
|
||||
<span class="info-value">{{ detailData.event?.inspectionMileage ? detailData.event.inspectionMileage + '公里' : '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">是否恢复重建:</span>
|
||||
<span class="info-value">{{ detailData.event?.needsRecovery ? '是' : '否' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">恢复重建预估费用:</span>
|
||||
<span class="info-value">{{ detailData.event?.estimatedRecoveryCost ? detailData.event.estimatedRecoveryCost + '万元' : '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="20" class="info-row">
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">联系人:</span>
|
||||
<span class="info-value">{{ detailData.event?.contactPerson || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">联系电话:</span>
|
||||
<span class="info-value">{{ detailData.event?.contactPhone || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="info-item">
|
||||
<span class="info-label">填报单位:</span>
|
||||
<span class="info-value">{{ detailData.event?.reporterUnit || '-' }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-card>
|
||||
|
||||
<!-- 填报信息卡片 -->
|
||||
<el-card class="info-card" shadow="never">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span class="card-title">填报信息</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div v-if="hasReportData">
|
||||
<div v-for="(report, index) in allReports" :key="index" class="report-section">
|
||||
<div class="report-header">
|
||||
<span class="report-title">{{ report?.title }}</span>
|
||||
<span class="report-meta">{{ report.reporterName || '-' }} {{ report.reportTime || '-' }}</span>
|
||||
</div>
|
||||
|
||||
<div class="info-list">
|
||||
<div class="info-item">
|
||||
<span class="info-label">处置情况:</span>
|
||||
<span class="info-value">{{ formatDisposalMeasures(report.disposalMeasures) || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">塌方及损失:</span>
|
||||
<span class="info-value">{{ getLossDescription(report) }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">路产损失:</span>
|
||||
<span class="info-value">{{ report.totalLossAmount ? report.totalLossAmount + '万元' : '-' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">有无车辆滞留:</span>
|
||||
<span class="info-value">{{ getVehicleStrandedText(report) }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">滞留车辆:</span>
|
||||
<span class="info-value">{{ report.strandedVehicleCount || 0 }}辆</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">预计恢复时间:</span>
|
||||
<span class="info-value">{{ report.expectRecoverTime || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">实际恢复时间:</span>
|
||||
<span class="info-value">{{ report.actualRecoverTime || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">现场描述:</span>
|
||||
<span class="info-value">{{ report.siteDescription || '-' }}</span>
|
||||
</div>
|
||||
|
||||
<!-- 附件 -->
|
||||
<div v-if="report.fileList && report.fileList.length > 0" class="info-item attachment-item">
|
||||
<span class="info-label">附件:</span>
|
||||
<div class="attachment-list">
|
||||
<el-link v-for="(file, fileIndex) in report.fileList" :key="fileIndex" :underline="false" @click="previewFile(file)" class="attachment-link">
|
||||
<el-icon><Picture v-if="file.fileType === 1" /><VideoCamera v-else /></el-icon>
|
||||
<span class="file-name">{{ file.fileName }}</span>
|
||||
</el-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<el-empty v-else description="暂无填报信息" :image-size="100" />
|
||||
</el-card>
|
||||
|
||||
<!-- 底部按钮 -->
|
||||
<!-- <div class="footer-buttons">
|
||||
<el-button type="primary" size="large" @click="handleContinueReport" class="footer-btn"> 续报 </el-button>
|
||||
</div> -->
|
||||
</div>
|
||||
<div class="right-panel" v-if="isEdit">
|
||||
<ContinueReport ref="continueReport" @refresh="getDisasterDetail" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { onMounted, ref, computed } from 'vue'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { ArrowLeft, Picture, VideoCamera } from '@element-plus/icons-vue'
|
||||
import ContinueReport from './ContinueReport.vue'
|
||||
import { request } from '@shared/utils/request'
|
||||
import mockData from '../DisasterReport/waterMockJson.json'
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
|
||||
// 详情数据
|
||||
const detailData = ref({
|
||||
event: null,
|
||||
report: [],
|
||||
fileList: [],
|
||||
lossList: [],
|
||||
occurLocation: '',
|
||||
occurTime: '',
|
||||
roadConditionType: '',
|
||||
routeNo: ''
|
||||
})
|
||||
|
||||
// 事件状态
|
||||
const eventStatus = ref(0)
|
||||
|
||||
// 是否为编辑
|
||||
const isEdit = computed(() => {
|
||||
return route.query.mode === 'edit'
|
||||
})
|
||||
|
||||
const continueReport = ref(null)
|
||||
|
||||
// 所有填报记录(首报 + 续报)
|
||||
const allReports = computed(() => {
|
||||
const reports =
|
||||
detailData.value.report?.map((item, index) => {
|
||||
item.title = index === 0 ? '首报' : '续报' + index
|
||||
return item
|
||||
}) || []
|
||||
return reports.reverse()
|
||||
})
|
||||
|
||||
// 是否有填报数据
|
||||
const hasReportData = computed(() => {
|
||||
return allReports.value.length > 0
|
||||
})
|
||||
|
||||
// 获取事件状态文本
|
||||
const getEventStatusText = () => {
|
||||
return eventStatus.value === 1 ? '已解除' : '未解除'
|
||||
}
|
||||
|
||||
// 获取事件状态类型
|
||||
const getEventStatusType = () => {
|
||||
return eventStatus.value === 1 ? 'success' : 'danger'
|
||||
}
|
||||
|
||||
// 格式化处置措施
|
||||
const formatDisposalMeasures = (measures) => {
|
||||
if (!measures) return ''
|
||||
const measureMap = {
|
||||
halfClose: '半幅封闭',
|
||||
fullClose: '全副封闭',
|
||||
bypass: '便道通行',
|
||||
normal: '正常通行'
|
||||
}
|
||||
return measures
|
||||
.split(',')
|
||||
.map((m) => measureMap[m.trim()] || m.trim())
|
||||
.join('、')
|
||||
}
|
||||
|
||||
// 获取损失描述
|
||||
const getLossDescription = (report) => {
|
||||
const lossList = report?.lossList
|
||||
if (!lossList || lossList.length === 0) return '-'
|
||||
|
||||
const totalVolume = lossList.reduce((sum, loss) => {
|
||||
const volume = (loss.length || 0) * (loss.width || 0) * (loss.height || 0)
|
||||
return sum + volume
|
||||
}, 0)
|
||||
|
||||
const totalAmount = lossList.reduce((sum, loss) => sum + (loss.totalAmount || 0), 0)
|
||||
|
||||
return `${totalVolume}方,共损失${totalAmount}万元`
|
||||
}
|
||||
|
||||
// 获取车辆滞留文本
|
||||
const getVehicleStrandedText = (report) => {
|
||||
const count = report?.strandedVehicleCount || 0
|
||||
return count > 0 ? `有车滞留,共${count}辆` : '无车滞留'
|
||||
}
|
||||
|
||||
// 获取灾毁详情
|
||||
const getDisasterDetail = async () => {
|
||||
const id = route.query.id
|
||||
if (!id) {
|
||||
ElMessage.warning('缺少灾毁ID')
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await request({
|
||||
url: `/snow-ops-platform/water-damage/getById`,
|
||||
method: 'get',
|
||||
params: { id }
|
||||
})
|
||||
|
||||
if (result?.data) {
|
||||
const data = result.data
|
||||
detailData.value = {
|
||||
event: data.event || null,
|
||||
report: data.report || [],
|
||||
fileList: data.fileList || [],
|
||||
lossList: data.lossList || [],
|
||||
occurLocation: data.occurLocation || '',
|
||||
occurTime: data.occurTime || '',
|
||||
roadConditionType: data.roadConditionType || '',
|
||||
routeNo: data.routeNo || ''
|
||||
}
|
||||
eventStatus.value = data.eventStatus || 0
|
||||
|
||||
if (isEdit.value) {
|
||||
const newFormData = {
|
||||
...data,
|
||||
lossList: null,
|
||||
report: mockData.report,
|
||||
fileList: null
|
||||
}
|
||||
continueReport.value?.initFormData(newFormData)
|
||||
}
|
||||
} else {
|
||||
ElMessage.warning(result.message || '获取详情失败')
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取灾毁详情失败:', error)
|
||||
ElMessage.error('获取详情失败,请稍后重试')
|
||||
}
|
||||
}
|
||||
|
||||
// 点击返回
|
||||
const handleClickBack = () => {
|
||||
router.push('/disasterManagement')
|
||||
}
|
||||
|
||||
// 续报
|
||||
const handleContinueReport = () => {
|
||||
router.push({
|
||||
path: '/disasterReport',
|
||||
query: {
|
||||
id: route.query.id,
|
||||
eventId: detailData.value.event?.id,
|
||||
isContinue: 'true'
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 预览附件
|
||||
const previewFile = (file) => {
|
||||
if (file.fileUrl) {
|
||||
window.open(file.fileUrl, '_blank')
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getDisasterDetail()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.web-detail-container {
|
||||
padding: 20px;
|
||||
background: #f5f7fa;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
padding-bottom: 100px;
|
||||
}
|
||||
|
||||
.page-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 20px;
|
||||
padding: 0 20px;
|
||||
|
||||
.header-left {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
|
||||
.page-title {
|
||||
margin: 0;
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
color: #303133;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.info-card {
|
||||
margin-bottom: 20px;
|
||||
border-radius: 8px;
|
||||
|
||||
:deep(.el-card__header) {
|
||||
padding: 16px 20px;
|
||||
border-bottom: 1px solid #ebeef5;
|
||||
background: #fafafa;
|
||||
}
|
||||
|
||||
.card-header {
|
||||
.card-title {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #303133;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.info-row {
|
||||
margin-bottom: 16px;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.info-item {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
line-height: 1.5;
|
||||
|
||||
.info-label {
|
||||
width: 120px;
|
||||
flex-shrink: 0;
|
||||
color: #909399;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.info-value {
|
||||
flex: 1;
|
||||
color: #606266;
|
||||
font-size: 14px;
|
||||
word-break: break-all;
|
||||
}
|
||||
}
|
||||
|
||||
.report-section {
|
||||
margin-bottom: 32px;
|
||||
padding-bottom: 24px;
|
||||
border-bottom: 1px solid #ebeef5;
|
||||
|
||||
&:last-child {
|
||||
border-bottom: none;
|
||||
margin-bottom: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.report-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: baseline;
|
||||
margin-bottom: 20px;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 1px dashed #dcdfe6;
|
||||
|
||||
.report-title {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #409eff;
|
||||
}
|
||||
|
||||
.report-meta {
|
||||
font-size: 13px;
|
||||
color: #909399;
|
||||
}
|
||||
}
|
||||
|
||||
.attachment-wrapper {
|
||||
margin-top: 12px;
|
||||
padding-top: 8px;
|
||||
border-top: 1px dashed #ebeef5;
|
||||
|
||||
.attachment-item {
|
||||
.attachment-list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 16px;
|
||||
|
||||
.attachment-link {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 6px 12px;
|
||||
background: #f5f7fa;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
background: #ecf5ff;
|
||||
color: #409eff;
|
||||
}
|
||||
|
||||
.file-name {
|
||||
font-size: 13px;
|
||||
max-width: 200px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.footer-buttons {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 16px 24px;
|
||||
background: #fff;
|
||||
box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.08);
|
||||
z-index: 100;
|
||||
|
||||
.footer-btn {
|
||||
width: 200px;
|
||||
height: 44px;
|
||||
font-size: 16px;
|
||||
border-radius: 22px;
|
||||
}
|
||||
}
|
||||
.content-container {
|
||||
display: flex;
|
||||
.left-panel {
|
||||
flex: 1;
|
||||
margin-right: 10px;
|
||||
}
|
||||
.right-panel {
|
||||
width: 400px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -90,9 +90,9 @@
|
||||
<el-table-column prop="routeNo" label="所属区县" min-width="120" />
|
||||
<el-table-column prop="routeNo" label="路线编号" min-width="120" />
|
||||
<el-table-column prop="routeName" label="路线名称" min-width="150" show-overflow-tooltip />
|
||||
<el-table-column prop="startPile" label="起点桩号" min-width="110" />
|
||||
<el-table-column prop="endPile" label="终点桩号" min-width="110" />
|
||||
<el-table-column prop="occurLocation" label="发生地点" min-width="180" show-overflow-tooltip />
|
||||
<el-table-column prop="startPile" label="起点桩号" min-width="110" show-overflow-tooltip />
|
||||
<el-table-column prop="endPile" label="终点桩号" min-width="110" show-overflow-tooltip />
|
||||
<el-table-column prop="roadConditionLocation" label="路况位置" min-width="150" show-overflow-tooltip />
|
||||
<el-table-column prop="isBlocked" label="是否阻断" width="90" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.isBlocked === '是' ? 'danger' : 'success'" size="small">
|
||||
@ -100,8 +100,8 @@
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="disasterType" label="灾害类型" min-width="120" />
|
||||
<el-table-column prop="roadConditionType" label="路线类别" min-width="110" />
|
||||
<el-table-column prop="disasterType" label="事件类型" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column prop="roadConditionType" label="路况类别" min-width="110" show-overflow-tooltip />
|
||||
<el-table-column prop="eventStatus" label="事件状态" width="100" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.eventStatus === 1 ? 'success' : 'danger'" size="small">
|
||||
@ -109,8 +109,8 @@
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="measure" label="处理措施" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column prop="occurTime" label="发生时间" width="170" />
|
||||
<el-table-column prop="measure" label="处理措施" min-width="150" show-overflow-tooltip />
|
||||
<el-table-column prop="occurTime" label="发现时间" width="170" />
|
||||
<el-table-column prop="expectRecoverTime" label="预计恢复时间" width="170" />
|
||||
<el-table-column prop="contactPerson" label="联系人" width="110" />
|
||||
<el-table-column prop="contactPhone" label="联系电话" width="120" />
|
||||
@ -298,12 +298,12 @@ const resetFilters = () => {
|
||||
|
||||
// 查看详情
|
||||
const handleDetail = (row) => {
|
||||
router.push({ path: '/disasterDetail', query: { id: row.id } })
|
||||
router.push({ path: '/waterDisasterDetail', query: { id: row.id } })
|
||||
}
|
||||
|
||||
// 编辑
|
||||
const handleEdit = (row) => {
|
||||
router.push({ path: '/disasterReport', query: { id: row.id, mode: 'edit' } })
|
||||
router.push({ path: '/waterDisasterDetail', query: { id: row.id, mode: 'edit' } })
|
||||
}
|
||||
|
||||
// 新增跳转
|
||||
@ -400,4 +400,4 @@ onMounted(() => {
|
||||
border-top: 1px solid #ebeef5;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
@ -0,0 +1,148 @@
|
||||
<template>
|
||||
<el-row class="loss-list-pc" :gutter="24">
|
||||
<el-col :span="colSpan" v-for="(item, index) in configs" :key="index">
|
||||
<el-form-item :label="item.lossTypeName">
|
||||
<el-input :modelValue="getValue(item)" @update:modelValue="(event) => changeValue(item, event)">
|
||||
<template #suffix>
|
||||
<span>{{ item.unit }}</span>
|
||||
</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed, onMounted, watch } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { Delete, Plus } from '@element-plus/icons-vue'
|
||||
import { request } from '@shared/utils/request'
|
||||
|
||||
const emit = defineEmits(['update:modelValue'])
|
||||
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
},
|
||||
colSpan: {
|
||||
type: Number,
|
||||
default: 8
|
||||
}
|
||||
})
|
||||
|
||||
const getValue = (config) => {
|
||||
const value = props.modelValue.find((v) => v.lossTypeId === config.lossTypeId)
|
||||
if (value == null) props.modelValue.push({ ...config })
|
||||
return value?.totalAmount || 0
|
||||
}
|
||||
|
||||
const configs = ref([])
|
||||
|
||||
// 获取损失类型字典
|
||||
const getLossDict = async () => {
|
||||
try {
|
||||
const res = await request({
|
||||
url: '/snow-ops-platform/water-damage/loss/typeAndInfo',
|
||||
method: 'get'
|
||||
})
|
||||
configs.value = res.data?.records
|
||||
} catch (error) {
|
||||
console.error('获取损失类型失败:', error)
|
||||
ElMessage.error('获取损失类型失败')
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
await getLossDict()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.loss-list-pc {
|
||||
width: 100%;
|
||||
|
||||
.loss-table {
|
||||
margin-bottom: 16px;
|
||||
|
||||
:deep(.el-table) {
|
||||
.amount-cell {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
|
||||
.unit-text {
|
||||
color: #909399;
|
||||
font-size: 14px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.add-button-wrapper {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.calculate-form {
|
||||
padding: 8px 0;
|
||||
|
||||
:deep(.el-form-item) {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.calculation-preview {
|
||||
background-color: #f5f7fa;
|
||||
border-radius: 8px;
|
||||
padding: 16px;
|
||||
margin-top: 16px;
|
||||
|
||||
.preview-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.preview-label {
|
||||
color: #606266;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.preview-value {
|
||||
color: #f56c6c;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.loss-picker-content {
|
||||
max-height: 400px;
|
||||
overflow-y: auto;
|
||||
padding: 8px 0;
|
||||
|
||||
.loss-radio-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
width: 100%;
|
||||
|
||||
.loss-radio-item {
|
||||
margin: 0;
|
||||
padding: 10px 12px;
|
||||
border-radius: 6px;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
|
||||
:deep(.el-radio__label) {
|
||||
width: calc(100% - 22px);
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,45 @@
|
||||
{
|
||||
"occurLocation": "G108国道 K2250+300处",
|
||||
"occurTime": "2024-07-15 14:30:00",
|
||||
"roadConditionType": "国道",
|
||||
"routeNo": "G108",
|
||||
"event": {
|
||||
"blockedMileage": 1.5,
|
||||
"blockedPointName": "磨盘山隧道口",
|
||||
"contactPerson": "张明",
|
||||
"contactPhone": "13812345678",
|
||||
"damageCount": 3,
|
||||
"district": "武侯区",
|
||||
"endStakeLat": "30.658712",
|
||||
"endStakeLng": "104.082356",
|
||||
"endStakeNo": "K2251+200",
|
||||
"estimatedRecoveryCost": 120.5,
|
||||
"inspectionMileage": 25.6,
|
||||
"isBlocked": true,
|
||||
"needsRecovery": true,
|
||||
"repairProgress": "抢修中",
|
||||
"reporterUnit": "武侯区交通运输局",
|
||||
"startStakeLat": "30.652145",
|
||||
"startStakeLng": "104.075632",
|
||||
"startStakeNo": "K2250+300"
|
||||
},
|
||||
"report": {
|
||||
"damagedVehicleCount": 2,
|
||||
"strandedPersonCount": 12,
|
||||
"deadCount": 0,
|
||||
"strandedVehicleCount": 12,
|
||||
"disposalMeasures": "halfClose,bypass",
|
||||
"actualRecoverTime": "2024-07-17 12:00:00",
|
||||
"expectRecoverTime": "2024-07-18 18:00:00",
|
||||
"injuredCount": 1,
|
||||
"investedFunds": 35.8,
|
||||
"investedMachinery": 6,
|
||||
"investedManpower": 45,
|
||||
"remark": "已组织抢险队伍进行抢通,便道已修建完成",
|
||||
"siteDescription": "因持续强降雨导致山体滑坡,掩埋路面约50米,边坡垮塌严重",
|
||||
"totalLossAmount": 85.6
|
||||
},
|
||||
"lossList": [
|
||||
],
|
||||
"fileList": []
|
||||
}
|
||||
@ -1,451 +0,0 @@
|
||||
<template>
|
||||
<div class="detail-container">
|
||||
<el-form ref="formRef" :model="form" label-position="right" label-width="150px"
|
||||
style="max-height: 60vh; overflow-y: auto; padding-right: 50px" :rules="rules" :disabled="disabled">
|
||||
<el-row style="margin: 20px 20px;">
|
||||
<h4>基本信息</h4>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="区县名称" prop="区县名称">
|
||||
<el-input v-model="form.project.districtName"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="路线编码" prop="路线编码">
|
||||
<el-input v-model="form.project.routeNo"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="实施里程(公里)" prop="实施里程">
|
||||
<el-input-number v-model="form.project.implementMileage" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="路线名称" prop="路线名称">
|
||||
<el-input v-model="form.project.routeName"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="起点桩号" prop="起点桩号">
|
||||
<el-input v-model="form.project.startStakeNo"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="止点桩号" prop="止点桩号">
|
||||
<el-input v-model="form.project.endStakeNo"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="总投资(万元)" prop="总投资">
|
||||
<el-input-number v-model="form.project.totalInvestment" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="预估费用(万元)" prop="预估费用">
|
||||
<el-input-number v-model="form.project.estimatedCost" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="技术等级" prop="技术等级">
|
||||
<el-select v-model="form.project.technicalGrade">
|
||||
<el-option
|
||||
v-for="item in [{ value: '三级', label: '三级' }, { value: '二级', label: '二级' }, { value: '一级', label: '一级' }]"
|
||||
:key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="资金来源" prop="资金来源">
|
||||
<el-input v-model="form.project.fundingSource"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="处置灾毁处数" prop="处置灾毁处数">
|
||||
<el-input-number v-model="form.project.disposalCount" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="已完工处数" prop="已完工处数">
|
||||
<el-input-number v-model="form.project.completedCount" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="项目费用类型" prop="项目费用类型">
|
||||
<el-radio-group v-model="form.project.projectExpenseType">
|
||||
<el-radio value="自费重修">自费重修</el-radio>
|
||||
<el-radio value="申报重修">申报重修</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row style="margin: 20px 20px;">
|
||||
<h4>实施情况</h4>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="主要建设内容" prop="主要建设内容">
|
||||
<el-input v-model="form.project.mainConstructionContent" type="textarea"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="开工或预计开工时间" prop="开工或预计开工时间">
|
||||
<el-date-picker type="date" v-model="form.project.startTime" format="YYYY/MM/DD"
|
||||
value-format="YYYY-MM-DD"></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="完工或预计完工时间" prop="完工或预计完工时间">
|
||||
<el-date-picker type="date" v-model="form.project.endTime" format="YYYY/MM/DD"
|
||||
value-format="YYYY-MM-DD"></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="是否在部交通统计报表管理系统报送投资" prop="是否在部交通统计报表管理系统报送投资" label-width="300px">
|
||||
<el-radio-group v-model="form.project.isReportedToMinistry">
|
||||
<el-radio value="1">是</el-radio>
|
||||
<el-radio value="0">否</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="已报送投资额" prop="已报送投资额" label-width="160px">
|
||||
<el-input-number v-model="form.project.reportedInvestment" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="建设单位名称" prop="建设单位名称">
|
||||
<el-input v-model="form.project.constructionUnit"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="建设单位联系人" prop="建设单位联系人">
|
||||
<el-input v-model="form.project.constructionUnitContact"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="建设单位联系电话" prop="建设单位联系电话">
|
||||
<el-input v-model="form.project.constructionUnitPhone"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="施工单位名称" prop="施工单位名称">
|
||||
<el-input v-model="form.project.executionUnit"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="施工单位联系人" prop="施工单位联系人">
|
||||
<el-input v-model="form.project.executionUnitContact"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="施工单位联系电话" prop="施工单位联系电话">
|
||||
<el-input v-model="form.project.executionUnitPhone"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="设计单位名称" prop="设计单位名称">
|
||||
<el-input v-model="form.project.designUnit"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="设计单位联系人" prop="设计单位联系人">
|
||||
<el-input v-model="form.project.designUnitContact"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="设计单位联系电话" prop="设计单位联系电话">
|
||||
<el-input v-model="form.project.designUnitPhone"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="监理单位名称" prop="监理单位名称">
|
||||
<el-input v-model="form.project.supervisionUnit"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="监理单位联系人" prop="监理单位联系人">
|
||||
<el-input v-model="form.project.supervisionUnitContact"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="监理单位联系电话" prop="监理单位联系电话">
|
||||
<el-input v-model="form.project.supervisionUnitPhone"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="施工图批复时间" prop="施工图批复时间">
|
||||
<el-date-picker type="date" v-model="form.project.designApprovalTime" format="YYYY/MM/DD"
|
||||
value-format="YYYY-MM-DD"></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="施工图批复文件" prop="施工图批复文件">
|
||||
<el-input v-model="form.project.xxx"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="施工合同时间" prop="施工合同时间">
|
||||
<el-date-picker type="date" v-model="form.project.contractTime" format="YYYY/MM/DD"
|
||||
value-format="YYYY-MM-DD"></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="施工合同金额" prop="施工合同金额">
|
||||
<el-input-number v-model="form.project.contractAmount" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="施工合同" prop="施工合同">
|
||||
<el-input v-model="form.project.xxxx"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="建设完成投资" prop="建设完成投资">
|
||||
<el-input-number v-model="form.project.completedInvestment" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="交竣工验收时间" prop="交竣工验收时间">
|
||||
<el-date-picker type="date" v-model="form.project.acceptanceTime" format="YYYY/MM/DD"
|
||||
value-format="YYYY-MM-DD"></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="交竣工证书" prop="交竣工证书">
|
||||
<el-input v-model="form.project.xxxx"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="其他佐证文件" prop="其他佐证文件">
|
||||
<el-input v-model="form.project.xxxx"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="完工项目上传" prop="完工项目上传">
|
||||
<el-input v-model="form.project.xxxx"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted, watch, computed } from "vue";
|
||||
import { request } from "@/utils/request";
|
||||
const formRef = ref(null);
|
||||
defineExpose({ formRef });
|
||||
|
||||
const props = defineProps({
|
||||
form: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
}
|
||||
});
|
||||
const sfjwd = ref("是");
|
||||
const qx = ref("");
|
||||
const loading = ref(false);
|
||||
const selectOptions = ref([]);
|
||||
const qxList = ref([]);
|
||||
|
||||
// 根据用户信息 查询角色列表
|
||||
const getUserList = async (key) => {
|
||||
try {
|
||||
const keyword = key;
|
||||
let url = "";
|
||||
if (keyword) {
|
||||
url = `/snow-ops-platform/yhzry/getUserByKey?key=${keyword}`;
|
||||
} else {
|
||||
url = `/snow-ops-platform/yhzry/getUserByKey?key=`;
|
||||
}
|
||||
const res = await request({
|
||||
url: url,
|
||||
method: "GET",
|
||||
});
|
||||
if (res.code === "00000") {
|
||||
return res.data;
|
||||
} else {
|
||||
throw new Error(res.message);
|
||||
}
|
||||
} catch (error) {
|
||||
ElMessage.error(error.message);
|
||||
console.log(error);
|
||||
}
|
||||
};
|
||||
|
||||
// 选择人员筛选
|
||||
const remoteMethod = async (query) => {
|
||||
if (query === "") {
|
||||
selectOptions.value = [];
|
||||
return [];
|
||||
}
|
||||
loading.value = true;
|
||||
const res = await getUserList(query);
|
||||
if (res) {
|
||||
selectOptions.value = res;
|
||||
}
|
||||
loading.value = false;
|
||||
};
|
||||
|
||||
// 根据区县名称 查询区县列表
|
||||
const getQxList = async (key) => {
|
||||
try {
|
||||
const keyword = key;
|
||||
let url = "";
|
||||
if (keyword) {
|
||||
url = `/snow-ops-platform/district/listDistricts?qxmc=${keyword}`;
|
||||
} else {
|
||||
url = `/snow-ops-platform/district/listDistricts?qxmc=`;
|
||||
}
|
||||
const res = await request({
|
||||
url: url,
|
||||
method: "GET",
|
||||
});
|
||||
if (res.code === "00000") {
|
||||
return res.data;
|
||||
} else {
|
||||
throw new Error(res.message);
|
||||
}
|
||||
} catch (error) { }
|
||||
};
|
||||
|
||||
// 选择区县筛选
|
||||
const remoteMethod_qx = async (query) => {
|
||||
loading.value = true;
|
||||
const res = await getQxList(query);
|
||||
if (res) {
|
||||
qxList.value = res;
|
||||
}
|
||||
loading.value = false;
|
||||
};
|
||||
|
||||
// 选择区县
|
||||
const handleSelect_qx = (value) => {
|
||||
props.form.qxmc = value;
|
||||
};
|
||||
|
||||
// 选择人员
|
||||
const handleSelect = (value) => {
|
||||
console.log("value", value);
|
||||
props.form.fzrXm = value.realName;
|
||||
props.form.fzrSjhm = value.phone;
|
||||
props.form.fzrUserId = value.userId;
|
||||
};
|
||||
|
||||
const rules = computed(() => {
|
||||
return {
|
||||
mc: [
|
||||
{
|
||||
required: true,
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.mc) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请输入服务站名称"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
qxmc: [
|
||||
{
|
||||
required: true,
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.qxmc) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请选择所属区县"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
fzr: [
|
||||
{
|
||||
required: true,
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.fzrUserId && props.form.fzrXm && props.form.fzrSjhm) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请选择负责人"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
jd: [
|
||||
{
|
||||
required: sfjwd.value === "否",
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.jd) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请输入站点经度"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
wd: [
|
||||
{
|
||||
required: sfjwd.value === "否",
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.wd) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请输入站点纬度"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
<style></style>
|
||||
@ -0,0 +1,289 @@
|
||||
<template>
|
||||
<div class="detail-container">
|
||||
<el-form ref="formRef" :model="form" label-position="right" label-width="150px"
|
||||
style="max-height: 60vh; overflow-y: auto; padding-right: 50px" :rules="rules" :disabled="disabled">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="区县名称" prop="区县名称">
|
||||
<el-input v-model="form.project.districtName"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="路线编码" prop="路线编码">
|
||||
<el-input v-model="form.project.routeNo"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="实施里程(公里)" prop="实施里程">
|
||||
<el-input-number v-model="form.project.implementMileage" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="塌方及损失" prop="塌方及损失">
|
||||
<el-input-number v-model="form.project.earthworkLoss" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="起点桩号" prop="起点桩号">
|
||||
<el-input v-model="form.project.startStakeNo"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="止点桩号" prop="止点桩号">
|
||||
<el-input v-model="form.project.endStakeNo"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="路况位置" prop="路况位置">
|
||||
<el-input v-model="form.project.roadLocation"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="阻断点小地名" prop="阻断点小地名">
|
||||
<el-input v-model="form.project.blockedPointName"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="灾害类型" prop="灾害类型">
|
||||
<el-input v-model="form.project.disasterType"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="预估费用" prop="预估费用">
|
||||
<el-input-number v-model="form.project.estimatedCost" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="技术等级" prop="技术等级">
|
||||
<el-select v-model="form.project.technicalGrade">
|
||||
<el-option
|
||||
v-for="item in [{ value: '三级', label: '三级' }, { value: '二级', label: '二级' }, { value: '一级', label: '一级' }]"
|
||||
:key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="资金来源" prop="资金来源">
|
||||
<el-input v-model="form.project.fundingSource"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="处置灾毁处数" prop="处置灾毁处数">
|
||||
<el-input-number v-model="form.project.disposalCount" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="已完工处数" prop="已完工处数">
|
||||
<el-input-number v-model="form.project.completedCount" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="总投资" prop="总投资">
|
||||
<el-input-number v-model="form.project.totalInvestment" :controls="false"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="项目费用类型" prop="项目费用类型">
|
||||
<el-radio-group v-model="form.project.projectExpenseType">
|
||||
<el-radio value="自费重修">自费重修</el-radio>
|
||||
<el-radio value="申报重修">申报重修</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted, watch, computed } from "vue";
|
||||
import { request } from "@/utils/request";
|
||||
const formRef = ref(null);
|
||||
defineExpose({ formRef });
|
||||
|
||||
const props = defineProps({
|
||||
form: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
}
|
||||
});
|
||||
const sfjwd = ref("是");
|
||||
const qx = ref("");
|
||||
const loading = ref(false);
|
||||
const selectOptions = ref([]);
|
||||
const qxList = ref([]);
|
||||
|
||||
// 根据用户信息 查询角色列表
|
||||
const getUserList = async (key) => {
|
||||
try {
|
||||
const keyword = key;
|
||||
let url = "";
|
||||
if (keyword) {
|
||||
url = `/snow-ops-platform/yhzry/getUserByKey?key=${keyword}`;
|
||||
} else {
|
||||
url = `/snow-ops-platform/yhzry/getUserByKey?key=`;
|
||||
}
|
||||
const res = await request({
|
||||
url: url,
|
||||
method: "GET",
|
||||
});
|
||||
if (res.code === "00000") {
|
||||
return res.data;
|
||||
} else {
|
||||
throw new Error(res.message);
|
||||
}
|
||||
} catch (error) {
|
||||
ElMessage.error(error.message);
|
||||
console.log(error);
|
||||
}
|
||||
};
|
||||
|
||||
// 选择人员筛选
|
||||
const remoteMethod = async (query) => {
|
||||
if (query === "") {
|
||||
selectOptions.value = [];
|
||||
return [];
|
||||
}
|
||||
loading.value = true;
|
||||
const res = await getUserList(query);
|
||||
if (res) {
|
||||
selectOptions.value = res;
|
||||
}
|
||||
loading.value = false;
|
||||
};
|
||||
|
||||
// 根据区县名称 查询区县列表
|
||||
const getQxList = async (key) => {
|
||||
try {
|
||||
const keyword = key;
|
||||
let url = "";
|
||||
if (keyword) {
|
||||
url = `/snow-ops-platform/district/listDistricts?qxmc=${keyword}`;
|
||||
} else {
|
||||
url = `/snow-ops-platform/district/listDistricts?qxmc=`;
|
||||
}
|
||||
const res = await request({
|
||||
url: url,
|
||||
method: "GET",
|
||||
});
|
||||
if (res.code === "00000") {
|
||||
return res.data;
|
||||
} else {
|
||||
throw new Error(res.message);
|
||||
}
|
||||
} catch (error) { }
|
||||
};
|
||||
|
||||
// 选择区县筛选
|
||||
const remoteMethod_qx = async (query) => {
|
||||
loading.value = true;
|
||||
const res = await getQxList(query);
|
||||
if (res) {
|
||||
qxList.value = res;
|
||||
}
|
||||
loading.value = false;
|
||||
};
|
||||
|
||||
// 选择区县
|
||||
const handleSelect_qx = (value) => {
|
||||
props.form.qxmc = value;
|
||||
};
|
||||
|
||||
// 选择人员
|
||||
const handleSelect = (value) => {
|
||||
console.log("value", value);
|
||||
props.form.fzrXm = value.realName;
|
||||
props.form.fzrSjhm = value.phone;
|
||||
props.form.fzrUserId = value.userId;
|
||||
};
|
||||
|
||||
const rules = computed(() => {
|
||||
return {
|
||||
mc: [
|
||||
{
|
||||
required: true,
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.mc) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请输入服务站名称"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
qxmc: [
|
||||
{
|
||||
required: true,
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.qxmc) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请选择所属区县"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
fzr: [
|
||||
{
|
||||
required: true,
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.fzrUserId && props.form.fzrXm && props.form.fzrSjhm) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请选择负责人"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
jd: [
|
||||
{
|
||||
required: sfjwd.value === "否",
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.jd) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请输入站点经度"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
wd: [
|
||||
{
|
||||
required: sfjwd.value === "否",
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.wd) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请输入站点纬度"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
<style></style>
|
||||
@ -1,7 +1,7 @@
|
||||
import { h, ref, onMounted, reactive, watch, toRaw, nextTick } from "vue";
|
||||
import { request } from "@/utils/request";
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import AddDialog from "./addDialog.vue";
|
||||
import ExamineDialog from "./examineDialog.vue";
|
||||
|
||||
const tableData = ref([]); // 表格数据
|
||||
const modelVisible = ref(false); // 弹窗状态
|
||||
@ -42,59 +42,63 @@ const drawerRef = ref(null); // 抽屉实例
|
||||
|
||||
const columns = [
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "districtName",
|
||||
label: "区县",
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "routeNo",
|
||||
label: "路线编码",
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "disasterType",
|
||||
label: "灾害类型",
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "startStakeNo",
|
||||
label: "起点桩号",
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "endStakeNo",
|
||||
label: "止点桩号",
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "implementMileage",
|
||||
label: "实施里程(公里)",
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "technicalGrade",
|
||||
label: "技术等级",
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "totalInvestment",
|
||||
label: "总投资金额(万元)",
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "estimatedCost",
|
||||
label: "投资估算(万元)",
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "startTime",
|
||||
label: "开工或预计开工时间",
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "endTime",
|
||||
label: "完工或预计完工时间",
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
label: "申报状态",
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "approvalStatus",
|
||||
label: "审批状态",
|
||||
formatter: (row) => {
|
||||
const statusMap = {
|
||||
0: '待审批',
|
||||
1: '审批通过',
|
||||
2: '审批驳回'
|
||||
};
|
||||
return statusMap[row.approvalStatus] || '未知状态';
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: "xxx",
|
||||
prop: "updateTime",
|
||||
label: "更新日期",
|
||||
},
|
||||
{
|
||||
@ -130,8 +134,8 @@ const columns = [
|
||||
|
||||
// 过滤条件
|
||||
const filterData = reactive({
|
||||
year: "",
|
||||
code: "",
|
||||
submitTimeStart: "",
|
||||
routeNo: "",
|
||||
})
|
||||
// 分页
|
||||
const pagination = reactive({
|
||||
@ -147,30 +151,33 @@ const pagination = reactive({
|
||||
},
|
||||
});
|
||||
|
||||
// 获取预警列表
|
||||
// 获取项目列表
|
||||
const getTableData = async (filterData) => {
|
||||
try {
|
||||
const res = await request({
|
||||
url: '',
|
||||
url: '/snow-ops-platform/recovery/list',
|
||||
method: "GET",
|
||||
params: {
|
||||
|
||||
...filterData,
|
||||
submitTimeStart: filterData.submitTimeStart ? filterData.submitTimeStart+`-01-01 00:00:00` : null,
|
||||
pageNum: pagination.current,
|
||||
pageSize: pagination.pageSize,
|
||||
}
|
||||
})
|
||||
} catch (error) {
|
||||
|
||||
console.error('获取项目列表失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 打开填报项目弹窗
|
||||
const openAddDialog = () => {
|
||||
model.title = '';
|
||||
// 打开审批弹窗
|
||||
const openExamineDialog = async () => {
|
||||
model.title = '项目审批';
|
||||
Object.assign(form, INIT_FORM);
|
||||
model.props = {
|
||||
form: form,
|
||||
};
|
||||
model.content = AddDialog;
|
||||
model.content = ExamineDialog;
|
||||
model.onCancel = () => {
|
||||
modelVisible.value = false;
|
||||
};
|
||||
@ -184,8 +191,10 @@ const openAddDialog = () => {
|
||||
});
|
||||
};
|
||||
model.width = "50%"
|
||||
// model.footerPosition = 'center'
|
||||
// model.onCancelType = 'null'
|
||||
model.footerPosition = 'flex-end'
|
||||
model.onCancelType = 'danger'
|
||||
model.onConfirmName = '审批通过'
|
||||
model.onCancelName = '审批驳回'
|
||||
// model.tagType = 'warning'
|
||||
// model.tagContent = '测试'
|
||||
modelVisible.value = true;
|
||||
@ -193,10 +202,20 @@ const openAddDialog = () => {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
export default () => {
|
||||
|
||||
const router = useRouter();
|
||||
|
||||
onMounted(() => {
|
||||
getTableData();
|
||||
})
|
||||
|
||||
|
||||
watch(filterData, (val) => {
|
||||
getTableData(filterData);
|
||||
}, { deep: true })
|
||||
|
||||
|
||||
return {
|
||||
@ -211,6 +230,6 @@ export default () => {
|
||||
drawer,
|
||||
dialogRef,
|
||||
drawerRef,
|
||||
openAddDialog,
|
||||
openExamineDialog,
|
||||
}
|
||||
}
|
||||
@ -1,13 +1,12 @@
|
||||
<template>
|
||||
<div class="root">
|
||||
<div class="search-box">
|
||||
<el-date-picker v-model="script.filterData.year" type="year" placeholder="年度" format="YYYY"
|
||||
<el-date-picker v-model="script.filterData.submitTimeStart" type="year" placeholder="年度" format="YYYY" value-format="YYYY"
|
||||
style="width: 240px; margin-right: 10px" size="large" />
|
||||
<el-input v-model="script.filterData.code" style="width: 240px; margin-right: 10px" size="large"
|
||||
<el-input v-model="script.filterData.routeNo" style="width: 240px; margin-right: 10px" size="large"
|
||||
placeholder="路线编码" :suffix-icon="Search" />
|
||||
</div>
|
||||
<div class="event-box">
|
||||
<el-button type="primary" @click="script.openAddDialog">项目填报</el-button>
|
||||
<el-button type="primary" color="#952DE6" @click="">导出</el-button>
|
||||
</div>
|
||||
<DynamicTable :dataSource="script.tableData.value" :columns="script.columns" :autoHeight="true"
|
||||
|
||||
@ -0,0 +1,18 @@
|
||||
<template>
|
||||
<div class="root">
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.root {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
Loading…
x
Reference in New Issue
Block a user