在做工厂智能化生产看板时,绝对会有设备状态看板,展示设备当天或者当前状态,设备状态数据一般是有mes 系统设备管理模块对设备信息进行采集,一般包括过站数据,设备当前状态,是否在线是否故障、检修、待生产、正常运行等
那么前端看板用什么展示设备当天所有状态,以及状态持续的时长,设备当天的运行记录
实现效果:
代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>跳转页面</title>
<script type="text/javascript" src="jquery.min.js" asp-append-version="true"></script>
<script type="text/javascript" src="echarts.js" asp-append-version="true"></script>
<script src="https://cdn.jsdelivr.net/npm/echarts@5.2.2/dist/echarts.min.js"></script>
<style>
*{
font-size:100px;
}
</style>
</head>
<body>
<!-- 创建容器 -->
<div id="chart" style="width:800px;height:500px;"></div>
<script>
var myChart = echarts.init(document.getElementById('chart'));
var data =
[{
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T07:00:00",
"END_TIME": "2023-11-25T07:05:00",
"RUNTIME_TIMESTAMP": 1700895600000,
"END_TIME_TIMESTAMP": 1700895900000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T07:05:00",
"END_TIME": "2023-11-25T07:10:00",
"RUNTIME_TIMESTAMP": 1700895900000,
"END_TIME_TIMESTAMP": 1700896200000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T07:10:00",
"END_TIME": "2023-11-25T07:15:00",
"RUNTIME_TIMESTAMP": 1700896200000,
"END_TIME_TIMESTAMP": 1700896500000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T07:15:00",
"END_TIME": "2023-11-25T07:20:00",
"RUNTIME_TIMESTAMP": 1700896500000,
"END_TIME_TIMESTAMP": 1700896800000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T07:20:00",
"END_TIME": "2023-11-25T07:25:00",
"RUNTIME_TIMESTAMP": 1700896800000,
"END_TIME_TIMESTAMP": 1700897100000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T07:25:00",
"END_TIME": "2023-11-25T07:30:00",
"RUNTIME_TIMESTAMP": 1700897100000,
"END_TIME_TIMESTAMP": 1700897400000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T07:30:00",
"END_TIME": "2023-11-25T07:35:00",
"RUNTIME_TIMESTAMP": 1700897400000,
"END_TIME_TIMESTAMP": 1700897700000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T07:35:00",
"END_TIME": "2023-11-25T07:40:00",
"RUNTIME_TIMESTAMP": 1700897700000,
"END_TIME_TIMESTAMP": 1700898000000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T07:40:00",
"END_TIME": "2023-11-25T07:45:00",
"RUNTIME_TIMESTAMP": 1700898000000,
"END_TIME_TIMESTAMP": 1700898300000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T07:45:00",
"END_TIME": "2023-11-25T07:50:00",
"RUNTIME_TIMESTAMP": 1700898300000,
"END_TIME_TIMESTAMP": 1700898600000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T07:50:00",
"END_TIME": "2023-11-25T07:55:00",
"RUNTIME_TIMESTAMP": 1700898600000,
"END_TIME_TIMESTAMP": 1700898900000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "故障停机",
"RUNTIME": "2023-11-25T07:55:00",
"END_TIME": "2023-11-25T08:00:00",
"RUNTIME_TIMESTAMP": 1700898900000,
"END_TIME_TIMESTAMP": 1700899200000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "故障停机",
"RUNTIME": "2023-11-25T08:00:00",
"END_TIME": "2023-11-25T08:05:00",
"RUNTIME_TIMESTAMP": 1700899200000,
"END_TIME_TIMESTAMP": 1700899500000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "故障停机",
"RUNTIME": "2023-11-25T08:05:00",
"END_TIME": "2023-11-25T08:10:00",
"RUNTIME_TIMESTAMP": 1700899500000,
"END_TIME_TIMESTAMP": 1700899800000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "故障停机",
"RUNTIME": "2023-11-25T08:10:00",
"END_TIME": "2023-11-25T08:15:00",
"RUNTIME_TIMESTAMP": 1700899800000,
"END_TIME_TIMESTAMP": 1700900100000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "故障停机",
"RUNTIME": "2023-11-25T08:15:00",
"END_TIME": "2023-11-25T08:20:00",
"RUNTIME_TIMESTAMP": 1700900100000,
"END_TIME_TIMESTAMP": 1700900400000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "调试",
"RUNTIME": "2023-11-25T08:20:00",
"END_TIME": "2023-11-25T08:25:00",
"RUNTIME_TIMESTAMP": 1700900400000,
"END_TIME_TIMESTAMP": 1700900700000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "调试",
"RUNTIME": "2023-11-25T08:25:00",
"END_TIME": "2023-11-25T08:30:00",
"RUNTIME_TIMESTAMP": 1700900700000,
"END_TIME_TIMESTAMP": 1700901000000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "调试",
"RUNTIME": "2023-11-25T08:30:00",
"END_TIME": "2023-11-25T08:35:00",
"RUNTIME_TIMESTAMP": 1700901000000,
"END_TIME_TIMESTAMP": 1700901300000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "待生产",
"RUNTIME": "2023-11-25T08:35:00",
"END_TIME": "2023-11-25T08:40:00",
"RUNTIME_TIMESTAMP": 1700901300000,
"END_TIME_TIMESTAMP": 1700901600000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "待生产",
"RUNTIME": "2023-11-25T08:40:00",
"END_TIME": "2023-11-25T08:45:00",
"RUNTIME_TIMESTAMP": 1700901600000,
"END_TIME_TIMESTAMP": 1700901900000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T08:45:00",
"END_TIME": "2023-11-25T08:50:00",
"RUNTIME_TIMESTAMP": 1700901900000,
"END_TIME_TIMESTAMP": 1700902200000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T08:50:00",
"END_TIME": "2023-11-25T08:55:00",
"RUNTIME_TIMESTAMP": 1700902200000,
"END_TIME_TIMESTAMP": 1700902500000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T08:55:00",
"END_TIME": "2023-11-25T09:00:00",
"RUNTIME_TIMESTAMP": 1700902500000,
"END_TIME_TIMESTAMP": 1700902800000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T09:00:00",
"END_TIME": "2023-11-25T09:05:00",
"RUNTIME_TIMESTAMP": 1700902800000,
"END_TIME_TIMESTAMP": 1700903100000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "调试",
"RUNTIME": "2023-11-25T09:05:00",
"END_TIME": "2023-11-25T09:10:00",
"RUNTIME_TIMESTAMP": 1700903100000,
"END_TIME_TIMESTAMP": 1700903400000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "调试",
"RUNTIME": "2023-11-25T09:10:00",
"END_TIME": "2023-11-25T09:15:00",
"RUNTIME_TIMESTAMP": 1700903400000,
"END_TIME_TIMESTAMP": 1700903700000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T09:15:00",
"END_TIME": "2023-11-25T09:20:00",
"RUNTIME_TIMESTAMP": 1700903700000,
"END_TIME_TIMESTAMP": 1700904000000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T09:20:00",
"END_TIME": "2023-11-25T09:25:00",
"RUNTIME_TIMESTAMP": 1700904000000,
"END_TIME_TIMESTAMP": 1700904300000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T09:25:00",
"END_TIME": "2023-11-25T09:30:00",
"RUNTIME_TIMESTAMP": 1700904300000,
"END_TIME_TIMESTAMP": 1700904600000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "故障停机",
"RUNTIME": "2023-11-25T09:30:00",
"END_TIME": "2023-11-25T09:35:00",
"RUNTIME_TIMESTAMP": 1700904600000,
"END_TIME_TIMESTAMP": 1700904900000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "故障停机",
"RUNTIME": "2023-11-25T09:35:00",
"END_TIME": "2023-11-25T09:40:00",
"RUNTIME_TIMESTAMP": 1700904900000,
"END_TIME_TIMESTAMP": 1700905200000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "维修",
"RUNTIME": "2023-11-25T09:40:00",
"END_TIME": "2023-11-25T09:45:00",
"RUNTIME_TIMESTAMP": 1700905200000,
"END_TIME_TIMESTAMP": 1700905500000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "维修",
"RUNTIME": "2023-11-25T09:45:00",
"END_TIME": "2023-11-25T09:50:00",
"RUNTIME_TIMESTAMP": 1700905500000,
"END_TIME_TIMESTAMP": 1700905800000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T09:50:00",
"END_TIME": "2023-11-25T09:55:00",
"RUNTIME_TIMESTAMP": 1700905800000,
"END_TIME_TIMESTAMP": 1700906100000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T09:55:00",
"END_TIME": "2023-11-25T10:00:00",
"RUNTIME_TIMESTAMP": 1700906100000,
"END_TIME_TIMESTAMP": 1700906400000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T10:00:00",
"END_TIME": "2023-11-25T10:05:00",
"RUNTIME_TIMESTAMP": 1700906400000,
"END_TIME_TIMESTAMP": 1700906700000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T10:05:00",
"END_TIME": "2023-11-25T10:10:00",
"RUNTIME_TIMESTAMP": 1700906700000,
"END_TIME_TIMESTAMP": 1700907000000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T10:10:00",
"END_TIME": "2023-11-25T10:15:00",
"RUNTIME_TIMESTAMP": 1700907000000,
"END_TIME_TIMESTAMP": 1700907300000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T10:15:00",
"END_TIME": "2023-11-25T10:20:00",
"RUNTIME_TIMESTAMP": 1700907300000,
"END_TIME_TIMESTAMP": 1700907600000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T10:20:00",
"END_TIME": "2023-11-25T10:25:00",
"RUNTIME_TIMESTAMP": 1700907600000,
"END_TIME_TIMESTAMP": 1700907900000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T10:25:00",
"END_TIME": "2023-11-25T10:30:00",
"RUNTIME_TIMESTAMP": 1700907900000,
"END_TIME_TIMESTAMP": 1700908200000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T10:30:00",
"END_TIME": "2023-11-25T10:35:00",
"RUNTIME_TIMESTAMP": 1700908200000,
"END_TIME_TIMESTAMP": 1700908500000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T10:35:00",
"END_TIME": "2023-11-25T10:40:00",
"RUNTIME_TIMESTAMP": 1700908500000,
"END_TIME_TIMESTAMP": 1700908800000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T10:40:00",
"END_TIME": "2023-11-25T10:45:00",
"RUNTIME_TIMESTAMP": 1700908800000,
"END_TIME_TIMESTAMP": 1700909100000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T10:45:00",
"END_TIME": "2023-11-25T10:50:00",
"RUNTIME_TIMESTAMP": 1700909100000,
"END_TIME_TIMESTAMP": 1700909400000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T10:50:00",
"END_TIME": "2023-11-25T10:55:00",
"RUNTIME_TIMESTAMP": 1700909400000,
"END_TIME_TIMESTAMP": 1700909700000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T10:55:00",
"END_TIME": "2023-11-25T11:00:00",
"RUNTIME_TIMESTAMP": 1700909700000,
"END_TIME_TIMESTAMP": 1700910000000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T11:00:00",
"END_TIME": "2023-11-25T11:05:00",
"RUNTIME_TIMESTAMP": 1700910000000,
"END_TIME_TIMESTAMP": 1700910300000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T11:05:00",
"END_TIME": "2023-11-25T11:10:00",
"RUNTIME_TIMESTAMP": 1700910300000,
"END_TIME_TIMESTAMP": 1700910600000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T11:10:00",
"END_TIME": "2023-11-25T11:15:00",
"RUNTIME_TIMESTAMP": 1700910600000,
"END_TIME_TIMESTAMP": 1700910900000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T11:15:00",
"END_TIME": "2023-11-25T11:20:00",
"RUNTIME_TIMESTAMP": 1700910900000,
"END_TIME_TIMESTAMP": 1700911200000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T11:20:00",
"END_TIME": "2023-11-25T11:25:00",
"RUNTIME_TIMESTAMP": 1700911200000,
"END_TIME_TIMESTAMP": 1700911500000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T11:25:00",
"END_TIME": "2023-11-25T11:30:00",
"RUNTIME_TIMESTAMP": 1700911500000,
"END_TIME_TIMESTAMP": 1700911800000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T11:30:00",
"END_TIME": "2023-11-25T11:35:00",
"RUNTIME_TIMESTAMP": 1700911800000,
"END_TIME_TIMESTAMP": 1700912100000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T11:35:00",
"END_TIME": "2023-11-25T11:40:00",
"RUNTIME_TIMESTAMP": 1700912100000,
"END_TIME_TIMESTAMP": 1700912400000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}, {
"ROWNUM": 1,
"SN": "80-0055-00002",
"STATUSCODE": 5,
"NAME": "Traffic_02",
"STATUSDESC": "正常运行",
"RUNTIME": "2023-11-25T11:40:00",
"END_TIME": "2023-11-25T11:45:00",
"RUNTIME_TIMESTAMP": 1700912400000,
"END_TIME_TIMESTAMP": 1700912700000,
"SECOND_TIMESTAMP": 300000,
"DIFF_MILLISEC": 0
}];
var types = [
{ name: '正常运行', color: '#07c160' },
{ name: '待生产', color: '#269abc' },
{ name: '调试', color: '#edb217' },
{ name: '维修', color: '#f68ba7' },
{ name: '故障停机', color: '#ff3374' }
];
var startTime;
var datatemp = [];
for (let i = 0; i < data.length; i++) {
startTime = new Date(data[i].RUNTIME).getTime();
var typeItem = types.filter(a => a.name == data[i].STATUSDESC)[0];
datatemp.push({
name: typeItem.name,
value: [
parseInt(data[i].ROWNUM),
new Date(data[i].RUNTIME).getTime(),
new Date(data[i].END_TIME).getTime(),
//data[i].RUNTIME_TIMESTAMP,
//data[i].END_TIME_TIMESTAMP,
data[i].DIFF_MILLISEC,
data[i].NAME
],
itemStyle: {
normal: {
color: typeItem.color
}
}
});
}
console.log(JSON.stringify(datatemp));
var categories = data.map(item => item.NAME).filter((name, index, arr) => arr.indexOf(name) === index);
function renderItem(params, api) {
var categoryIndex = api.value(0);
var start = api.coord([api.value(1), categoryIndex]);
var end = api.coord([api.value(2), categoryIndex]);
var height = api.size([0, 1])[1] * 0.6;
var rectShape = echarts.graphic.clipRectByRect(
{
x: start[0],
y: start[1] - height / 2,
width: end[0] - start[0],
height: height
},
{
x: params.coordSys.x,
y: params.coordSys.y,
width: params.coordSys.width,
height: params.coordSys.height
}
);
return (
rectShape && {
type: 'rect',
transition: ['shape'],
shape: rectShape,
style: api.style()
}
);
}
option = {
textStyle: {
color: '#333',
fontSize: '0.13rem'
},
grid: {
top: '5%',
left: '8%',
bottom: '16%',
width: '90%'
},
legend: {
show: true,
itemWidth: 10,
itemHeight: 10,
textStyle: {
color: '#fff',
fontSize: '0.12rem'
},
data: types.map(function (type) {
return type.name;
}),
},
tooltip: {
show: true,
textStyle: {
fontSize: 10
},
axisPointer: {
type: 'cross',
crossStyle: {
color: '#333'
}
},
formatter: function (params) {
return params.value[4] + '\t' + params.name + '\t' + params.marker + (new Date(params.value[1])).getHours() + ':' + (new Date(params.value[1])).getMinutes() + '—' + (new Date(params.value[2])).getHours() + ':' + (new Date(params.value[2])).getMinutes();
}
},
dataZoom: [
{
type: 'inside',
filterMode: 'weakFilter'
},
{
type: "slider",
show: true,
height: "6",
bottom: "4%",
labelFormatter: '',
backgroundColor: "white",
brushSelect: false,
minValueSpan: 3600 * 24 * 1000 * 7,
handleIcon: 'path://path://M100, 100m -75, 0a75,75 0 1,0 150,0a75,75 0 1,0 -150,0',
handleSize: 15,
handleColor: '#6bc5da',
start: 0,
end: 100,
handleStyle: {
borderCap: 'round',
color: "#fff",
shadowColor: 'rgba(0, 0, 0, 0.5)',
shadowBlur: 1
},
textStyle: {
color: "transparent"
},
borderColor: 'transparent',
backgroundColor: '#D7F4FF',
dataBackground: {
lineStyle: {
width: 0
},
areaStyle: {
color: 'transparent'
}
},
fillerColor: '#00EBFF'
}
],
xAxis: {
type: 'time',
//min: new Date(startTime).setHours(7, 0, 0, 0),
//max: new Date(new Date(startTime).setDate(new Date(startTime).getDate() + 1)).setHours(7, 0, 0, 0),
interval: 3600000,
scale: true,
axisLabel: {
formatter: function (val) {
return new Date(val).toLocaleTimeString('en-US', { hour: '2-digit', minute: 'numeric', hour12: false });
}
},
splitLine: {
show: false
},
axisLine: {
show: false
},
axisTick: {
show: true,
lineStyle: {
color: '#333',
width: 2
}
},
axisLabel: {
textStyle: {
color: '#333',
fontSize: '0.14rem'
},
show: true
}
},
yAxis: {
data: categories,
scale: true,
splitLine: { show: false },
axisLine: {
show: false
},
axisTick: {
show: false
},
axisLabel: {
show: true,
textStyle: {
color: '#333',
fontSize: '0.12rem',
fontWeight: 'bolder',
}
}
},
series: [
{
type: 'custom',
renderItem: renderItem,
itemStyle: {
opacity: 0.8
},
encode: {
x: [1, 2],
y: 0
},
data: datatemp
}
]
};
myChart.setOption(option);
myChart.on('click', function (params) {
console.log(params);
});
window.addEventListener('resize', function () {
chart.resize();
});
</script>
</body>
</html>
参考:
Echarts 甘特图事例
博客1
博客2
博客3
注意事项:
不要把设备的开始时间,和结束时间在数据库查询的时候就转时间戳,数据转的时间戳,在前端转时间会有差异
就用数据查询yyyy-MM-dd HH:mm:ss.fff 日期格式,前端转时间戳就不会报错。
demo2
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>跳转页面</title>
<script type="text/javascript" src="jquery.min.js" asp-append-version="true"></script>
<script type="text/javascript" src="echarts.js" asp-append-version="true"></script>
<!--<script src="https://cdn.jsdelivr.net/npm/echarts@5.2.2/dist/echarts.min.js"></script>-->
<style>
*{
font-size:100px;
}
</style>
</head>
<body>
<!-- 创建容器 -->
<div id="chart" style="width:800px;height:500px;"></div>
<script>
var myChart = echarts.init(document.getElementById('chart'));
var data = [{"ROW":"1","GROUPID":"0","SN":"10-0012-00174","STATUSCODE":"5","NAME":"Wire bonder 04#","STATUSDESC":"正常运行","RUNTIME":"2023-11-27 07:00:00.000","END_TIME":"2023-11-27 10:00:00.000","DIFF_MILLISEC":"0"},{"ROW":"2","GROUPID":"0","SN":"10-0012-00174","STATUSCODE":"3","NAME":"Wire bonder 04#","STATUSDESC":"调试","RUNTIME":"2023-11-27 10:00:00.000","END_TIME":"2023-11-27 11:15:00.000","DIFF_MILLISEC":"0"},{"ROW":"3","GROUPID":"0","SN":"10-0012-00174","STATUSCODE":"5","NAME":"Wire bonder 04#","STATUSDESC":"正常运行","RUNTIME":"2023-11-27 11:15:00.000","END_TIME":"2023-11-27 15:35:00.000","DIFF_MILLISEC":"0"},{"ROW":"4","GROUPID":"1","SN":"80-0055-00015","STATUSCODE":"5","NAME":"Traffic_15","STATUSDESC":"正常运行","RUNTIME":"2023-11-27 07:00:00.000","END_TIME":"2023-11-27 10:15:00.000","DIFF_MILLISEC":"0"},{"ROW":"5","GROUPID":"1","SN":"80-0055-00015","STATUSCODE":"4","NAME":"Traffic_15","STATUSDESC":"待生产","RUNTIME":"2023-11-27 10:15:00.000","END_TIME":"2023-11-27 14:35:00.000","DIFF_MILLISEC":"0"},{"ROW":"6","GROUPID":"1","SN":"80-0055-00015","STATUSCODE":"5","NAME":"Traffic_15","STATUSDESC":"正常运行","RUNTIME":"2023-11-27 14:35:00.000","END_TIME":"2023-11-27 15:35:00.000","DIFF_MILLISEC":"0"}];
var types = [
{ name: '正常运行', color: '#07c160' },
{ name: '待生产', color: '#269abc' },
{ name: '调试', color: '#edb217' },
{ name: '维修', color: '#f68ba7' },
{ name: '故障停机', color: '#ff3374' }
];
var startTime;
var datatemp = [];
for (let i = 0; i < data.length; i++) {
startTime = new Date(data[i].RUNTIME).getTime();
var typeItem = types.filter(a => a.name == data[i].STATUSDESC)[0];
datatemp.push({
name: typeItem.name,
value: [
parseInt(data[i].GROUPID),
new Date(data[i].RUNTIME).getTime(),
new Date(data[i].END_TIME).getTime(),
data[i].DIFF_MILLISEC,
data[i].NAME
],
itemStyle: {
normal: {
color: typeItem.color
}
}
});
}
console.log(JSON.stringify(datatemp));
var categories = data.map(item => item.NAME).filter((name, index, arr) => arr.indexOf(name) === index);
function renderItem(params, api) {
var categoryIndex = api.value(0);
var start = api.coord([api.value(1), categoryIndex]);
var end = api.coord([api.value(2), categoryIndex]);
var height = api.size([0, 1])[1] * 0.6;
var rectShape = echarts.graphic.clipRectByRect(
{
x: start[0],
y: start[1] - height / 2,
width: end[0] - start[0],
height: height
},
{
x: params.coordSys.x,
y: params.coordSys.y,
width: params.coordSys.width,
height: params.coordSys.height
}
);
return (
rectShape && {
type: 'rect',
transition: ['shape'],
shape: rectShape,
style: api.style()
}
);
}
option = {
textStyle: {
color: '#333',
fontSize: '0.13rem'
},
grid: {
top: '5%',
left: '8%',
right:'4%',
bottom: '16%',
width: '86%'
},
legend: {
show: true,
itemWidth: 10,
itemHeight: 10,
textStyle: {
color: '#fff',
fontSize: '0.12rem'
},
data: types.map(function (type) {
return type.name;
}),
},
tooltip: {
show: true,
textStyle: {
fontSize: 10
},
axisPointer: {
type: 'cross',
crossStyle: {
color: '#333'
}
},
formatter: function (params) {
return params.value[4] + '\t' + params.name + '\t' + params.marker + (new Date(params.value[1])).getHours() + ':' + (new Date(params.value[1])).getMinutes() + '—' + (new Date(params.value[2])).getHours() + ':' + (new Date(params.value[2])).getMinutes();
}
},
dataZoom: [
{
type: 'inside',
filterMode: 'weakFilter'
},
{
type: "slider",
show: true,
height: "6",
bottom: "4%",
labelFormatter: '',
backgroundColor: "white",
brushSelect: false,
minValueSpan: 3600 * 24 * 1000 * 7,
handleIcon: 'path://path://M100, 100m -75, 0a75,75 0 1,0 150,0a75,75 0 1,0 -150,0',
handleSize: 15,
handleColor: '#6bc5da',
start: 0,
end: 100,
handleStyle: {
borderCap: 'round',
color: "#fff",
shadowColor: 'rgba(0, 0, 0, 0.5)',
shadowBlur: 1
},
textStyle: {
color: "transparent"
},
borderColor: 'transparent',
backgroundColor: '#D7F4FF',
dataBackground: {
lineStyle: {
width: 0
},
areaStyle: {
color: 'transparent'
}
},
fillerColor: '#00EBFF'
}
],
xAxis: {
type: 'time',
//min: new Date(startTime).setHours(7, 0, 0, 0),
//max: new Date(new Date(startTime).setDate(new Date(startTime).getDate() + 1)).setHours(7, 0, 0, 0),
interval: 3600000,
scale: true,
axisLabel: {
formatter: function (val) {
return new Date(val).toLocaleTimeString('en-US', { hour: '2-digit', minute: 'numeric', hour12: false });
}
},
splitLine: {
show: false
},
axisLine: {
show: false
},
axisTick: {
show: true,
lineStyle: {
color: '#333',
width: 2
}
},
axisLabel: {
textStyle: {
color: '#333',
fontSize: '0.14rem'
},
show: true
}
},
yAxis: [
{
yAxisIndex: 0,
type: 'category',
data: categories,
axisLine: {
show: false
},
axisTick: {
show: false
},
axisLabel: {
show: true,
textStyle: {
color: '#333',
fontSize: '0.12rem',
fontWeight: 'bolder',
}
}
},
{
yAxisIndex: 1,
type: 'category',
data: ["100%","80%"],
axisLine: {
show: false
},
axisTick: {
show: false
},
axisLabel: {
show: true,
textStyle: {
color: '#333',
fontSize: '0.12rem',
fontWeight: 'bolder',
}
}
}
],
series: [
{
type: 'custom',
renderItem: renderItem,
itemStyle: {
opacity: 0.8
},
encode: {
x: [1, 2],
y: 0
},
data: datatemp
}
]
};
myChart.setOption(option);
myChart.on('click', function (params) {
console.log(params);
});
window.addEventListener('resize', function () {
chart.resize();
});
</script>
</body>
</html>
柱状图,当没有到达目标值时,柱子闪烁
代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>跳转页面</title>
<script type="text/javascript" src="jquery.min.js" asp-append-version="true"></script>
<script type="text/javascript" src="echarts.js" asp-append-version="true"></script>
<!--<script src="https://cdn.jsdelivr.net/npm/echarts@5.2.2/dist/echarts.min.js"></script>-->
</head>
<body>
<div class="stratop">
<div class="topTitle">
<svg-icon icon-class="alarun" style="color:#5cd9e8; "></svg-icon>
<span class="fs-xl text mx-2">员工产出</span>
</div>
<div id="bottomLeftChart" style="height:500px;background: black; "></div>
</div>
<script>
var data = [{ "PROJ_CODE": "NCCSAP", "PRODUCT_CODE": "TOSA_ADV2", "PRODUCT_SEQ": 4, "PROCESS_ID": "SIOB_BOND_PIC", "PROCESS_SEQ": 48, "OPERATOR_ID": "C01432", "INPUT_QTY": 4, "OUTPUT_QTY": 2, "FALL_QTY": 2, "YIELD": 50, "TARGET_VAULE": 19 }, { "PROJ_CODE": "NCCSAP", "PRODUCT_CODE": "TOSA_ADV2", "PRODUCT_SEQ": 4, "PROCESS_ID": "SIOB_BOND_PIC", "PROCESS_SEQ": 48, "OPERATOR_ID": "C02616", "INPUT_QTY": 15, "OUTPUT_QTY": 14, "FALL_QTY": 1, "YIELD": 93.33, "TARGET_VAULE": 19 }, { "PROJ_CODE": "NCCSAP", "PRODUCT_CODE": "TOSA_ADV2", "PRODUCT_SEQ": 4, "PROCESS_ID": "SIOB_BOND_PIC", "PROCESS_SEQ": 48, "OPERATOR_ID": "C02634", "INPUT_QTY": 21, "OUTPUT_QTY": 14, "FALL_QTY": 7, "YIELD": 66.67, "TARGET_VAULE": 19 }, { "PROJ_CODE": "NCCSAP", "PRODUCT_CODE": "TOSA_ADV2", "PRODUCT_SEQ": 4, "PROCESS_ID": "SIOB_BOND_PIC", "PROCESS_SEQ": 48, "OPERATOR_ID": "C02655", "INPUT_QTY": 2, "OUTPUT_QTY": 2, "FALL_QTY": 0, "YIELD": 100, "TARGET_VAULE": 19 }, { "PROJ_CODE": "NCCSAP", "PRODUCT_CODE": "TOSA_ADV2", "PRODUCT_SEQ": 4, "PROCESS_ID": "SIOB_BOND_PIC", "PROCESS_SEQ": 48, "OPERATOR_ID": "C03969", "INPUT_QTY": 18, "OUTPUT_QTY": 11, "FALL_QTY": 7, "YIELD": 61.11, "TARGET_VAULE": 19 }, { "PROJ_CODE": "NCCSAP", "PRODUCT_CODE": "TOSA_ADV2", "PRODUCT_SEQ": 4, "PROCESS_ID": "SIOB_BOND_PIC", "PROCESS_SEQ": 48, "OPERATOR_ID": "C03986", "INPUT_QTY": 3, "OUTPUT_QTY": 3, "FALL_QTY": 0, "YIELD": 100, "TARGET_VAULE": 19 }, { "PROJ_CODE": "NCCSAP", "PRODUCT_CODE": "TOSA_ADV2", "PRODUCT_SEQ": 4, "PROCESS_ID": "SIOB_BOND_PIC", "PROCESS_SEQ": 48, "OPERATOR_ID": "C04031", "INPUT_QTY": 2, "OUTPUT_QTY": 2, "FALL_QTY": 0, "YIELD": 100, "TARGET_VAULE": 19 }, { "PROJ_CODE": "NCCSAP", "PRODUCT_CODE": "TOSA_ADV2", "PRODUCT_SEQ": 4, "PROCESS_ID": "SIOB_BOND_PIC", "PROCESS_SEQ": 48, "OPERATOR_ID": "C04081", "INPUT_QTY": 17, "OUTPUT_QTY": 4, "FALL_QTY": 13, "YIELD": 23.53, "TARGET_VAULE": 19 }, { "PROJ_CODE": "NCCSAP", "PRODUCT_CODE": "TOSA_ADV2", "PRODUCT_SEQ": 4, "PROCESS_ID": "SIOB_BOND_PIC", "PROCESS_SEQ": 48, "OPERATOR_ID": "C04091", "INPUT_QTY": 6, "OUTPUT_QTY": 4, "FALL_QTY": 2, "YIELD": 66.67, "TARGET_VAULE": 19 }, { "PROJ_CODE": "NCCSAP", "PRODUCT_CODE": "TOSA_ADV2", "PRODUCT_SEQ": 4, "PROCESS_ID": "SIOB_BOND_PIC", "PROCESS_SEQ": 48, "OPERATOR_ID": "C04201", "INPUT_QTY": 1, "OUTPUT_QTY": 1, "FALL_QTY": 0, "YIELD": 100, "TARGET_VAULE": 19 }, { "PROJ_CODE": "NCCSAP", "PRODUCT_CODE": "TOSA_ADV2", "PRODUCT_SEQ": 4, "PROCESS_ID": "SIOB_BOND_PIC", "PROCESS_SEQ": 48, "OPERATOR_ID": "C04332", "INPUT_QTY": 2, "OUTPUT_QTY": 2, "FALL_QTY": 0, "YIELD": 100, "TARGET_VAULE": 19 }, { "PROJ_CODE": "NCCSAP", "PRODUCT_CODE": "TOSA_ADV2", "PRODUCT_SEQ": 4, "PROCESS_ID": "SIOB_BOND_PIC", "PROCESS_SEQ": 48, "OPERATOR_ID": "C04708", "INPUT_QTY": 10, "OUTPUT_QTY": 5, "FALL_QTY": 5, "YIELD": 50, "TARGET_VAULE": 19 }];
var ToDayOperatorYieldChart = function () {
var chart = document.getElementById("bottomLeftChart");
var myChart = echarts.init(chart);
// 定义X轴和两个Y轴的数据
var xData = data.map(function (item) {
return item.OPERATOR_ID;
});
var yData1 = data.map(function (item) {
return item.OUTPUT_QTY;
});
var yData2 = data.map(function (item) {
return item.YIELD;
});
var yData3 = data.map(function (item) {
return item.TARGET_VAULE;
});
var vaulemax = Math.max.apply(null, yData1);
// 配置图表选项
var option = {
title: { show: false },
textStyle: {
color: '#fff',
fontSize: '0.16rem'
},
tooltip: {
show: true,
trigger: 'axis',
formatter: function (params) {
const order = ['TARGET', 'YIELD', 'OUTPUT_QTY', 'FALL'];
let tooltipString = params
.sort((a, b) => order.indexOf(a.seriesName) - order.indexOf(b.seriesName))
.map(p => `${p.marker} ${p.seriesName}: ${Math.round(p.value)}<br/>`)
.join('');
return tooltipString;
},
textStyle: {
fontSize: '0.14rem'
},
axisPointer: {
type: 'cross',
crossStyle: {
color: 'white'
}
}
},
grid: {
top: '10%',
left: '5%',
bottom: '12%',
width: '90%'
},
color: ['#FF3374','#07c160'],
legend: {
data: ['TARGET', 'YIELD', 'OUTPUT_QTY', 'FALL'],
width: '100%',
itemGap: 20,
itemWidth: 10,
itemHeight: 10,
textStyle: {
color: '#fff',
fontSize: '0.16rem'
}
},
xAxis: {
type: 'category',
data: xData,
axisLabel: {
show: true,
interval: xData.length > 30 ? Math.floor(xData.length / 30) : 0,
rotate: 45,
color: '#fff',
fontSize: '0.14rem'
},
axisPointer: {
type: 'shadow'
}
},
yAxis: [
{
type: 'value',
//min: 0,
//max: Math.ceil(vaulemax),
//interval: Math.ceil(vaulemax / 6),
scale: true,//刻度范围一致
splitLine: { show: false },
axisTick: { //y轴刻度线
show: true
},
axisLine: { //y轴
show: true
},
axisLabel: {
textStyle: {
color: '#fff',
fontSize: '0.16rem'
}
}
},
{
type: 'value',
min: 0,
max: 120,
interval: 20,
scale: true,//刻度范围一致
splitLine: { show: false },
axisTick: { //y轴刻度线
show: true
},
axisLine: { //y轴
show: true
},
axisLabel: {
formatter: function (value) {
return value + '%';
},
textStyle: {
color: '#fff',
fontSize: '0.16rem'
}
}
}
],
series: [
{
name: 'TARGET',
type: 'line',
yAxisIndex: 0,
data: yData3,
lineStyle: { normal: { width: 3 } },
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: 'rgba(3, 194, 236, 0.5)'
}, {
offset: 0.8,
color: 'rgba(3, 194, 236, 0.1)'
}], false),
shadowColor: 'rgba(0, 0, 0, 0.1)',
shadowBlur: 12
}
},
itemStyle: { normal: { color: '#03C2EC' } }
},
{
name: 'YIELD',
type: 'line',
yAxisIndex: 1,
data: yData2,
lineStyle: { normal: { width: 3 } },
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: 'rgba(237, 178, 23, 0.5)'
}, {
offset: 0.8,
color: 'rgba(237, 178, 23, 0.1)'
}], false),
shadowColor: 'rgba(0, 0, 0, 0.1)',
shadowBlur: 12
}
},
itemStyle: { normal: { color: '#edb217 ' } }
},
{
name: 'FALL',
type: 'bar',
stack: 'stack1',//堆叠stack属性
barCategoryGap: '50%', // 设置组内柱子的间距
/*barGap: '2%', // 设置不同组之间的间距*/
barWidth: '40%',
data: data.map(function (item) {
return item.FALL_QTY;
}),
itemStyle: {
normal: {
color: '#FF3374',
shadowColor: 'rgba(0, 0, 0, 0.1)'
}
}
},
{
name: 'OUTPUT_QTY',
type: 'bar',
stack: 'stack1',// 堆叠stack属性
data: yData1,
barCategoryGap: '50%', // 设置组内柱子的间距
/*barGap: '2%', // 设置不同组之间的间距*/
barWidth: '40%',
itemStyle: {
normal: {
barBorderRadius: [10, 10, 0, 0],
color: '#07C160',
shadowColor: 'rgba(0, 0, 0, 0.1)'
}
}
}
]
};
//myChart.setOption(option);
//myChart.off('click');
//myChart.getZr().on('click', (params) => {
// var pointInPixel = [params.offsetX, params.offsetY];
// var pointInGrid = myChart.convertFromPixel('grid', pointInPixel);
// if (myChart.containPixel('grid', pointInPixel)) {
// var chart_x = myChart.getOption().xAxis[0].data[pointInGrid[0]];
// //OperatorHourOutputChart(chart_x);
// }
//});
var sparkletimer = setInterval(changeColor, 1000);
var type = 0;
function changeColor() {
option.series[2].itemStyle = {
normal: {
color: function (params) {
var targetvaule = data.find(item => item.OPERATOR_ID === params.name)?.TARGET_VAULE;
var inputvaule = data.find(item => item.OPERATOR_ID === params.name)?.INPUT_QTY;
if (type === 0 || inputvaule > targetvaule) {return '#FF3374';}
else {return 'rgba(0,0,0,0)';}
}
}
};
option.series[3].itemStyle = {
normal: {
barBorderRadius: [10, 10, 0, 0],
color: function (params) {
var targetvaule = data.find(item => item.OPERATOR_ID === params.name)?.TARGET_VAULE;
var inputvaule = data.find(item => item.OPERATOR_ID === params.name)?.INPUT_QTY;
if (type === 0 || inputvaule > targetvaule) {return '#07C160';}
else {return 'rgba(0,0,0,0)';}
}
}
};
type = 1 - type;
myChart.setOption(option, false);
//clearInterval(sparkletimer);
myChart.off('click');
myChart.getZr().on('click', (params) => {
var pointInPixel = [params.offsetX, params.offsetY];
var pointInGrid = myChart.convertFromPixel('grid', pointInPixel);
if (myChart.containPixel('grid', pointInPixel)) {
var chart_x = myChart.getOption().xAxis[0].data[pointInGrid[0]];
//OperatorHourOutputChart(chart_x);
}
});
}
};
ToDayOperatorYieldChart();
/*
var chart = echarts.init(document.getElementById("bottomLeftChart"));
var option = {
title: {
text: "",
x: "center",
y: 0,
textStyle: {
color: "#B4B4B4",
fontSize: 16,
fontWeight: "normal"
}
},
tooltip: {
trigger: "axis",
backgroundColor: "rgba(255,255,255,0.1)",
axisPointer: {
type: "shadow",
label: {
show: true,
backgroundColor: "#7B7DDC"
}
}
},
legend: {
textStyle: {
color: "#B4B4B4"
},
},
grid: {
x: "11%",
width: "80%",
y: "4%"
},
xAxis: {
data: [],
axisLine: {
lineStyle: {
color: "#B4B4B4"
}
},
axisTick: {
show: false
}
},
yAxis: [
{
type: 'value',
splitLine: {
show: false
},
axisLine: {
lineStyle: {
color: "#B4B4B4"
}
},
axisLabel: {
formatter: "{value} "
}
}
],
series: [{
type: "bar",
barWidth: 50,
itemStyle: {
normal: {
opacity: 1,
barBorderRadius: 10,
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: "#5e69ff"
},
{
offset: 1,
color: "#ffa4f3"
}])
}
},
data: []
},
]
};
var category = ["C00340", 'C00341', 'C00342', 'C00348', 'C00349', 'C00350'];
var data = [10, 12, 18, 20, 17, 16];
draw(category, data);
setInterval(changeColor, 500);
function draw(category, data) {
option.xAxis.data = category;
option.series[0].data = data;
chart.setOption(option);
}
var type = 0;
function changeColor() {
option.series[0].itemStyle.normal.color = new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: type === 0 ? "#ff3374" : "#eaa6c3" },
{ offset: 1, color: type === 0 ? "#ffa4f3" : "#e653ff" }
]);
type = 1 - type;
chart.setOption(option, true);
}
//function changeColor() {
// option.series[2].itemStyle.normal.color = type === 0 ? "#FF3374" : "rgba(0,0,0,0)";
// option.series[3].itemStyle.normal.color = type === 0 ? "#07C160" : "rgba(0,0,0,0)";
// type = 1 - type;
// myChart.setOption(option, true);
//}
*/
</script>
</body>
</html>
箱线图
代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>跳转页面</title>
<script type="text/javascript" src="jquery.min.js" asp-append-version="true"></script>
<script type="text/javascript" src="echarts.js" asp-append-version="true"></script>
<script type="text/javascript" src="dataTool.js" asp-append-version="true"></script>
<!--<script src="https://cdn.jsdelivr.net/npm/echarts@5.2.2/dist/echarts.min.js"></script>-->
<style>
.tooltip > p {
height: 0.25rem;
line-height: 0.25rem;
}
.tooltip > p > label, .tooltip > p > span {
color: #2C3444;
height: 0.2rem;
font-family: Arial;
font-size: 0.14rem;
font-weight: bold;
}
.tooltip > p > span {
float: right;
}
</style>
</head>
<body>
<div class="stratop">
<div class="topTitle">
<div id="bottomLeftChart" style="height:500px;"></div>
</div>
</div>
<div class="stratop">
<div class="topTitle">
<div id="bottomLeftChart2" style="height:200px;"></div>
</div>
</div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
let myChart = echarts.init(document.getElementById('bottomLeftChart'));
// echarts.dataTool.prepareBoxplotData--处理盒须图需要的数据格式
let ydata = echarts.dataTool.prepareBoxplotData([
[132.43, 106.84, 123.98, 117.85, 121.02],
[133.67, 106.24, 123.98, 117.85, 121.02],
[135.43, 106.94, 123.98, 117.85, 121.02],
[132.43, 106.84, 128.98, 117.85, 121.02],
[137.43, 106.84, 123.98, 117.85, 121.02],
[132.43, 109.84, 123.98, 115.85, 121.02],
[132.43, 116.84, 123.98, 117.85, 131.02],
], {
boundIQR: 'none',//是否需要计算
})
let option = {
tooltip: {
show: true,
trigger: 'axis',
textStyle: {
color: 'red',
fontSize: '0.13rem',
align: 'left'
},
axisPointer: {
type: 'line',
lineStyle: {
width: 1,
color: "#84afaa",
type: "dashed"
}
},
formatter: function (params) {
var txt = `
<div class="tooltip">
<p><label>${params[0].name}</label></p>
<p><label>${params[0].marker}上限值(Max):</label><span>${params[0].data[5]}</span></p>
<p><label>${params[0].marker}Q3(上四分位数):</label><span>${params[0].data[4]}</span></p>
<p><label>${params[0].marker}Q2(中位数):</label><span>${params[0].data[3]}</span></p>
<p><label>${params[0].marker}Q1(下四分位数):</label><span>${params[0].data[2]}</span></p>
<p><label>${params[0].marker}下限值(Min):</label><span>${params[0].data[1]}</span</p>
<p><label>${params[1].marker}平均值:</label><span>${params[1].value}</span></p>
</div>`;
return txt;
}
},
grid: {
left: '10%',
right: '15%',
bottom: '10%'
},
xAxis: {
type: 'category',
name: 'Item',
boundaryGap: true,
nameGap: 30,
nameLocation: "middle",
splitArea: {
show: false,
},
splitLine: {
show: false,
},
axisTick: {
show: false,
},
axisLine: {
show: false,
},
data: [445, 450, 455, 460, 465, 470, 475]
},
yAxis: [{
type: 'value',
name: '测\n试\n项\n值\n︵\nval\n︶',
nameGap: 40,
nameRotate: 360,
nameLocation: "center",
splitArea: {
show: true,
},
axisTick: {
show: false,
},
axisLine: {
show: false,
},
}, {
type: 'value',
name: `{legend|} {value|平均值}`,
show: false,
axisLabel: {
show: false,
},
axisTick: {
show: false,
},
axisLine: {
show: false,
},
axisLine: {
show: false,
},
nameTextStyle: {
rich: {
legend: {
width: 50,
height: 2,
backgroundColor: "#fbd173"
}
}
}
},],
series: [{
name: '',
type: 'boxplot',
itemStyle: {
borderColor: "#31c2e8",
color: "#0080cc"
},
data: ydata.boxData,
},
{
name: '平均值',
type: 'line',
color: "#fbd173",
yAxisIndex: 1,
showSymbol: false,
data: [120.77, 120.26, 120.22, 120.38, 119.9, 121.79, 120.65]
}
]
};
myChart.setOption(option);
</script>
</body>
</html>