<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
 | 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
 | 
<%@page isELIgnored="false" %> 
 | 
<% 
 | 
    String version ="1.000003"; 
 | 
    response.setHeader("Cache-Control","no-store"); 
 | 
    response.setHeader("Pragrma","no-cache"); 
 | 
    response.setDateHeader("Expires",0); 
 | 
%> 
 | 
<!DOCTYPE html> 
 | 
<html lang="en"> 
 | 
<head> 
 | 
    <meta charset="UTF-8"> 
 | 
    <title>设备警报数据</title> 
 | 
    <style> 
 | 
        .align-center{ 
 | 
            margin:0 auto; /* 居中 这个是必须的,,其它的属性非必须 */ 
 | 
            /* background:red; 背景色  */ 
 | 
            text-align:center; /* 文字等内容居中 */ 
 | 
        } 
 | 
        body { 
 | 
            font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 
 | 
            margin: 0; 
 | 
            padding: 0; 
 | 
            border: 0; 
 | 
            position: relative; 
 | 
            width: 100%; 
 | 
        } 
 | 
        .dev-desc{ 
 | 
            position: relative; 
 | 
            height: 480px; 
 | 
        } 
 | 
        .dev-alarm-s0{ 
 | 
            background:url('/img/bg-s0.png') repeat-x fixed top; 
 | 
        } 
 | 
        .dev-alarm-s1{ 
 | 
            background:url('/img/bg-s1.png') repeat-x fixed top; 
 | 
        } 
 | 
        .dev-alarm-s2{ 
 | 
            background:url('/img/bg-s2.png') repeat-x fixed top; 
 | 
        } 
 | 
        .dev-alarm-s3{ 
 | 
            background:url('/img/bg-s3.png') repeat-x fixed top; 
 | 
        } 
 | 
        .dev-desc .state-summary{ 
 | 
            color: white; 
 | 
            font-size: 38px; 
 | 
            font-weight: 100; 
 | 
            position: relative; 
 | 
            left: 30%; 
 | 
        } 
 | 
        .dev-desc .state-summary td{ 
 | 
            padding: 0; 
 | 
            margin: 0; 
 | 
            border: 0; 
 | 
        } 
 | 
        .ui-block-a{ 
 | 
            height: 240px; 
 | 
        } 
 | 
        .dev-desc .dev-state{ 
 | 
            position: absolute; 
 | 
            text-align: center; 
 | 
            padding-top: 2%; 
 | 
            left:10%; 
 | 
            top:30px; 
 | 
            /* background: white; */ 
 | 
            /* opacity:0.1; */ 
 | 
            background-color: rgba(255,255,255,0.2); 
 | 
            color: white; 
 | 
            width: 420px; 
 | 
            height: 240px; 
 | 
            border:1px solid #f8f8f8; 
 | 
            border-radius: 10px; 
 | 
            z-index:999; 
 | 
        } 
 | 
        /*.dev-desc .dev-state-bg{*/ 
 | 
            /*left: 8%;*/ 
 | 
            /*top:30px;*/ 
 | 
            /*position: absolute;*/ 
 | 
            /*width: 420px;*/ 
 | 
            /*height: 240px;*/ 
 | 
            /*border:3px solid #f8f8f8;*/ 
 | 
            /*border-radius: 10px;*/ 
 | 
            /*!**background-color:rgb(0,152,50);**!*/ 
 | 
            /*background:white;*/ 
 | 
            /*opacity: 0.3;*/ 
 | 
            /*filter:alpha(opacity=30);*/ 
 | 
        /*}*/ 
 | 
        .dev-desc .dev-state .dev-state-title{ 
 | 
            font-size: 100px; 
 | 
            font-weight: 500; 
 | 
        } 
 | 
        .dev-desc .dev-state .dev-state-subtitle{ 
 | 
            font-size: 40px; 
 | 
            font-weight: 100; 
 | 
        } 
 | 
        .dev-desc .dev-state .dev-state-time{ 
 | 
            margin-top: 3%; 
 | 
            display: block; 
 | 
            font-size: 36px; 
 | 
            font-weight: 100; 
 | 
        } 
 | 
        .dev-desc .dev-info{ 
 | 
            position: relative; 
 | 
            margin-left: 8%; 
 | 
            color: black; 
 | 
        } 
 | 
        .dev-desc .dev-info .dev-name{ 
 | 
            font-size: 60px; 
 | 
            font-weight: 300; 
 | 
        } 
 | 
        .dev-desc .dev-info .dev-name .dev-name-suffix{ 
 | 
            font-size: 40px; 
 | 
            font-weight: 200; 
 | 
        } 
 | 
        .dev-desc .dev-info .dev-address{ 
 | 
            font-size: 30px; 
 | 
            font-weight: 200; 
 | 
        } 
 | 
        .bullet { font: 36px sans-serif; } 
 | 
        .bullet .marker { stroke: #000; stroke-width: 2px; } 
 | 
        .bullet .tick line { stroke: #666; stroke-width: .5px; } 
 | 
        .bullet .range.s0 { fill: #969696; } 
 | 
        .bullet .range.s1 { fill: #afafaf; } 
 | 
        .bullet .range.s2 { fill: #d6d6d6; } 
 | 
        .bullet .range.s3 { fill: #f1f1f1; } 
 | 
        .bullet .measure.s0_0 { fill: #0eb929; } 
 | 
        .bullet .measure.s1_0 { fill: #0eb929; } 
 | 
        .bullet .measure.s0_1 { fill: #b1aa02; } 
 | 
        .bullet .measure.s1_1 { fill: #b1aa02; } 
 | 
        .bullet .measure.s0_2 { fill: #e66404; } 
 | 
        .bullet .measure.s1_2 { fill: #e66404; } 
 | 
        .bullet .measure.s0_3 { fill: #bf031a; } 
 | 
        .bullet .measure.s1_3 { fill: #bf031a; } 
 | 
        .bullet .meaning.state {fill:white; font-size: 36px;} 
 | 
        .bullet .meaning.text {fill:black; font-size: 36px;} 
 | 
        .bullet .title { font-size: 42px;} 
 | 
        .bullet .subtitle { fill: #999; } 
 | 
        .bullet-content { 
 | 
            width: 100%; 
 | 
        } 
 | 
        .bullet-content .bullet-row{ 
 | 
            border: 0; 
 | 
            border-bottom: 1px solid #d3d3d3; 
 | 
            padding: 4% 0 0; 
 | 
            height: 180px; 
 | 
        } 
 | 
        .bullet-row:hover{ 
 | 
            background: #e8e8e8; 
 | 
        } 
 | 
        /* .bullet-content .bullet-row .bullet-col{ 
 | 
          padding: 7% 0 6%; 
 | 
        } */ 
 | 
    </style> 
 | 
    <link rel="stylesheet" href="/css/jquery.mobile-1.4.5.min.css"> 
 | 
    <script src="/js/moment-with-locales.js"></script> 
 | 
    <script src="/js/jquery.min.js"></script> 
 | 
    <script src="/js/jquery.mobile-1.4.5.min.js"></script> 
 | 
    <script src="/js/d3.min.js"charset="utf-8"></script> 
 | 
    <script src="/js/bullet.js"></script> 
 | 
    <title>监控数据</title> 
 | 
</head> 
 | 
<body> 
 | 
<div id="parms" style="display: none;"> 
 | 
     <div id="alarm">${requestScope.alarm}</div> 
 | 
     <div id="device">${requestScope.device}</div> 
 | 
     <div id="sensors">${requestScope.sensors}</div> 
 | 
     <div id="data">${requestScope.data}</div> 
 | 
    <div id="alarmLevels">${requestScope.alarmLevels}</div> 
 | 
</div> 
 | 
<div data-role="page" id="page-init"> 
 | 
    <div data-role="header" class="dev-desc"> 
 | 
        <div data-role="main" class="ui-content"> 
 | 
            <div class="ui-grid-a"> 
 | 
                <div class="ui-block-a"> 
 | 
                    <%--<div class="dev-state-bg ui-corner-all"></div>--%> 
 | 
                    <div class="dev-state"> 
 | 
                          <span id="alarm-state" class="dev-state-title"> 
 | 
                          </span> 
 | 
                        <span class="dev-state-subtitle"> 
 | 
                            状态 
 | 
                          </span> 
 | 
                        <br/> 
 | 
                        <span id="alarm-time" class="dev-state-time"> 
 | 
                        </span> 
 | 
                    </div> 
 | 
                </div> 
 | 
                <div class="ui-block-b"> 
 | 
                    <div class="state-summary"> 
 | 
                        <table data-role="table" class="ui-responsive"> 
 | 
                            <thead> 
 | 
                            <tr> 
 | 
                                <th></th> 
 | 
                                <th></th> 
 | 
                                <th></th> 
 | 
                                <th></th> 
 | 
                            </tr> 
 | 
                            </thead> 
 | 
                            <tbody> 
 | 
                            <tr> 
 | 
                                <td style="width:20%">严重</td> 
 | 
                                <td ><span id="state3_count"></span></td> 
 | 
                            </tr> 
 | 
                            <tr> 
 | 
                                <td>中度</td> 
 | 
                                <td><span id="state2_count"></span></td> 
 | 
                            </tr> 
 | 
                            <tr> 
 | 
                                <td>轻度</td> 
 | 
                                <td><span id="state1_count"></span></td> 
 | 
                            </tr> 
 | 
                            <tr> 
 | 
                                <td>正常</td> 
 | 
                                <td><span id="state0_count"></span></td> 
 | 
                            </tr> 
 | 
                            <tr> 
 | 
                                <td></td> 
 | 
                                <td></td> 
 | 
                            </tr> 
 | 
                            </tbody> 
 | 
                        </table> 
 | 
                    </div> 
 | 
                </div> 
 | 
            </div> 
 | 
        </div> 
 | 
        <div data-role="main" class="ui-content"> 
 | 
            <div class="ui-grid-solo"> 
 | 
                <div class="ui-block-a"> 
 | 
                    <div class="dev-info"> 
 | 
                        <div class="dev-name"> 
 | 
                            <span id="device-name">金浦路云山诗意01</span> 
 | 
                            <span  class="dev-name-suffix">设备</span> 
 | 
                        </div> 
 | 
                        <div class="dev-address"> 
 | 
                                  <span> 
 | 
                                      地址: 
 | 
                                  </span> 
 | 
                            <span id="device-address"> 
 | 
                            </span> 
 | 
                        </div> 
 | 
                    </div> 
 | 
                </div> 
 | 
            </div> 
 | 
        </div> 
 | 
    </div> 
 | 
    <div data-role="main" class="ui-content"> 
 | 
        <div class="bullet-content ui-grid-solo"> 
 | 
        </div> 
 | 
        <!-- <div data-role="footer"> 
 | 
          <h1>底部文本</h1> 
 | 
        </div> --> 
 | 
    </div> 
 | 
  
 | 
</div> 
 | 
</body> 
 | 
</html> 
 | 
<script> 
 | 
    function  createBullet(data) { 
 | 
        var margin = {top: 5, right:100, bottom: 20, left:140}, 
 | 
            width = window.innerWidth*0.95 - margin.left - margin.right, 
 | 
            height = 90 - margin.top - margin.bottom; 
 | 
        // bullet 函数对象 
 | 
        var chart = d3.bullet() 
 | 
            .width(width) 
 | 
            .height(height); 
 | 
        var svg = d3.select(".bullet-content").selectAll("svg") 
 | 
            .data(data) 
 | 
            .enter() 
 | 
            .append("div") 
 | 
            .attr("class","ui-block-a bullet-row") 
 | 
            .append("svg") 
 | 
            .attr("class", "bullet") 
 | 
            .attr("width", width + margin.left + margin.right) 
 | 
            .attr("height", height + margin.top + margin.bottom) 
 | 
            .append("g") 
 | 
            .attr("transform", "translate(" + margin.left + "," + margin.top + ")") 
 | 
            .call(chart); 
 | 
  
 | 
        var title = svg.append("g") 
 | 
            .style("text-anchor", "end") 
 | 
            .attr("transform", "translate(60," + (height / 2+5)+ ")"); 
 | 
  
 | 
        title.append("text") 
 | 
            .attr("class", "title") 
 | 
            .text(function(d) { return d.title; }); 
 | 
  
 | 
        title.append("text") 
 | 
            .attr("class", "subtitle") 
 | 
            .attr("dy", "1em") 
 | 
            .text(function(d) { return d.subtitle; }); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 
 | 
     * @param sortKeys 排序好的key数组 
 | 
     * @param data  监控数据 
 | 
     * @param sensors 设备明细 
 | 
     * @param alarmData 报警数据 
 | 
     * @param alarmLevels 报警阀值配置 
 | 
     * @returns {Array} 
 | 
     */ 
 | 
    function createBulletData(sortKeys,data,sensors,alarmData,alarmLevels) { 
 | 
        var bullets = []; 
 | 
        for(var index = 0; index<sortKeys.length;index++){ 
 | 
              var bullet = {"ranges":[],"measures":[],"markers":[]}; 
 | 
              var sensorKey = sortKeys[index]; 
 | 
              var sensor = sensors.find(function (value) { 
 | 
                    return value.sensorKey == sensorKey; 
 | 
              }); 
 | 
            sensorLevel = alarmLevels[sensorKey]; 
 | 
            if(!sensor) break; 
 | 
            bullet.title = !!sensor["description"]?sensor["description"]:sensor.name; 
 | 
            bullet.subtitle = sensor.unit; 
 | 
            bullet.state = !!alarmData[sensorKey]?alarmData[sensorKey]:0; 
 | 
            bullet.measures.push(data[sensorKey]); 
 | 
            bullet.markers.push(data[sensorKey]); 
 | 
            var start = 0; 
 | 
            if(!!sensorLevel&&!!sensorLevel.enable){ 
 | 
                var ranges = sensorLevel.increment; 
 | 
                if(!!sensorLevel.degressEnable){ 
 | 
                    var inFirst = sensorLevel.increment[0]; 
 | 
                    var deFirst = sensorLevel.degression[0]; 
 | 
                    start = (inFirst+deFirst)/2; 
 | 
                    ranges = Math.abs(data[sensorKey]-inFirst) >  Math.abs(data[sensorKey]-deFirst) ? sensorLevel.degression:sensorLevel.increment; 
 | 
                    bullet.startPoint = start; 
 | 
                } 
 | 
                bullet.ranges = ranges; 
 | 
            }else { 
 | 
                var range = data[sensorKey]*10; 
 | 
                for(var n=0;n<3;n++){ 
 | 
                    bullet.ranges.push(range); 
 | 
                } 
 | 
            } 
 | 
            bullets.push(bullet); 
 | 
        } 
 | 
        console.log(bullets); 
 | 
        return bullets; 
 | 
    } 
 | 
    // init page 
 | 
    (function () { 
 | 
        var alarm = $.parseJSON($("#alarm").text()); 
 | 
        alarm["json"] = $.parseJSON(alarm.json); 
 | 
        var device = $.parseJSON($("#device").text()); 
 | 
        var sensors = $.parseJSON($("#sensors").text()); 
 | 
        var data = $.parseJSON($("#data").text()); 
 | 
        var alarmLevels = $.parseJSON($("#alarmLevels").text()); 
 | 
        // 载入数据 
 | 
        var alarmState; 
 | 
        var alarmStateClass = 'dev-alarm-s'+ alarm.state; 
 | 
        switch (alarm.state){ 
 | 
            case 1: alarmState = '轻度'; 
 | 
            break; 
 | 
            case 2: alarmState = '中度';break; 
 | 
            case 3: alarmState = '重度';break; 
 | 
            default: alarmState = '正常';break; 
 | 
        } 
 | 
        $(".dev-desc").addClass(alarmStateClass) 
 | 
        $("#alarm-state").text(alarmState); 
 | 
        $("#alarm-time").text(moment(alarm.time).format("YYYY-MM-DD HH:mm:ss")); 
 | 
        $("#device-address").text(device.address); 
 | 
        $("#device-name").text(device.name); 
 | 
        var stateSummary = [0,0,0,0];// index 0 正常的数量 
 | 
        Object.keys(data).forEach(function (value) { 
 | 
            var _value = !!alarm.json[value]? alarm.json[value]:0; 
 | 
            stateSummary[_value] +=1; 
 | 
        }) 
 | 
        stateSummary.forEach(function (value, index) { 
 | 
            $("#state"+index+"_count").text(value); 
 | 
        }); 
 | 
        var alarmSortKeys = Object.keys(data).sort(function (a, b) { 
 | 
               var aValue = !!alarm.json[a]? alarm.json[a]:0; 
 | 
               var bValue = !!alarm.json[b]? alarm.json[b]:0; 
 | 
               return bValue - aValue; 
 | 
        }); 
 | 
        var bulletData = createBulletData(alarmSortKeys,data,sensors,alarm.json,alarmLevels); 
 | 
        // console.log(bulletData); 
 | 
        createBullet(bulletData); 
 | 
    })(); 
 | 
</script> 
 |