377 lines
11 KiB
JavaScript
377 lines
11 KiB
JavaScript
|
|
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;
|