mcfxkh-Web/src/views/Home/panels/Skzl/index.js

198 lines
7.1 KiB
JavaScript
Raw Normal View History

2025-06-11 11:08:10 +08:00
import React, { useEffect, useMemo, useState } from 'react';
2025-06-12 11:45:21 +08:00
import { Switch, Collapse, Table, TableContainer, TableBody, TableHead, TableRow, TableSortLabel } from '@material-ui/core/index'
2025-06-11 11:08:10 +08:00
import DpTableCell from '../../../../layouts/mui/DpTableCell';
import DpTableRow from '../../../../layouts/mui/DpTableRow';
2025-06-04 20:45:32 +08:00
import PanelBox from '../../components/PanelBox';
2025-06-11 11:08:10 +08:00
import { parseGeoJSON } from "../../../../utils/tools";
import { SkRealPromise } from "../../../../models/_/real";
import { useDispatch, useSelector } from 'react-redux';
import CountPage from './countPage'
import CollapsePage from './collapsePage'
2025-06-04 20:45:32 +08:00
function DrpReal({ style }) {
2025-06-12 11:45:21 +08:00
const [dimension, setDimension] = useState('ft');
const [skData, setSkData] = useState([])
const [skType, setSkType] = useState('')
const [sort, setSort] = useState(true)
const [sort1, setSort1] = useState(true)
2025-06-11 11:08:10 +08:00
const dispatch = useDispatch();
2025-06-12 11:45:21 +08:00
const tableData = useMemo(() => {
if (skType === '1') {
return (skData.filter(o => o.w > 10000) || []).sort((a, b) => sort ? (b.w - a.w) : (a.w - b.w))
2025-06-11 11:08:10 +08:00
}
2025-06-12 11:45:21 +08:00
if (skType === '2') {
return (skData.filter(o => o.w > 100 && o.w <= 10000) || []).sort((a, b) => sort ? (b.w - a.w) : (a.w - b.w))
2025-06-11 11:08:10 +08:00
}
2025-06-12 11:45:21 +08:00
if (skType === '3') {
const filterSkData = skData.filter(o => o.w > 0.375 && o.w <= 100) || [];
const newFilterData = filterSkData.map(item => ({ ...item, xs: (item.w * 0.6).toFixed(2) }))
return newFilterData.sort((a, b) => sort ? (b.w - a.w) : (a.w - b.w))
2025-06-11 11:08:10 +08:00
}
2025-06-12 11:45:21 +08:00
if (skType === '4') {
const filterSkData = skData.filter(o => o.w >= 0 && o.w <= 0.375) || [];
const newFilterData = filterSkData.map(item => ({ ...item, xs: (item.w * 0.6).toFixed(2) }))
return newFilterData.sort((a, b) => sort ? (b.w - a.w) : (a.w - b.w))
2025-06-11 11:08:10 +08:00
}
return []
2025-06-12 11:45:21 +08:00
}, [skData, skType, sort, sort1])
2025-06-04 20:45:32 +08:00
2025-06-11 11:08:10 +08:00
const skTypeObj = [
2025-06-12 14:17:03 +08:00
{ type: '1', name: '大型水库', num1: 3, num2: 7.93,num3:8.73,icon:'大型水库.png' },//8.735
{ type: '2', name: '中型水库', num1: 7, num2: 0.51,num3:1.62,icon:'中.png' },
{ type: '3', name: '小(1)型水库', num1: 44, num2: 31.54,num3:52.61 ,icon:'小1.png'},
{ type: '4', name: '小(2)型水库', num1: 207, num2: 10.11,num3:16.91 ,icon:'小1.png'},
2025-06-11 11:08:10 +08:00
]
2025-06-12 11:45:21 +08:00
useEffect(() => {
2025-06-11 11:08:10 +08:00
getSkData()
2025-06-11 11:29:32 +08:00
// return ()=>{
// const map = window.__mapref;
// const layer = map.getLayer('临时水库tz')
// if(layer){
// map.removeLayer('临时水库tz');
// map.removeSource('临时水库tz');
// }
// }
2025-06-12 11:45:21 +08:00
}, [])
2025-06-11 11:08:10 +08:00
2025-06-12 11:45:21 +08:00
const getSkData = async () => {
2025-06-11 11:08:10 +08:00
const data = await SkRealPromise.get();
setSkData(data)
}
2025-06-12 11:45:21 +08:00
const flyTo = (row) => {
2025-06-11 11:08:10 +08:00
const { lgtd, lttd } = row;
if (lgtd && lttd) {
2025-06-12 11:45:21 +08:00
// dispatch.runtime.setFeaturePop({ type: 'RealSkPop', properties: row, coordinates: [row.lgtd, row.lttd] });
dispatch.runtime.setCameraTarget({
center: [lgtd, lttd + 0.005],
2025-06-11 11:08:10 +08:00
zoom: 15,
pitch: 50,
bearing: 0
2025-06-12 11:45:21 +08:00
});
2025-06-11 11:08:10 +08:00
}
}
2025-06-12 11:45:21 +08:00
const setSkLayer = (data = []) => {
2025-06-11 11:08:10 +08:00
const map = window.__mapref;
const layer = map.getLayer('临时水库tz')
2025-06-12 11:45:21 +08:00
if (layer) {
2025-06-11 11:08:10 +08:00
map.removeLayer('临时水库tz');
map.removeSource('临时水库tz');
}
2025-06-12 11:45:21 +08:00
if (data.length === 0) { return }
2025-06-11 11:08:10 +08:00
map.addLayer({
2025-06-12 11:45:21 +08:00
'id': '临时水库tz',//+new Date().getTime(),
'type': 'symbol',
'source': {
'type': 'geojson',
'data': {
'type': 'FeatureCollection',
'features': [],
2025-06-11 11:08:10 +08:00
},
2025-06-12 11:45:21 +08:00
},
'layout': {
// 'icon-allow-overlap': true,
// 'text-allow-overlap': true,
'icon-image': '水库', // 从properties中动态读取icon字段
'icon-size': [
'interpolate', ['linear'], ['zoom'],
10, 0.8,
14, 0.8,
],
'text-size': [
'interpolate', ['linear'], ['zoom'],
5, 10,
14, 14,
],
'text-font': ['Roboto Black'],
'text-field': [
'step',
['zoom'],
'',
8, ['get', 'stnm']
],
'text-anchor': 'top',
'text-offset': [0, 1],
},
'paint': {
'text-color': '#fff'
},
'visibility': 'visible',
2025-06-11 11:08:10 +08:00
});
map.getSource('临时水库tz').setData(parseGeoJSON(data))
}
2025-06-04 20:45:32 +08:00
2025-06-12 11:45:21 +08:00
return (
2025-06-04 20:45:32 +08:00
<PanelBox
style={style}
title="水库总览"
color="green"
>
2025-06-12 11:45:21 +08:00
<CountPage />
2025-06-11 11:08:10 +08:00
{
2025-06-12 11:45:21 +08:00
skTypeObj.map((item) =>
(<>
2025-06-12 14:50:40 +08:00
<CollapsePage type={item.type} name={item.name} num1={item.num1} num2={`${item.num2}/${item.num3}`} skType={skType} setSkType={setSkType} icon={item.icon} />
2025-06-12 11:45:21 +08:00
<Collapse in={skType === item.type} timeout="auto" unmountOnExit>
<TableContainer style={{ maxHeight: 'calc( 100vh - 28.2rem )' }}>
<Table size="small" stickyHeader>
<TableHead>
<TableRow>
<DpTableCell style={{ minWidth: '3rem' }} align="left">序号</DpTableCell>
<DpTableCell style={{ minWidth: '8rem' }} align="center">水库名称</DpTableCell>
<DpTableCell style={{ minWidth: '8rem' }} align="center">类型</DpTableCell>
<DpTableCell style={{ minWidth: '8rem' }} align="center">
{/* <TableSortLabel
onClick={() => setSort1(!sort1)}
2025-06-11 11:08:10 +08:00
active={true}
2025-06-12 11:45:21 +08:00
direction={sort1?'desc':'asc'}>
{'蓄水量(万m³)'}
</TableSortLabel> */}
蓄水量(万m³)
</DpTableCell>
<DpTableCell style={{ minWidth: '8rem' }} align="center">
<TableSortLabel
onClick={() => setSort(!sort)}
active={true}
direction={sort ? 'desc' : 'asc'}>
{'库容(万m³)'}
</TableSortLabel>
</DpTableCell>
</TableRow>
</TableHead>
{
tableData.map((tableRow, index) =>
2025-06-11 11:08:10 +08:00
<TableBody>
<DpTableRow key={tableRow.stcd}>
2025-06-12 11:45:21 +08:00
<DpTableCell align="center" >{index + 1}</DpTableCell>
2025-06-11 11:08:10 +08:00
<DpTableCell align="center" >
2025-06-12 11:45:21 +08:00
<div className="table-ellipsis cursor-pointer" onClick={() => {
flyTo(tableRow)
setSkLayer([tableRow])
}}>
{tableRow.stnm}
</div>
2025-06-11 11:08:10 +08:00
</DpTableCell>
<DpTableCell align="center" >{item.name}</DpTableCell>
2025-06-12 11:45:21 +08:00
<DpTableCell align="center" >{tableRow.xs}</DpTableCell>
2025-06-11 11:08:10 +08:00
<DpTableCell align="center" >{tableRow.w}</DpTableCell>
</DpTableRow>
</TableBody>
2025-06-12 11:45:21 +08:00
)
}
</Table>
</TableContainer>
</Collapse>
</>)
2025-06-11 11:08:10 +08:00
)
}
2025-06-04 20:45:32 +08:00
</PanelBox>
)
2025-06-12 11:45:21 +08:00
}
2025-06-04 20:45:32 +08:00
export default DrpReal;