mh_jy_safe_web/src/components/CustomPages/BI/BI009RiskAnalysis.js

467 lines
14 KiB
JavaScript
Raw Normal View History

2025-08-25 10:08:30 +08:00
import React, { useState, useEffect, useRef, Component } from 'react'
import { connect } from 'dva'
import { initFilter, addRuleAndGroups, guid, extendInclude, extendRule, extendOrder, extend, initQueryFilter } from "../../../utils/common"
import { Table, Row, Col, Button, Select, DatePicker, message } from 'antd';
import echarts from 'echarts';
import moment from 'moment'
class BI008RiskAnalysis extends React.Component {
constructor(props) {
super(props);
this.state = {
pagination: {},
retData: [],
totalUsers: 0,
totalActiveUsers: 0,
todayCount: 0,
LEVEL1TOTAL: 0,
LEVEL2TOTAL: 0,
LEVEL3TOTAL: 0,
LEVEL4TOTAL: 0,
HAZARDTOTALCOUNT: 0,
RISKTOTALCOUNT: 0,
MEASURESTOTALCOUNT: 0
};
};
componentDidMount() {
this.state.columns1 = [
{
title: '部门',
dataIndex: 'NAME',
},
{
title: '一级风险',
dataIndex: 'LEVEL1',
},
{
title: '二级风险',
dataIndex: 'LEVEL2',
},
{
title: '三级风险',
dataIndex: 'LEVEL3',
},
{
title: '四级风险',
dataIndex: 'LEVEL4',
},
]
const json = initFilter(this.props.login.OrgId);
this.getBaseInfoData();
};
//获取数据
getBaseInfoData = () => {
const json2 = initFilter(this.props.login.OrgId)
extendOrder(json2, "CREATE_TIME", 1);
this.props.dispatch({
type: 'app/getDataByPost',
url: 'BI/BIController/getRiskData',
payload: json2,
onlyData: false,
onComplete: (ret) => {
if (ret) {
this.state.retData = ret?.Data.RISKLEVELCOUNTS;
let level1all = 0;
let level2all = 0;
let level3all = 0;
let level4all = 0;
for (let i = 0; i < ret.Data.RISKLEVELCOUNTS.length; i++) {
level1all += ret.Data.RISKLEVELCOUNTS[i].LEVEL1;
level2all += ret.Data.RISKLEVELCOUNTS[i].LEVEL2;
level3all += ret.Data.RISKLEVELCOUNTS[i].LEVEL3;
level4all += ret.Data.RISKLEVELCOUNTS[i].LEVEL4;
}
this.state.LEVEL1TOTAL = level1all;
this.state.LEVEL2TOTAL = level2all;
this.state.LEVEL3TOTAL = level3all;
this.state.LEVEL4TOTAL = level4all;
this.state.HAZARDTOTALCOUNT = ret.Data.HAZARDTOTALCOUNT;
this.state.RISKTOTALCOUNT = ret.Data.RISKTOTALCOUNT;
this.state.MEASURESTOTALCOUNT = ret.Data.MEASURESTOTALCOUNT;
}
this.chart1();
this.chart2(ret?.Data.AREACOUNTS.filter(t => t.AREATYPE == 0).slice(0, 10));
this.chart3(ret?.Data.AREACOUNTS.filter(t => t.AREATYPE == 1).slice(0, 10));
this.chart4(ret?.Data.DATECOUNTS);
}
})
};
chart1 = () => {
let chart1s = document.getElementById('chart1');
let myChart = echarts.init(chart1s);
myChart.setOption(
{
grid: {
top: '2%',
left: '1%',
right: '1%',
},
title: {
text: "风险分级占比",
left: 'center',
top: "2%"
},
tooltip: {
trigger: 'item'
},
legend: {
bottom: '2%'
},
series: [
{
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
label: {
show: false,
position: 'center'
},
labelLine: {
show: false
},
data: [
{ value: this.state.LEVEL1TOTAL, name: '一级风险' },
{ value: this.state.LEVEL2TOTAL, name: '二级风险' },
{ value: this.state.LEVEL3TOTAL, name: '三级风险' },
{ value: this.state.LEVEL4TOTAL, name: '四级风险' },
],
itemStyle: {
normal: {
color: function (colors) {
var colorList = [ "red","orange","yellow","blue" ];
return colorList [colors.dataIndex];
}
},
}
}
]
}
);
}
chart2 = (data) => {
let areaName = [];
let areaCount = [];
data.forEach(item => {
areaName.push(item.AREANAME);
areaCount.push(item.AREACOUNT);
})
let chart2s = document.getElementById('chart2');
if (chart2s) {
let myChart = echarts.init(chart2s);
myChart.setOption({
title: {
text: "矿山-风险区域统计TOP10",
left: 'center',
top: "2%"
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
},
grid: {
left: '3%',
right: '4%',
top: '10%',
bottom: '1%',
containLabel: true
},
xAxis: {
type: 'value',
splitLine: {
show: false,
lineStyle: {
color: '#172749'
}
},
axisLine: {
show: false
},
axisTick: {
show: false
},
axisLabel: {
show: true,
interval: 0,
formatter: '{value}', // 给每个数值添加%
},
},
yAxis: {
type: 'category',
axisTick: {
show: false
},
axisLine: {
show: false
},
splitLine: {
show: false,
lineStyle: {
color: '#172749'
}
},
data: areaName,
},
series: [
{
name: '数量',
type: 'bar',
label: {
show: true,
position: 'insideRight',
color: '#fff',
formatter: '{c}',
fontSize: '12'
},
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{ offset: 0, color: "#01AEF6" },
{ offset: 1, color: "#9999FF" },
]),
},
data: areaCount,
show: false
},
],
});
}
}
chart3 = (data) => {
let areaName = [];
let areaCount = [];
data.forEach(item => {
areaName.push(item.AREANAME);
areaCount.push(item.AREACOUNT);
})
let chart3s = document.getElementById('chart3');
if (chart3s) {
let myChart = echarts.init(chart3s);
myChart.setOption({
title: {
text: "选矿-风险区域统计TOP10",
left: 'center',
top: "2%"
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
},
grid: {
left: '3%',
right: '4%',
top: '10%',
bottom: '1%',
containLabel: true
},
xAxis: {
type: 'value',
splitLine: {
show: false,
lineStyle: {
color: '#172749'
}
},
axisLine: {
show: false
},
axisTick: {
show: false
},
axisLabel: {
show: true,
interval: 0,
formatter: '{value}', // 给每个数值添加%
},
},
yAxis: {
type: 'category',
axisTick: {
show: false
},
axisLine: {
show: false
},
splitLine: {
show: false,
lineStyle: {
color: '#172749'
}
},
data: areaName,
},
series: [
{
name: '数量',
type: 'bar',
label: {
show: true,
position: 'insideRight',
color: '#fff',
formatter: '{c}',
fontSize: '12'
},
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{ offset: 0, color: "#01AEF6" },
{ offset: 1, color: "#9999FF" },
]),
},
data: areaCount,
show: false
},
],
});
}
}
chart4 = (data) => {
let riskArr = [];
let hazardArr = [];
let dates = [];
for (let i = 0; i < data.length; i++) {
if (data[i].TYPE == 0) {
riskArr.push(data[i].COUNT);
dates.push(moment(data[i].DATE).format('YYYY/MM'))
} else {
hazardArr.push(data[i].COUNT);
}
}
let currMonth=dates.length;
for (let i = 1; i < (13 - currMonth); i++) {
dates.push(moment(dates[dates.length]).add(i, 'months').format('YYYY/MM'))
}
let chart4s = document.getElementById('chart4');
if (chart4s) {
let myChart = echarts.init(chart4s);
myChart.setOption({
grid: {
left: '5%',
right: '5%',
},
legend: {
bottom: '0px'
},
title: {
text: "月度风险辨识统计走势",
left: 'center',
top: "2%"
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
},
xAxis: {
type: 'category',
data: dates,
axisLabel: {
showMaxLabel: true
}
},
yAxis: {
type: 'value',
},
series: [
{
name: '危险源/风险库',
data: riskArr,
type: 'line',
}, {
name: '职业危害库',
data: hazardArr,
type: 'line',
}
]
});
}
}
render() {
return (
<div style={{ backgroundColor: 'white', width: '1200px', top: '0', bottom: '0', left: '0', right: '0', margin: 'auto', borderStyle: 'solid', borderColor: '#ccc', borderWidth: '1px', }}>
<h1 style={{ textAlign: "center", marginTop: '30px', fontWeight: 'bold' }}>风险管理统计分析</h1>
<Row gutter={10} style={{ marginTop: "14px" }}>
<Col span={1}></Col>
<Col span={2} style={{ textAlign: 'center' }}>
<div>
<Button style={{ width: "100px", height: "70px", borderRadius: '8px', marginBottom: "10px", backgroundColor: "red" }}><span style={{
color
: "white"
}}>一级风险</span><br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: 'white' }}>{this.state.LEVEL1TOTAL}</span></Button>
<Button style={{ width: "100px", height: "70px", borderRadius: '8px', marginBottom: "10px", backgroundColor: "orange" }}><span style={{
color
: "white"
}}>二级风险</span><br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: 'white' }}>{this.state.LEVEL2TOTAL}</span></Button>
<Button style={{ width: "100px", height: "70px", borderRadius: '8px', marginBottom: "10px", backgroundColor: "yellow" }}><span style={{
color
: "black"
}}>三级风险</span><br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: 'black' }}>{this.state.LEVEL3TOTAL}</span></Button>
<Button style={{ width: "100px", height: "70px", borderRadius: '8px', marginBottom: "10px", backgroundColor: "blue" }}><span style={{
color
: "white"
}}>四级风险</span><br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: 'white' }}>{(this.state.LEVEL4TOTAL)}</span></Button>
</div>
</Col>
<Col span={10}>
<div className="dashboard-div-style" style={{ border: '1px gray dotted' }}>
<div id="chart1" style={{ width: '100%', height: '340px' }}></div>
</div>
</Col>
<Col span={10} style={{ height: '300px' }}>
<div>
<Table
dataSource={this.state.retData}
columns={this.state.columns1}
bordered
loading={this.state.showLoading}
size="small"
rowKey="1"
pagination={false}
/>
</div>
</Col>
</Row>
<hr style={{ border: '1px dashed #ccc', marginBottom: "20px", marginTop: "20px" }}></hr>
<Row gutter={10} style={{ marginTop: "14px" }}>
<Col span={1}></Col>
<Col span={3} style={{ textAlign: 'center' }}>
<div>
<Button style={{ width: "120px", height: "70px", borderRadius: '8px', marginBottom: "10px" }}><span>危险源/风险库</span><br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: "brown" }}>{this.state.RISKTOTALCOUNT}</span></Button>
<Button style={{ width: "120px", height: "70px", borderRadius: '8px', marginBottom: "10px" }}><span>职业危害库</span><br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: "brown" }}>{this.state.HAZARDTOTALCOUNT}</span></Button>
<Button style={{ width: "120px", height: "70px", borderRadius: '8px', marginBottom: "10px" }}><span>管控措施</span><br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: "brown" }}>{this.state.MEASURESTOTALCOUNT}</span></Button>
</div>
</Col>
<Col span={19}>
<div className="dashboard-div-style" style={{ border: '1px gray dotted' }}>
<div id="chart4" style={{ width: '100%', height: '300px' }}></div>
</div>
</Col>
</Row>
<hr style={{ border: '1px dashed #ccc', marginBottom: "20px", marginTop: "20px" }}></hr>
<Row gutter={10} style={{ marginTop: "14px" }}>
<Col span={1}></Col>
<Col span={11}>
<div className="dashboard-div-style" style={{ border: '1px gray dotted' }}>
<div id="chart2" style={{ width: '100%', height: '400px' }}></div>
</div>
</Col>
<Col span={11}>
<div className="dashboard-div-style" style={{ border: '1px gray dotted' }}>
<div id="chart3" style={{ width: '100%', height: '400px' }}></div>
</div>
</Col>
</Row>
<br />
</div>
)
}
}
export default connect(({ login, app }) => ({ login, app }))(BI008RiskAnalysis)