@@ -95,6 +95,12 @@ const handleClickBack = () => {
const handleAddDevice = () => {
router.push('/rebuild-add')
+ // router.push({
+ // name: "RebuildAdd",
+ // params: {
+ // data: encodeURIComponent(JSON.stringify(11)),
+ // },
+ // });
}
diff --git a/packages/mobile/src/views/Rebuild/RebuildAdd.vue b/packages/mobile/src/views/Rebuild/RebuildAdd.vue
new file mode 100644
index 0000000..ffd64c0
--- /dev/null
+++ b/packages/mobile/src/views/Rebuild/RebuildAdd.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+ 提交
+
+
+
+
+
+
+
+
+
From 7d510060b1da4635f02c72ec8b0f877a98dc5091 Mon Sep 17 00:00:00 2001
From: niedongsheng <605973111@qq.com>
Date: Tue, 7 Apr 2026 15:23:45 +0800
Subject: [PATCH 08/15] =?UTF-8?q?feat:=20panelItem=20=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E8=BE=B9=E8=B7=9D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/mobile/src/components/PanelItem.vue | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/packages/mobile/src/components/PanelItem.vue b/packages/mobile/src/components/PanelItem.vue
index 17df11b..afe17fa 100644
--- a/packages/mobile/src/components/PanelItem.vue
+++ b/packages/mobile/src/components/PanelItem.vue
@@ -30,6 +30,10 @@ const props = defineProps({
padding: 20px;
background-color: #fff;
border-radius: 8px;
+
+ & + .panel-item {
+ margin-top: 10px;
+ }
}
.header {
display: flex;
From d578797f5b3ba1eff674057ce458f52ab5af18a7 Mon Sep 17 00:00:00 2001
From: niedongsheng <605973111@qq.com>
Date: Tue, 7 Apr 2026 16:02:19 +0800
Subject: [PATCH 09/15] =?UTF-8?q?feat:=20=E4=B8=8B=E6=8B=89=E7=BB=84?=
=?UTF-8?q?=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/mobile/src/components/BasePicker.vue | 139 ++++++++++++++++++
1 file changed, 139 insertions(+)
create mode 100644 packages/mobile/src/components/BasePicker.vue
diff --git a/packages/mobile/src/components/BasePicker.vue b/packages/mobile/src/components/BasePicker.vue
new file mode 100644
index 0000000..f68b998
--- /dev/null
+++ b/packages/mobile/src/components/BasePicker.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
From 207c65de19374b5caf9c64cf441c65cb24593386 Mon Sep 17 00:00:00 2001
From: huangchenhao <123673748@qq.com>
Date: Tue, 7 Apr 2026 16:29:39 +0800
Subject: [PATCH 10/15] =?UTF-8?q?feat:=20=E9=A1=B9=E7=9B=AE=E8=AF=A6?=
=?UTF-8?q?=E6=83=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/mobile/src/components/PanelItem.vue | 2 +-
packages/mobile/src/router/index.js | 5 +
packages/mobile/src/views/Rebuild/Rebuild.vue | 12 ++
.../mobile/src/views/Rebuild/RebuildAdd.vue | 123 +++++++++++++++---
.../src/views/Rebuild/RebuildDetails.vue | 104 +++++++++++++++
5 files changed, 229 insertions(+), 17 deletions(-)
create mode 100644 packages/mobile/src/views/Rebuild/RebuildDetails.vue
diff --git a/packages/mobile/src/components/PanelItem.vue b/packages/mobile/src/components/PanelItem.vue
index 17df11b..c652726 100644
--- a/packages/mobile/src/components/PanelItem.vue
+++ b/packages/mobile/src/components/PanelItem.vue
@@ -1,6 +1,6 @@
-
+
-
- 冰雪填报
+
+
+
+
@@ -63,6 +55,7 @@ import SearchInput from '@/components/SearchInput.vue'
import CardItem from '@/components/CardItem.vue'
import EmptyBox from '@/components/EmptyBox.vue'
import CurrentSite from '@/components/CurrentSite.vue'
+import TagFilter from '@/components/TagFilter.vue'
import mockDataJSON from './mockData.json'
const router = useRouter()
@@ -79,45 +72,90 @@ const loading = ref(false)
// 空状态文本
const emptyText = ref('暂无相关灾毁信息')
-// 获取灾毁列表数据(后端接口)
-const getDisasterList = async (keyword = '') => {
+// 筛选弹窗显示状态
+const showFilter = ref(false)
+
+// 当前选中的灾毁类型(通过 v-model 传给 TagFilter)
+const selectedDisasterType = ref('all')
+
+// 灾毁类型列表
+const disasterTypes = [
+ { label: '全部', value: 'all' },
+ { label: '边坡坍塌', value: '边坡坍塌' },
+ { label: '泥石流', value: '泥石流' },
+ { label: '路基沉陷', value: '路基沉陷' },
+ { label: '山体滑坡', value: '山体滑坡' },
+ { label: '行道树倒塌', value: '行道树倒塌' },
+ { label: '积水', value: '积水' },
+ { label: '积雪', value: '积雪' },
+ { label: '其他', value: '其他' }
+]
+
+// 获取简短类型名称
+const getShortTypeName = (type) => {
+ const typeMap = {
+ '边坡坍塌': '边坡',
+ '泥石流': '泥石',
+ '路基沉陷': '路基',
+ '山体滑坡': '滑坡',
+ '行道树倒塌': '树倒',
+ '积水': '积水',
+ '积雪': '积雪',
+ '其他': '其他'
+ }
+ return typeMap[type] || type.substring(0, 2)
+}
+
+// 获取灾毁列表数据
+const getDisasterList = async (keyword = '', disasterType = 'all') => {
loading.value = true
try {
// TODO: 替换为实际的后端接口地址
- const response = await fetch('/api/disaster/list', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json'
- },
- body: JSON.stringify({
- keyword: keyword.trim()
- })
- })
-
- // 模拟接口响应格式,实际使用时根据后端返回结构调整
+ // const response = await fetch('/api/disaster/list', {
+ // method: 'POST',
+ // headers: {
+ // 'Content-Type': 'application/json'
+ // },
+ // body: JSON.stringify({
+ // keyword: keyword.trim(),
+ // disasterType: disasterType === 'all' ? '' : disasterType
+ // })
+ // })
// const result = await response.json()
-
- // 模拟异步请求
// if (result.code === 200) {
// list.value = result.data
- // emptyText.value = keyword ? '未搜索到相关灾毁信息' : '暂无相关灾毁信息'
// } else {
// showToast(result.message || '获取数据失败')
// list.value = []
// }
- // ========== 模拟数据(实际开发时删除此部分) ==========
+ // ========== 模拟数据 ==========
await new Promise((resolve) => setTimeout(resolve, 500))
const mockData = mockDataJSON
- // 模拟后端搜索过滤(实际由后端完成)
+ let filteredData = [...mockData]
+
if (keyword) {
- const filtered = mockData.filter((item) => item.title.toLowerCase().includes(keyword.toLowerCase()))
- list.value = filtered
- emptyText.value = filtered.length === 0 ? '未搜索到相关灾毁信息' : '暂无相关灾毁信息'
+ filteredData = filteredData.filter((item) =>
+ item.title.toLowerCase().includes(keyword.toLowerCase())
+ )
+ }
+
+ if (disasterType !== 'all') {
+ filteredData = filteredData.filter((item) =>
+ item.disasterType === disasterType
+ )
+ }
+
+ list.value = filteredData
+
+ if (keyword && filteredData.length === 0) {
+ emptyText.value = '未搜索到相关灾毁信息'
+ } else if (disasterType !== 'all' && filteredData.length === 0) {
+ const typeLabel = disasterTypes.find(t => t.value === disasterType)?.label || disasterType
+ emptyText.value = `暂无${typeLabel}类型灾毁信息`
} else {
- list.value = mockData
emptyText.value = '暂无相关灾毁信息'
}
// ========== 模拟数据结束 ==========
@@ -130,9 +168,23 @@ const getDisasterList = async (keyword = '') => {
}
}
-// 搜索处理(调用后端接口)
+// 搜索处理
const handleSearch = () => {
- getDisasterList(searchValue.value)
+ getDisasterList(searchValue.value, selectedDisasterType.value)
+}
+
+// 点击全部按钮
+const handleAllClick = () => {
+ if (selectedDisasterType.value !== 'all') {
+ selectedDisasterType.value = 'all'
+ getDisasterList(searchValue.value, 'all')
+ }
+}
+
+// 筛选确认
+const handleFilterConfirm = (type) => {
+ // selectedDisasterType 已经通过 v-model 更新,这里只需重新请求数据
+ getDisasterList(searchValue.value, type)
}
// 点击返回
@@ -140,7 +192,7 @@ const handleClickBack = () => {
router.push('/')
}
-// 点击列表项,跳转详情
+// 点击列表项
const handleClickItem = (item) => {
router.push({
path: '/disaster-detail',
@@ -157,9 +209,7 @@ const handleClickItem = (item) => {
// 灾毁填报
const handleAdd = () => {
- // TODO: 跳转到灾毁填报页面
- console.log('点击灾毁填报')
- // router.push('/disaster-report')
+ router.push('/disasterReport')
}
// 页面初始化加载数据
@@ -176,7 +226,6 @@ onMounted(() => {
padding-bottom: 80px;
}
-/* CardItem 需要设置相对定位 */
:deep(.card-item) {
position: relative;
}
@@ -185,7 +234,7 @@ onMounted(() => {
display: flex;
flex-direction: column;
gap: 8px;
- padding-right: 24px; /* 为箭头留出空间 */
+ padding-right: 24px;
}
.time-box {
@@ -206,7 +255,6 @@ onMounted(() => {
color: #333333;
}
-/* 使用绝对定位的箭头样式 */
.jump-icon-absolute {
position: absolute;
right: 16px;
@@ -217,12 +265,11 @@ onMounted(() => {
cursor: pointer;
}
-/* 灾毁类型标签样式 */
.disaster-type-wrapper {
margin-top: 4px;
}
-.fab-btn {
+.footer-btn {
position: fixed;
bottom: 30px;
left: 50%;
@@ -249,4 +296,12 @@ onMounted(() => {
justify-content: center;
padding: 40px 0;
}
-
+
+:deep(.van-button) {
+ &.active {
+ background-color: #1989fa;
+ color: #fff;
+ border-color: #1989fa;
+ }
+}
+
\ No newline at end of file
diff --git a/packages/mobile/src/views/DisasterManagement/DisasterReport.vue b/packages/mobile/src/views/DisasterManagement/DisasterReport.vue
new file mode 100644
index 0000000..d2df783
--- /dev/null
+++ b/packages/mobile/src/views/DisasterManagement/DisasterReport.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+ 水毁灾害
+ 冰雪灾害
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/mobile/src/views/DisasterManagement/WaterDisaster.vue b/packages/mobile/src/views/DisasterManagement/WaterDisaster.vue
new file mode 100644
index 0000000..acf7a26
--- /dev/null
+++ b/packages/mobile/src/views/DisasterManagement/WaterDisaster.vue
@@ -0,0 +1,532 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 公里
+
+
+
+
+
+
+
+ 校准时间
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 校准经纬度
+
+
+
+
+
+
+
+
+
+
+
+
+ 校准经纬度
+
+
+
+
+
+
+
+
+
+
+
+
+
+
处置措施
+
+
+ 半幅封闭
+ 全副封闭
+ 便道通行
+ 正常通行
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 个
+
+
+
+
+ 个
+
+
+
+
+ 个
+
+
+
+
+ 辆
+
+
+
+
+ 辆
+
+
+
+
+
+
+
+
+ 塌方及损失
+ {{ formData.collapseLoss }}万/万元
+
+ 添加损失
+
+
+
+ 万元
+
+
+
+
+
+
+
+ 台/班
+
+
+
+
+ 人次
+
+
+
+
+ 万元
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
预估塌方量:{{ calculatedVolume }} m³
+
预估损失:{{ calculatedLoss }} 万元
+
+
+
+
+
+
+
+
From 76e64b38b4e29feb7959703ae182373a63008e23 Mon Sep 17 00:00:00 2001
From: huangchenhao <123673748@qq.com>
Date: Tue, 7 Apr 2026 17:56:06 +0800
Subject: [PATCH 13/15] =?UTF-8?q?feat:=20=E9=A1=B9=E7=9B=AE=E7=AE=A1?=
=?UTF-8?q?=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/screen/src/router/index.js | 10 +
.../ProjectManagement_Rebuild/addDialog.vue | 372 ++++++++++++++++++
.../views/ProjectManagement_Rebuild/index.js | 205 ++++++++++
.../views/ProjectManagement_Rebuild/index.vue | 52 +++
4 files changed, 639 insertions(+)
create mode 100644 packages/screen/src/views/ProjectManagement_Rebuild/addDialog.vue
create mode 100644 packages/screen/src/views/ProjectManagement_Rebuild/index.js
create mode 100644 packages/screen/src/views/ProjectManagement_Rebuild/index.vue
diff --git a/packages/screen/src/router/index.js b/packages/screen/src/router/index.js
index 9d4f956..3974b60 100644
--- a/packages/screen/src/router/index.js
+++ b/packages/screen/src/router/index.js
@@ -139,6 +139,16 @@ const routes = [
breadcrumb: true,
parentRoute: 'warningManagement' // 用于在面包屑中建立父子关系
}
+ },
+ // 项目管理
+ {
+ path: '/projectManagement',
+ name: 'projectManagement',
+ component: () => import('../views/ProjectManagement_Rebuild/index.vue'),
+ meta: {
+ title: '项目管理',
+ breadcrumb: true
+ }
}
]
diff --git a/packages/screen/src/views/ProjectManagement_Rebuild/addDialog.vue b/packages/screen/src/views/ProjectManagement_Rebuild/addDialog.vue
new file mode 100644
index 0000000..c981eb7
--- /dev/null
+++ b/packages/screen/src/views/ProjectManagement_Rebuild/addDialog.vue
@@ -0,0 +1,372 @@
+
+
+
+
+ 项目信息
+
+
+
+
+
+ 在建
+ 停工
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 项目联系人信息
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 其他信息
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/screen/src/views/ProjectManagement_Rebuild/index.js b/packages/screen/src/views/ProjectManagement_Rebuild/index.js
new file mode 100644
index 0000000..ae4d3a7
--- /dev/null
+++ b/packages/screen/src/views/ProjectManagement_Rebuild/index.js
@@ -0,0 +1,205 @@
+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";
+
+const tableData = ref([]); // 表格数据
+const modelVisible = ref(false); // 弹窗状态
+const drawerVisible = ref(false); // 抽屉状态
+// 弹窗内容
+const model = reactive({
+ title: '',
+ content: null,
+ props: {},
+ onCancel: null,
+ onConfirm: null,
+ width: '',
+});
+const form = reactive({
+});
+const INIT_FORM = {
+
+};
+// 抽屉内容
+const drawer = reactive({
+ title: '',
+ content: null,
+ props: {},
+ onCancel: null,
+ onConfirm: null,
+ direction: 'rtl',
+ size: '50%'
+});
+const dialogRef = ref(null); // 弹窗实例
+const drawerRef = ref(null); // 抽屉实例
+
+const columns = [
+ {
+ prop: "xxx",
+ label: "区县",
+ },
+ {
+ prop: "xxx",
+ label: "路线编码",
+ },
+ {
+ prop: "xxx",
+ label: "灾害类型",
+ },
+ {
+ prop: "xxx",
+ label: "起点桩号",
+ },
+ {
+ prop: "xxx",
+ label: "止点桩号",
+ },
+ {
+ prop: "xxx",
+ label: "实施里程(公里)",
+ },
+ {
+ prop: "xxx",
+ label: "技术等级",
+ },
+ {
+ prop: "xxx",
+ label: "总投资金额(万元)",
+ },
+ {
+ prop: "xxx",
+ label: "投资估算(万元)",
+ },
+ {
+ prop: "xxx",
+ label: "开工或预计开工时间",
+ },
+ {
+ prop: "xxx",
+ label: "完工或预计完工时间",
+ },
+ {
+ prop: "xxx",
+ label: "申报状态",
+ },
+ {
+ prop: "xxx",
+ label: "审批状态",
+ },
+ {
+ prop: "xxx",
+ label: "更新日期",
+ },
+ {
+ label: "操作",
+ fixed: "right",
+ width: 150,
+ render: (row) => () =>
+ h("div", { class: "action-btns" }, [
+ h(
+ ElButton,
+ {
+ type: "primary",
+ link: true,
+ onClick: async () => {
+ },
+ },
+ () => "审批"
+ ),
+ h(
+ ElButton,
+ {
+ type: "primary",
+ link: true,
+ style: "margin-left: 10px;",
+ onClick: async () => {
+ },
+ },
+ () => "详情"
+ ),
+ ]),
+ },
+]
+
+// 过滤条件
+const filterData = reactive({
+ year: "",
+ code: "",
+})
+// 分页
+const pagination = reactive({
+ current: 1,
+ pageSize: 10,
+ total: 0,
+ pageSizes: [10, 20, 50],
+ layout: "prev, pager, next, jumper",
+ onChange: (page, pageSize) => {
+ pagination.current = page;
+ pagination.pageSize = pageSize;
+ getTableData(filterData);
+ },
+});
+
+// 获取预警列表
+const getTableData = async (filterData) => {
+ try {
+ const res = await request({
+ url: '',
+ method: "GET",
+ params: {
+
+ }
+ })
+ } catch (error) {
+
+ }
+}
+
+
+// 打开填报项目弹窗
+const openAddDialog = () => {
+ model.title = '填报项目';
+ Object.assign(form, INIT_FORM);
+ model.props = {
+ form: form,
+ };
+ model.content = AddDialog;
+ model.onCancel = () => {
+ modelVisible.value = false;
+ };
+ model.onConfirm = async () => {
+ dialogType.value = '';
+ await dialogRef?.value?.dynamicComponentRef?.formRef.validate().then(() => {
+ console.log('@@@@@填报项目', form);
+ })
+ .catch((err) => {
+ ElMessage.error('请处理表单中的错误项');
+ });
+ };
+ model.width = "70%"
+ modelVisible.value = true;
+}
+
+
+
+export default () => {
+
+ const router = useRouter();
+
+
+
+ return {
+ tableData,
+ filterData,
+ pagination,
+ columns,
+
+ modelVisible,
+ model,
+ drawerVisible,
+ drawer,
+ dialogRef,
+ drawerRef,
+ openAddDialog,
+ }
+}
\ No newline at end of file
diff --git a/packages/screen/src/views/ProjectManagement_Rebuild/index.vue b/packages/screen/src/views/ProjectManagement_Rebuild/index.vue
new file mode 100644
index 0000000..10005f7
--- /dev/null
+++ b/packages/screen/src/views/ProjectManagement_Rebuild/index.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+ 项目填报
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
From a53dbf6a0e10e83751a3ea6679120607731a0deb Mon Sep 17 00:00:00 2001
From: niedongsheng <605973111@qq.com>
Date: Wed, 8 Apr 2026 09:21:47 +0800
Subject: [PATCH 14/15] =?UTF-8?q?feat:=20=E6=B0=B4=E6=AF=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../DisasterManagement/DisasterReport.vue | 2 +-
.../WaterDisaster/CubeCalculateDialog.vue | 159 ++++++++++++++++++
.../WaterDisaster/LossList.vue | 72 ++++++++
.../{ => WaterDisaster}/WaterDisaster.vue | 96 +----------
4 files changed, 239 insertions(+), 90 deletions(-)
create mode 100644 packages/mobile/src/views/DisasterManagement/WaterDisaster/CubeCalculateDialog.vue
create mode 100644 packages/mobile/src/views/DisasterManagement/WaterDisaster/LossList.vue
rename packages/mobile/src/views/DisasterManagement/{ => WaterDisaster}/WaterDisaster.vue (82%)
diff --git a/packages/mobile/src/views/DisasterManagement/DisasterReport.vue b/packages/mobile/src/views/DisasterManagement/DisasterReport.vue
index d2df783..8cf4cc7 100644
--- a/packages/mobile/src/views/DisasterManagement/DisasterReport.vue
+++ b/packages/mobile/src/views/DisasterManagement/DisasterReport.vue
@@ -37,7 +37,7 @@ import { showToast, showSuccessToast, showFailToast } from 'vant'
import PageContainer from '@/components/PageContainer.vue'
import CurrentSite from '@/components/CurrentSite.vue'
import PanelItem from '@/components/PanelItem.vue'
-import WaterDisaster from './WaterDisaster.vue'
+import WaterDisaster from './WaterDisaster/WaterDisaster.vue'
const router = useRouter()
diff --git a/packages/mobile/src/views/DisasterManagement/WaterDisaster/CubeCalculateDialog.vue b/packages/mobile/src/views/DisasterManagement/WaterDisaster/CubeCalculateDialog.vue
new file mode 100644
index 0000000..7cd4ecb
--- /dev/null
+++ b/packages/mobile/src/views/DisasterManagement/WaterDisaster/CubeCalculateDialog.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+ 米
+
+
+
+
+
+
+ 米
+
+
+
+
+
+
+ 米
+
+
+
+
+
+
+ 元
+
+
+
+
+
+ 元
+
+
+
+
+
+
+
diff --git a/packages/mobile/src/views/DisasterManagement/WaterDisaster/LossList.vue b/packages/mobile/src/views/DisasterManagement/WaterDisaster/LossList.vue
new file mode 100644
index 0000000..2cd9621
--- /dev/null
+++ b/packages/mobile/src/views/DisasterManagement/WaterDisaster/LossList.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+ 方/万元
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/mobile/src/views/DisasterManagement/WaterDisaster.vue b/packages/mobile/src/views/DisasterManagement/WaterDisaster/WaterDisaster.vue
similarity index 82%
rename from packages/mobile/src/views/DisasterManagement/WaterDisaster.vue
rename to packages/mobile/src/views/DisasterManagement/WaterDisaster/WaterDisaster.vue
index acf7a26..2c86c31 100644
--- a/packages/mobile/src/views/DisasterManagement/WaterDisaster.vue
+++ b/packages/mobile/src/views/DisasterManagement/WaterDisaster/WaterDisaster.vue
@@ -120,11 +120,8 @@
-
- 塌方及损失
- {{ formData.collapseLoss }}万/万元
-
- 添加损失
+
+ 添加损失
@@ -152,8 +149,7 @@
-
-
+
@@ -186,18 +182,6 @@
-->
-
-
-
-
-
-
-
-
-
预估塌方量:{{ calculatedVolume }} m³
-
预估损失:{{ calculatedLoss }} 万元
-
-
@@ -207,6 +191,7 @@ import { showToast, showFailToast } from 'vant'
import PanelItem from '@/components/PanelItem.vue'
import BasePicker from '@/components/BasePicker.vue'
import BaseDatePicker from '@/components/BaseDatePicker.vue'
+import LossList from './LossList.vue'
// 定义 props
const props = defineProps({
@@ -244,7 +229,7 @@ const formData = reactive({
strandedPeople: '',
damagedVehicles: '',
strandedVehicles: '',
- collapseLoss: '0',
+ collapseLoss: [],
handlingSituation: '',
totalLossAmount: '',
machineryInput: '',
@@ -252,12 +237,10 @@ const formData = reactive({
fundsInput: '',
siteDescription: '',
imageFiles: [],
- videoFile: []
+ videoFile: [],
+ lossList: [{ value: '' }]
})
-// 弹窗显示状态
-const showLossDialog = ref(false)
-
// BasePicker 选项数据
const roadConditionOptions = [
{ label: '高速公路', value: '高速公路' },
@@ -284,30 +267,6 @@ const repairProgressOptions = [
const minDate = new Date(2020, 0, 1)
const maxDate = new Date(2030, 11, 31)
-// 损失计算表单
-const lossForm = reactive({
- length: '',
- width: '',
- height: '',
- unitPrice: ''
-})
-
-// 计算塌方量
-const calculatedVolume = computed(() => {
- const l = parseFloat(lossForm.length) || 0
- const w = parseFloat(lossForm.width) || 0
- const h = parseFloat(lossForm.height) || 0
- return (l * w * h).toFixed(2)
-})
-
-// 计算损失金额(万元)
-const calculatedLoss = computed(() => {
- const volume = parseFloat(calculatedVolume.value) || 0
- const price = parseFloat(lossForm.unitPrice) || 0
- const lossYuan = volume * price
- return (lossYuan / 10000).toFixed(2)
-})
-
// 监听父组件传入的数据
watch(
() => props.modelValue,
@@ -350,27 +309,6 @@ const calibrateEndCoord = () => {
showToast('止点经纬度已校准')
}
-// 确认损失计算
-const confirmLoss = () => {
- const lossValue = calculatedLoss.value
- if (parseFloat(lossValue) > 0) {
- formData.collapseLoss = lossValue
- if (formData.totalLossAmount) {
- const currentTotal = parseFloat(formData.totalLossAmount) || 0
- formData.totalLossAmount = (currentTotal + parseFloat(lossValue)).toFixed(2)
- } else {
- formData.totalLossAmount = lossValue
- }
- } else {
- showToast('请填写有效的长宽高和单价')
- }
- lossForm.length = ''
- lossForm.width = ''
- lossForm.height = ''
- lossForm.unitPrice = ''
- showLossDialog.value = false
-}
-
// 图片上传处理
const afterImageRead = (file) => {
console.log('图片上传:', file)
@@ -415,7 +353,6 @@ defineExpose({
\ No newline at end of file
+
diff --git a/packages/mobile/src/views/DisasterManagement/WaterDisaster/LossPicker.vue b/packages/mobile/src/views/DisasterManagement/WaterDisaster/LossPicker.vue
new file mode 100644
index 0000000..535a2f8
--- /dev/null
+++ b/packages/mobile/src/views/DisasterManagement/WaterDisaster/LossPicker.vue
@@ -0,0 +1,47 @@
+