diff --git a/packages/mobile/src/components/BaseDatePicker.vue b/packages/mobile/src/components/BaseDatePicker.vue index 360cfd9..5cdaeaf 100644 --- a/packages/mobile/src/components/BaseDatePicker.vue +++ b/packages/mobile/src/components/BaseDatePicker.vue @@ -55,6 +55,7 @@ + diff --git a/packages/mobile/src/views/DisasterManagement/WaterDisaster/CubeCalculateDialog.vue b/packages/mobile/src/views/DisasterManagement/WaterDisaster/CubeCalculateDialog.vue deleted file mode 100644 index 234efcb..0000000 --- a/packages/mobile/src/views/DisasterManagement/WaterDisaster/CubeCalculateDialog.vue +++ /dev/null @@ -1,172 +0,0 @@ - - - diff --git a/packages/mobile/src/views/DisasterManagement/WaterDisaster/LossList.vue b/packages/mobile/src/views/DisasterManagement/WaterDisaster/LossList.vue index 85f0a7f..69aaaf8 100644 --- a/packages/mobile/src/views/DisasterManagement/WaterDisaster/LossList.vue +++ b/packages/mobile/src/views/DisasterManagement/WaterDisaster/LossList.vue @@ -1,24 +1,34 @@ + + diff --git a/packages/screen/src/component/FileUpload/PreviewBlock.vue b/packages/screen/src/component/FileUpload/PreviewBlock.vue new file mode 100644 index 0000000..562f568 --- /dev/null +++ b/packages/screen/src/component/FileUpload/PreviewBlock.vue @@ -0,0 +1,242 @@ + + + + + + \ No newline at end of file diff --git a/packages/screen/src/component/FileUpload/UploadBlock.vue b/packages/screen/src/component/FileUpload/UploadBlock.vue new file mode 100644 index 0000000..f6ad47e --- /dev/null +++ b/packages/screen/src/component/FileUpload/UploadBlock.vue @@ -0,0 +1,148 @@ + + + + + + diff --git a/packages/screen/src/component/MyDialog/index.vue b/packages/screen/src/component/MyDialog/index.vue index f65f55b..afb6386 100644 --- a/packages/screen/src/component/MyDialog/index.vue +++ b/packages/screen/src/component/MyDialog/index.vue @@ -24,7 +24,7 @@ diff --git a/packages/screen/src/component/MyDrawer/index.vue b/packages/screen/src/component/MyDrawer/index.vue index 88237c8..be7784f 100644 --- a/packages/screen/src/component/MyDrawer/index.vue +++ b/packages/screen/src/component/MyDrawer/index.vue @@ -15,8 +15,8 @@ diff --git a/packages/screen/src/component/VideoPreviewDialog.vue b/packages/screen/src/component/VideoPreviewDialog.vue new file mode 100644 index 0000000..9c87841 --- /dev/null +++ b/packages/screen/src/component/VideoPreviewDialog.vue @@ -0,0 +1,142 @@ + + + + + \ No newline at end of file diff --git a/packages/screen/src/router/index.js b/packages/screen/src/router/index.js index 6207d7e..0da7fe2 100644 --- a/packages/screen/src/router/index.js +++ b/packages/screen/src/router/index.js @@ -1,4 +1,3 @@ -import component from 'element-plus/es/components/tree-select/src/tree-select-option.mjs' import { createRouter, createWebHistory } from 'vue-router' const routes = [ @@ -118,17 +117,17 @@ const routes = [ }, component: () => import('../views/ConstructionDepartment/ConstructionDepartment.vue') }, - // 响应预警 + // 响应预警 - 建设处 { path: '/warningManagement', name: 'warningManagement', - component: () => import('../views/WarningManagement/index.vue'), + component: () => import('../views/WarningManagement/construction/index.vue'), meta: { title: '响应预警', breadcrumb: true } }, - // 驻地台账 - 作为独立的页面,但在面包屑中显示为响应预警的子页面 + // 驻地台账 - 建设处 { path: '/ledgerManagement', name: 'ledgerManagement', @@ -136,23 +135,88 @@ const routes = [ meta: { title: '驻地台账', breadcrumb: true, - parentRoute: 'warningManagement' // 用于在面包屑中建立父子关系 + parentRoute: 'warningManagement' } }, - // 项目管理 + // 响应预警 - 区县级 + { + path: '/warningManagement2', + name: 'warningManagement2', + component: () => import('../views/WarningManagement/district/index.vue'), + meta: { + title: '响应预警', + breadcrumb: true + } + }, + // 驻地台账 - 区县级 + { + path: '/ledgerManagement2', + name: 'ledgerManagement2', + component: () => import('../views/LedgerManagement/index.vue'), + meta: { + title: '驻地台账', + breadcrumb: true, + parentRoute: 'warningManagement2' + } + }, + + // 项目管理 - 区县 { path: '/projectManagement', name: 'projectManagement', - component: () => import('../views/ProjectManagement_Rebuild/index.vue'), + component: () => import('../views/ProjectManagement_Rebuild/district/index.vue'), meta: { title: '项目管理', breadcrumb: true } }, + { + path: '/projectAdd/:data?', + name: 'projectAdd', + component: () => import('../views/ProjectManagement_Rebuild/district/projectAddPage.vue'), + meta: { + title: '项目填报', + breadcrumb: true, + parentRoute: 'projectManagement' + } + }, + // 项目详情 - 区县版本 + { + path: '/projectDetail/:data?', + name: 'projectDetail', + component: () => import('../views/ProjectManagement_Rebuild/district/projectDetailPage.vue'), + meta: { + title: '项目详情', + breadcrumb: true, + parentRoute: 'projectManagement' + } + }, + // 项目管理 - 业务部门 + { + path: '/projectManagement2', + name: 'projectManagement2', + component: () => import('../views/ProjectManagement_Rebuild/business/index.vue'), + meta: { + title: '项目管理', + breadcrumb: true + } + }, + // 项目详情 - 业务部门版本 + { + path: '/projectDetail2/:data?', + name: 'projectDetail2', + component: () => import('../views/ProjectManagement_Rebuild/business/projectDetailPage.vue'), + meta: { + title: '项目详情', + breadcrumb: true, + parentRoute: 'projectManagement2' + } + }, + { path: '/disasterManagement', name: 'disasterManagement', - component: () => import('../views/DisasterManagement/DisasterManagement.vue'), + component: () => import('../views/DisasterManagement/DisasterManagementPC.vue'), meta: { title: '灾害巡检事件', breadcrumb: true @@ -161,16 +225,16 @@ const routes = [ { path: '/disasterReport', name: 'DisasterReport', - component: () => import('../views/DisasterManagement/DisasterReport/DisasterReport.vue'), + component: () => import('../views/DisasterManagement/DisasterReport/DisasterReportPC.vue'), meta: { title: '灾毁事件填报', breadcrumb: true } }, - { + { path: '/waterDisasterDetail', name: 'WaterDisasterDetail', - component: () => import('../views/DisasterManagement/DisasterDetail/WaterDisasterDetail.vue'), + component: () => import('../views/DisasterManagement/DisasterDetail/WaterDisasterDetailPC.vue'), meta: { title: '水毁事件详情', breadcrumb: true diff --git a/packages/screen/src/views/DisasterManagement/DisasterDetail/ContinueReport.vue b/packages/screen/src/views/DisasterManagement/DisasterDetail/WaterDisasterContinueReportPC.vue similarity index 90% rename from packages/screen/src/views/DisasterManagement/DisasterDetail/ContinueReport.vue rename to packages/screen/src/views/DisasterManagement/DisasterDetail/WaterDisasterContinueReportPC.vue index 7158c2b..c98f449 100644 --- a/packages/screen/src/views/DisasterManagement/DisasterDetail/ContinueReport.vue +++ b/packages/screen/src/views/DisasterManagement/DisasterDetail/WaterDisasterContinueReportPC.vue @@ -3,19 +3,19 @@
- 续保信息 + 续报信息
- - 半幅封闭 - 全副封闭 - 便道通行 - 正常通行 - + + + + + + @@ -138,7 +138,7 @@ import { ref, reactive, watch, computed } from 'vue' import { ElMessage } from 'element-plus' import { request } from '@shared/utils/request' -import LossList from '../DisasterReport/LossList.vue' +import LossList from '../DisasterReport/WaterDisasterLossListPC.vue' // Props 定义 const props = defineProps({ @@ -164,8 +164,6 @@ const formData = reactive({ contactPhone: '', damageCount: '', district: '', - endStakeLat: '', - endStakeLng: '', endStakeNo: '', estimatedRecoveryCost: '', inspectionMileage: '', @@ -173,8 +171,6 @@ const formData = reactive({ needsRecovery: '', repairProgress: '', reporterUnit: '', - startStakeLat: '', - startStakeLng: '', startStakeNo: '' }, report: { @@ -216,8 +212,8 @@ const blockedOptions = [ ] const repairProgressOptions = [ - { label: '未抢修', value: '未抢修' }, - { label: '抢修中', value: '抢修中' }, + { label: '未抢险', value: '未抢险' }, + { label: '抢险中', value: '抢险中' }, { label: '已完成', value: '已完成' } ] @@ -295,20 +291,6 @@ const calibrateTime = () => { 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) { @@ -341,8 +323,6 @@ const resetForm = () => { contactPhone: '', damageCount: '', district: '', - endStakeLat: '', - endStakeLng: '', endStakeNo: '', estimatedRecoveryCost: '', inspectionMileage: '', @@ -350,8 +330,6 @@ const resetForm = () => { needsRecovery: '', repairProgress: '', reporterUnit: '', - startStakeLat: '', - startStakeLng: '', startStakeNo: '' }, report: { @@ -426,8 +404,6 @@ defineExpose({ getFormData, resetForm, calibrateTime, - calibrateStartCoord, - calibrateEndCoord }) diff --git a/packages/screen/src/views/DisasterManagement/DisasterDetail/WaterDisasterDetail.vue b/packages/screen/src/views/DisasterManagement/DisasterDetail/WaterDisasterDetailPC.vue similarity index 69% rename from packages/screen/src/views/DisasterManagement/DisasterDetail/WaterDisasterDetail.vue rename to packages/screen/src/views/DisasterManagement/DisasterDetail/WaterDisasterDetailPC.vue index 3bb01cd..a37db99 100644 --- a/packages/screen/src/views/DisasterManagement/DisasterDetail/WaterDisasterDetail.vue +++ b/packages/screen/src/views/DisasterManagement/DisasterDetail/WaterDisasterDetailPC.vue @@ -47,16 +47,25 @@
- 抢修进度: + 抢险进度: {{ detailData.event?.repairProgress || '-' }}
+ +
+ 处理措施: + {{ getBaseDisposalMeasures() }} +
+
水毁处数: {{ detailData.event?.damageCount || 0 }}
+
+ +
阻断里程: @@ -66,66 +75,24 @@ - -
- 发生时间: - {{ detailData.occurTime || '-' }} -
-
- -
- 线路编号: - {{ detailData.routeNo || '-' }} -
-
地点路线: {{ detailData.occurLocation || '-' }}
-
- -
起点桩号: {{ detailData.event?.startStakeNo || '-' }}
- -
- 起点桩经度: - {{ detailData.event?.startStakeLng || '-' }} -
-
- -
- 起点桩纬度: - {{ detailData.event?.startStakeLat || '-' }} -
-
-
- -
止点桩号: {{ detailData.event?.endStakeNo || '-' }}
- -
- 止点桩经度: - {{ detailData.event?.endStakeLng || '-' }} -
-
- -
- 止点桩纬度: - {{ detailData.event?.endStakeLat || '-' }} -
-
@@ -141,55 +108,37 @@ {{ detailData.event?.blockedPointName || '-' }}
- -
- 上报区县: - {{ detailData.event?.district || '-' }} -
-
- 巡查里程: - {{ detailData.event?.inspectionMileage ? detailData.event.inspectionMileage + '公里' : '-' }} + 所属区县: + {{ detailData.event?.district || '-' }}
+ +
+ 发生时间: + {{ detailData.occurTime || '-' }} +
+
+
+ +
是否恢复重建: {{ detailData.event?.needsRecovery ? '是' : '否' }}
- +
恢复重建预估费用: {{ detailData.event?.estimatedRecoveryCost ? detailData.event.estimatedRecoveryCost + '万元' : '-' }}
- - - -
- 联系人: - {{ detailData.event?.contactPerson || '-' }} -
-
- -
- 联系电话: - {{ detailData.event?.contactPhone || '-' }} -
-
- -
- 填报单位: - {{ detailData.event?.reporterUnit || '-' }} -
-
-
@@ -204,52 +153,71 @@
{{ report?.title }} - {{ report.reporterName || '-' }} {{ report.reportTime || '-' }} + 时间:{{ report.reportTime || '-' }}
+
+
+
+
+ 现场描述: + {{ report.siteDescription || '-' }} +
+
+ 处置措施: + {{ report.disposalMeasures || '-' }} +
+
+ 实际恢复时间: + {{ report.actualRecoverTime || '-' }} +
+
+ 预计恢复时间: + {{ report.expectRecoverTime || '-' }} +
-
-
- 处置情况: - {{ formatDisposalMeasures(report.disposalMeasures) || '-' }} -
-
- 塌方及损失: - {{ getLossDescription(report) }} -
-
- 路产损失: - {{ report.totalLossAmount ? report.totalLossAmount + '万元' : '-' }} -
-
- 有无车辆滞留: - {{ getVehicleStrandedText(report) }} -
-
- 滞留车辆: - {{ report.strandedVehicleCount || 0 }}辆 -
-
- 预计恢复时间: - {{ report.expectRecoverTime || '-' }} -
-
- 实际恢复时间: - {{ report.actualRecoverTime || '-' }} -
-
- 现场描述: - {{ report.siteDescription || '-' }} -
+
+ 填报人: + {{ report.reporterName ? report.reporterName : '-' }} +
- -
- 附件: -
- - - {{ file.fileName }} - +
+ 联系电话: + {{ report.phone ? report.phone : '-' }} +
+
+ +
+
+ +
+ + + + {{ report.showDetail ? '点击关闭详情' : '点击查看详情' }} +
@@ -274,8 +242,10 @@ 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 ContinueReport from './WaterDisasterContinueReportPC.vue' import { request } from '@shared/utils/request' +import LossListDetail from './WaterDisasterLossListDetailPC.vue' +import FileUpload from '@/component/FileUpload/FileUpload.vue' import mockData from '../DisasterReport/waterMockJson.json' const router = useRouter() @@ -307,10 +277,15 @@ const continueReport = ref(null) const allReports = computed(() => { const reports = detailData.value.report?.map((item, index) => { - item.title = index === 0 ? '首报' : '续报' + index + if (index === detailData.value.report.length - 1) { + item.title = '首报' + } else { + item.title = '续报' + (detailData.value.report.length - 1 - index) + } return item }) || [] - return reports.reverse() + return reports + // return reports.reverse() }) // 是否有填报数据 @@ -328,14 +303,20 @@ const getEventStatusType = () => { return eventStatus.value === 1 ? 'success' : 'danger' } +const getBaseDisposalMeasures = () => { + const firstItem = allReports.value[0] + if (!firstItem) return '-' + return formatDisposalMeasures(firstItem.disposalMeasures || '') || '-' +} + // 格式化处置措施 const formatDisposalMeasures = (measures) => { if (!measures) return '' const measureMap = { - halfClose: '半幅封闭', - fullClose: '全副封闭', - bypass: '便道通行', - normal: '正常通行' + 半幅封闭: '半幅封闭', + 全副封闭: '全副封闭', + 便道通行: '便道通行', + 正常通行: '正常通行' } return measures .split(',') @@ -381,6 +362,7 @@ const getDisasterDetail = async () => { if (result?.data) { const data = result.data + console.log('🚀 ~ getDisasterDetail ~ data:', data) detailData.value = { event: data.event || null, report: data.report || [], @@ -397,7 +379,7 @@ const getDisasterDetail = async () => { const newFormData = { ...data, lossList: null, - report: mockData.report, + report: route.query.mock ? mockData.report : {}, fileList: null } continueReport.value?.initFormData(newFormData) @@ -416,25 +398,6 @@ 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() }) @@ -502,8 +465,12 @@ onMounted(() => { align-items: flex-start; line-height: 1.5; + & + .info-item { + margin-top: 10px; + } + .info-label { - width: 120px; + white-space: nowrap; flex-shrink: 0; color: #909399; font-size: 14px; @@ -612,7 +579,26 @@ onMounted(() => { margin-right: 10px; } .right-panel { - width: 400px; + width: 300px; } +} +.content-wrapper { + display: flex; + flex-direction: column; +} +.basic-info-wrapper { + display: flex; +} +.detal-info-wrapper { + margin-top: 10px; + border-top: 1px solid #efefef; + padding-top: 10px; +} +.info-list { + flex: 1; + overflow: hidden; +} +.file-list { + } diff --git a/packages/screen/src/views/DisasterManagement/DisasterDetail/WaterDisasterLossListDetailPC.vue b/packages/screen/src/views/DisasterManagement/DisasterDetail/WaterDisasterLossListDetailPC.vue new file mode 100644 index 0000000..aad82ff --- /dev/null +++ b/packages/screen/src/views/DisasterManagement/DisasterDetail/WaterDisasterLossListDetailPC.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/packages/screen/src/views/DisasterManagement/DisasterManagement.vue b/packages/screen/src/views/DisasterManagement/DisasterManagementPC.vue similarity index 85% rename from packages/screen/src/views/DisasterManagement/DisasterManagement.vue rename to packages/screen/src/views/DisasterManagement/DisasterManagementPC.vue index 68edc96..700557d 100644 --- a/packages/screen/src/views/DisasterManagement/DisasterManagement.vue +++ b/packages/screen/src/views/DisasterManagement/DisasterManagementPC.vue @@ -22,9 +22,8 @@ - - - + + @@ -87,20 +86,25 @@ {{ scope.$index + 1 }} - + - - + + - + + + - + @@ -148,6 +152,9 @@ />
+ + +
@@ -156,6 +163,8 @@ import { ref, reactive, onMounted } from 'vue' import { ElMessage } from 'element-plus' import { useRouter } from 'vue-router' import { request } from '@/utils/request' +import { Picture, VideoPlay } from '@element-plus/icons-vue' +import VideoPreviewDialog from '@/component/VideoPreviewDialog.vue' const router = useRouter() @@ -171,6 +180,11 @@ const filterForm = reactive({ pushStatus: '' // 推送状态 }) +const showPreviewImage = ref(false) +const selectedRow = ref(null) + +const videoPreviewDialog = ref(null) + // 日期范围 const dateRange = ref(null) @@ -221,7 +235,7 @@ const fetchData = async () => { // 实际接口调用 const response = await request({ - url: '/snow-ops-platform/unified-disaster/list', + url: '/snow-ops-platform/unified-disaster/pc/list', method: 'get', params }) @@ -313,21 +327,16 @@ const toReport = () => { // 查看图片 const viewImages = (row) => { - if (row.images && row.images.length) { - // 打开图片预览 - ElMessage.info('图片预览功能开发中') - } else { - ElMessage.info('暂无图片') - } + selectedRow.value = row + showPreviewImage.value = true } // 查看视频 const viewVideos = (row) => { - if (row.videos && row.videos.length) { - ElMessage.info('视频播放功能开发中') - } else { - ElMessage.info('暂无视频') - } + videoPreviewDialog.value.show({ + url: row.videos[0], + title: row.eventName + }) } // 分页大小改变 @@ -400,4 +409,4 @@ onMounted(() => { border-top: 1px solid #ebeef5; } } - \ No newline at end of file + diff --git a/packages/screen/src/views/DisasterManagement/DisasterReport/DisasterReport.vue b/packages/screen/src/views/DisasterManagement/DisasterReport/DisasterReportPC.vue similarity index 97% rename from packages/screen/src/views/DisasterManagement/DisasterReport/DisasterReport.vue rename to packages/screen/src/views/DisasterManagement/DisasterReport/DisasterReportPC.vue index b4c9bfb..3bfa6d3 100644 --- a/packages/screen/src/views/DisasterManagement/DisasterReport/DisasterReport.vue +++ b/packages/screen/src/views/DisasterManagement/DisasterReport/DisasterReportPC.vue @@ -16,7 +16,7 @@ import { useRouter, useRoute } from 'vue-router' import { ElMessage, ElMessageBox } from 'element-plus' import { Plus, Upload } from '@element-plus/icons-vue' import { request } from '@/utils/request' -import WaterDisasterReport from './WaterDisasterReport.vue' +import WaterDisasterReport from './WaterDisasterReportPC.vue' const router = useRouter() const route = useRoute() diff --git a/packages/screen/src/views/DisasterManagement/DisasterReport/LossList.vue b/packages/screen/src/views/DisasterManagement/DisasterReport/WaterDisasterLossListPC.vue similarity index 100% rename from packages/screen/src/views/DisasterManagement/DisasterReport/LossList.vue rename to packages/screen/src/views/DisasterManagement/DisasterReport/WaterDisasterLossListPC.vue diff --git a/packages/screen/src/views/DisasterManagement/DisasterReport/WaterDisasterReport.vue b/packages/screen/src/views/DisasterManagement/DisasterReport/WaterDisasterReportPC.vue similarity index 90% rename from packages/screen/src/views/DisasterManagement/DisasterReport/WaterDisasterReport.vue rename to packages/screen/src/views/DisasterManagement/DisasterReport/WaterDisasterReportPC.vue index f494c67..d37522d 100644 --- a/packages/screen/src/views/DisasterManagement/DisasterReport/WaterDisasterReport.vue +++ b/packages/screen/src/views/DisasterManagement/DisasterReport/WaterDisasterReportPC.vue @@ -35,8 +35,8 @@ - - + + @@ -77,8 +77,8 @@ - - + + @@ -206,35 +206,14 @@ - + - - - -
只能上传jpg/png格式,且不超过500kb
+
- + - - 选择文件 - -
仅支持20s内的视频,不超过20MB
-
- -
+
@@ -307,24 +286,33 @@ - - 台/班 + + + - - 人次 + + + - - 万元 + + + @@ -351,7 +339,7 @@ - + @@ -383,9 +371,9 @@ import { ElMessage } from 'element-plus' import { Plus, Upload } from '@element-plus/icons-vue' import mockData from './waterMockJson.json' import { request } from '@/utils/request' -import LossList from './LossList.vue' +import LossList from './WaterDisasterLossListPC.vue' import BlockItem from '@/component/BlockItem.vue' -import { el } from 'element-plus/es/locale/index.mjs' +import FileUpload from '@/component/FileUpload/FileUpload.vue' const router = useRouter() const route = useRoute() @@ -402,6 +390,8 @@ const disposalMeasuresArray = ref([]) const imageFileList = ref([]) const videoFileList = ref([]) +const eventType = ref('水毁事件') + const formData = reactive({ // 顶层字段 occurLocation: null, // 发生地点/路况位置 @@ -417,17 +407,13 @@ const formData = reactive({ contactPhone: null, // 联系电话 damageCount: null, // 水毁处数 district: null, // 上报区县 - endStakeLat: null, // 止点纬度 - endStakeLng: null, // 止点经度 endStakeNo: null, // 止点桩号 estimatedRecoveryCost: null, // 恢复重建预估费用 inspectionMileage: null, // 巡查里程 isBlocked: null, // 是否阻断 needsRecovery: null, // 是否需要恢复重建 - repairProgress: null, // 抢修进度 + repairProgress: null, // 抢险进度 reporterUnit: null, // 填报单位 - startStakeLat: null, // 起点纬度 - startStakeLng: null, // 起点经度 startStakeNo: null // 起点桩号 }, @@ -635,7 +621,12 @@ const handleSubmit = async () => { // 加载编辑数据 const loadEditData = async () => { - initFormData(mockData) + + if(route.query.mock) { + initFormData(mockData) + } else { + initFormData({}) + } } onMounted(() => { diff --git a/packages/screen/src/views/DisasterManagement/DisasterReport/waterMockJson.json b/packages/screen/src/views/DisasterManagement/DisasterReport/waterMockJson.json index ce32ea7..b4b555f 100644 --- a/packages/screen/src/views/DisasterManagement/DisasterReport/waterMockJson.json +++ b/packages/screen/src/views/DisasterManagement/DisasterReport/waterMockJson.json @@ -10,17 +10,13 @@ "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": "抢修中", + "repairProgress": "抢险中", "reporterUnit": "武侯区交通运输局", - "startStakeLat": "30.652145", - "startStakeLng": "104.075632", "startStakeNo": "K2250+300" }, "report": { @@ -28,7 +24,7 @@ "strandedPersonCount": 12, "deadCount": 0, "strandedVehicleCount": 12, - "disposalMeasures": "halfClose,bypass", + "disposalMeasures": "全幅封闭", "actualRecoverTime": "2024-07-17 12:00:00", "expectRecoverTime": "2024-07-18 18:00:00", "injuredCount": 1, diff --git a/packages/screen/src/views/LedgerManagement/index.js b/packages/screen/src/views/LedgerManagement/index.js index b386f22..784c27d 100644 --- a/packages/screen/src/views/LedgerManagement/index.js +++ b/packages/screen/src/views/LedgerManagement/index.js @@ -1,6 +1,7 @@ import { h, ref, onMounted, reactive, watch, toRaw, nextTick } from "vue"; import { request } from "@/utils/request"; import { useRoute, useRouter } from 'vue-router' +import { ElMessage } from "element-plus"; const tableData = ref([]); // 表格数据 @@ -18,7 +19,7 @@ const model = reactive({ const form = reactive({ }); const INIT_FORM = { - + }; // 抽屉内容 const drawer = reactive({ @@ -35,101 +36,105 @@ const drawerRef = ref(null); // 抽屉实例 const columns = [ { - prop: "xxx", + prop: "county", label: "所属区县", }, { - prop: "xxx", + prop: "projectName", label: "项目名称", }, { - prop: "xxx", + prop: "siteName", label: "驻地名称", }, { - prop: "xxx", + prop: "siteType", label: "驻地类型", }, { - prop: "xxx", + prop: "coordinatePoint", label: "坐标点位", }, { - prop: "xxx", + prop: "subProjectName", label: "所属项目名称", }, { - prop: "xxx", + prop: "projectType", label: "项目类型", }, { - prop: "xxx", + prop: "constructionUnit", label: "建设单位", }, { - prop: "xxx", + prop: "constructionCompany", label: "施工单位", }, { - prop: "xxx", + prop: "siteAddress", label: "驻地地址", }, { - prop: "xxx", + prop: "town", + label: "乡镇名称", + }, + { + prop: "streetName", + label: "街道名称", + }, + { + prop: "administrativeRegion", label: "行政区域", }, { - prop: "xxx", + prop: "sitePopulation", label: "驻地人数", }, { - prop: "xxx", + prop: "riskLevel", label: "驻地风险等级", }, { - prop: "xxx", + prop: "buildingType", label: "房建类型", }, { - prop: "xxx", + prop: "relocationStatus", label: "搬迁状态", }, { - prop: "xxx", label: "吹哨人/电话", + formatter: (row) => `${row.whistleblowerName || ''}/${row.whistleblowerPhone || ''}`, }, { - prop: "xxx", label: "建设单位包保责任人/电话", + formatter: (row) => `${row.ownerResponsiblePerson || ''}/${row.ownerResponsiblePhone || ''}`, }, { - prop: "xxx", label: "施工单位包保责任人/电话", + formatter: (row) => `${row.constructorResponsiblePerson || ''}/${row.constructorResponsiblePhone || ''}`, }, { - prop: "xxx", label: "驻地包保责任人/电话", + formatter: (row) => `${row.siteResponsiblePerson || ''}/${row.siteResponsiblePhone || ''}`, }, { - prop: "xxx", label: "区县级包保责任人/电话", + formatter: (row) => `${row.districtResponsiblePerson || ''}/${row.districtResponsiblePhone || ''}`, }, { - prop: "xxx", label: "市级包保责任人/电话", + formatter: (row) => `${row.cityResponsiblePerson || ''}/${row.cityResponsiblePhone || ''}`, }, { - prop: "xxx", + prop: "remarks", label: "备注", }, ] // 过滤条件 -const filterData = reactive({ - title: "", - type: "", - warningLevel: "", -}) +const filterData = reactive({}) // 分页 const pagination = reactive({ current: 1, @@ -145,17 +150,33 @@ const pagination = reactive({ }); // 获取列表 -const getTableData = async (filterData) => { +const getTableData = async (filterData = {}) => { try { + // 过滤空字符串属性 + const filteredParams = {}; + Object.keys(filterData).forEach(key => { + if (filterData[key] !== '' && filterData[key] != null) { + filteredParams[key] = filterData[key]; + } + }); const res = await request({ - url: '', + url: '/snow-ops-platform/site-ledger/list', method: "GET", params: { - + ...filteredParams, + pageNum: pagination.current, + pageSize: pagination.pageSize, } }) + if (res.code === '00000') { + tableData.value = res.data.records + pagination.total = res.data.total + } else { + throw new Error(res.message) + } } catch (error) { - + ElMessage.error(error.message) + console.error('获取列表失败:', error); } } @@ -182,8 +203,31 @@ const warningLevelOptions = [ ] +const exportExcel = async () => { + try { + const res = await request({ + url: '/snow-ops-platform/site-ledger/export', + method: 'GET' + }) + } catch (error) { + + } +} + + export default () => { + + onMounted(() => { + getTableData(); + }) + + + watch(filterData, (val) => { + getTableData(filterData); + }, { deep: true }) + + return { modelVisible, model, @@ -197,5 +241,7 @@ export default () => { filterData, pagination, columns, + + exportExcel, } } \ No newline at end of file diff --git a/packages/screen/src/views/LedgerManagement/index.vue b/packages/screen/src/views/LedgerManagement/index.vue index 868917f..ec6de9c 100644 --- a/packages/screen/src/views/LedgerManagement/index.vue +++ b/packages/screen/src/views/LedgerManagement/index.vue @@ -1,37 +1,37 @@ + + + + \ No newline at end of file diff --git a/packages/screen/src/views/ProjectManagement_Rebuild/business/index.js b/packages/screen/src/views/ProjectManagement_Rebuild/business/index.js new file mode 100644 index 0000000..0625aaa --- /dev/null +++ b/packages/screen/src/views/ProjectManagement_Rebuild/business/index.js @@ -0,0 +1,447 @@ +import { h, ref, onMounted, reactive, watch, toRaw, nextTick } from "vue"; +import { request } from "@/utils/request"; +import { useRoute, useRouter } from 'vue-router' +import ExamineDialog from "./examineDialog.vue"; +import RejectDialog from './rejectDialog.vue'; + +const tableData = ref([]); // 表格数据 +const modelVisible = ref(false); // 弹窗状态 +const drawerVisible = ref(false); // 抽屉状态 +// 弹窗内容 +const model = reactive({ + title: '', + content: null, + props: {}, + onCancel: null, + onConfirm: null, + width: '', + footerPosition: null, + onCancelType: null, + onConfirmName: null, + onCancelName: null, + tagContent: null, + tagType: null, +}); +const form = reactive({ +}); +// 抽屉内容 +const drawer = reactive({ + title: '', + content: null, + props: {}, + onCancel: null, + onConfirm: null, + direction: 'rtl', + size: '50%' +}); +const dialogRef = ref(null); // 弹窗实例 +const drawerRef = ref(null); // 抽屉实例 + +// 第二个弹窗 +const model2 = reactive({ + title: '', + content: null, + props: {}, + onCancel: null, + onConfirm: null, + width: '', + footerPosition: null, + onCancelType: null, + onConfirmName: null, + onCancelName: null, + tagContent: null, + tagType: null, +}); +const modelVisible2 = ref(false); +const dialogRef2 = ref(null); + + + +// 过滤条件 +const filterData = reactive({ +}) +// 分页 +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 filteredParams = {}; + Object.keys(filterData).forEach(key => { + if (filterData[key] !== '' && filterData[key] != null) { + filteredParams[key] = filterData[key]; + } + }); + + const res = await request({ + url: '/snow-ops-platform/recovery/list', + method: "GET", + params: { + ...filteredParams, + submitTimeStart: filteredParams?.submitTimeStart ? filteredParams.submitTimeStart + `-01-01 00:00:00` : null, + pageNum: pagination.current, + pageSize: pagination.pageSize, + } + }) + if (res.code === '00000') { + tableData.value = res.data.records + pagination.total = res.data.total + } else { + throw new Error(res.message) + } + } catch (error) { + ElMessage.error('获取项目列表失败'); + console.error('获取项目列表失败:', error); + } +} + + + + +// 驳回项目 +const rejectProject = async () => { + try { + const loading = ElLoading.service({ + lock: true, + text: '操作中', + background: 'rgba(0, 0, 0, 0.7)', + }) + const res = await request({ + url: '/snow-ops-platform/recovery/approve', + method: 'POST', + data: { + id: form.id, + approveLevel: 2, + isPass: false, + rejectReason: form.rejectReason, + } + }) + loading.close(); + if (res.code === '00000') { + ElMessage.success('操作成功'); + modelVisible.value = false; + modelVisible2.value = false; + getTableData(filterData); + } + } catch (error) { + ElMessage.error('操作失败'); + console.error('驳回项目失败:', error); + } +} + +// 审批通过项目 +const approveProject = async () => { + try { + const loading = ElLoading.service({ + lock: true, + text: '操作中', + background: 'rgba(0, 0, 0, 0.7)', + }) + const res = await request({ + url: '/snow-ops-platform/recovery/approve', + method: 'POST', + data: { + id: form.id, + approveLevel: 2, + isPass: true, + } + }) + loading.close(); + if (res.code === '00000') { + ElMessage.success('操作成功'); + modelVisible.value = false; + modelVisible2.value = false; + getTableData(filterData); + } + } catch (error) { + ElMessage.error('操作失败'); + console.error('审批项目失败:', error); + } +} + +// 获取项目详情 +const getDetailData = async (id) => { + try { + const res = await request({ + url: `/snow-ops-platform/recovery/getById`, + method: 'GET', + params: { + id: id, + } + }); + if (res.code === '00000') { + return res.data; + } else { + throw new Error(res.message); + } + } catch (error) { + ElMessage.error('获取项目详情失败'); + console.error('获取项目详情失败:', error); + } +} + + + + + +export default () => { + + const router = useRouter(); + + // 记录访问的项目管理模块 + onMounted(() => { + sessionStorage.setItem('lastVisitedProjectManagement', 'projectManagement2') + }) + + const columns = [ + { + prop: "districtName", + label: "区县", + }, + { + prop: "routeNo", + label: "路线编码", + }, + // { + // prop: "disasterType", + // label: "灾害类型", + // }, + { + prop: "startStakeNo", + label: "起点桩号", + }, + { + prop: "endStakeNo", + label: "止点桩号", + }, + { + prop: "implementMileage", + label: "实施里程(公里)", + }, + // { + // prop: "technicalGrade", + // label: "技术等级", + // }, + { + prop: "totalInvestment", + label: "总投资金额(万元)", + }, + { + prop: "estimatedCost", + label: "投资估算(万元)", + }, + { + prop: "subsidyAmount", + label: "补助金额(万元)", + }, + { + prop: "fundingSource", + label: "资金来源", + }, + { + prop: "startTime", + label: "开工或预计开工时间", + }, + { + prop: "endTime", + label: "完工或预计完工时间", + }, + { + prop: "projectProgress", + label: "项目进度情况", + }, + // { + // prop: "reportStatus", + // label: "申报状态", + // formatter: (row) => { + // const colorMap = { + // 0: '#409EFF', // 蓝色 - 未申报 + // 1: '#67C23A', // 绿色 - 已申报 + // }; + // const textMap = { + // 0: '未申报', + // 1: '已申报', + // }; + // const status = row.reportStatus; + // const color = colorMap[status] || '#909399'; + // const text = textMap[status] || '未知状态'; + // return h(ElText, { style: { color } }, text); + // } + // }, + { + prop: "approvalStatus", + width: 150, + label: "审批状态", + formatter: (row) => { + const colorMap = { + 0: '#409EFF', // 蓝色 - 待区县审批 + 1: '#67C23A', // 绿色 - 区县审批通过 + 2: '#F56C6C', // 红色 - 区县审批驳回 + 3: '#67C23A', // 绿色 - 业务部门审批通过 + 4: '#F56C6C', // 红色 - 业务部门审批驳回 + }; + const textMap = { + 0: '待区县审批', + 1: '区县审批通过(待业务部门审批)', + 2: '区县审批驳回', + 3: '业务部门审批通过', + 4: '业务部门审批驳回', + }; + const status = row.approvalStatus; + const color = colorMap[status] || '#909399'; + const text = textMap[status] || '未知状态'; + return h(ElText, { style: { color } }, text); + } + }, + { + prop: "updateTime", + label: "更新日期", + }, + { + label: "操作", + fixed: "right", + width: 150, + render: (row) => () => + h("div", { class: "action-btns" }, [ + row.approvalStatus === 1 ? h( + ElButton, + { + type: "primary", + link: true, + onClick: async () => { + openExamineDialog(row); + }, + }, + () => "审批" + ) : null, + h( + ElButton, + { + type: "primary", + link: true, + style: row.approvalStatus === 1 ? "margin-left: 10px;" : "", + onClick: async () => { + gotoDetaillPage(row); + }, + }, + () => "详情" + ), + ]), + }, + ] + + // 打开审批弹窗 + const openExamineDialog = async (row) => { + const data = await getDetailData(row.id) + model.title = '项目审批'; + Object.assign(form, data); + model.props = { + form: form, + }; + model.content = ExamineDialog; + model.onCancel = () => { + model2.title = '驳回原因'; + model2.props = { + form: form, + } + model2.content = RejectDialog; + model2.onCancel = () => { + modelVisible2.value = false; + } + model2.onConfirm = async () => { + await dialogRef2?.value?.dynamicComponentRef?.formRef.validate().then(async () => { + await rejectProject() + }) + .catch((err) => { + ElMessage.error('请处理表单中的错误项'); + }); + + } + model2.width = '30%' + model2.footerPosition = 'center' + model2.onConfirmName = '确定' + model2.onCancelName = '取消' + modelVisible2.value = true; + }; + model.onConfirm = async () => { + await dialogRef?.value?.dynamicComponentRef?.formRef.validate().then(async () => { + try { + await ElMessageBox.confirm( + '确定该项目申请通过恢复重建?', + '审批确认', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + } + ); + await approveProject(); + } catch { + ElMessage.info('已取消审批'); + } + }) + .catch((err) => { + ElMessage.error('请处理表单中的错误项'); + }); + }; + model.width = "50%" + model.footerPosition = 'flex-end' + model.onCancelType = 'danger' + model.onConfirmName = '审批通过' + model.onCancelName = '审批驳回' + // model.tagType = 'warning' + // model.tagContent = '测试' + modelVisible.value = true; + } + + // 跳转至详情页面 + const gotoDetaillPage = (row) => { + router.push({ + name: 'projectDetail2', + params: { + data: encodeURIComponent(JSON.stringify(row.id)) + } + }) + } + + onMounted(() => { + getTableData(); + }) + + + watch(filterData, (val) => { + getTableData(filterData); + }, { deep: true }) + + + return { + tableData, + filterData, + pagination, + columns, + + modelVisible, + model, + drawerVisible, + drawer, + dialogRef, + drawerRef, + openExamineDialog, + + model2, + modelVisible2, + dialogRef2, + } +} \ No newline at end of file diff --git a/packages/screen/src/views/ProjectManagement_Rebuild/index.vue b/packages/screen/src/views/ProjectManagement_Rebuild/business/index.vue similarity index 59% rename from packages/screen/src/views/ProjectManagement_Rebuild/index.vue rename to packages/screen/src/views/ProjectManagement_Rebuild/business/index.vue index 66bc244..8dbc588 100644 --- a/packages/screen/src/views/ProjectManagement_Rebuild/index.vue +++ b/packages/screen/src/views/ProjectManagement_Rebuild/business/index.vue @@ -1,8 +1,8 @@