mh-sms-web/src/components/CustomPages/BI/BI011TrainSafeAnalysis.js

493 lines
15 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",
},
{
width: "270px",
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) {
let ret = {
IsSuccessful: true,
Data: {
NUM1: 1,
NUM2: 94,
NUM3: 42,
NUM4: 13,
NUM5: 14,
NUM6: 15,
NUM7: 539,
trainRecords: [],
dateCountModel: [
{
DATE: "2024-01-01 00:00:00",
COUNT: 44,
TYPE: 0,
},
{
DATE: "2024-02-01 00:00:00",
COUNT: 50,
TYPE: 0,
},
{
DATE: "2024-03-01 00:00:00",
COUNT: 0,
TYPE: 0,
},
{
DATE: "2024-04-01 00:00:00",
COUNT: 0,
TYPE: 0,
},
],
},
TotalCount: 0,
MessageType: 0,
};
this.setState(
{
showLoading: false,
NUM1: ret.Data.NUM1,
NUM2: ret.Data.NUM2,
NUM3: ret.Data.NUM3,
NUM4: ret.Data.NUM4,
NUM5: ret.Data.NUM5,
NUM6: ret.Data.NUM6,
NUM7: ret.Data.NUM7,
retData: ret.Data.trainRecords,
}
);
// 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 = [];
let color = [
"#0090FF",
"#36CE9E",
"#FFC005",
"#FF515A",
"#8B5CFF",
"#00CA69",
];
const hexToRgba = (hex, opacity) => {
let rgbaColor = "";
let reg = /^#[\da-f]{6}$/i;
if (reg.test(hex)) {
rgbaColor = `rgba(${parseInt("0x" + hex.slice(1, 3))},${parseInt(
"0x" + hex.slice(3, 5)
)},${parseInt("0x" + hex.slice(5, 7))},${opacity})`;
}
return rgbaColor;
};
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({
color: color,
grid: {
left: "5%",
right: "5%",
},
legend: {
bottom: "0px",
},
title: {
text: "月度培训完成走势图",
left: "center",
top: "2%",
},
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
},
},
xAxis: {
type: "category",
data: this.state.dates,
boundaryGap: false,
axisLabel: {
textStyle: {
color: "#333",
},
},
axisLine: {
lineStyle: {
color: "#D9D9D9",
},
},
},
yAxis: {
type: "value",
axisLabel: {
textStyle: {
color: "#666",
},
},
nameTextStyle: {
color: "#666",
fontSize: 12,
lineHeight: 40,
},
splitLine: {
lineStyle: {
type: "dashed",
color: "#E9E9E9",
},
},
axisLine: {
show: false,
},
axisTick: {
show: false,
},
},
series: [
{
name: "培训记录数",
data: this.state.recordNums,
type: "line",
smooth: true,
symbolSize: 8,
zlevel: 3,
lineStyle: {
normal: {
color: color[0],
shadowBlur: 3,
shadowColor: hexToRgba(color[0], 0.5),
shadowOffsetY: 8,
},
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{
offset: 0,
color: hexToRgba(color[0], 0.3),
},
{
offset: 1,
color: hexToRgba(color[0], 0.1),
},
],
false
),
shadowColor: hexToRgba(color[0], 0.1),
shadowBlur: 10,
},
},
},
],
});
}
};
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={22}>
{/* <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> */}
<div
style={{
display: "flex",
flexDirection: "row",
alignItems: "center",
justifyContent: "space-around",
border: "1px #888 solid",
padding: "8px 0px",
}}
>
<div
style={{
width: "120px",
height: "70px",
borderRadius: "8px",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "space-around",
// marginBottom: "10px",
}}
>
<span>安全培训教育</span>
{/* <br></br> */}
<div>
<span
style={{
fontWeight: "bold",
fontSize: "20px",
color: "brown",
}}
>
{this.state.NUM2}
</span>
</div>
</div>
<div
style={{
width: "120px",
height: "70px",
borderRadius: "8px",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "space-around",
// marginBottom: "10px",
}}
>
<span>三级安全教育</span>
{/* <br></br> */}
<div>
<span
style={{
fontWeight: "bold",
fontSize: "20px",
color: "brown",
}}
>
{this.state.NUM3}
</span>
</div>
</div>
<div
style={{
width: "120px",
height: "70px",
borderRadius: "8px",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "space-around",
// marginBottom: "10px",
}}
>
<span>题库总条数</span>
{/* <br></br> */}
<div>
<span
style={{
fontWeight: "bold",
fontSize: "20px",
color: "brown",
}}
>
{this.state.NUM7}
</span>
</div>
</div>
</div>
</Col>
<Col span={1}></Col>
</Row>
<Row gutter={10} style={{ marginTop: "14px" }}>
<Col span={1}> </Col>
<Col span={22}>
<div
className="dashboard-div-style"
style={{
// borderRadius: "10px",
backgroundColor: "white",
border: "1px solid rgb(232,232,232)",
// 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="2"
/>
</div>
</Col>
<Col span={1}></Col>
</Row>
<br />
</div>
);
}
}
export default connect(({ login, app }) => ({ login, app }))(TrainSafeAnalysis);