|
|
|
|
@ -9,6 +9,7 @@ const { Option } = Select;
|
|
|
|
|
|
|
|
|
|
const PollutionSourceManagement = () => {
|
|
|
|
|
const [loading, setLoading] = useState(false);
|
|
|
|
|
const [chartReady, setChartReady] = useState(false);
|
|
|
|
|
const [tableData, setTableData] = useState({
|
|
|
|
|
list: [],
|
|
|
|
|
pagination: {
|
|
|
|
|
@ -18,53 +19,136 @@ const PollutionSourceManagement = () => {
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 污染物排放统计图表配置
|
|
|
|
|
// 确保DOM准备好后再渲染图表
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const timer = setTimeout(() => {
|
|
|
|
|
setChartReady(true);
|
|
|
|
|
}, 100);
|
|
|
|
|
return () => clearTimeout(timer);
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
// 污染物排放统计图表配置 - 闭合环图+进度饼图
|
|
|
|
|
const pollutantEmissionOption = {
|
|
|
|
|
tooltip: {
|
|
|
|
|
trigger: 'item',
|
|
|
|
|
formatter: '{a} <br/>{b}: {c} ({d}%)'
|
|
|
|
|
show: false
|
|
|
|
|
},
|
|
|
|
|
series: [{
|
|
|
|
|
name: '污染物排放',
|
|
|
|
|
type: 'pie',
|
|
|
|
|
radius: ['40%', '70%'],
|
|
|
|
|
center: ['50%', '50%'],
|
|
|
|
|
data: [
|
|
|
|
|
{ value: 62, name: '超标污染物数量', itemStyle: { color: '#ff6b6b' } },
|
|
|
|
|
{ value: 38, name: '正常污染物数量', itemStyle: { color: '#4ecdc4' } }
|
|
|
|
|
],
|
|
|
|
|
emphasis: {
|
|
|
|
|
series: [
|
|
|
|
|
// 外层闭合环图
|
|
|
|
|
{
|
|
|
|
|
name: '外层环',
|
|
|
|
|
type: 'pie',
|
|
|
|
|
radius: ['58%', '80%'],
|
|
|
|
|
center: ['50%', '50%'],
|
|
|
|
|
data: [{ value: 100, name: '外层环' }],
|
|
|
|
|
itemStyle: {
|
|
|
|
|
shadowBlur: 10,
|
|
|
|
|
shadowOffsetX: 0,
|
|
|
|
|
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
|
|
|
|
}
|
|
|
|
|
color: '#F6F1E8',
|
|
|
|
|
shadowBlur: 4,
|
|
|
|
|
shadowColor: '#FFF5F0',
|
|
|
|
|
shadowOffsetY: 4,
|
|
|
|
|
borderRadius: 10,
|
|
|
|
|
borderColor: 'rgba(255, 227, 208, 0.6)', // 外边框颜色
|
|
|
|
|
borderWidth: 2
|
|
|
|
|
},
|
|
|
|
|
label: { show: false },
|
|
|
|
|
labelLine: { show: false },
|
|
|
|
|
silent: true
|
|
|
|
|
},
|
|
|
|
|
// 内层进度饼图
|
|
|
|
|
{
|
|
|
|
|
name: '进度饼图',
|
|
|
|
|
type: 'pie',
|
|
|
|
|
radius: ['61%', '77%'],
|
|
|
|
|
center: ['50%', '50%'],
|
|
|
|
|
data: [
|
|
|
|
|
{
|
|
|
|
|
value: 62,
|
|
|
|
|
name: '超标污染物数量',
|
|
|
|
|
itemStyle: {
|
|
|
|
|
color: {
|
|
|
|
|
type: 'linear',
|
|
|
|
|
x: 0, y: 0, x2: 1, y2: 1,
|
|
|
|
|
colorStops: [
|
|
|
|
|
{ offset: 0, color: '#FFF4B3' },
|
|
|
|
|
{ offset: 0.5, color: '#FF8351' },
|
|
|
|
|
{ offset: 1, color: '#FF7125' }
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
borderRadius: 10
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
value: 38,
|
|
|
|
|
name: '剩余',
|
|
|
|
|
itemStyle: { color: 'transparent' }
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
label: { show: false },
|
|
|
|
|
labelLine: { show: false },
|
|
|
|
|
silent: true
|
|
|
|
|
}
|
|
|
|
|
}]
|
|
|
|
|
]
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 超标污染物种类统计图表配置 - 闭合环图+进度饼图
|
|
|
|
|
const pollutantTypeOption = {
|
|
|
|
|
tooltip: {
|
|
|
|
|
trigger: 'item',
|
|
|
|
|
formatter: '{a} <br/>{b}: {c} ({d}%)'
|
|
|
|
|
show: false
|
|
|
|
|
},
|
|
|
|
|
series: [{
|
|
|
|
|
name: '污染物种类',
|
|
|
|
|
type: 'pie',
|
|
|
|
|
radius: ['40%', '70%'],
|
|
|
|
|
center: ['50%', '50%'],
|
|
|
|
|
data: [
|
|
|
|
|
{ value: 25, name: '超标污染物种类', itemStyle: { color: '#a8e6cf' } },
|
|
|
|
|
{ value: 75, name: '正常污染物种类', itemStyle: { color: '#ffd3a5' } }
|
|
|
|
|
],
|
|
|
|
|
emphasis: {
|
|
|
|
|
series: [
|
|
|
|
|
// 外层闭合环图
|
|
|
|
|
{
|
|
|
|
|
name: '外层环',
|
|
|
|
|
type: 'pie',
|
|
|
|
|
radius: ['58%', '80%'],
|
|
|
|
|
center: ['50%', '50%'],
|
|
|
|
|
data: [{ value: 100, name: '外层环' }],
|
|
|
|
|
itemStyle: {
|
|
|
|
|
shadowBlur: 10,
|
|
|
|
|
shadowOffsetX: 0,
|
|
|
|
|
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
|
|
|
|
}
|
|
|
|
|
color: '#F2F0FF',
|
|
|
|
|
shadowBlur: 4,
|
|
|
|
|
shadowColor: '#F2F0FF',
|
|
|
|
|
shadowOffsetY: 4,
|
|
|
|
|
borderRadius: 10,
|
|
|
|
|
borderColor: '#E4E1FB', // 外边框颜色
|
|
|
|
|
borderWidth: 2
|
|
|
|
|
},
|
|
|
|
|
label: { show: false },
|
|
|
|
|
labelLine: { show: false },
|
|
|
|
|
silent: true
|
|
|
|
|
},
|
|
|
|
|
// 内层进度饼图
|
|
|
|
|
{
|
|
|
|
|
name: '进度饼图',
|
|
|
|
|
type: 'pie',
|
|
|
|
|
radius: ['61%', '77%'],
|
|
|
|
|
center: ['50%', '50%'],
|
|
|
|
|
data: [
|
|
|
|
|
{
|
|
|
|
|
value: 25,
|
|
|
|
|
name: '超标污染物种类',
|
|
|
|
|
itemStyle: {
|
|
|
|
|
color: {
|
|
|
|
|
type: 'linear',
|
|
|
|
|
x: 0, y: 0, x2: 0, y2: 1,
|
|
|
|
|
colorStops: [
|
|
|
|
|
{ offset: 0, color: '#B3D6FF' },
|
|
|
|
|
{ offset: 0.476, color: '#9E7DFF' },
|
|
|
|
|
{ offset: 1, color: '#2549FF' }
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
borderRadius: 10
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
value: 75,
|
|
|
|
|
name: '剩余',
|
|
|
|
|
itemStyle: { color: 'transparent' }
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
label: { show: false },
|
|
|
|
|
labelLine: { show: false },
|
|
|
|
|
silent: true
|
|
|
|
|
}
|
|
|
|
|
}]
|
|
|
|
|
]
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 超标排放统计图表配置
|
|
|
|
|
@ -97,12 +181,14 @@ const PollutionSourceManagement = () => {
|
|
|
|
|
grid: {
|
|
|
|
|
left: '20%',
|
|
|
|
|
right: '10%',
|
|
|
|
|
top: '10%',
|
|
|
|
|
bottom: '10%'
|
|
|
|
|
top: '0%',
|
|
|
|
|
bottom: '0%'
|
|
|
|
|
},
|
|
|
|
|
xAxis: {
|
|
|
|
|
type: 'value',
|
|
|
|
|
max: 100,
|
|
|
|
|
min: 0,
|
|
|
|
|
interval: 10,
|
|
|
|
|
axisLine: {
|
|
|
|
|
show: false
|
|
|
|
|
},
|
|
|
|
|
@ -110,7 +196,10 @@ const PollutionSourceManagement = () => {
|
|
|
|
|
show: false
|
|
|
|
|
},
|
|
|
|
|
axisLabel: {
|
|
|
|
|
color: '#666'
|
|
|
|
|
color: '#666',
|
|
|
|
|
formatter: function(value) {
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
splitLine: {
|
|
|
|
|
lineStyle: {
|
|
|
|
|
@ -123,7 +212,10 @@ const PollutionSourceManagement = () => {
|
|
|
|
|
type: 'category',
|
|
|
|
|
data: ['污染物1', '污染物2', '污染物3', '污染物4', '污染物5'],
|
|
|
|
|
axisLine: {
|
|
|
|
|
show: false
|
|
|
|
|
show: true,
|
|
|
|
|
lineStyle: {
|
|
|
|
|
color: '#D7D6D6'
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
axisTick: {
|
|
|
|
|
show: false
|
|
|
|
|
@ -137,10 +229,21 @@ const PollutionSourceManagement = () => {
|
|
|
|
|
type: 'bar',
|
|
|
|
|
data: [45, 66, 32, 28, 38],
|
|
|
|
|
itemStyle: {
|
|
|
|
|
color: '#ff6b6b',
|
|
|
|
|
color: {
|
|
|
|
|
type: 'linear',
|
|
|
|
|
x: 0,
|
|
|
|
|
y: 0,
|
|
|
|
|
x2: 1,
|
|
|
|
|
y2: 0,
|
|
|
|
|
colorStops: [{
|
|
|
|
|
offset: 0, color: '#FFEBD9'
|
|
|
|
|
}, {
|
|
|
|
|
offset: 1, color: '#FF0000'
|
|
|
|
|
}]
|
|
|
|
|
},
|
|
|
|
|
borderRadius: [0, 4, 4, 0]
|
|
|
|
|
},
|
|
|
|
|
barWidth: '60%'
|
|
|
|
|
barWidth: '100%'
|
|
|
|
|
}]
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@ -321,7 +424,7 @@ const PollutionSourceManagement = () => {
|
|
|
|
|
{/* 顶部统计区域 */}
|
|
|
|
|
<div className={styles.statsSection}>
|
|
|
|
|
{/* 污染物排放统计 */}
|
|
|
|
|
<div className={styles.statsCard}>
|
|
|
|
|
<div className={styles.pollutantStatsCard}>
|
|
|
|
|
<div className={styles.cardTitle}>
|
|
|
|
|
<span>污染物排放统计</span>
|
|
|
|
|
<div className={styles.cardHeader}>
|
|
|
|
|
@ -340,46 +443,60 @@ const PollutionSourceManagement = () => {
|
|
|
|
|
<div className={styles.chartsContainer}>
|
|
|
|
|
<div className={styles.pieChartContainer}>
|
|
|
|
|
{/* <div className={styles.chartTitle}>超标污染物数量</div> */}
|
|
|
|
|
<ReactECharts
|
|
|
|
|
option={pollutantEmissionOption}
|
|
|
|
|
style={{ height: '120px', width: '100%' }}
|
|
|
|
|
opts={{ renderer: 'canvas' }}
|
|
|
|
|
/>
|
|
|
|
|
<div className={styles.chartValue}>62%</div>
|
|
|
|
|
{chartReady && (
|
|
|
|
|
<ReactECharts
|
|
|
|
|
option={pollutantEmissionOption}
|
|
|
|
|
style={{ height: '100%', width: '100%' }}
|
|
|
|
|
opts={{ renderer: 'canvas' }}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
<div className={styles.chartCenterContent}>
|
|
|
|
|
<div className={styles.chartValue}>62%</div>
|
|
|
|
|
<div className={styles.chartLabel}>超标污染物数量</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div className={styles.pieChartContainer}>
|
|
|
|
|
{/* <div className={styles.chartTitle}>超标污染物种类</div> */}
|
|
|
|
|
<ReactECharts
|
|
|
|
|
option={pollutantTypeOption}
|
|
|
|
|
style={{ height: '120px', width: '100%' }}
|
|
|
|
|
opts={{ renderer: 'canvas' }}
|
|
|
|
|
/>
|
|
|
|
|
<div className={styles.chartValue}>25%</div>
|
|
|
|
|
{chartReady && (
|
|
|
|
|
<ReactECharts
|
|
|
|
|
option={pollutantTypeOption}
|
|
|
|
|
style={{ height: '100%', width: '100%' }}
|
|
|
|
|
opts={{ renderer: 'canvas' }}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
<div className={styles.chartCenterContent}>
|
|
|
|
|
<div className={styles.chartValue}>25%</div>
|
|
|
|
|
<div className={styles.chartLabel}>超标污染物种类</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* 超标排放统计 */}
|
|
|
|
|
<div className={styles.statsCard}>
|
|
|
|
|
<div className={styles.cardTitle}>超标排放统计</div>
|
|
|
|
|
<div className={styles.exceedanceStatsCard}>
|
|
|
|
|
<div className={styles.cardHeader}>
|
|
|
|
|
<Select defaultValue="今日" className={styles.timeFilter}>
|
|
|
|
|
<div className={styles.cardTitle}>超标排放统计</div>
|
|
|
|
|
<div className={styles.filterGroup}>
|
|
|
|
|
<Select defaultValue="今日" className={styles.exceedanceTimeFilter}>
|
|
|
|
|
<Option value="今日">今日</Option>
|
|
|
|
|
<Option value="本周">本周</Option>
|
|
|
|
|
<Option value="本月">本月</Option>
|
|
|
|
|
</Select>
|
|
|
|
|
<Select defaultValue="所有名录" className={styles.categoryFilter}>
|
|
|
|
|
<Select defaultValue="所有名录" className={styles.exceedanceCategoryFilter}>
|
|
|
|
|
<Option value="所有名录">所有名录</Option>
|
|
|
|
|
<Option value="大气环境">大气环境</Option>
|
|
|
|
|
<Option value="水环境">水环境</Option>
|
|
|
|
|
</Select>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div className={styles.barChartContainer}>
|
|
|
|
|
<ReactECharts
|
|
|
|
|
option={exceedanceOption}
|
|
|
|
|
style={{ height: '100px', width: '100%' }}
|
|
|
|
|
opts={{ renderer: 'canvas' }}
|
|
|
|
|
/>
|
|
|
|
|
{chartReady && (
|
|
|
|
|
<ReactECharts
|
|
|
|
|
option={exceedanceOption}
|
|
|
|
|
style={{ height: '100px', width: '100%' }}
|
|
|
|
|
opts={{ renderer: 'canvas' }}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
@ -466,7 +583,7 @@ const PollutionSourceManagement = () => {
|
|
|
|
|
onChange={handleTableChange}
|
|
|
|
|
rowKey="key"
|
|
|
|
|
size="small"
|
|
|
|
|
scroll={{ x: 1200 }}
|
|
|
|
|
scroll={{ x: 1200, y: 600 }}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|