From 94bb7b62c2acfe478c2da2fa51ca28954e666a91 Mon Sep 17 00:00:00 2001 From: niedongsheng <605973111@qq.com> Date: Fri, 10 Apr 2026 17:41:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B0=B4=E6=AF=81=E7=BB=86=E8=8A=82?= =?UTF-8?q?=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DisasterManagement/DisasterDetail.vue | 122 ++++++++++++----- .../DisasterManagement/DisasterManagement.vue | 2 +- .../DisasterManagement/DisasterReport.vue | 17 ++- .../WaterDisaster/CalculateDialog.vue | 129 +++++++++++------- .../WaterDisaster/LossList.vue | 27 +++- .../WaterDisaster/LossMap.js | 47 +++++++ .../WaterDisaster/LossPicker.vue | 2 +- .../WaterDisaster/WaterDisaster.vue | 25 +--- .../waterDisasterFormData.json | 2 +- .../DisasterDetail/WaterDisasterDetailPC.vue | 13 -- .../WaterDisasterLossListDetailPC.vue | 26 +++- 11 files changed, 274 insertions(+), 138 deletions(-) create mode 100644 packages/mobile/src/views/DisasterManagement/WaterDisaster/LossMap.js diff --git a/packages/mobile/src/views/DisasterManagement/DisasterDetail.vue b/packages/mobile/src/views/DisasterManagement/DisasterDetail.vue index 714fdc2..4986aec 100644 --- a/packages/mobile/src/views/DisasterManagement/DisasterDetail.vue +++ b/packages/mobile/src/views/DisasterManagement/DisasterDetail.vue @@ -150,16 +150,18 @@
处置措施: - {{ formatDisposalMeasures(report.disposalMeasures) || '-' }} -
-
- 塌方及损失: - {{ getLossDescription(report) }} -
-
- 路产损失: - {{ report.totalLossAmount ? report.totalLossAmount + '万元' : '-' }} + {{ report.disposalMeasures || '-' }}
+
有无车辆滞留: {{ getVehicleStrandedText(report) }} @@ -181,13 +183,18 @@ {{ report.siteDescription || '-' }}
-
+
附件:
- - {{ file.fileName }} - 预览 +
+ +
+
+ + {{ file.fileName }} + +
@@ -200,8 +207,12 @@ + + + + @@ -220,10 +231,10 @@ const route = useRoute() // 详情数据(对应 Data 接口) const detailData = ref({ - event: null, // Event 对象 - reportList: [], // 填报列表(包含首报和续报) - fileList: [], // 附件列表 - lossList: [], // 损失列表 + event: null, // Event 对象 + report: [], // 填报列表(包含首报和续报) + fileList: [], // 附件列表 + lossList: [], // 损失列表 occurLocation: '', occurTime: '', roadConditionType: '', @@ -231,11 +242,17 @@ const detailData = ref({ }) const allReports = computed(() => { - const reports = detailData.value.reportList?.map((item, index)=>{ - item.title = index == 0 ? '首报' : ('续报' + index) - return item - }) || [] - return reports.reverse() + const reports = + detailData.value.report?.map((item, index) => { + if (index === detailData.value.report.length - 1) { + item.title = '首报' + } else { + item.title = '续报' + (detailData.value.report.length - 1 - index) + } + return item + }) || [] + return reports + // return reports.reverse() }) // 是否有填报数据 @@ -243,7 +260,6 @@ const hasReportData = computed(() => { return allReports.value.length > 0 }) - // 获取事件状态文本 const getEventStatusText = () => { return detailData.eventStatus === 1 ? '已解除' : '未解除' @@ -258,10 +274,10 @@ const getEventStatusType = () => { const formatDisposalMeasures = (measures) => { if (!measures) return '' const measureMap = { - '半幅封闭': '半幅封闭', - '全副封闭': '全副封闭', - '便道通行': '便道通行', - '正常通行': '正常通行' + 半幅封闭: '半幅封闭', + 全副封闭: '全副封闭', + 便道通行: '便道通行', + 正常通行: '正常通行' } return measures .split(',') @@ -287,7 +303,7 @@ const getLossDescription = (report) => { // 获取车辆滞留文本 const getVehicleStrandedText = (report) => { const count = report?.strandedVehicleCount || 0 - return count > 0 ? `有车滞留,共${count}辆` : '无车滞留' + return count > 0 ? `有车滞留` : '无车滞留' } // 获取灾毁详情 @@ -310,7 +326,7 @@ const getDisasterDetail = async () => { const data = result.data detailData.value = { event: data.event || null, - reportList: data.report || [], // 直接使用 reportList,包含首报和续报 + report: data.report || [], // 直接使用 report,包含首报和续报 fileList: data.fileList || [], lossList: data.lossList || [], occurLocation: data.occurLocation || '', @@ -344,10 +360,25 @@ const handleContinueReport = () => { }) } +const isImageFile = (file) => { + // 根据url后缀判断 + const imageExtensions = /\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i + if (file.fileUrl && imageExtensions.test(file.fileUrl)) return true + // 根据文件类型判断 + if (file.type && file.type.startsWith('image/')) return true + return false +} + +const imagesForPreview = ref([]) +const previewImagesVisible = ref(false) +const startPosition = ref(0) + // 预览附件 -const previewFile = (file) => { - console.log("🚀 ~ previewFile ~ file:", file) - // showImagePreview +const previewFile = (report, file) => { + const images = report.fileList.filter((file) => isImageFile(file)) + imagesForPreview.value = images.map((item) => item.fileUrl) + startPosition.value = imagesForPreview.value.indexOf(file.fileUrl) + previewImagesVisible.value = true } onMounted(() => { @@ -374,6 +405,13 @@ onMounted(() => { margin-left: 20px; margin-top: -8px; } + + &.column { + flex-direction: column; + .info-label { + margin-bottom: 10px; + } + } } .info-label { @@ -428,14 +466,17 @@ onMounted(() => { } .attachment-list { + display: flex; + flex-wrap: wrap; flex: 1; + gap: 10px; + overflow: hidden; .attachment-item { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; - padding: 8px; background: #f7f8fa; border-radius: 4px; @@ -450,11 +491,20 @@ onMounted(() => { color: #323233; overflow: hidden; text-overflow: ellipsis; - white-space: nowrap; } } } +.preview-image-block { + width: 60px; + height: 60px; + img { + width: 100%; + height: 100%; + object-fit: contain; + } +} + .footer-buttons { position: fixed; bottom: 0; @@ -474,4 +524,4 @@ onMounted(() => { font-size: 16px; } } - \ No newline at end of file + diff --git a/packages/mobile/src/views/DisasterManagement/DisasterManagement.vue b/packages/mobile/src/views/DisasterManagement/DisasterManagement.vue index 652cfd6..b17de77 100644 --- a/packages/mobile/src/views/DisasterManagement/DisasterManagement.vue +++ b/packages/mobile/src/views/DisasterManagement/DisasterManagement.vue @@ -49,7 +49,7 @@