merge: 合并冲突

lsf-dev
李神峰 2025-06-05 18:06:53 +08:00
commit 0ef113ca63
58 changed files with 19785 additions and 151 deletions

BIN
public/assets/duibi2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
public/assets/gantanh.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

BIN
public/assets/gaoguan.mp4 Normal file

Binary file not shown.

BIN
public/assets/pietl.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
public/assets/shuikugh.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

BIN
public/assets/sjti2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
public/assets/sjtj1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
public/assets/sjyf.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
public/assets/xcxq.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@ -70,6 +70,14 @@
"y": 0,
"pixelRatio": 1,
"visible": true
},
"巡查": {
"width": 32,
"height": 32,
"x": 128,
"y": 32,
"pixelRatio": 1,
"visible": true
},
"水库-离线": {
"width": 32,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -467,8 +467,7 @@ const map = {
dispatch.runtime.setLayerSetting({ planeArea: null });
dispatch.map.setLayerVisible({ ContourLayer: false });
}
if (id === 201 || id === 205) {
if (id === 201) {
dispatch.map.setLayerSetting({ dom: false });
map.setLayoutProperty('热力图', 'visibility', 'visible');
} else {

View File

@ -95,7 +95,7 @@ export default function calcLayout(view, rightStack, hidePanels) {
} else if (view === 206) {
left = [
{ key: '天气' },
{ key: '水库管理', style: { height: '40rem', flexGrow: 1 } },
{ key: '巡查任务总览', style: { height: '40rem', flexGrow: 1 } },
];
leftFullHeight = true;
} else if (view === 207) {
@ -289,7 +289,8 @@ export default function calcLayout(view, rightStack, hidePanels) {
];
} else if (view === 206) {
right = [
{ key: '警报' },
{ key: '巡查问题看板', style: { height: '70%', flexGrow: 1 } },
{ key: '水库管护', style: { height: '10rem', flexGrow: 1 } },
];
} else if (view === 207) {
right = [

View File

@ -5,7 +5,7 @@ import {
Box,
} from '@material-ui/core';
import { makeStyles } from '@material-ui/core/styles';
import clsx from "clsx"
import PlayArrowIcon from '@material-ui/icons/PlayArrow';
import PauseIcon from '@material-ui/icons/Pause';
@ -35,15 +35,33 @@ const useStyles = makeStyles((theme) => ({
display: 'flex',
alignItems: 'center',
gap: theme.spacing(2),
},
controls1: {
position: 'absolute',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
padding: theme.spacing(2),
background: 'rgba(0,0,0,0.7)',
borderRadius: theme.spacing(1),
display: 'flex',
alignItems: 'center',
gap: theme.spacing(2),
width: '800px',
maxWidth: '90%',
pointerEvents: 'none',
},
playButton: {
color: '#fff',
pointerEvents: 'auto',
'&:hover': {
backgroundColor: 'rgba(255,255,255,0.1)',
},
},
slider: {
color: '#1976d2',
pointerEvents: 'auto',
flex: 1,
'& .MuiSlider-rail': {
backgroundColor: 'rgba(255,255,255,0.3)',
@ -65,6 +83,7 @@ const useStyles = makeStyles((theme) => ({
fontSize: '0.875rem',
minWidth: 100,
textAlign: 'right',
pointerEvents: 'auto',
},
dateDisplay: {
position: 'absolute',
@ -75,9 +94,13 @@ const useStyles = makeStyles((theme) => ({
fontWeight: 500,
textShadow: '1px 1px 2px rgba(0,0,0,0.5)',
},
odd: {
zIndex: 1,
position: 'absolute'
}
}));
const VideoPlayer = ({ videoUrl, date }) => {
const VideoPlayer = ({ videoUrl, date,odd=false }) => {
const classes = useStyles();
const [playing, setPlaying] = useState(false);
const [progress, setProgress] = useState(0);
@ -120,7 +143,7 @@ const VideoPlayer = ({ videoUrl, date }) => {
};
return (
<div className={classes.root}>
<div className={clsx({[classes.root]:true,[classes.odd]:odd})}>
<div className={classes.videoContainer}>
<video
ref={videoRef}

View File

@ -5,7 +5,7 @@ import { makeStyles } from '@material-ui/core/styles';
const useStyles = makeStyles(() => ({
card: {
marginBottom: '16px',
// backgroundColor: '#fff',
backgroundColor: 'transparent',
'&:hover': {
boxShadow: '0 4px 12px rgba(0,0,0,0.1)'
}

View File

@ -5,7 +5,7 @@ import { makeStyles } from '@material-ui/core/styles';
const useStyles = makeStyles(() => ({
card: {
marginBottom: '16px',
// backgroundColor: '#fff',
backgroundColor: 'transparent',
'&:hover': {
boxShadow: '0 4px 12px rgba(0,0,0,0.1)'
}

View File

@ -43,7 +43,7 @@ const useStyles = makeStyles((theme) => ({
},
statsContainer: {
marginTop: theme.spacing(2),
backgroundColor: 'rgba(0, 0, 0, 0.2)',
backgroundColor: 'transparent',
borderRadius: theme.shape.borderRadius,
padding: theme.spacing(2)
},
@ -81,55 +81,55 @@ const useStyles = makeStyles((theme) => ({
const RainfallMonitor = () => {
const rainfallList = [
{
time: '2020-07-25 00:00:00',
time: '2024-12-10 10:00:00',
rainfall: 1.5,
magnified: 3,
simulated: 4.5
},
{
time: '2020-07-25 01:00:00',
time: '2024-12-10 11:00:00',
rainfall: 1.5,
magnified: 3,
simulated: 4.5
},
{
time: '2020-07-25 02:00:00',
time: '2024-12-10 12:00:00',
rainfall: 4.5,
magnified: 9,
simulated: 13.5
},
{
time: '2020-07-25 03:00:00',
time: '2024-12-10 13:00:00',
rainfall: 1.5,
magnified: 3,
simulated: 4.5
},
{
time: '2020-07-25 04:00:00',
time: '2024-12-10 14:00:00',
rainfall: 1.5,
magnified: 3,
simulated: 4.5
},
{
time: '2020-07-25 05:00:00',
time: '2024-12-10 15:00:00',
rainfall: 0,
magnified: 0,
simulated: 0
},
{
time: '2020-07-25 06:00:00',
time: '2024-12-10 16:00:00',
rainfall: 1.5,
magnified: 3,
simulated: 4.5
},
{
time: '2020-07-25 07:00:00',
time: '2024-12-10 17:00:00',
rainfall: 1.5,
magnified: 3,
simulated: 4.5
},
{
time: '2020-07-25 08:00:00',
time: '2024-12-10 18:00:00',
rainfall: 3,
magnified: 6,
simulated: 9
@ -163,10 +163,10 @@ const RainfallMonitor = () => {
<Table>
<TableHead>
<TableRow>
<TableCell>时间</TableCell>
<TableCell>面雨量(mm)</TableCell>
<TableCell>放大量(mm)</TableCell>
<TableCell>预演面雨量(mm)</TableCell>
<TableCell style={{width:'37%'}}>时间</TableCell>
<TableCell style={{width:'20%'}}>面雨量(mm)</TableCell>
<TableCell style={{width:'20%'}}>放大量(mm)</TableCell>
<TableCell style={{width:'20%'}}>预演面雨量(mm)</TableCell>
</TableRow>
</TableHead>
<TableBody>
@ -202,7 +202,7 @@ const RainfallMonitor = () => {
))}
</Box>
<Box className={classes.statsRow}>
<Typography variant="subtitle2" style={{ color: "#fff", width: '120' }}></Typography>
<Typography variant="subtitle2" style={{ color: "#fff", width: '80px' }}></Typography>
{['>102.0', '>125.0', '>141.0', '>163.0', '>188.0'].map((threshold, index) => (
<Box key={index} display="flex" flexDirection="column" alignItems="center">
<Typography variant="body2">{threshold}</Typography>

View File

@ -31,6 +31,7 @@ import ShuizhiLayer from '../../MapCtrl/mapstyle/shuizhilayer';
import TrsqLayer from '../../MapCtrl/mapstyle/trsqlayer';
import ShuichangLayer from '../../MapCtrl/mapstyle/shuichangLayer'
import ShuiyuandiLayer from '../../MapCtrl/mapstyle/shuiyuandiLayer'
import XunchaLayer from '../../MapCtrl/mapstyle/xunchalayer';
@ -149,6 +150,9 @@ function LayersDlg({ onClose }) {
<div className={classes.catItem}>
<RowItem icon="水源地" label="水源地" name={ShuiyuandiLayer.LayerName} checked={!!layerVisible[ShuiyuandiLayer.LayerName]} onChange={layerVisibleChanged} />
</div>
<div className={classes.catItem}>
<RowItem icon="巡查" label="巡查" name={XunchaLayer.LayerName} checked={!!layerVisible[XunchaLayer.LayerName]} onChange={layerVisibleChanged} />
</div>
</div>
<div className={classes.catRoot}>

View File

@ -0,0 +1,41 @@
import React from 'react';
import DpTab from '../../../../layouts/mui/DpTab';
import Dialog from '@material-ui/core/Dialog';
import DialogContent from '@material-ui/core/DialogContent';
import DpPaperComponent from '../../../../layouts/mui/DpPaperCompanent';
import DpTabs from '../../../../layouts/mui/DpTabs';
import DpAppBar from '../../../../layouts/mui/DpAppBar';
import DpBackgroundDrop from '../../../../layouts/mui/DpBackdrop';
import DpCloseButton from '../../../../layouts/mui/DpCloseButton';
function HDStDlg({ record, onClose }) {
const [value, setValue] = React.useState(0);
return (
<Dialog
open={true}
onClose={onClose}
maxWidth="xl"
style={{ borderRadius: 0 }}
PaperComponent={DpPaperComponent}
BackdropComponent={DpBackgroundDrop}
>
<div className="boxhead"></div>
<DialogContent style={{ padding: 0, width: '70rem', overflowX: 'hidden',height:'80rem' }}>
<DpAppBar position="sticky">
<DpTabs value={value} indicatorColor="primary" onChange={(_, v) => setValue(v)}>
<DpTab label="详情" />
</DpTabs>
<DpCloseButton onClick={onClose} />
</DpAppBar>
<div style={{padding:10}}>
<img src={`${process.env.PUBLIC_URL}/assets/shuikugh.png`} style={{width:'100%'}}></img>
</div>
</DialogContent>
<div className="boxfoot"></div>
</Dialog>
)
}
export default React.memo(HDStDlg);

View File

@ -0,0 +1,40 @@
import React from 'react';
import DpTab from '../../../../layouts/mui/DpTab';
import Dialog from '@material-ui/core/Dialog';
import DialogContent from '@material-ui/core/DialogContent';
import DpPaperComponent from '../../../../layouts/mui/DpPaperCompanent';
import DpTabs from '../../../../layouts/mui/DpTabs';
import DpAppBar from '../../../../layouts/mui/DpAppBar';
import DpBackgroundDrop from '../../../../layouts/mui/DpBackdrop';
import DpCloseButton from '../../../../layouts/mui/DpCloseButton';
function HDStDlg({ record, onClose }) {
const [value, setValue] = React.useState(0);
return (
<Dialog
open={true}
onClose={onClose}
maxWidth="xl"
style={{ borderRadius: 0 }}
PaperComponent={DpPaperComponent}
BackdropComponent={DpBackgroundDrop}
>
<div className="boxhead"></div>
<DialogContent style={{ padding: 0, width: '60rem', overflowX: 'hidden',height:'80rem' }}>
<DpAppBar position="sticky">
<DpTabs value={value} indicatorColor="primary" onChange={(_, v) => setValue(v)}>
<DpTab label="任务信息" />
</DpTabs>
<DpCloseButton onClick={onClose} />
</DpAppBar>
<div style={{padding:10}}>
<img src={`${process.env.PUBLIC_URL}/assets/xcxq.png`} style={{width:'100%'}}></img>
</div>
</DialogContent>
<div className="boxfoot"></div>
</Dialog>
)
}
export default React.memo(HDStDlg);

View File

@ -0,0 +1,377 @@
import React, { useState,useEffect } from 'react';
import { makeStyles } from '@material-ui/core/styles';
import {
Paper,
Table,
TableBody,
TableCell,
TableContainer,
TableHead,
TableRow,
TextField,
Button,
Box,
IconButton,
ButtonGroup,
Grid
} from '@material-ui/core';
import SearchIcon from '@material-ui/icons/Search';
import RefreshIcon from '@material-ui/icons/Refresh';
import { DatePicker } from 'antd';
import moment from 'moment';
import { useDispatch, useSelector } from 'react-redux';
import ModalView from './view'
const { RangePicker } = DatePicker;
const useStyles = makeStyles((theme) => ({
root: {
width: '100%',
backgroundColor: 'transparent',
color: '#fff'
},
toolbar: {
padding: theme.spacing(2),
display: 'flex',
gap: theme.spacing(2),
alignItems: 'center',
borderBottom: '1px solid rgba(255, 255, 255, 0.1)'
},
searchRow: {
display: 'flex',
gap: theme.spacing(2),
alignItems: 'center',
flexWrap: 'wrap'
},
searchField: {
'& .MuiInputBase-root': {
color: '#fff',
backgroundColor: 'rgba(255, 255, 255, 0.05)',
borderRadius: 4,
width: 200
},
'& .MuiInputLabel-root': {
color: '#fff'
},
'& .MuiOutlinedInput-notchedOutline': {
borderColor: 'rgba(255, 255, 255, 0.1)'
}
},
datePicker: {
'& .MuiInputBase-root': {
color: '#fff',
backgroundColor: 'rgba(255, 255, 255, 0.05)',
width: 200
},
'& .MuiIconButton-root': {
color: '#fff'
},
'& .MuiOutlinedInput-notchedOutline': {
borderColor: 'rgba(255, 255, 255, 0.1)'
}
},
buttonGroup: {
'& .MuiButton-root': {
color: '#fff',
borderColor: 'rgba(255, 255, 255, 0.3)',
'&.active': {
backgroundColor: '#2196f3',
borderColor: '#2196f3'
}
}
},
table: {
'& .MuiTableCell-head': {
backgroundColor: 'rgba(255, 255, 255, 0.05)',
color: '#fff',
fontWeight: 'bold',
borderBottom: '1px solid rgba(255, 255, 255, 0.1)'
},
'& .MuiTableCell-body': {
color: '#fff',
borderBottom: '1px solid rgba(255, 255, 255, 0.1)'
}
},
status: {
padding: '4px 8px',
borderRadius: 4,
backgroundColor: 'rgba(33, 150, 243, 0.1)',
color: '#2196f3'
},
actionButton: {
color: '#2196f3',
'&:hover': {
backgroundColor: 'rgba(33, 150, 243, 0.1)'
}
}
}));
const TaskList = () => {
const classes = useStyles();
const [startDate, setStartDate] = useState(null);
const dispatch = useDispatch();
const [endDate, setEndDate] = useState(null);
const [activeType, setActiveType] = useState('daily');
const [visible, setVisible] = useState(false)
const handleTypeChange = (type) => {
setActiveType(type);
};
const columns = [
{ id: 'sequence', label: '序号', width: 70 },
{ id: 'city', label: '市' },
{ id: 'district', label: '区县' },
{ id: 'location', label: '街道乡镇' },
{ id: 'taskType', label: '任务标题' },
{ id: 'taskContent', label: '任务内容' },
{ id: 'status', label: '任务状态' },
{ id: 'person', label: '巡查人' },
{ id: 'startTime', label: '开始时间' },
{ id: 'endTime', label: '结束时间' },
{ id: 'problems', label: '问题数量', width: 100 },
{ id: 'processed', label: '待处理', width: 100 },
{ id: 'actions', label: '操作', width: 150 }
];
const mockData = [
{
sequence: 1,
city: '黄冈市',
district: '麻城市',
location: '',
taskType: '06-02明山水库日常巡查',
taskContent: '20250602每日巡检',
status: '未完成',
person: '姜兴军',
startTime: '2025-06-02 00:00:00',
endTime: '2025-06-08 23:59:59',
problems: 0,
processed: 0,
createTime: '2025-06-02 02:00:00',
creator: ''
},
{
sequence: 2,
city: '黄冈市',
district: '麻城市',
location: '',
taskType: '06-02浮桥河水库汛前巡查',
taskContent: '20250602每日巡检',
status: '未完成',
person: '熊杰',
startTime: '2025-06-02 00:00:00',
endTime: '2025-06-08 23:59:59',
problems: 0,
processed: 0,
createTime: '2025-06-02 02:00:00',
creator: ''
},
{
sequence: 3,
city: '黄冈市',
district: '麻城市',
location: '',
taskType: '06-02永丰水库特别检查',
taskContent: '20250602每日巡检',
status: '未完成',
person: '白斌',
startTime: '2025-06-02 00:00:00',
endTime: '2025-06-08 23:59:59',
problems: 0,
processed: 0,
createTime: '2025-06-02 02:00:00',
creator: ''
},
{
sequence: 4,
city: '黄冈市',
district: '麻城市',
location: '',
taskType: '06-02永红水库日常巡查',
taskContent: '20250602每日巡检',
status: '未完成',
person: '于静',
startTime: '2025-06-02 00:00:00',
endTime: '2025-06-08 23:59:59',
problems: 0,
processed: 0,
createTime: '2025-06-02 02:00:00',
creator: ''
},{
sequence: 5,
city: '黄冈市',
district: '麻城市',
location: '',
taskType: '06-02四新水库日常巡查',
taskContent: '20250602每日巡检',
status: '未完成',
person: '何义红',
startTime: '2025-06-02 00:00:00',
endTime: '2025-06-08 23:59:59',
problems: 0,
processed: 0,
createTime: '2025-06-02 02:00:00',
creator: ''
},
];
const flyTo = () => {
// dispatch?.runtime.setInfoDlg({ layerId: 'ChaoshiDetailLayer', properties: {} })
setVisible(true)
}
const [params, setParams] = useState({ tm: [] })
const searchTm = (e) => {
setParams({
...params,
stm: e[0].format("YYYY-MM-DD HH:mm"),
etm: e[1].format("YYYY-MM-DD HH:mm"),
tm: e,
})
};
useEffect(() => {
let options = "";
options = {
etm: moment().add(1, 'hour').set({ minute: 0, second: 0 }).format("YYYY-MM-DD HH:mm"),
stm: moment().subtract(7, 'days').add(1, 'hour').set({ minute: 0, second: 0 }).format("YYYY-MM-DD HH:mm"),
tm: [
moment().subtract(7, 'days').add(1, 'hour').set({ minute: 0, second: 0 }),
moment().add(1, 'hour').set({ minute: 0, second: 0 }),
],
}
setParams(options)
}, [])
return (
<Paper className={classes.root}>
<Box className={classes.toolbar}>
<Box className={classes.searchRow}>
<ButtonGroup className={classes.buttonGroup}>
<Button
className={activeType === 'daily' ? 'active' : ''}
onClick={() => handleTypeChange('daily')}
>
日常巡查(3)
</Button>
<Button
className={activeType === 'flood' ? 'active' : ''}
onClick={() => handleTypeChange('flood')}
>
汛期巡查(1)
</Button>
<Button
className={activeType === 'special' ? 'active' : ''}
onClick={() => handleTypeChange('special')}
>
特别巡查(1)
</Button>
<Button
className={activeType === 'all' ? 'active' : ''}
onClick={() => handleTypeChange('all')}
>
全部(5024)
</Button>
</ButtonGroup>
</Box>
<Box className={classes.searchRow}>
<TextField
className={classes.searchField}
variant="outlined"
size="small"
placeholder="请输入水库名称"
/>
<TextField
className={classes.searchField}
variant="outlined"
size="small"
placeholder="请输入任务标题"
/>
<div style={{ display: 'flex', alignItems: 'center',width:'40%' }}>
<div style={{ color: "#fff" }}>时段选择</div>
<div className='tm' style={{ position: "relative", zIndex: 999999, color: "#fff", width: "70%", margin: '10px' }}>
<RangePicker
// width="100%"
className='time-picker'
style={{
flex: 1,
background: "transparent",
border: "none",
color: "#fff",
}}
onChange={searchTm}
allowClear
format="YYYY-MM-DD HH:mm"
showTime={{
format: 'HH:mm',
}}
value={params.tm}
getPopupContainer={trigger => trigger.parentElement}
/>
</div>
</div>
<Button
variant="contained"
color="primary"
startIcon={<SearchIcon />}
>
查询
</Button>
<Button
variant="outlined"
style={{ color: '#fff', borderColor: 'rgba(255, 255, 255, 0.3)' }}
startIcon={<RefreshIcon />}
>
重置
</Button>
</Box>
</Box>
<TableContainer>
<Table className={classes.table} size="small">
<TableHead>
<TableRow>
{columns.map((column) => (
<TableCell
key={column.id}
style={{ width: column.width }}
>
{column.label}
</TableCell>
))}
</TableRow>
</TableHead>
<TableBody>
{mockData.map((row, index) => (
<TableRow key={index}>
<TableCell>{row.sequence}</TableCell>
<TableCell>{row.city}</TableCell>
<TableCell>{row.district}</TableCell>
<TableCell>{row.location}</TableCell>
<TableCell>{row.taskType}</TableCell>
<TableCell>{row.taskContent}</TableCell>
<TableCell>
<span className={classes.status}>{row.status}</span>
</TableCell>
<TableCell>{row.person}</TableCell>
<TableCell>{row.startTime}</TableCell>
<TableCell>{row.endTime}</TableCell>
<TableCell>{row.problems}</TableCell>
<TableCell>{row.processed}</TableCell>
<TableCell>
<IconButton className={classes.actionButton} size="small" onClick={flyTo}>
查看
</IconButton>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
<ModalView
open={visible}
onClose={() => setVisible(false)}
></ModalView>
</Paper>
);
};
export default TaskList;

View File

@ -0,0 +1,39 @@
import React from 'react';
import DpTab from '../../../../layouts/mui/DpTab';
import Dialog from '@material-ui/core/Dialog';
import DialogContent from '@material-ui/core/DialogContent';
import DpPaperComponent from '../../../../layouts/mui/DpPaperCompanent';
import DpTabs from '../../../../layouts/mui/DpTabs';
import DpAppBar from '../../../../layouts/mui/DpAppBar';
import DpBackgroundDrop from '../../../../layouts/mui/DpBackdrop';
import DpCloseButton from '../../../../layouts/mui/DpCloseButton';
import ContentDetail from './detail'
function HDStDlg({ record, onClose }) {
const [value, setValue] = React.useState(0);
return (
<Dialog
open={true}
onClose={onClose}
maxWidth="xl"
style={{ borderRadius: 0 }}
PaperComponent={DpPaperComponent}
BackdropComponent={DpBackgroundDrop}
>
<div className="boxhead"></div>
<DialogContent style={{ padding: 0, width: '110rem', overflowX: 'hidden',height:'80rem' }}>
<DpAppBar position="sticky">
<DpTabs value={value} indicatorColor="primary" onChange={(_, v) => setValue(v)}>
<DpTab label="超时详情" />
</DpTabs>
<DpCloseButton onClick={onClose} />
</DpAppBar>
<ContentDetail />
</DialogContent>
<div className="boxfoot"></div>
</Dialog>
)
}
export default React.memo(HDStDlg);

View File

@ -0,0 +1,40 @@
import React from 'react';
import DpTab from '../../../../layouts/mui/DpTab';
import Dialog from '@material-ui/core/Dialog';
import DialogContent from '@material-ui/core/DialogContent';
import DpPaperComponent from '../../../../layouts/mui/DpPaperCompanent';
import DpTabs from '../../../../layouts/mui/DpTabs';
import DpAppBar from '../../../../layouts/mui/DpAppBar';
import DpBackgroundDrop from '../../../../layouts/mui/DpBackdrop';
import DpCloseButton from '../../../../layouts/mui/DpCloseButton';
function HDStDlg({ record, onClose,open }) {
const [value, setValue] = React.useState(0);
return (
<Dialog
open={open}
onClose={onClose}
maxWidth="xl"
style={{ borderRadius: 0 }}
PaperComponent={DpPaperComponent}
BackdropComponent={DpBackgroundDrop}
>
<div className="boxhead"></div>
<DialogContent style={{ padding: 0, width: '60rem', overflowX: 'hidden',height:'80rem' }}>
<DpAppBar position="sticky">
<DpTabs value={value} indicatorColor="primary" onChange={(_, v) => setValue(v)}>
<DpTab label="任务信息" />
</DpTabs>
<DpCloseButton onClick={onClose} />
</DpAppBar>
<div style={{padding:10}}>
<img src={`${process.env.PUBLIC_URL}/assets/xcxq.png`} style={{width:'100%'}}></img>
</div>
</DialogContent>
<div className="boxfoot"></div>
</Dialog>
)
}
export default React.memo(HDStDlg);

View File

@ -8,9 +8,15 @@ import DpAppBar from '../../../../layouts/mui/DpAppBar';
import DpBackgroundDrop from '../../../../layouts/mui/DpBackdrop';
import DpCloseButton from '../../../../layouts/mui/DpCloseButton';
import Zdya from './zdscya'
function HDStDlg({ record, onClose }) {
const [value, setValue] = React.useState(0);
import { useDispatch, useSelector } from 'react-redux';
function HDStDlg({ record, onClose }) {
const dispatch = useDispatch();
const [value, setValue] = React.useState(0);
const loadFa = () => {
onClose()
dispatch.runtime.setYyfa({ yy: 111 })
}
return (
<Dialog
open={true}
@ -29,7 +35,7 @@ function HDStDlg({ record, onClose }) {
<DpCloseButton onClick={onClose} />
</DpAppBar>
<Zdya />
<Zdya loadFa={loadFa} />
</DialogContent>
<div className="boxfoot"></div>
</Dialog>

View File

@ -56,7 +56,7 @@ const useStyles = makeStyles((theme) => ({
},
}));
const SchemeOptimization = () => {
const SchemeOptimization = ({loadFa}) => {
const classes = useStyles();
const [reservoirs, setReservoirs] = useState([
{ name: '浮标河水库', safeLevel: 64.80, storage: 16110, maxOutflow: 20.00 },
@ -100,7 +100,7 @@ const SchemeOptimization = () => {
const [data, setData] = useState(checkData)
const changeSw = (e, id) => {
const checked = e.target.checked
const data1 = checkData.map(item => {
const data1 = data.map(item => {
if (item.id == id) {
item.checked = checked;
}
@ -196,7 +196,7 @@ const SchemeOptimization = () => {
<TableCell>{scheme.households}</TableCell>
<TableCell>{scheme.population}</TableCell>
<TableCell>
<button className={classes.addButton} style={{ marginRight: 8 }}>加载方案</button>
<button className={classes.addButton} style={{ marginRight: 8 }} onClick={loadFa}>加载方案</button>
<button className={classes.addButton}>导出方案库</button>
</TableCell>
</TableRow>

View File

@ -37,6 +37,9 @@ import YascDlg from './YascDlg';
import YbcgDlg from './YbcgDlg'
import DdcgDlg from './DdcgDlg'
import FadbDlg from './FadbDlg'
import ShuikuyhDlg from './ShuikuyhDlg';
import XunchaDlg from './XunchaDlg';
import XcxqDlg from './XcxqDlg';
function InfoDlg() {
@ -122,8 +125,16 @@ function InfoDlg() {
return <DdcgDlg record={properties} onClose={handleClose} />
} else if (layerId === 'FadbLayer') {
return <FadbDlg record={properties} onClose={handleClose} />
}
} else if (layerId === 'ShuikuyanghuLayer') {
return <ShuikuyhDlg record={properties} onClose={handleClose} />
}else if (layerId === 'XunchachaoshiLayer') {
return <XunchaDlg record={properties} onClose={handleClose} />
}else if (layerId === 'ChaoshiDetailLayer') {
return <PdfDlg record={properties} onClose={handleClose} />
}else if (layerId === 'XcxqLayer') {
return <XcxqDlg record={properties} onClose={handleClose} />
}
return null;
}

View File

@ -83,6 +83,7 @@ export const iconstyles = {
土壤墒情: { backgroundPosition: '37.5% -40%',backgroundSize: '1895% 1650%' },
水厂监测: { backgroundPosition: '0.5% -34%',backgroundSize: '1895% 1650%' },
水源地: { backgroundPosition: '53.3% -106.7%',backgroundSize: '1597% 1550%' },
巡查: { backgroundPosition: '26.8% -99.4%',backgroundSize: '1597% 1550%' },

View File

@ -35,6 +35,7 @@ import ShuichangLayer from "./shuichangLayer"
import ShuiyuandiLayer from "./shuiyuandiLayer"
import ShuikuLayer from "./shuikuLayer"
import RainDrpLayer from "./rainDrpLayer"
import XunchaLayer from "./xunchalayer"
@ -66,6 +67,7 @@ class LayerMgr {
this.layers.push(new ShuiyuandiLayer());
this.layers.push(new ShuikuLayer());
this.layers.push(new RainDrpLayer());
this.layers.push(new XunchaLayer());
//
@ -212,6 +214,7 @@ class LayerMgr {
this.layerMap.ShuiyuandiLayer.getStyle(),
this.layerMap.ShuikuLayer.getStyle(),
this.layerMap.RainDrpLayer.getStyle(),
this.layerMap.XunchaLayer.getStyle(),
//

View File

@ -26,6 +26,7 @@ import ShuichangLayer from "./shuichangLayer";
import ShuiyuandiLayer from "./shuiyuandiLayer";
import ShuikuLayer from "./shuikuLayer";
import RainDrpLayer from "./rainDrpLayer"
import XunchaLayer from "./xunchalayer"
const hash = window.location.origin;
@ -224,6 +225,10 @@ const sources = {
[ShuikuLayer.SourceName]: {
type: 'geojson',
data: { type: 'FeatureCollection', features: [] },
},
[XunchaLayer.SourceName]: {
type: 'geojson',
data: { type: 'FeatureCollection', features: [] },
},
[RainDrpLayer.SourceName]: {
type: 'geojson',

View File

@ -0,0 +1,878 @@
import clone from "clone";
import { PicStPromise, TestPicStPromise } from "../../../../models/_/real";
import { parseGeoJSON } from "../../../../utils/tools";
import { InfoPopNames } from "../../InfoPops";
import BaseLayer from "./baselayer";
const SourceName = '巡查';
const ShapeStyle = {
id: SourceName,
type: 'symbol',
source: SourceName,
layout: {
'icon-allow-overlap': true,
'text-allow-overlap': true,
'icon-image': '巡查',
'icon-size': [
'interpolate', ['linear'], ['zoom'],
10, 0.4,
14, 0.8,
],
'text-allow-overlap': true,
'text-size': [
'interpolate', ['linear'], ['zoom'],
10, 10,
14, 14,
],
'text-font': ['Roboto Black'],
'text-field': [
'step',
['zoom'],
'',
12, ['get', 'stnm']
],
'text-anchor': 'top',
'text-offset': [0, 1],
'visibility': 'none',
},
paint: {
'text-color': '#fff'
}
};
const page1 = [
{
"stcd": "716113701",
"type": "sk",
"hasRz": true,
"stnm": "永红水库",
"adcd": "421181105000",
"wscd": null,
"importancy": 0,
"lgtd": 115.120278,
"lttd": 31.183611,
"elev": 0,
"damel": 131.99,
"dsflz": 130.56,
"fsltdz": 129.9,
"ddz": 113.5,
"zcxsw": 129.9,
"drpTm": "2025-04-11T06:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 130.15,
"w": 0.444,
"a_fsltdz": -10.75,
"rzTm": "2025-04-11T06:00:00.000Z",
"rzWarning": 0,
"rzState": 2,
"pic": [
{
"stcd": "716113701",
"tm": "2023-11-16T11:19:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/1116/716113701/20231116191900.jpg"
},
{
"stcd": "716113701",
"tm": "2023-11-16T09:05:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/1116/716113702/20231116170500.jpg"
}
]
},
{
"stcd": "61614200",
"type": "sk",
"hasRz": true,
"stnm": "浮桥河水库",
"adcd": "421181100000",
"wscd": null,
"importancy": 0,
"lgtd": 114.875,
"lttd": 31.166667,
"elev": 0,
"damel": 71.33,
"dsflz": 68.04,
"fsltdz": 64.89,
"ddz": 51.78,
"zcxsw": 64.89,
"drpTm": "2025-06-03T02:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 16.5,
"drpState": 1,
"rz": 60.71,
"w": 162.8,
"a_fsltdz": -4.18,
"rzTm": "2025-06-03T02:00:00.000Z",
"rzWarning": 0,
"rzState": 1,
"aRz": -4.18
},
{
"stcd": "61613010",
"type": "sk",
"hasRz": true,
"stnm": "明山水库",
"adcd": "421181103000",
"wscd": null,
"importancy": 0,
"lgtd": 115.066667,
"lttd": 31.016667,
"elev": 0,
"damel": 98.7,
"dsflz": 96.07,
"fsltdz": 93,
"ddz": 78.02,
"zcxsw": 93,
"drpTm": "2025-06-03T02:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 12.5,
"drpState": 1,
"rz": 84.43,
"w": 49.5,
"a_fsltdz": -8.569999999999993,
"rzTm": "2025-06-03T02:00:00.000Z",
"rzWarning": 0,
"rzState": 1,
"aRz": -8.57
},
{
"stcd": "716112601",
"type": "sk",
"hasRz": true,
"stnm": "永丰水库",
"adcd": "421181003000",
"wscd": null,
"importancy": 0,
"lgtd": 115.057222,
"lttd": 31.110833,
"elev": 0,
"damel": 79.57,
"dsflz": 77.82,
"fsltdz": 76.96,
"ddz": 64.96,
"zcxsw": 76.96,
"drpTm": "2025-04-11T06:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 71.88,
"w": 1.178,
"a_fsltdz": -5.079999999999998,
"rzTm": "2025-04-11T06:00:00.000Z",
"rzWarning": 0,
"rzState": 2,
"pic": [
{
"stcd": "716112601",
"tm": "2025-04-11T06:02:20.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2025/0411/716112601/20250411140220.jpg"
},
{
"stcd": "716112601",
"tm": "2025-04-11T06:04:01.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2025/0411/716112602/20250411140401.jpg"
}
],
"aRz": -5.08
},
{
"stcd": "716115401",
"type": "sk",
"hasRz": true,
"stnm": "长冲水库",
"adcd": "421181110000",
"wscd": null,
"importancy": 0,
"lgtd": 115.061389,
"lttd": 31.408611,
"elev": 0,
"damel": 21.6,
"dsflz": 20.15,
"fsltdz": 130.8,
"ddz": 0,
"zcxsw": 130.8,
"drpTm": "2024-05-17T08:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 126.41,
"w": 0.374,
"a_fsltdz": -4.390000000000015,
"rzTm": "2024-05-17T06:00:00.000Z",
"rzWarning": 0,
"rzState": 2,
"pic": [
{
"stcd": "716115401",
"tm": "2024-05-17T08:05:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2024/0517/716115401/20240517160500.jpg"
},
{
"stcd": "716115401",
"tm": "2024-05-17T08:20:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2024/0517/716115402/20240517162000.jpg"
}
],
"aRz": -4.39
},
{
"stcd": "716115301",
"type": "sk",
"hasRz": true,
"stnm": "葡萄冲水库",
"adcd": "421181110000",
"wscd": null,
"importancy": 0,
"lgtd": 115.051389,
"lttd": 31.423333,
"elev": 0,
"damel": 15.8,
"dsflz": 14.73,
"fsltdz": 14.3,
"ddz": 9.48,
"zcxsw": 14.3,
"drpTm": "2025-04-11T05:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 213.75,
"w": 0.04,
"a_fsltdz": 199.45,
"rzTm": "2025-04-11T05:00:00.000Z",
"rzWarning": 1,
"rzState": 2,
"pic": [
{
"stcd": "716115301",
"tm": "2023-03-12T08:02:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716115301/20230312160200.jpg"
},
{
"stcd": "716115301",
"tm": "2023-03-12T07:11:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716115302/20230312151100.jpg"
}
],
"aRz": 199.45
},
{
"stcd": "716115701",
"type": "sk",
"hasRz": true,
"stnm": "二五冲水库",
"adcd": "421181110000",
"wscd": null,
"importancy": 0,
"lgtd": 115.087222,
"lttd": 31.378333,
"elev": 0,
"damel": 11.2,
"dsflz": 10.07,
"fsltdz": 108.55,
"ddz": 1.5,
"zcxsw": 108.55,
"drpTm": "2025-03-22T08:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 99.65,
"w": 0.038,
"a_fsltdz": -8.899999999999991,
"rzTm": "2025-03-22T08:00:00.000Z",
"rzWarning": 0,
"rzState": 2,
"pic": [
{
"stcd": "716115701",
"tm": "2025-03-06T23:01:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2025/0307/716115701/20250307070100.jpg"
},
{
"stcd": "716115701",
"tm": "2024-10-18T06:28:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2024/1018/716115702/20241018142800.jpg"
}
],
"aRz": -8.9
},
{
"stcd": "716115501",
"type": "sk",
"hasRz": true,
"stnm": "石鼓庙水库",
"adcd": "421181110000",
"wscd": null,
"importancy": 0,
"lgtd": 114.049444,
"lttd": 31.392222,
"elev": 0,
"damel": 106.15,
"dsflz": 104.92,
"fsltdz": 102.45,
"ddz": 6.7,
"zcxsw": 102.45,
"drpTm": "2024-11-17T04:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 95.86,
"w": 0.073,
"a_fsltdz": -6.590000000000003,
"rzTm": "2024-08-21T01:00:00.000Z",
"rzWarning": 0,
"rzState": 2,
"pic": [
{
"stcd": "716115501",
"tm": "2023-03-12T07:04:32.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716115501/20230312150432.jpg"
},
{
"stcd": "716115501",
"tm": "2023-03-12T07:08:39.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716115502/20230312150839.jpg"
}
],
"aRz": -6.59
},
{
"stcd": "716115601",
"type": "sk",
"hasRz": true,
"stnm": "滚冲水库",
"adcd": "421181110000",
"wscd": null,
"importancy": 0,
"lgtd": 115.027778,
"lttd": 31.386944,
"elev": 0,
"damel": 129.72,
"dsflz": 129.17,
"fsltdz": 128.3,
"ddz": 123,
"zcxsw": 128.3,
"drpTm": "2025-04-11T04:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 123.03,
"w": 0.02,
"a_fsltdz": -5.27000000000001,
"rzTm": "2025-04-11T04:00:00.000Z",
"rzWarning": 0,
"rzState": 2,
"pic": [
{
"stcd": "716115601",
"tm": "2023-03-12T07:03:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716115601/20230312150300.jpg"
},
{
"stcd": "716115601",
"tm": "2023-03-12T07:11:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716115602/20230312151100.jpg"
}
],
"aRz": -5.27
},
{
"stcd": "716108601",
"type": "sk",
"hasRz": true,
"stnm": "吴家垸水库",
"adcd": "421181110000",
"wscd": null,
"importancy": 0,
"lgtd": 115.029167,
"lttd": 31.427222,
"elev": 0,
"damel": 15.7,
"dsflz": 13.85,
"fsltdz": 173.9,
"ddz": 4.6,
"zcxsw": 173.9,
"drpTm": "2025-04-11T05:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 169.14,
"w": 0.11,
"a_fsltdz": -4.760000000000019,
"rzTm": "2025-04-11T05:00:00.000Z",
"rzWarning": 0,
"rzState": 2,
"pic": [
{
"stcd": "716108601",
"tm": "2023-03-12T08:01:41.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716108601/20230312160141.jpg"
},
{
"stcd": "716108601",
"tm": "2023-03-12T07:04:17.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716108602/20230312150417.jpg"
}
],
"aRz": -4.76
},
{
"stcd": "716113401",
"type": "sk",
"hasRz": true,
"stnm": "鲇鱼坝水库",
"adcd": "421181102000",
"wscd": null,
"importancy": 0,
"lgtd": 114.731667,
"lttd": 31.019444,
"elev": 0,
"damel": 55.73,
"dsflz": 52.9,
"fsltdz": 50.63,
"ddz": 42.83,
"zcxsw": 50.63,
"drpTm": "2025-04-11T05:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 48.05,
"w": 2.584,
"a_fsltdz": -2.5800000000000054,
"rzTm": "2025-04-11T05:00:00.000Z",
"rzWarning": 0,
"rzState": 2,
"pic": [
{
"stcd": "716113401",
"tm": "2023-03-12T07:07:01.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716113401/20230312150701.jpg"
},
{
"stcd": "716113401",
"tm": "2023-03-12T07:15:09.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716113402/20230312151509.jpg"
}
],
"aRz": -2.58
},
{
"stcd": "716126501",
"type": "sk",
"hasRz": true,
"stnm": "破堰水库",
"adcd": "421181102000",
"wscd": null,
"importancy": 0,
"lgtd": 114.696111,
"lttd": 31.025556,
"elev": 0,
"damel": 18.48,
"dsflz": 15.23,
"fsltdz": 74.2,
"ddz": 6.3,
"zcxsw": 74.2,
"drpTm": "2025-04-11T05:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 64.47,
"w": 0.265,
"a_fsltdz": -9.730000000000004,
"rzTm": "2025-04-11T05:00:00.000Z",
"rzWarning": 0,
"rzState": 2,
"pic": [
{
"stcd": "716126501",
"tm": "2023-03-12T07:04:21.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716126501/20230312150421.jpg"
},
{
"stcd": "716126501",
"tm": "2023-03-12T07:10:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716126502/20230312151000.jpg"
}
],
"aRz": -9.73
},
{
"stcd": "716107371",
"type": "sk",
"hasRz": true,
"stnm": "群英水库",
"adcd": "421181102000",
"wscd": null,
"importancy": 0,
"lgtd": 114.726944,
"lttd": 31.054444,
"elev": 0,
"damel": 7.4,
"dsflz": 6.02,
"fsltdz": 65.6,
"ddz": 4.1,
"zcxsw": 65.6,
"drpTm": "2025-04-11T05:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 68.66,
"w": 0,
"a_fsltdz": 3.0600000000000023,
"rzTm": "2025-04-11T05:00:00.000Z",
"rzWarning": 1,
"rzState": 2,
"pic": [
{
"stcd": "716107371",
"tm": "2023-03-12T07:23:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716107371/20230312152300.jpg"
},
{
"stcd": "716107371",
"tm": "2023-03-12T07:16:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716107372/20230312151600.jpg"
}
],
"aRz": 3.06
},
{
"stcd": "716126301",
"type": "sk",
"hasRz": true,
"stnm": "淮海水库",
"adcd": "421181102000",
"wscd": null,
"importancy": 0,
"lgtd": 114.694722,
"lttd": 31.053333,
"elev": 0,
"damel": 11.2,
"dsflz": 9.97,
"fsltdz": 9.6,
"ddz": 6.3,
"zcxsw": 9.6,
"drpTm": "2025-04-11T05:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 64.96,
"w": 0.129,
"a_fsltdz": 55.35999999999999,
"rzTm": "2025-04-11T05:00:00.000Z",
"rzWarning": 1,
"rzState": 2,
"pic": [
{
"stcd": "716126301",
"tm": "2023-03-12T07:04:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716126301/20230312150400.jpg"
},
{
"stcd": "716126301",
"tm": "2023-03-12T07:10:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716126302/20230312151000.jpg"
}
],
"aRz": 55.36
},
{
"stcd": "716108501",
"type": "sk",
"hasRz": true,
"stnm": "东风水库",
"adcd": "421181102000",
"wscd": null,
"importancy": 0,
"lgtd": 115.232222,
"lttd": 30.970556,
"elev": 0,
"damel": 81.7,
"dsflz": 80.22,
"fsltdz": 79,
"ddz": 76.2,
"zcxsw": 79,
"drpTm": "2025-03-22T08:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 78.22,
"w": 0.203,
"a_fsltdz": -0.7800000000000011,
"rzTm": "2025-03-22T08:00:00.000Z",
"rzWarning": 0,
"rzState": 2,
"pic": [
{
"stcd": "716108501",
"tm": "2024-09-08T02:44:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2024/0908/716108501/20240908104400.jpg"
},
{
"stcd": "716108501",
"tm": "2024-08-26T09:20:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2024/0826/716108502/20240826172000.jpg"
}
],
"aRz": -0.78
},
{
"stcd": "716126601",
"type": "sk",
"hasRz": true,
"stnm": "毛屋湾水库",
"adcd": "421181102000",
"wscd": null,
"importancy": 0,
"lgtd": 114.693889,
"lttd": 31.019722,
"elev": 0,
"damel": 10,
"dsflz": 9.8,
"fsltdz": 66.57,
"ddz": 5,
"zcxsw": 66.57,
"drpTm": "2024-12-30T06:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 65.41,
"w": 0.039,
"a_fsltdz": -1.1599999999999966,
"rzTm": "2024-05-15T06:00:00.000Z",
"rzWarning": 0,
"rzState": 2,
"pic": [
{
"stcd": "716126601",
"tm": "2024-03-11T02:02:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2024/0311/716126601/20240311100200.jpg"
},
{
"stcd": "716126601",
"tm": "2024-05-15T06:07:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2024/0515/716126602/20240515140700.jpg"
}
],
"aRz": -1.16
},
{
"stcd": "7CS000081",
"type": "sk",
"hasRz": true,
"stnm": "陡山洪水库",
"adcd": "421181102000",
"wscd": null,
"importancy": 0,
"lgtd": 114.724722,
"lttd": 31.007222,
"elev": 0,
"damel": 56.7,
"dsflz": 55.6,
"fsltdz": 5.8,
"ddz": 49.71,
"zcxsw": 5.8,
"drpTm": "2025-04-11T05:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 51.26,
"w": 0.034,
"a_fsltdz": 45.46,
"rzTm": "2025-04-11T05:00:00.000Z",
"rzWarning": 1,
"rzState": 2,
"pic": [
{
"stcd": "7CS000081",
"tm": "2023-03-12T08:01:48.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/7CS000081/20230312160148.jpg"
},
{
"stcd": "7CS000081",
"tm": "2023-03-12T07:05:33.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/7CS000082/20230312150533.jpg"
}
],
"aRz": 45.46
},
{
"stcd": "716107391",
"type": "sk",
"hasRz": true,
"stnm": "高岗水库",
"adcd": "421181102000",
"wscd": null,
"importancy": 0,
"lgtd": 114.731389,
"lttd": 31.042222,
"elev": 0,
"damel": 41.7,
"dsflz": 41.6,
"fsltdz": 40,
"ddz": 35.56,
"zcxsw": 40,
"drpTm": "2025-04-11T05:00:00.000Z",
"today": 0,
"h1": 0,
"h3": 0,
"h6": 0,
"h12": 0,
"h24": 0,
"h48": 0,
"drpState": 2,
"rz": 51.42,
"w": 0.044,
"a_fsltdz": 11.420000000000002,
"rzTm": "2025-04-11T05:00:00.000Z",
"rzWarning": 1,
"rzState": 2,
"pic": [
{
"stcd": "716107391",
"tm": "2023-03-12T07:03:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716107391/20230312150300.jpg"
},
{
"stcd": "716107391",
"tm": "2023-03-12T07:10:00.000Z",
"url": "http://223.75.53.106:8891/skjgimages/2023/0312/716107392/20230312151000.jpg"
}
],
"aRz": 11.42
},
]
export default class XunchaLayer extends BaseLayer {
static LayerName = 'XunchaLayer';
static SourceName = SourceName;
getStyle() {
const ret = clone(ShapeStyle);
this._setStyleVisibility(ret);
return ret;
}
getName() {
return XunchaLayer.LayerName;
}
getSubLayers() {
return [ShapeStyle.id];
}
async doRefreshLayer(mapCtrl) {
const ms = mapCtrl.getSource(SourceName);
let data =
// await PicStPromise.get();
[...page1].map((item)=>{
const obj = {...item}
obj.lgtd = item.lgtd + 0.0019
obj.lttd = item.lttd
return obj
})
ms.setData(parseGeoJSON(data));
return true;
}
getFeatureTip(record) {
return '';
}
featureClicked(properties, dispatch) {
dispatch?.runtime.setInfoDlg({ layerId: 'XcxqLayer', properties: {} })
}
}

View File

@ -118,6 +118,9 @@ import Skyb from './panels/Skyb'
import ShuikuYa from './panels/Yuanyfa'
import Diaodujg from './panels/Diaodujg'
import Duibifx from './panels/Duibifx'
import Xczl from './panels/Xczl'
import Xckb from './panels/Xcwtkb'
import Shuikugh from './panels/Shuikugh'
export default function PanelIndex({ name, style, ...params }) {
if (name === '天气') {
return (
@ -346,6 +349,12 @@ export default function PanelIndex({ name, style, ...params }) {
return <Ddcg style={style} />
} else if (name === '方案对比') {
return <Fadb style={style} />
}else if (name === '巡查任务总览') {
return <Xczl />
}else if (name === '巡查问题看板') {
return <Xckb />
}else if (name === '水库管护') {
return <Shuikugh />
}
return (

View File

@ -26,7 +26,7 @@ const VIEWS = [
{ id: 203, title: '安全监测', img: '/assets/menu/安全监测.png' },
{ id: 204, title: '视频监视', img: '/assets/menu/视频监视.png' },
{ id: 205, title: '防汛调度', img: '/assets/menu/防汛调度.png' },
{ id: 206, title: '水库管理', img: '/assets/menu/水库管理.png' },
{ id: 206, title: '巡查维养', img: '/assets/menu/水库管理.png' },
] },
{
id: 300, title: '水厂', img: '/assets/menu/水利设施.png', children: [

View File

@ -0,0 +1,183 @@
import React, { useState, useRef } from 'react';
import {
IconButton,
Slider,
Box,
} from '@material-ui/core';
import { makeStyles } from '@material-ui/core/styles';
import clsx from "clsx"
import PlayArrowIcon from '@material-ui/icons/PlayArrow';
import PauseIcon from '@material-ui/icons/Pause';
const useStyles = makeStyles((theme) => ({
root: {
position: 'relative',
width: '100%',
height: '100%',
backgroundColor: '#000',
},
videoContainer: {
width: '100%',
height: '100%',
'& video': {
width: '100%',
height: '100%',
objectFit: 'cover',
},
},
controls: {
position: 'absolute',
bottom: 0,
left: 0,
right: 0,
padding: theme.spacing(1, 2),
background: 'linear-gradient(to top, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0) 100%)',
display: 'flex',
alignItems: 'center',
gap: theme.spacing(2),
},
controls1: {
position: 'absolute',
top: '85%',
left: '50%',
transform: 'translate(-50%, -50%)',
padding: theme.spacing(2),
background: 'rgba(0,0,0,0.7)',
borderRadius: theme.spacing(1),
display: 'flex',
alignItems: 'center',
gap: theme.spacing(2),
width: '800px',
maxWidth: '90%',
pointerEvents: 'none',
},
playButton: {
color: '#fff',
pointerEvents: 'auto',
'&:hover': {
backgroundColor: 'rgba(255,255,255,0.1)',
},
},
slider: {
color: '#1976d2',
pointerEvents: 'auto',
flex: 1,
'& .MuiSlider-rail': {
backgroundColor: 'rgba(255,255,255,0.3)',
},
'& .MuiSlider-track': {
backgroundColor: '#1976d2',
},
'& .MuiSlider-thumb': {
width: 12,
height: 12,
backgroundColor: '#fff',
'&:hover, &.Mui-focusVisible': {
boxShadow: '0 0 0 8px rgba(25,118,210,0.16)',
},
},
},
timeDisplay: {
color: '#fff',
fontSize: '0.875rem',
minWidth: 100,
textAlign: 'right',
pointerEvents: 'auto',
},
dateDisplay: {
position: 'absolute',
top: theme.spacing(2),
left: theme.spacing(2),
color: '#fff',
fontSize: '1.25rem',
fontWeight: 500,
textShadow: '1px 1px 2px rgba(0,0,0,0.5)',
},
odd: {
zIndex: 1,
position: 'absolute'
}
}));
const VideoPlayer = ({ videoUrl, date,odd=false }) => {
const classes = useStyles();
const [playing, setPlaying] = useState(false);
const [progress, setProgress] = useState(0);
const [currentTime, setCurrentTime] = useState(0);
const [duration, setDuration] = useState(0);
const videoRef = useRef(null);
const handlePlayPause = () => {
if (playing) {
videoRef.current.pause();
} else {
videoRef.current.play();
}
setPlaying(!playing);
};
const handleTimeUpdate = () => {
const video = videoRef.current;
if (video) {
const progress = (video.currentTime / video.duration) * 100;
setProgress(progress);
setCurrentTime(video.currentTime);
}
};
const handleLoadedMetadata = () => {
setDuration(videoRef.current.duration);
};
const handleSliderChange = (event, newValue) => {
const time = (newValue / 100) * duration;
videoRef.current.currentTime = time;
setProgress(newValue);
};
const formatTime = (time) => {
const minutes = Math.floor(time / 60);
const seconds = Math.floor(time % 60);
return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
};
return (
<div className={clsx({[classes.root]:true,[classes.odd]:odd})}>
<div className={classes.videoContainer}>
<video
ref={videoRef}
onTimeUpdate={handleTimeUpdate}
onLoadedMetadata={handleLoadedMetadata}
>
<source src={videoUrl} type="video/mp4" />
</video>
</div>
<div className={classes.dateDisplay}>
{date}
</div>
<div className={clsx({[classes.controls]:odd,[classes.controls1]:odd})}>
<IconButton
className={classes.playButton}
onClick={handlePlayPause}
>
{playing ? <PauseIcon /> : <PlayArrowIcon />}
</IconButton>
<Slider
className={classes.slider}
value={progress}
onChange={handleSliderChange}
/>
<Box className={classes.timeDisplay}>
{formatTime(currentTime)} / {formatTime(duration)}
</Box>
</div>
</div>
);
};
export default VideoPlayer;

View File

@ -1,5 +1,5 @@
import React,{useEffect} from 'react';
import { useSelector,useDispatch } from 'react-redux';
import React, { useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { TransitionGroup, CSSTransition } from 'react-transition-group';
import './index.less';
import ActionDock from './components/ActionDock';
@ -10,6 +10,7 @@ import MapCtrl from './MapCtrl';
import InfoDlg from './InfoDlg';
import clsx from 'clsx';
import Calculating from './components/Calculating';
import VideoPlayer from './components/VideoCom/index';
//import SocketCtrl from './components/SocketCtrl';
@ -21,10 +22,10 @@ export default function Demo1() {
const yyRes = useSelector(s => s.runtime.yyObj);
const isSc = useSelector(s => s.runtime.scya);
const wg = useSelector(s => s.runtime.shkshObj)
console.log('wg',wg);
console.log('wg', wg);
return (
<div className="demo1">
<div style={{ position: 'absolute', left: 0, bottom: 0, right: 0, top: 0, zIndex: 0 }}>
@ -33,10 +34,15 @@ export default function Demo1() {
{
yyRes.yy &&
<>
<img src={`${process.env.PUBLIC_URL}/assets/yytc.png`} alt="" style={{ zIndex: 0.1, position: 'absolute' }} />
<img src={`${process.env.PUBLIC_URL}/assets/yy.png`} alt="" style={{ zIndex: 0.2, position: 'absolute', bottom: 150, left: '32%', width: 700 }} />
</>
<VideoPlayer
videoUrl={`${process.env.PUBLIC_URL}/assets/gaoguan.mp4`}
date=""
odd={true}
/>
// <>
// <img src={`${process.env.PUBLIC_URL}/assets/yytc.png`} alt="" style={{ zIndex: 0.1, position: 'absolute' }} />
// <img src={`${process.env.PUBLIC_URL}/assets/yy.png`} alt="" style={{ zIndex: 0.2, position: 'absolute', bottom: 150, left: '32%', width: 700 }} />
// </>
}
{
@ -75,8 +81,8 @@ export default function Demo1() {
<PanelIndex name={key} {...params} />
</CSSTransition>
)
} else if(wg) {
return (
} else if (wg) {
return (
<CSSTransition key={key} unmountOnExit exit={false} timeout={500} classNames="dp-panelgroup">
<PanelIndex name={key} {...params} />
</CSSTransition>

View File

@ -6,7 +6,7 @@ function DrpReal({ style }) {
return (
<PanelBox
style={style}
title="对比分析"
title="方案对比"
color="green"
>
<img src='/assets/duibifenxi.png' style={{width:'429.81px', height:'254px',marginLeft:'1px'}}/>

View File

@ -110,7 +110,7 @@ function HDReal({ style }) {
const toggleAutoRefresh = () => {
dispatch.realview.setHdAutoRefresh(!hdAutoRefresh);
}
const [renderChart, setRenderChart] = useState(false)
return (
@ -136,15 +136,18 @@ function HDReal({ style }) {
<div className='skyb-box' >
<div className='rain-yb'>
<div className='title-yb'>水库洪水演进</div>
<TableYj onChange={() => {}}/>
<TableYj onChange={() => setRenderChart(true)}/>
</div>
<div className='rain-yb'>
<div className='title-yb'>下游淹没影响</div>
<img src={`${process.env.PUBLIC_URL}/assets/cgfx.png`} alt="" style={{ width: 420}} />
</div>
<div style={{position:'absolute',top:80,right:450}}>
{
renderChart &&<div style={{position:'absolute',top:80,right:450}}>
<img src={`${process.env.PUBLIC_URL}/assets/dcjg.jpg`} alt="" style={{ width: 370}} />
</div>
}
</div>
</> :
<Empty description={<span style={{color:"#fff"}}>暂无数据</span>}/>

View File

@ -23,6 +23,7 @@ import {
} from '@material-ui/core';
import AddIcon from '@material-ui/icons/Add';
import { useDispatch, useSelector } from 'react-redux';
import DpTableCell from '../../../../layouts/mui/DpTableCell';
import RemoveIcon from '@material-ui/icons/Remove';
import config from '../../../../config';
@ -214,14 +215,14 @@ export default function Overall({ style }) {
</div>
<TableContainer>
<Table className={classes.table}>
<TableHead>
<TableContainer >
<Table stickyHeader>
<TableHead >
<TableRow>
<TableCell style={{ width: '50%' }}>站名</TableCell>
<TableCell style={{ width: '20%' }}>累计雨量(mm)</TableCell>
<TableCell style={{ width: '15%' }}>所属政区</TableCell>
<TableCell style={{ width: '15%' }}>所属流域</TableCell>
<DpTableCell style={{ width: '50%' }}>站名</DpTableCell>
<DpTableCell style={{ width: '20%' }}>累计雨量(mm)</DpTableCell>
<DpTableCell style={{ width: '15%' }}>所属政区</DpTableCell>
<DpTableCell style={{ width: '15%' }}>所属流域</DpTableCell>
</TableRow>
</TableHead>
<TableBody>
@ -231,7 +232,7 @@ export default function Overall({ style }) {
// className={classes.stationRow}
className={`${classes.warningRow} ${station.color}`}
>
<TableCell>
<DpTableCell>
<Box display="flex" alignItems="center">
<IconButton
size="small"
@ -242,29 +243,29 @@ export default function Overall({ style }) {
</IconButton>
{station.name}({station.count})
</Box>
</TableCell>
<TableCell></TableCell>
<TableCell></TableCell>
<TableCell></TableCell>
</DpTableCell>
<DpTableCell></DpTableCell>
<DpTableCell></DpTableCell>
<DpTableCell></DpTableCell>
</TableRow>
<TableRow>
<TableCell colSpan={4} style={{ padding: 0 }}>
<DpTableCell colSpan={4} style={{ padding: 0 }}>
<Collapse in={expanded[station.id]} timeout="auto" unmountOnExit>
<Box className={`${classes.expandedRow} ${station.color}`}>
{/* 展开的详细内容可以在这里添加 */}{
station.id == 'heavy' && drpData.map(item => (
<TableRow onClick={() =>flyTo(item)}>
<TableCell style={{ width: '25%' }}>{item.stnm}</TableCell>
<TableCell style={{ width: '20%' }}>{item.today}</TableCell>
<TableCell style={{ width: '25%' }}>阎家河镇</TableCell>
<TableCell style={{ width: '30%' }}>桃林河</TableCell>
<DpTableCell style={{ width: '25%' }}>{item.stnm}</DpTableCell>
<DpTableCell style={{ width: '20%' }}>{item.today}</DpTableCell>
<DpTableCell style={{ width: '25%' }}>阎家河镇</DpTableCell>
<DpTableCell style={{ width: '30%' }}>桃林河</DpTableCell>
</TableRow>
))
}
</Box>
</Collapse>
</TableCell>
</DpTableCell>
</TableRow>
</React.Fragment>
))}

View File

@ -134,11 +134,11 @@ function HDReal({ style }) {
}
>
{
num.length ? num.map(item => (
num.length ?
<div style={{ padding: '5px' }}>
<img src={`${process.env.PUBLIC_URL}/assets/duibi1.png`} alt="" style={{ width: 420 }} />
<img src={`${process.env.PUBLIC_URL}/assets/${num.length == 1 ? 'duibi1':'duibi2'}.png`} alt="" style={{ width: 420 }} />
</div>
))
:
<Empty description={<span style={{ color: "#fff" }}>暂无数据</span>} />
}

View File

@ -13,7 +13,6 @@ import {
Button,
Table,
TableBody,
TableCell,
TableContainer,
TableHead,
TableRow,
@ -22,6 +21,8 @@ import {
} from '@material-ui/core';
import AddIcon from '@material-ui/icons/Add';
import RemoveIcon from '@material-ui/icons/Remove';
import DpTableCell from '../../../../layouts/mui/DpTableCell';
const useStyles = makeStyles((theme) => ({
root: {
color: '#fff',
@ -141,20 +142,20 @@ export default function Overall({ style }) {
<TableContainer>
<Table className={classes.table}>
<Table >
<TableHead>
<TableRow>
<TableCell style={{ width: '35%' }}>站名</TableCell>
<TableCell style={{ width: '30%' }}>水位(mm)</TableCell>
<TableCell style={{ width: '15%' }}>所属政区</TableCell>
<TableCell style={{ width: '15%' }}>所属流域</TableCell>
<DpTableCell style={{ width: '35%' }}>站名</DpTableCell>
<DpTableCell style={{ width: '30%' }}>水位(mm)</DpTableCell>
<DpTableCell style={{ width: '15%' }}>所属政区</DpTableCell>
<DpTableCell style={{ width: '15%' }}>所属流域</DpTableCell>
</TableRow>
</TableHead>
<TableBody>
{stations.map((station) => (
<React.Fragment key={station.id}>
<TableRow className={`${classes.warningRow} ${station.type}`}>
<TableCell>
<DpTableCell>
<Box display="flex" alignItems="center">
<IconButton
size="small"
@ -165,25 +166,25 @@ export default function Overall({ style }) {
</IconButton>
{station.name}({station.count})
</Box>
</TableCell>
<TableCell></TableCell>
<TableCell></TableCell>
<TableCell></TableCell>
</DpTableCell>
<DpTableCell></DpTableCell>
<DpTableCell></DpTableCell>
<DpTableCell></DpTableCell>
</TableRow>
<TableRow>
<TableCell colSpan={4} style={{ padding: 0 }}>
<DpTableCell colSpan={4} style={{ padding: 0 }}>
<Collapse in={expanded[station.id]} timeout="auto" unmountOnExit>
<Box className={`${classes.expandedRow} ${station.color}`}>
{/* 展开的详细内容可以在这里添加 */}
{/* <TableRow>
<TableCell style={{ width: '25%' }}>站名</TableCell>
<TableCell style={{ width: '20%' }}>水位(m)</TableCell>
<TableCell style={{ width: '25%' }}>所属政区</TableCell>
<TableCell style={{ width: '30%' }}>所属流域</TableCell>
<DpTableCell style={{ width: '25%' }}>站名</DpTableCell>
<DpTableCell style={{ width: '20%' }}>水位(m)</DpTableCell>
<DpTableCell style={{ width: '25%' }}>所属政区</DpTableCell>
<DpTableCell style={{ width: '30%' }}>所属流域</DpTableCell>
</TableRow> */}
</Box>
</Collapse>
</TableCell>
</DpTableCell>
</TableRow>
</React.Fragment>
))}

View File

@ -13,7 +13,7 @@ import {
Button,
Table,
TableBody,
TableCell,
TableContainer,
TableHead,
TableRow,
@ -26,6 +26,7 @@ import RemoveIcon from '@material-ui/icons/Remove';
import WarningIcon from '@material-ui/icons/Warning';
import AddIcon from '@material-ui/icons/Add';
import { useDispatch } from 'react-redux';
import DpTableCell from '../../../../layouts/mui/DpTableCell';
import { DatePicker } from 'antd';
import moment from 'moment';
@ -135,11 +136,11 @@ export default function Overall({ style }) {
useEffect(() => {
let options = "";
options = {
etm: moment().add(1, 'hour').set({ minute: 0, second: 0 }).format("YYYY-MM-DD HH:mm"),
stm: moment().subtract(7, 'days').add(1, 'hour').set({ minute: 0, second: 0 }).format("YYYY-MM-DD HH:mm"),
etm: moment().add(1, 'days').add(1, 'hour').set({ minute: 0, second: 0 }).format("YYYY-MM-DD HH:mm"),
stm: moment().add(1, 'hour').set({ minute: 0, second: 0 }).format("YYYY-MM-DD HH:mm"),
tm: [
moment().subtract(7, 'days').add(1, 'hour').set({ minute: 0, second: 0 }),
moment().add(1, 'hour').set({ minute: 0, second: 0 }),
moment().add(1, 'hour').set({ minute: 0, second: 0 }).hours(9),
moment().add(1, 'days').add(1, 'hour').set({ minute: 0, second: 0 }).hours(9),
],
}
@ -240,19 +241,19 @@ export default function Overall({ style }) {
</div>
</div>
<TableContainer component={Paper} style={{ backgroundColor: 'transparent' }}>
<Table className={classes.table}>
<Table stickyHeader>
<TableHead>
<TableRow>
<TableCell>乡镇</TableCell>
<TableCell>预警时间</TableCell>
<TableCell>预警状态</TableCell>
<DpTableCell>乡镇</DpTableCell>
<DpTableCell>预警时间</DpTableCell>
<DpTableCell>预警状态</DpTableCell>
</TableRow>
</TableHead>
<TableBody>
{warningData.map((row) => (
<React.Fragment key={row.type}>
<TableRow className={`${classes.warningRow} ${row.type}`}>
<TableCell>
<DpTableCell>
<Box display="flex" alignItems="center">
{expanded[row.type] ? (
<RemoveIcon
@ -267,14 +268,14 @@ export default function Overall({ style }) {
)}
{row.label}
</Box>
</TableCell>
<TableCell></TableCell>
<TableCell>
</DpTableCell>
<DpTableCell></DpTableCell>
<DpTableCell>
{row.count}个乡镇
</TableCell>
</DpTableCell>
</TableRow>
<TableRow>
<TableCell colSpan={3} style={{ padding: 0 }}>
<DpTableCell colSpan={3} style={{ padding: 0 }}>
<Collapse in={expanded[row.type]} timeout="auto" unmountOnExit>
<Box className={classes.expandedContent}>
{/* 这里可以添加展开后显示的详细内容 */}
@ -282,15 +283,15 @@ export default function Overall({ style }) {
{
row.type == 'immediate' ? zyData.map(item => (
<TableRow onClick={() => flyTo(item)}>
<TableCell style={{ width: '30%' }}><div
<DpTableCell style={{ width: '30%' }}><div
className="table-ellipsis cursor-pointer"
>{item.adnm}</div></TableCell>
<TableCell style={{ width: '40%' }}><div
>{item.adnm}</div></DpTableCell>
<DpTableCell style={{ width: '40%' }}><div
className="table-ellipsis cursor-pointer"
>{item.warnetm}</div></TableCell>
<TableCell style={{ width: '30%' }}><div
>{item.warnetm}</div></DpTableCell>
<DpTableCell style={{ width: '30%' }}><div
className="table-ellipsis cursor-pointer"
>{item.status}</div></TableCell>
>{item.status}</div></DpTableCell>
</TableRow>
))
@ -299,7 +300,7 @@ export default function Overall({ style }) {
}
</Box>
</Collapse>
</TableCell>
</DpTableCell>
</TableRow>
</React.Fragment>
))}

View File

@ -0,0 +1,51 @@
import React from 'react';
import Dialog from '@material-ui/core/Dialog';
import DialogContent from '@material-ui/core/DialogContent';
import DpPaperComponent from '../../../../layouts/mui/DpPaperCompanent';
import { FormGroup, MenuItem, Select, Switch, Typography } from '@material-ui/core';
import DpDialogTitle from '../../../../layouts/mui/DpDialogTitle';
import { useDispatch, useSelector } from 'react-redux';
import { getLayerSetting, getLayerVisible } from '../../../../models/map/selectors';
import DpBackgroundDrop from '../../../../layouts/mui/DpBackdrop';
function Setting({ onClose }) {
const layerVisible = useSelector(getLayerVisible);
const layerSetting = useSelector(getLayerSetting);
const dispath = useDispatch();
return (
<Dialog
open={true}
onClose={onClose}
maxWidth="xl"
style={{ borderRadius: 0 }}
PaperComponent={DpPaperComponent}
BackdropComponent={DpBackgroundDrop}
>
<div className="boxhead"></div>
<DpDialogTitle>河道水位显示设置</DpDialogTitle>
<DialogContent>
<div style={{ width: 320, padding: '1rem 0' }}>
<FormGroup>
<div style={{ marginBottom: '1rem' }}>
<Typography variant="subtitle2">显示河道水位图层</Typography>
<Switch
checked={!!layerVisible.RealHDLayer}
color="primary"
edge="start"
onChange={(e) => dispath.map.setLayerVisible({ RealHDLayer: e.target.checked })}
/>
</div>
</FormGroup>
</div>
</DialogContent>
<div className="boxfoot"></div>
</Dialog>
)
}
export default Setting;

View File

@ -0,0 +1,157 @@
const data = [
{
"addvcd": "420800000000000",
"moditime": "2022-05-01 21:00:00",
"comments": "漳河遥测",
"src": "zhzj",
"esstym": "",
"mvalue": {
"slmmmt": null,
"slm60": 0,
"exkey": "@",
"slm80": 0,
"hitrsn": null,
"crpty": null,
"crpgrwprd": null,
"srlslm": null,
"stcd": "ZH201417",
"slm10": 24,
"slm20": 5.3,
"slm30": 44.3,
"slm40": 44.3,
"tm": "2024-08-03 05:00",
"slm100": 0,
"vtavslm": null,
"slmAvg": 24.5
},
"lttd": 30.8456,
"sttp": "SS",
"irrCode": "D00000010",
"sort": 9999,
"hasImg": false,
"stlc": "荆门市",
"dtmel": 0,
"stcd": "ZH201417",
"stnm": "马山二组(墒情)",
"addvcd_dictText": "荆门市",
"lgtd": 112.2321,
"irrCode_dictText": "漳河实验站",
"bsnm": "漳河流域"
},
{
"addvcd": "420800000000000",
"moditime": "2022-05-01 21:00:00",
"comments": "漳河遥测",
"src": "zhzj",
"esstym": "",
"mvalue": {
"slmmmt": null,
"slm60": 0,
"exkey": "@",
"slm80": 0,
"hitrsn": null,
"crpty": null,
"crpgrwprd": null,
"srlslm": null,
"stcd": "ZH201421",
"slm10": 12.1,
"slm20": 16.2,
"slm30": 12.8,
"slm40": 12.8,
"tm": "2024-08-15 08:00",
"slm100": 0,
"vtavslm": null,
"slmAvg": 13.7
},
"lttd": 30.8446,
"sttp": "SS",
"irrCode": "D00000010",
"sort": 9999,
"hasImg": false,
"stlc": "荆门市",
"dtmel": 0,
"stcd": "ZH201421",
"stnm": "槐桥四组(墒情)",
"addvcd_dictText": "荆门市",
"lgtd": 112.203,
"irrCode_dictText": "漳河实验站",
"bsnm": "漳河流域"
},
{
"addvcd": "420800000000000",
"moditime": "2022-05-01 21:00:00",
"src": "zhzj",
"esstym": "",
"mvalue": {
"slmmmt": null,
"slm60": 0,
"exkey": "@",
"slm80": 0,
"hitrsn": null,
"crpty": null,
"crpgrwprd": null,
"srlslm": null,
"stcd": "ZH201418",
"slm10": 16.5,
"slm20": 12.5,
"slm30": 0,
"slm40": 0,
"tm": "2024-09-19 11:00",
"slm100": 0,
"vtavslm": null,
"slmAvg": 14.5
},
"lttd": 30.8866,
"sttp": "SS",
"irrCode": "D00000010",
"sort": 9999,
"hasImg": false,
"stlc": "荆门市",
"dtmel": 0,
"stcd": "ZH201418",
"stnm": "双碑一组(墒情)",
"addvcd_dictText": "荆门市",
"lgtd": 112.2006,
"irrCode_dictText": "漳河实验站",
"bsnm": "漳河流域"
},
{
"addvcd": "420800000000000",
"moditime": "2022-05-01 21:00:00",
"comments": "水资源多孔闸门控制系统",
"src": "zhzj",
"esstym": "",
"mvalue": {
"slmmmt": null,
"slm60": null,
"exkey": "@",
"slm80": null,
"hitrsn": null,
"crpty": null,
"crpgrwprd": null,
"srlslm": null,
"stcd": "4211221031",
"slm10": 31,
"slm20": 42.6,
"slm30": null,
"slm40": 26.6,
"tm": "2025-05-26 09:00",
"slm100": null,
"vtavslm": null,
"slmAvg": 33.4
},
"lttd": 30.904191,
"sttp": "SS",
"irrCode": "D00000010",
"sort": 9999,
"hasImg": false,
"stlc": "荆门市",
"stcd": "4211221031",
"stnm": "试验站墒情",
"addvcd_dictText": "荆门市",
"lgtd": 112.087806,
"irrCode_dictText": "漳河实验站",
"bsnm": "漳河流域"
}
]
export default data;

View File

@ -0,0 +1,197 @@
import React, { useMemo, useState } from 'react';
import useRequest from '../../../../utils/useRequest';
import PanelBox from '../../components/PanelBox';
import Table from '@material-ui/core/Table';
import TableContainer from '@material-ui/core/TableContainer';
import TableBody from '@material-ui/core/TableBody';
import TableHead from '@material-ui/core/TableHead';
import TableRow from '@material-ui/core/TableRow';
import DpTableCell from '../../../../layouts/mui/DpTableCell';
import DpTableRow from '../../../../layouts/mui/DpTableRow';
import { useDispatch, useSelector } from 'react-redux';
import useRefresh from '../../../../utils/useRefresh';
import { HDRealPromise } from '../../../../models/_/real';
import clsx from 'clsx';
import { renderHDRz } from '../../../../utils/renutils';
import Setting from './Setting';
import { InfoPopNames } from '../../InfoPops';
import config from '../../../../config';
import moment from 'moment';
import { Empty } from 'antd'
import TableYj from './tableYj';
import { Select, MenuItem } from '@material-ui/core/index'
// import showData from './constant'
function rzRender(rz, base) {
return (
<DpTableCell align="right" style={{ color: rz >= base ? 'red' : '#fff' }}>
{typeof base === 'number' ? base.toFixed(2) : ''}
</DpTableCell>
);
}
function HDReal({ style }) {
const dispatch = useDispatch();
const tableRzFilter = useSelector(s => s.realview.tableRzFilter);
const hdAutoRefresh = useSelector(s => s.realview.hdAutoRefresh);
const num = useSelector(s => s.runtime.duibifxNum)
const yyRes = useSelector(s => s.runtime.yyObj);
const [setting, showSetting] = useState(false);
const [dimension, setDimension] = useState('ft');
const data = [
{
"guid": "42118120003",
"code": "",
"name": "浮桥河水库",
"resRegCode": "42000020030-A4",
"adName": "白果镇",
"engScal": "大2型",
"place": "湖北省-黄冈市-麻城市-白果镇",
"lon": "115.068090",
"lat": "31.026170",
'username': '熊杰',
taskType: '除草除杂',
tm: '2025-06-02 17:38:00',
status: '已处理'
},
{
"guid": "42118120003",
"code": "",
"name": "浮桥河水库",
"resRegCode": "42000020030-A4",
"adName": "白果镇",
"engScal": "大2型",
"place": "湖北省-黄冈市-麻城市-白果镇",
"lon": "115.068090",
"lat": "31.026170",
'username': '白斌',
taskType: '除草除杂',
tm: '2025-06-02 17:09:11',
status: '已处理'
},
{
"guid": "42118120003",
"code": "",
"name": "明山水库",
"resRegCode": "42000020030-A4",
"adName": "白果镇",
"engScal": "大2型",
"place": "湖北省-黄冈市-麻城市-白果镇",
"lon": "115.068090",
"lat": "31.026170",
'username': '余静',
taskType: '危险提示',
tm: '2025-06-02 16:10:00',
status: '已处理'
},
{
"guid": "42118120003",
"code": "",
"name": "永红水库",
"resRegCode": "42000020030-A4",
"adName": "白果镇",
"engScal": "大2型",
"place": "湖北省-黄冈市-麻城市-白果镇",
"lon": "115.068090",
"lat": "31.026170",
'username': '周真',
taskType: '设备养护',
tm: '2025-06-02 15:00:49',
status: '待处理'
},
{
"guid": "42118120003",
"code": "",
"name": "永丰水库",
"resRegCode": "42000020030-A4",
"adName": "白果镇",
"engScal": "大2型",
"place": "湖北省-黄冈市-麻城市-白果镇",
"lon": "115.068090",
"lat": "31.026170",
'username': '陈发',
taskType: '除草除杂',
tm: '2025-06-02 14:43:49',
status: '已处理'
},
]
const [list, setList] = useState(data)
const onChange = (event) => {
const value = event.target.value;
setDimension(value);
const newData = data.filter(item => item.taskType == value);
if (newData.length) {
setList(newData);
} else {
setList(data)
}
}
const flyTo = () => {
dispatch?.runtime.setInfoDlg({ layerId: 'ShuikuyanghuLayer', properties: {} })
}
return (
<PanelBox
style={style}
title="水库管护"
color="green"
extra={
<>
<div style={{ height: '30px', overflow: 'hidden' }}>
<Select
labelId="analysis-select-label"
value={dimension}
label="请选择管护类型"
onChange={onChange}
>
<MenuItem value="ft">请选择管护类型</MenuItem>
<MenuItem value="除草除杂">除草除杂</MenuItem>
<MenuItem value="设备养护">设备养护</MenuItem>
<MenuItem value="危险提示">危险提示</MenuItem>
</Select>
</div>
</>
}
>
<TableContainer style={{ height: '200px', overflow: 'auto' }}>
<Table size="small" stickyHeader>
<TableHead>
<TableRow>
<DpTableCell style={{ width: '30%' }} align="center">水库名称</DpTableCell>
<DpTableCell style={{ width: '20%' }} align="center">管护类型</DpTableCell>
<DpTableCell style={{ width: '25%' }} align="center">内容</DpTableCell>
<DpTableCell style={{ width: '25%' }} align="center">上报时间</DpTableCell>
</TableRow>
</TableHead>
<TableBody>
{list.map((row, index) => (
<DpTableRow key={row.stcd} onClick={flyTo}>
<DpTableCell align="center">
<div
className="table-ellipsis cursor-pointer"
>{row.name}</div>
</DpTableCell>
<DpTableCell align="center">{row.taskType}</DpTableCell>
<DpTableCell align="center">一切正常</DpTableCell>
<DpTableCell align="center"> <div
className="table-ellipsis cursor-pointer"
>{row.tm}</div></DpTableCell>
</DpTableRow>
))}
</TableBody>
</Table>
</TableContainer>
{
setting && <Setting onClose={() => showSetting(false)} />
}
</PanelBox>
)
}
export default HDReal;

View File

@ -0,0 +1,171 @@
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import {
Table,
TableBody,
TableCell,
TableContainer,
TableHead,
TableRow,
Paper,
} from '@material-ui/core';
const reservoirData = [
{
name: '明山水库',
maxInflow: {
value: 12.32,
time: '03-23 14:32'
},
totalStorage: 17.98,
maxOutflow: {
value: 12.32,
time: '03-23 14:32'
}
}
];
const useStyles = makeStyles((theme) => ({
root: {
width: '100%',
// padding: '20px',
background: '#0d1117',
borderRadius: '8px',
position: 'relative',
},
tableContainer: {
background: 'transparent',
maxHeight: '100%',
overflowX: 'auto',
'&::-webkit-scrollbar': {
height: '8px',
},
'&::-webkit-scrollbar-track': {
// background: 'rgba(255, 255, 255, 0.1)',
borderRadius: '4px',
},
'&::-webkit-scrollbar-thumb': {
// background: 'rgba(255, 255, 255, 0.2)',
borderRadius: '4px',
'&:hover': {
background: 'rgba(255, 255, 255, 0.3)',
},
},
},
table: {
minWidth: 800,
// background: 'linear-gradient(180deg, rgba(22, 27, 34, 0.8) 0%, rgba(13, 17, 23, 0.8) 100%)',
backdropFilter: 'blur(10px)',
},
tableHead: {
background: 'linear-gradient(180deg, rgba(22, 27, 34, 0.9) 0%, rgba(22, 27, 34, 0.7) 100%)',
},
headerCell: {
color: '#c9d1d9',
fontWeight: 600,
textAlign: 'center',
borderBottom: '1px solid rgba(48, 54, 61, 0.6)',
borderRight: '1px solid rgba(48, 54, 61, 0.6)',
padding: 0,
whiteSpace: 'nowrap',
'&:last-child': {
borderRight: 'none',
},
},
cell: {
color: '#c9d1d9',
textAlign: 'center',
borderBottom: '1px solid rgba(48, 54, 61, 0.6)',
borderRight: '1px solid rgba(48, 54, 61, 0.6)',
padding: '12px 20px',
whiteSpace: 'nowrap',
'&:last-child': {
borderRight: 'none',
},
},
timeText: {
fontSize: '0.85em',
color: '#8b949e',
marginLeft: '4px',
},
scrollIndicator: {
position: 'absolute',
bottom: 0,
left: 0,
right: 0,
height: '4px',
background: 'rgba(255, 255, 255, 0.1)',
borderRadius: '2px',
},
scrollProgress: {
height: '100%',
background: 'rgba(255, 255, 255, 0.3)',
borderRadius: '2px',
width: '50%',
transform: 'translateX(0%)',
transition: 'transform 0.3s ease',
},
}));
const ReservoirTable = () => {
const classes = useStyles();
const [scrollPosition, setScrollPosition] = React.useState(0);
const handleScroll = (e) => {
const target = e.target;
const scrollLeft = target.scrollLeft;
const maxScroll = target.scrollWidth - target.clientWidth;
const position = (scrollLeft / maxScroll) * 100;
setScrollPosition(position);
};
const formatFlowCell = (data) => (
<>
{data.value}
<span className={classes.timeText}>({data.time})</span>
</>
);
return (
<Paper className={classes.root} elevation={0}>
<TableContainer className={classes.tableContainer} >
<Table >
<TableHead >
<TableRow>
<TableCell className={classes.headerCell}>水库名称</TableCell>
<TableCell className={classes.headerCell}>
最大入库流量<br/>(/s)
</TableCell>
<TableCell className={classes.headerCell}>
总入库水量<br/>(万m³)
</TableCell>
<TableCell className={classes.headerCell}>
最大出库流量<br/>(/s)
</TableCell>
</TableRow>
</TableHead>
<TableBody>
{reservoirData.map((item, index) => (
<TableRow key={index}>
<TableCell className={classes.cell}>{item.name}</TableCell>
<TableCell className={classes.cell}>{formatFlowCell(item.maxInflow)}</TableCell>
<TableCell className={classes.cell}>{item.totalStorage}</TableCell>
<TableCell className={classes.cell}>{formatFlowCell(item.maxOutflow)}</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
<div className={classes.scrollIndicator}>
<div
className={classes.scrollProgress}
style={{
transform: `translateX(${scrollPosition}%)`
}}
/>
</div>
</Paper>
);
};
export default ReservoirTable;

View File

@ -15,7 +15,7 @@ import {
Button,
Table,
TableBody,
TableCell,
TableContainer,
TableHead,
TableRow,
@ -24,6 +24,7 @@ import {
} from '@material-ui/core';
import { useDispatch, useSelector } from 'react-redux';
import config from '../../../../config';
import DpTableCell from '../../../../layouts/mui/DpTableCell';
import AddIcon from '@material-ui/icons/Add';
import RemoveIcon from '@material-ui/icons/Remove';
@ -206,21 +207,21 @@ export default function Overall({ style }) {
<TableContainer>
<Table className={classes.table}>
<Table stickyHeader>
<TableHead>
<TableRow>
<TableCell style={{ width: '40%' }}>站名</TableCell>
<TableCell style={{ width: '14%' }}>水位(mm)</TableCell>
<TableCell style={{ width: '15%' }}>所属政区</TableCell>
<TableCell style={{ width: '15%' }}>所属流域</TableCell>
<TableCell style={{ width: '16%' }}>预案</TableCell>
<DpTableCell style={{ width: '40%' }}>站名</DpTableCell>
<DpTableCell style={{ width: '14%' }}>水位(mm)</DpTableCell>
<DpTableCell style={{ width: '15%' }}>所属政区</DpTableCell>
<DpTableCell style={{ width: '15%' }}>所属流域</DpTableCell>
<DpTableCell style={{ width: '16%' }}>预案</DpTableCell>
</TableRow>
</TableHead>
<TableBody>
{stations.map((station) => (
<React.Fragment key={station.id}>
<TableRow className={`${classes.warningRow} ${station.color}`}>
<TableCell>
<DpTableCell>
<Box display="flex" alignItems="center">
<IconButton
size="small"
@ -231,39 +232,39 @@ export default function Overall({ style }) {
</IconButton>
{station.name}({station.count})
</Box>
</TableCell>
<TableCell></TableCell>
<TableCell></TableCell>
<TableCell></TableCell>
<TableCell></TableCell>
</DpTableCell>
<DpTableCell></DpTableCell>
<DpTableCell></DpTableCell>
<DpTableCell></DpTableCell>
<DpTableCell></DpTableCell>
</TableRow>
<TableRow>
<TableCell colSpan={5} style={{ padding: 0 }}>
<DpTableCell colSpan={5} style={{ padding: 0 }}>
<Collapse in={expanded[station.id]} timeout="auto" unmountOnExit>
<Box className={`${classes.expandedRow} ${station.color}`}>
{/* 展开的详细内容可以在这里添加 */}
{
station.id == "cxx" && <TableRow onClick={() => flyTo()}>
<TableCell style={{ width: '20%' }}><div
<DpTableCell style={{ width: '20%' }}><div
className="table-ellipsis cursor-pointer"
>永红水库</div></TableCell>
<TableCell style={{ width: '20%' }}>130.15(0.25)</TableCell>
<TableCell style={{ width: '20%' }}><div
>永红水库</div></DpTableCell>
<DpTableCell style={{ width: '20%' }}>130.15(0.25)</DpTableCell>
<DpTableCell style={{ width: '20%' }}><div
className="table-ellipsis cursor-pointer"
>阎家河镇</div></TableCell>
<TableCell style={{ width: '20%' }}>阎家河</TableCell>
<TableCell style={{ width: '20%' }}><a
>阎家河镇</div></DpTableCell>
<DpTableCell style={{ width: '20%' }}>阎家河</DpTableCell>
<DpTableCell style={{ width: '20%' }}><a
className="table-ellipsis cursor-pointer"
onClick={() => {
dispatch?.runtime.setInfoDlg({ layerId: 'PdfLayer', properties: {planName:'麻城市山洪灾害防御预案'} })
}}
>麻城市山洪灾害防御预案</a></TableCell>
>麻城市山洪灾害防御预案</a></DpTableCell>
</TableRow>
}
</Box>
</Collapse>
</TableCell>
</DpTableCell>
</TableRow>
</React.Fragment>
))}

View File

@ -3,7 +3,7 @@ import { makeStyles } from '@material-ui/core';
const useStyles = makeStyles((theme) => ({
root: {
backgroundColor: '#0d1117',
backgroundColor: 'transparent',
borderRadius: 4,
overflow: 'hidden',
},
@ -12,7 +12,7 @@ const useStyles = makeStyles((theme) => ({
borderCollapse: 'collapse',
color: '#c9d1d9',
'& th': {
backgroundColor: '#161b22',
backgroundColor: 'transparent',
padding: theme.spacing(1.5),
textAlign: 'center',
fontWeight: 'normal',

View File

@ -52,9 +52,9 @@ function WF() {
dispatch.runtime.setYyfa({yy:''})
dispatch.shyjview.showWeather24h();
const map = window.__mapref
map.setLayoutProperty('热力图', 'visibility', 'none');
// if (map) {
// }
if (map) {
map.setLayoutProperty('热力图', 'visibility', 'none');
}
}
const genWeatherContourRadar = () => {
@ -74,14 +74,9 @@ function WF() {
dispatch.runtime.setLayerSetting({ contour: newContourSetting })
}
// useEffect(() => {
// let timer = setTimeout(() => {
// genWeatherContour24H()
// },0)
// return () => {
// clearTimeout(timer)
// }
// }, [])
useEffect(() => {
genWeatherContour24H()
}, [])
return (
<div className={classes.root}>

View File

@ -0,0 +1,67 @@
import React from 'react';
import Dialog from '@material-ui/core/Dialog';
import DialogContent from '@material-ui/core/DialogContent';
import DpPaperComponent from '../../../../layouts/mui/DpPaperCompanent';
import { FormGroup, MenuItem, Select, Switch, Typography } from '@material-ui/core';
import DpDialogTitle from '../../../../layouts/mui/DpDialogTitle';
import { useDispatch, useSelector } from 'react-redux';
import { getLayerSetting, getLayerVisible } from '../../../../models/map/selectors';
import DpBackgroundDrop from '../../../../layouts/mui/DpBackdrop';
function Setting({ onClose }) {
const layerVisible = useSelector(getLayerVisible);
const layerSetting = useSelector(getLayerSetting);
const dispath = useDispatch();
return (
<Dialog
open={true}
onClose={onClose}
maxWidth="xl"
style={{ borderRadius: 0 }}
PaperComponent={DpPaperComponent}
BackdropComponent={DpBackgroundDrop}
>
<div className="boxhead"></div>
<DpDialogTitle>实时雨量显示设置</DpDialogTitle>
<DialogContent>
<div style={{ width: 320, padding: '1rem 0' }}>
<FormGroup>
<div style={{ marginBottom: '2rem' }}>
<Typography variant="subtitle2">地图实时雨量显示雨量时段</Typography>
<Select
style={{ fontSize: '1.2rem' }}
fullWidth
value={layerSetting.drplabel}
onChange={(event) => dispath.map.setLayerSetting({ drplabel: event.target.value })}
>
<MenuItem value="h1">小时雨量</MenuItem>
<MenuItem value="h3">3小时雨量</MenuItem>
<MenuItem value="h6">6小时雨量</MenuItem>
<MenuItem value="h12">12小时雨量</MenuItem>
<MenuItem value="h24">24小时雨量</MenuItem>
<MenuItem value="h48">48小时雨量</MenuItem>
</Select>
</div>
<div style={{ marginBottom: '1rem' }}>
<Typography variant="subtitle2">显示实时雨量图层</Typography>
<Switch
checked={!!layerVisible.RealDrpLayer}
color="primary"
edge="start"
onChange={(e) => dispath.map.setLayerVisible({ RealDrpLayer: e.target.checked })}
/>
</div>
</FormGroup>
</div>
</DialogContent>
<div className="boxfoot"></div>
</Dialog>
)
}
export default Setting;

View File

@ -0,0 +1,90 @@
import React, { useEffect, useRef } from 'react';
import * as echarts from 'echarts';
const ProcessChart = () => {
const chartRef = useRef(null);
useEffect(() => {
const chart = echarts.init(chartRef.current);
const option = {
title: [{
text: '总计',
left: 'center',
top: '42%',
textStyle: {
color: '#fff',
fontSize: 20,
fontWeight: 'normal'
}
}, {
text: '250',
left: 'center',
top: '52%',
textStyle: {
color: '#fff',
fontSize: 28,
fontWeight: 'bold'
}
}],
series: [{
name: '处理进度',
type: 'pie',
radius: ['55%', '90%'],
center: ['50%', '50%'],
startAngle: 90,
label: {
show: true,
position: 'outside',
formatter: '{c}',
color: '#fff',
fontSize: 14,
distance: 5
},
labelLine: {
show: true,
length: 10,
length2: 10,
lineStyle: {
color: '#fff'
}
},
data: [
{
value: 7,
name: '待处理',
itemStyle: {
color: '#5470c6'
}
},
{
value: 243,
name: '已处理',
itemStyle: {
color: '#3fb950'
}
}
]
}]
};
chart.setOption(option);
return () => {
chart.dispose();
};
}, []);
return (
<div
ref={chartRef}
style={{
width: '200px',
height: '220px'
}}
/>
);
};
export default ProcessChart;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,82 @@
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Box from '@material-ui/core/Box';
import Paper from '@material-ui/core/Paper';
import Typography from '@material-ui/core/Typography';
const useStyles = makeStyles((theme) => ({
root: {
display: 'flex',
flexDirection: 'column',
gap: '20px',
},
row: {
display: 'flex',
gap: '20px',
justifyContent: 'flex-start',
},
card: {
width: '200px',
height: '100px',
padding: '16px',
// background: 'linear-gradient(135deg, rgba(9, 70, 113,0.5) 0%, rgba(9, 70, 113,0.8) 100%)',
background:'rgba(6, 43, 78,.5)',
border: '1px solid rgba(9, 70, 113,1)',
borderRadius: '8px',
display: 'flex',
flexDirection: 'column',
justifyContent: 'space-between',
alignItems:'center',
backdropFilter: 'blur(10px)',
},
title: {
color: '#fff',
fontSize: '16px',
fontWeight: 'normal',
},
count: {
color: '#04f21c',
fontSize: '24px',
fontWeight: 'bold',
},
}));
const PatrolStatistics = () => {
const classes = useStyles();
const patrolTypes = [
{ title: '日常巡查', count: 456 },
{ title: '汛期巡查', count: 32 },
{ title: '特别巡查', count: 3 },
];
const patrolStatus = [
{ title: '已完成', count: 456 },
{ title: '未完成', count: 32 },
{ title: '进行中', count: 3 },
];
const StatCard = ({ title, count }) => (
<Paper className={classes.card}>
<Typography className={classes.title}>{title}</Typography>
<Typography className={classes.count}>{count} <span style={{fontSize:16,color:"#fff",fontWeight:'normal'}}></span></Typography>
</Paper>
);
return (
<Box className={classes.root}>
<Box className={classes.row}>
{patrolTypes.map((item, index) => (
<StatCard key={`type-${index}`} {...item} />
))}
</Box>
<Box className={classes.row}>
{patrolStatus.map((item, index) => (
<StatCard key={`status-${index}`} {...item} />
))}
</Box>
</Box>
);
};
export default PatrolStatistics;

View File

@ -0,0 +1,67 @@
import React from 'react';
import Dialog from '@material-ui/core/Dialog';
import DialogContent from '@material-ui/core/DialogContent';
import DpPaperComponent from '../../../../layouts/mui/DpPaperCompanent';
import { FormGroup, MenuItem, Select, Switch, Typography } from '@material-ui/core';
import DpDialogTitle from '../../../../layouts/mui/DpDialogTitle';
import { useDispatch, useSelector } from 'react-redux';
import { getLayerSetting, getLayerVisible } from '../../../../models/map/selectors';
import DpBackgroundDrop from '../../../../layouts/mui/DpBackdrop';
function Setting({ onClose }) {
const layerVisible = useSelector(getLayerVisible);
const layerSetting = useSelector(getLayerSetting);
const dispath = useDispatch();
return (
<Dialog
open={true}
onClose={onClose}
maxWidth="xl"
style={{ borderRadius: 0 }}
PaperComponent={DpPaperComponent}
BackdropComponent={DpBackgroundDrop}
>
<div className="boxhead"></div>
<DpDialogTitle>实时雨量显示设置</DpDialogTitle>
<DialogContent>
<div style={{ width: 320, padding: '1rem 0' }}>
<FormGroup>
<div style={{ marginBottom: '2rem' }}>
<Typography variant="subtitle2">地图实时雨量显示雨量时段</Typography>
<Select
style={{ fontSize: '1.2rem' }}
fullWidth
value={layerSetting.drplabel}
onChange={(event) => dispath.map.setLayerSetting({ drplabel: event.target.value })}
>
<MenuItem value="h1">小时雨量</MenuItem>
<MenuItem value="h3">3小时雨量</MenuItem>
<MenuItem value="h6">6小时雨量</MenuItem>
<MenuItem value="h12">12小时雨量</MenuItem>
<MenuItem value="h24">24小时雨量</MenuItem>
<MenuItem value="h48">48小时雨量</MenuItem>
</Select>
</div>
<div style={{ marginBottom: '1rem' }}>
<Typography variant="subtitle2">显示实时雨量图层</Typography>
<Switch
checked={!!layerVisible.RealDrpLayer}
color="primary"
edge="start"
onChange={(e) => dispath.map.setLayerVisible({ RealDrpLayer: e.target.checked })}
/>
</div>
</FormGroup>
</div>
</DialogContent>
<div className="boxfoot"></div>
</Dialog>
)
}
export default Setting;

View File

@ -0,0 +1,186 @@
import React, { useMemo, useState } from 'react';
import useRequest from '../../../../utils/useRequest';
import { useDispatch, useSelector } from 'react-redux';
import PanelBox from '../../components/PanelBox';
import Table from '@material-ui/core/Table';
import TableContainer from '@material-ui/core/TableContainer';
import TableBody from '@material-ui/core/TableBody';
import TableHead from '@material-ui/core/TableHead';
import TableRow from '@material-ui/core/TableRow';
import DpTableCell from '../../../../layouts/mui/DpTableCell';
import DpTableRow from '../../../../layouts/mui/DpTableRow';
import clsx from 'clsx';
import { renderDrp } from '../../../../utils/renutils';
import XcCard from './xcCard'
import config from '../../../../config';
const data = [
{
"guid": "42118120003",
"code": "",
"name": "浮桥河水库-汛前检查",
"resRegCode": "42000020030-A4",
"adName": "白果镇",
"engScal": "大2型",
"place": "湖北省-黄冈市-麻城市-白果镇",
"lgtd": "115.068090",
"lttd": "31.026170",
'username': '熊杰',
taskType: '日常巡查',
tm: '2025-06-02 00:08:00',
status: '进行中'
},
{
"guid": "42118120003",
"code": "",
"name": "浮桥河水库-特别巡查",
"resRegCode": "42000020030-A4",
"adName": "白果镇",
"engScal": "大2型",
"place": "湖北省-黄冈市-麻城市-白果镇",
"lgtd": "115.068090",
"lttd": "31.026170",
'username': '白斌',
taskType: '汛前巡查',
tm: '2025-06-02 00:09:00',
status: '已完成'
},
{
"guid": "42118120003",
"code": "",
"name": "明山水库-日常管理",
"resRegCode": "42000020030-A4",
"adName": "白果镇",
"engScal": "大2型",
"place": "湖北省-黄冈市-麻城市-白果镇",
"lgtd": "115.068090",
"lttd": "31.026170",
'username': '余静',
taskType: '特别巡查',
tm: '2025-06-02 00:10:00',
status: '未完成'
},
{
"guid": "42118120003",
"code": "",
"name": "永红水库-日常管理",
"resRegCode": "42000020030-A4",
"adName": "白果镇",
"engScal": "大2型",
"place": "湖北省-黄冈市-麻城市-白果镇",
"lgtd": "115.068090",
"lttd": "31.026170",
'username': '周真',
taskType: '特别巡查',
tm: '2025-06-02 00:10:00',
status: '未完成'
},
{
"guid": "42118120003",
"code": "",
"name": "永丰水库-汛前检查",
"resRegCode": "42000020030-A4",
"adName": "白果镇",
"engScal": "大2型",
"place": "湖北省-黄冈市-麻城市-白果镇",
"lgtd": "115.068090",
"lttd": "31.026170",
'username': '陈发',
taskType: '特别巡查',
tm: '2025-06-02 00:10:00',
status: '未完成'
},
]
function DrpReal({ style }) {
const [tab, setTab] = useState('1')
const dispatch = useDispatch();
const flyTo = () => {
dispatch?.runtime.setInfoDlg({ layerId: 'XunchachaoshiLayer', properties: {} })
}
const jumpTo = (record) => {
const { lgtd, lttd } = record;
if (lgtd && lttd) {
dispatch.runtime.setCameraTarget({
center: [lgtd, lttd + config.poiPositionOffsetY.hd],
zoom: config.poiPositionZoom.hd,
pitch: config.poiPitch,
});
}
}
return (
<PanelBox
style={style}
title="巡查任务总览"
color="green"
extra={
<span className="button-group">
<span className={clsx({ active: tab === '1' })} onClick={() => setTab('1')}>本月</span>
<span className={clsx({ active: tab === '2' })} onClick={() => setTab('2')}>本年</span>
</span>
}
>
<div className='skyb-box'>
<div className='rain-yb'>
<div className='title-yb'>巡查任务</div>
</div>
</div>
<div style={{ padding: 10 }}>
<XcCard />
</div>
<TableContainer>
<Table size="small" stickyHeader>
<TableHead>
<TableRow>
<DpTableCell style={{ width: '20%' }} align="center">任务标题</DpTableCell>
<DpTableCell style={{ width: '20%' }} align="center">任务类型</DpTableCell>
<DpTableCell style={{ width: '20%' }} align="center">巡查人</DpTableCell>
<DpTableCell style={{ width: '20%' }} align="center">巡查时间</DpTableCell>
<DpTableCell style={{ width: '20%' }} align="center">状态</DpTableCell>
</TableRow>
</TableHead>
<TableBody>
{data.map((row, index) => (
<DpTableRow key={row.stcd}
// onClick={() => jumpTo(row)}
>
<DpTableCell align="center">
<div
className="table-ellipsis cursor-pointer"
>{row.name}</div>
</DpTableCell>
<DpTableCell align="center">{row.taskType}</DpTableCell>
<DpTableCell align="center">{row.username}</DpTableCell>
<DpTableCell align="center">
<div
className="table-ellipsis cursor-pointer"
> {row.tm}</div>
</DpTableCell>
<DpTableCell align="center">{row.status}</DpTableCell>
</DpTableRow>
))}
</TableBody>
</Table>
</TableContainer>
<div className='skyb-box' style={{ marginTop: 50 }}>
<div className='rain-yb'>
<div className='title-yb'>数据统计</div>
</div>
</div>
<div>
<img src={`${process.env.PUBLIC_URL}/assets/sjtj1.jpg`} alt="" style={{ width: 420 }} />
<div style={{ position: 'relative' }}>
<img src={`${process.env.PUBLIC_URL}/assets/sjti2.png`} alt="" style={{ width: 205, height: 72 }} />
<img src={`${process.env.PUBLIC_URL}/assets/gantanh.png`} alt=""
style={{ width: 20, position: 'absolute', top: 12, left: 145, cursor: 'pointer' }}
onClick={flyTo}
/>
</div>
</div>
</PanelBox>
)
}
export default DrpReal;

View File

@ -0,0 +1,82 @@
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Box from '@material-ui/core/Box';
import Paper from '@material-ui/core/Paper';
import Typography from '@material-ui/core/Typography';
const useStyles = makeStyles((theme) => ({
root: {
display: 'flex',
flexDirection: 'column',
gap: '20px',
},
row: {
display: 'flex',
gap: '20px',
justifyContent: 'flex-start',
},
card: {
width: '200px',
height: '100px',
padding: '16px',
// background: 'linear-gradient(135deg, rgba(9, 70, 113,0.5) 0%, rgba(9, 70, 113,0.8) 100%)',
background:'rgba(6, 43, 78,.5)',
border: '1px solid rgba(9, 70, 113,1)',
borderRadius: '8px',
display: 'flex',
flexDirection: 'column',
justifyContent: 'space-between',
alignItems:'center',
backdropFilter: 'blur(10px)',
},
title: {
color: '#fff',
fontSize: '16px',
fontWeight: 'normal',
},
count: {
color: '#04f21c',
fontSize: '24px',
fontWeight: 'bold',
},
}));
const PatrolStatistics = () => {
const classes = useStyles();
const patrolTypes = [
{ title: '日常巡查', count: 456 },
{ title: '汛期巡查', count: 32 },
{ title: '特别巡查', count: 3 },
];
const patrolStatus = [
{ title: '已完成', count: 456 },
{ title: '未完成', count: 32 },
{ title: '进行中', count: 3 },
];
const StatCard = ({ title, count }) => (
<Paper className={classes.card}>
<Typography className={classes.title}>{title}</Typography>
<Typography className={classes.count}>{count} <span style={{fontSize:16,color:"#fff",fontWeight:'normal'}}></span></Typography>
</Paper>
);
return (
<Box className={classes.root}>
<Box className={classes.row}>
{patrolTypes.map((item, index) => (
<StatCard key={`type-${index}`} {...item} />
))}
</Box>
<Box className={classes.row}>
{patrolStatus.map((item, index) => (
<StatCard key={`status-${index}`} {...item} />
))}
</Box>
</Box>
);
};
export default PatrolStatistics;

View File

@ -270,7 +270,7 @@ const householdData = [
<div className="divider"></div>
<div className="section-title">预警指标</div>
{/* <div className="section-title"></div>
<div className="warning-item">
<span className="label">准备转移</span>
<span className="value">1小时-mm; 3小时-mm; 6小时-mm</span>
@ -278,7 +278,7 @@ const householdData = [
<div className="warning-item">
<span className="label">立即转移</span>
<span className="value">1小时-mm; 3小时-mm; 6小时-mm</span>
</div>
</div> */}
<div className="divider"></div>

View File

@ -72,9 +72,9 @@ export default function Warn({ style }) {
}
}
useEffect(() => {
setValue(res.yy)
}, [res])
// useEffect(() => {
// setValue(res.yy)
// }, [res])
const switchChange = (e) => {
const val = e.target.checked
setChecked(val)
@ -102,6 +102,7 @@ export default function Warn({ style }) {
} else if (selectedSchemes.length < 2) {
setSelectedSchemes([...selectedSchemes, schemeId]);
}
// dispatch.runtime.setYyfa({})
};
useEffect(() => {
@ -109,7 +110,14 @@ export default function Warn({ style }) {
}, [selectedSchemes])
const productFa = () => {
dispatch?.runtime.setInfoDlg({ layerId: 'YuananLayer', properties: {} })
dispatch?.runtime.setInfoDlg({ layerId: 'YuananLayer', properties: {} })
dispatch.runtime.setYyfa({})
}
const changeYY = (e) => {
setValue(e.target.value)
dispatch.runtime.setYyfa({})
}
return (
<PanelBox
@ -127,7 +135,7 @@ export default function Warn({ style }) {
<FormControl fullWidth>
<RadioGroup
value={value}
onChange={(e) => setValue(e.target.value)}
onChange={changeYY}
>
{

14941
yarn.lock Normal file

File diff suppressed because it is too large Load Diff