209 lines
8.0 KiB
JavaScript
209 lines
8.0 KiB
JavaScript
|
|
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'
|
||
|
|
const { Option } = Select;
|
||
|
|
class TrainSafeAnalysis extends React.Component {
|
||
|
|
constructor(props) {
|
||
|
|
super(props);
|
||
|
|
this.state = {
|
||
|
|
pagination: {},
|
||
|
|
retData: [],
|
||
|
|
totalUsers: 0,
|
||
|
|
totalActiveUsers: 0,
|
||
|
|
selectUser: "",
|
||
|
|
selectDepartment: "",
|
||
|
|
dates: [],
|
||
|
|
recordNums: [],
|
||
|
|
todayCount: 0,
|
||
|
|
NUM1: 0,
|
||
|
|
NUM2: 0,
|
||
|
|
NUM3: 0,
|
||
|
|
NUM4: 0,
|
||
|
|
NUM5: 0,
|
||
|
|
NUM6: 0,
|
||
|
|
NUM7: 0,
|
||
|
|
searchMonth: moment().format('YYYY-MM'),
|
||
|
|
showLoading: false
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
componentDidMount() {
|
||
|
|
this.state.columns1 = [
|
||
|
|
{
|
||
|
|
title: '序号',
|
||
|
|
render: (text, record, index) => `${index + 1}`
|
||
|
|
},
|
||
|
|
{
|
||
|
|
title: '课程名称',
|
||
|
|
dataIndex: 'NAME',
|
||
|
|
},
|
||
|
|
{
|
||
|
|
title: '培训起止时间',
|
||
|
|
dataIndex: 'TIMERANGE',
|
||
|
|
},
|
||
|
|
{
|
||
|
|
title: '应参训人数',
|
||
|
|
dataIndex: 'SHOULD_TRAINER',
|
||
|
|
},
|
||
|
|
{
|
||
|
|
title: '实际参训人数',
|
||
|
|
dataIndex: 'ACTUAL_TRAINER',
|
||
|
|
}, {
|
||
|
|
title: '参训率',
|
||
|
|
render: (text, record) => (<span>{((record.ACTUAL_TRAINER / record.SHOULD_TRAINER) * 100).toFixed(0) + "%"}</span>),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
title: '考核方式',
|
||
|
|
dataIndex: 'METHOD',
|
||
|
|
},
|
||
|
|
{
|
||
|
|
title: '通过率',
|
||
|
|
dataIndex: 'PASS_RATE',
|
||
|
|
render: (text, record) => (<span>{(record.PASS_RATE * 100).toFixed(0) + "%"}</span>),
|
||
|
|
|
||
|
|
},
|
||
|
|
{
|
||
|
|
title: '效果评估(优良率)',
|
||
|
|
dataIndex: 'EFFORT_RATE',
|
||
|
|
render: (text, record) => (<span>{(record.EFFORT_RATE*1).toFixed(0) + "%"}</span>),
|
||
|
|
},
|
||
|
|
]
|
||
|
|
this.loadData(this.state.searchMonth);
|
||
|
|
};
|
||
|
|
loadData = (startTime) => {
|
||
|
|
const json = initFilter(this.props.login.OrgId);
|
||
|
|
this.state.showLoading = true;
|
||
|
|
json.Parameter1 = startTime;
|
||
|
|
this.props.dispatch({
|
||
|
|
type: 'app/getDataByPost',
|
||
|
|
url: 'BI/BIController/getSafeTrainData',
|
||
|
|
payload: json,
|
||
|
|
onlyData: false,
|
||
|
|
onComplete: (ret) => {
|
||
|
|
if (ret) {
|
||
|
|
this.state.showLoading = false;
|
||
|
|
this.state.NUM1 = ret.Data.NUM1;
|
||
|
|
this.state.NUM2 = ret.Data.NUM2;
|
||
|
|
this.state.NUM3 = ret.Data.NUM3;
|
||
|
|
this.state.NUM4 = ret.Data.NUM4;
|
||
|
|
this.state.NUM5 = ret.Data.NUM5;
|
||
|
|
this.state.NUM6 = ret.Data.NUM6;
|
||
|
|
this.state.NUM7 = ret.Data.NUM7;
|
||
|
|
this.state.retData = ret.Data.trainRecords;
|
||
|
|
this.chart1(ret.Data.dateCountModel);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
chart1 = (ret) => {
|
||
|
|
this.state.recordNums = [];
|
||
|
|
this.state.dates = [];
|
||
|
|
for (let i = 0; i < ret.length; i++) {
|
||
|
|
this.state.recordNums.push(ret[i].COUNT);
|
||
|
|
this.state.dates.push(moment(ret[i].DATE).format('YYYY-MM'));
|
||
|
|
}
|
||
|
|
let chart1s = document.getElementById('chart1');
|
||
|
|
if (chart1s) {
|
||
|
|
let myChart = echarts.init(chart1s);
|
||
|
|
myChart.on('click', (params) => {
|
||
|
|
this.loadData(params.name);
|
||
|
|
});
|
||
|
|
myChart.setOption({
|
||
|
|
grid: {
|
||
|
|
left: '5%',
|
||
|
|
right: '5%',
|
||
|
|
},
|
||
|
|
legend: {
|
||
|
|
bottom: '0px'
|
||
|
|
},
|
||
|
|
title: {
|
||
|
|
text: "月度培训完成走势图",
|
||
|
|
left: 'center'
|
||
|
|
},
|
||
|
|
tooltip: {
|
||
|
|
trigger: 'axis',
|
||
|
|
axisPointer: {
|
||
|
|
type: 'shadow'
|
||
|
|
},
|
||
|
|
},
|
||
|
|
xAxis: {
|
||
|
|
type: 'category',
|
||
|
|
data: this.state.dates,
|
||
|
|
axisLabel: {
|
||
|
|
showMaxLabel: true
|
||
|
|
}
|
||
|
|
},
|
||
|
|
yAxis: {
|
||
|
|
type: 'value',
|
||
|
|
},
|
||
|
|
series: [
|
||
|
|
{
|
||
|
|
name: '培训记录数',
|
||
|
|
data: this.state.recordNums,
|
||
|
|
type: 'line',
|
||
|
|
},
|
||
|
|
]
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
onChange = (type, value) => {
|
||
|
|
this.setState({
|
||
|
|
[type]: value
|
||
|
|
})
|
||
|
|
}
|
||
|
|
paginationConfig = {
|
||
|
|
pageSizeOptions: ['10', '20', '50'],
|
||
|
|
pageSize: 20,
|
||
|
|
showSizeChanger: true,
|
||
|
|
size: 'small',
|
||
|
|
}
|
||
|
|
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={3}>
|
||
|
|
{/* <Button style={{ width: "150px", height: "60px", borderRadius: '8px', border: '1px RGB(24, 149, 255) solid', margin: "10px" , boxShadow:"6px 0 10px rgba(0, 0, 0, 0.5)" }}>年度培训计划完成率<br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: '#843C0C' }}>{this.state.NUM1}</span>%</Button> */}
|
||
|
|
<Button style={{ width: "110px", height: "60px", borderRadius: '8px', border: '1px RGB(24, 149, 255) solid', margin: "10px", boxShadow: "6px 0 10px rgba(0, 0, 0, 0.5)" }}>安全培训教育<br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: '#843C0C' }}>{this.state.NUM2}</span>/次</Button>
|
||
|
|
<Button style={{ width: "110px", height: "60px", borderRadius: '8px', border: '1px RGB(24, 149, 255) solid', margin: "10px", boxShadow: "6px 0 10px rgba(0, 0, 0, 0.5)" }}>三级安全教育<br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: '#843C0C' }}>{this.state.NUM3}</span>/次</Button>
|
||
|
|
{/* <Button style={{ width: "110px", height: "60px", borderRadius: '8px', border: '1px RGB(24, 149, 255) solid', margin: "10px" , boxShadow:"6px 0 10px rgba(0, 0, 0, 0.5)"}}>学时达标率<br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: '#843C0C' }}>{this.state.NUM4}</span>%</Button> */}
|
||
|
|
{/* <Button style={{ width: "110px", height: "60px", borderRadius: '8px', border: '1px RGB(24, 149, 255) solid', margin: "10px" , boxShadow:"6px 0 10px rgba(0, 0, 0, 0.5)"}}>培训优良率<br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: '#843C0C' }}>{this.state.NUM5}</span>%</Button> */}
|
||
|
|
{/* <Button style={{ width: "150px", height: "60px", borderRadius: '8px', border: '1px RGB(24, 149, 255) solid', margin: "10px" , boxShadow:"6px 0 10px rgba(0, 0, 0, 0.5)"}}>培训考核通过率<br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: '#843C0C' }}>{this.state.NUM6}</span>%</Button> */}
|
||
|
|
<Button style={{ width: "110px", height: "60px", borderRadius: '8px', border: '1px RGB(24, 149, 255) solid', margin: "10px", boxShadow: "6px 0 10px rgba(0, 0, 0, 0.5)" }}>题库总条数<br></br><span style={{ fontWeight: "bold", fontSize: "20px", color: '#843C0C' }}>{this.state.NUM7}</span>/条</Button>
|
||
|
|
</Col>
|
||
|
|
<Col span={19}>
|
||
|
|
<div className="dashboard-div-style" style={{ borderRadius: '10px', backgroundColor: 'white', boxShadow: '0px 0px 10px rgba(0,0,0,.15)' }}>
|
||
|
|
<div id="chart1" style={{ width: '100%', height: '350px' }}></div>
|
||
|
|
</div>
|
||
|
|
</Col>
|
||
|
|
<Col span={1}></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={22} style={{ height: '100%' }}>
|
||
|
|
<div className="dashboard-div-style" style={{ boxShadow: '0px 0px 10px rgba(0,0,0,.15)' }}>
|
||
|
|
<Table
|
||
|
|
dataSource={this.state.retData}
|
||
|
|
columns={this.state.columns1}
|
||
|
|
pagination={this.paginationConfig}
|
||
|
|
bordered
|
||
|
|
loading={this.state.showLoading}
|
||
|
|
size="small"
|
||
|
|
rowKey="1"
|
||
|
|
/>
|
||
|
|
</div>
|
||
|
|
</Col>
|
||
|
|
<Col span={1}></Col>
|
||
|
|
</Row>
|
||
|
|
<br />
|
||
|
|
</div>
|
||
|
|
)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
export default connect(({ login, app }) => ({ login, app }))(TrainSafeAnalysis)
|