1
zrg
7 天以前 75a3365af2e78f89c464c9cdf87a91ab5b577e77
1
2个文件已添加
5个文件已修改
3592 ■■■■■ 已修改文件
WebTM/WebTM.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/layuiadmin/Scripts/webConfig.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/Baseset/基础资料/saomazutuo_xiaowei.html 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/仓存管理/仓库报表/Kf_WMSDailyRunStateReport.html 542 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/数采管理/DAQ_EquipRunningSlice copy.html 1476 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/数采管理/DAQ_EquipRunningSlice.html 1370 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/数采管理/DAQ_EvidenceEquipmentCockpitDetail.html 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/WebTM.csproj
@@ -210,6 +210,7 @@
    <Content Include="views\WMS扫码模块\采购入库\Kf_POStockInBackBill_Check_PDA.html" />
    <Content Include="views\WMS扫码模块\销售出库\Kf_SellOutBackBill_CheckList_PDA.html" />
    <Content Include="views\WMS扫码模块\销售出库\Kf_SellOutBackBill_Check_PDA.html" />
    <Content Include="views\仓存管理\仓库报表\Kf_WMSDailyRunStateReport.html" />
    <Content Include="views\仓存管理\条码生成\Gy_BarCodeBill_HuaZhou.html" />
    <Content Include="views\基础资料\公用基础资料\Add_Edit_Gy_Car.html" />
    <Content Include="views\基础资料\公用基础资料\Add_Edit_Gy_CostCenter.html" />
WebTM/layuiadmin/Scripts/webConfig.js
@@ -4,8 +4,8 @@
  //var WEBURL = "http://localhost/API/";             //颜晓军本地配置
  //var WEBURL = "http://localhost:8082/API/";        //杜贺本地配置
/*  var WEBURL = "http://localhost:81/API/"           //翁涛涛本地配置*/
  var WEBURL = "http://localhost:8082/API/"; //张瑞广本地配置
  //var WEBURL = "http://localhost:81/API/";          //陈镐哲本地配置
  // var WEBURL = "http://localhost:8082/API/"; //张瑞广本地配置
  var WEBURL = "http://localhost:81/API/";          //陈镐哲本地配置
  // var WEBURL = "http://localhost:8082/LuBaoAPI/";   //李林俊本地配置
  //var WEBURL = "http://localhost:8080/API/";        //王仪本地配置
  //var WEBURL = "http://localhost:8082/LuBaoAPI/";   //余思杰本地配置
WebTM/views/Baseset/»ù´¡×ÊÁÏ/saomazutuo_xiaowei.html
@@ -508,11 +508,11 @@
                    if (listData.length > 0) {
                        // èŽ·å–å½“å‰æ¡ç çš„åŽ9-10位(从后往前数第9和第8位)
                        if (sBarCode.length >= 10) {
                            var currentLast9to10 = sBarCode.substr(-14, 2); // èŽ·å–å€’æ•°ç¬¬9位开始的2位字符
                            var currentLast9to10 = sBarCode.substr(-15, 2); // èŽ·å–å€’æ•°ç¬¬9位开始的2位字符
                            // èŽ·å–ä¸Šä¸€æ¡æ¡ç çš„å¯¹åº”ä½ç½®
                            var lastBarCode = listData[listData.length - 1]['条码编号'];
                            if (lastBarCode.length >= 10) {
                                var lastLast9to10 = lastBarCode.substr(-14, 2);
                                var lastLast9to10 = lastBarCode.substr(-15, 2);
                                if (currentLast9to10 !== lastLast9to10) {
                                    layer.msg(`当前条码倒数14-15位(${currentLast9to10})与上一条条码(${lastLast9to10})不同,请检查!`, { icon: 5 });
                                    $('#HBarCode').val('');
@@ -526,11 +526,11 @@
                    if (listData.length > 0) {
                        // èŽ·å–å½“å‰æ¡ç çš„åŽ9-10位(从后往前数第9和第8位)
                        if (sBarCode.length >= 10) {
                            var currentLast9to10 = sBarCode.substr(-10, 2); // èŽ·å–å€’æ•°ç¬¬9位开始的2位字符
                            var currentLast9to10 = sBarCode.substr(-11, 2); // èŽ·å–å€’æ•°ç¬¬9位开始的2位字符
                            // èŽ·å–ä¸Šä¸€æ¡æ¡ç çš„å¯¹åº”ä½ç½®
                            var lastBarCode = listData[listData.length - 1]['条码编号'];
                            if (lastBarCode.length >= 10) {
                                var lastLast9to10 = lastBarCode.substr(-10, 2);
                                var lastLast9to10 = lastBarCode.substr(-11, 2);
                                if (currentLast9to10 !== lastLast9to10) {
                                    layer.msg(`当前条码倒数10-11位(${currentLast9to10})与上一条条码(${lastLast9to10})不同,请检查!`, { icon: 5 });
                                    $('#HBarCode').val('');
WebTM/views/²Ö´æ¹ÜÀí/²Ö¿â±¨±í/Kf_WMSDailyRunStateReport.html
New file
@@ -0,0 +1,542 @@

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>WMS每日运行状态报表</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../../layuiadmin/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../../layuiadmin/style/admin.css" media="all">
    <script src="../../../layuiadmin/layui/layui.js"></script>
    <script src="../../../layuiadmin/Scripts/json2.js"></script>
    <script src="../../../layuiadmin/Scripts/jquery-1.4.1.js"></script>
    <script src="../../../layuiadmin/Scripts/webConfig.js"></script>
    <script src="../../../layuiadmin/PubCustom.js"></script>
    <script src="../../../layuiadmin/zgqCustom/zgqCustom.js"></script>
    <script src="../../../layuiadmin/HideButton.js"></script>
    <script src='../../../layuiadmin/lib/extend/echarts.min.js'></script>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        html, body {
            height: 100%;
        }
        .page-container {
            height: 100%;
            padding: 10px;
            display: flex;
            flex-direction: column;
        }
        .query-bar {
            background: #fff;
            padding: 10px 15px;
            border-radius: 6px;
            margin-bottom: 10px;
            flex-shrink: 0;
        }
        .summary-row {
            display: flex;
            flex-wrap: wrap;
            margin-bottom: 10px;
            flex-shrink: 0;
        }
        .chart-container {
            background: #fff;
            border-radius: 6px;
            padding: 8px;
            flex: 1;
            overflow: auto;
            min-height: 0;
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
            gap: 8px;
        }
        .chart-box {
            margin: 4px;
            border: 1px solid #eee;
            border-radius: 4px;
            background: #fafbfc;
            position: relative;
            min-height: 260px;
            display: flex;
            align-items: stretch;
            justify-content: stretch;
        }
        .empty-tip {
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: center;
            color: #999;
            font-size: 12px;
        }
        .summary-card {
            margin: 4px;
            border: 1px solid #eee;
            border-radius: 4px;
            background: #fafbfc;
            text-align: center;
            padding: 8px 4px;
            min-width: 200px;
        }
            .summary-card.total-card {
                background: linear-gradient(135deg, #1e9fff 0%, #5fb3ff 100%);
                border-color: #1e9fff;
            }
                .summary-card.total-card .summary-number,
                .summary-card.total-card .summary-label {
                    color: #fff;
                }
        .summary-number {
            font-size: 16px;
            font-weight: bold;
            color: #1e9fff;
        }
        .summary-label {
            font-size: 11px;
            color: #888;
            margin-top: 2px;
        }
    </style>
</head>
<body>
    <div class="page-container">
        <div class="query-bar">
            <form class="layui-form" action="" lay-filter="component-form-group">
                <div class="layui-collapse">
                    <div class="layui-colla-item">
                        <div class="layui-colla-title layui-inline">
                            <div class="layui-inline"><span>更多</span></div>
                        </div>
                        <div class="layui-inline">
                            <label class="layui-form-label" style="width:100px;">日期间隔</label>
                            <div class="layui-input-block">
                                <select name="HInitTimeCycle" id="HInitTimeCycle" class="ForFilteringSchemes" lay-filter="HInitTimeCycle" style="width:190px;">
                                </select>
                            </div>
                        </div>
                        <div class="layui-inline">
                            <label class="layui-form-label" style="width:100px;">开始日期</label>
                            <div class="layui-input-block">
                                <input type="date" class="layui-input ForFilteringSchemes" id="HBeginDate" style="width:160px;">
                            </div>
                        </div>
                        <div class="layui-inline">
                            <label class="layui-form-label" style="width:100px;">结束日期</label>
                            <div class="layui-input-block">
                                <input type="date" class="layui-input ForFilteringSchemes" id="HEndDate" style="width:160px;">
                            </div>
                        </div>
                        <button class="layui-btn layuiadmin-btn-order" type="button" lay-submit="" lay-filter="btnSearch" id="btnSearch">
                            <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
                        </button>
                        <button class="layui-btn layuiadmin-btn-order" type="button" lay-submit="" lay-filter="btnReSearch" id="btnReSearch" style="padding:0 5px">重置</button>
                    </div>
                    <div class="layui-colla-content">
                    </div>
                </div>
            </form>
        </div>
        <div class="summary-row" id="summaryRow"></div>
        <div class="chart-container" id="chartContainer"></div>
    </div>
    <script>
        layui.config({
            base: '../../../layuiadmin/'
        }).extend({
            index: 'lib/index',
        }).use(['index', 'form', 'element'], function () {
            var $ = layui.$, layer = layui.layer, form = layui.form;
            var chartInstances = {};
            var chartConfigKeys = [];
            // å›¾è¡¨é…ç½®
            var ChartConfig = {
                cgrk: { chartTitle: '采购入库统计', chartType: 'bar', dataTableIndex: 0 },
                cgtl: { chartTitle: '采购退料统计', chartType: 'bar', dataTableIndex: 1 },
                scll: { chartTitle: '生产领料统计', chartType: 'bar', dataTableIndex: 2 },
                scbl: { chartTitle: '生产补料统计', chartType: 'bar', dataTableIndex: 3 },
                wcll: { chartTitle: '委外领料统计', chartType: 'bar', dataTableIndex: 4 },
                schb: { chartTitle: '生产汇报统计', chartType: 'bar', dataTableIndex: 5 },
                scrk: { chartTitle: '生产入库统计', chartType: 'bar', dataTableIndex: 6 },
                wcrk: { chartTitle: '委外入库统计', chartType: 'bar', dataTableIndex: 7 },
                sctk: { chartTitle: '生产退库统计', chartType: 'bar', dataTableIndex: 8 },
                sctl: { chartTitle: '生产退料统计', chartType: 'bar', dataTableIndex: 9 },
                xscK: { chartTitle: '销售出库统计', chartType: 'bar', dataTableIndex: 10 },
                zjdb: { chartTitle: '直接调拨统计', chartType: 'bar', dataTableIndex: 11 },
                fbsdr: { chartTitle: '分布式调入统计', chartType: 'bar', dataTableIndex: 12 },
                fbsdc: { chartTitle: '分布式调出统计', chartType: 'bar', dataTableIndex: 13 },
                stjgrk: { chartTitle: '受托加工入库统计', chartType: 'bar', dataTableIndex: 14 },
                stjgtl: { chartTitle: '受托加工退料统计', chartType: 'bar', dataTableIndex: 15 },
                qtrk: { chartTitle: '其他入库统计', chartType: 'bar', dataTableIndex: 16 },
                qtck: { chartTitle: '其他出库统计', chartType: 'bar', dataTableIndex: 17 }
            };
            // ç”Ÿæˆé¡µé¢ç»“æž„
            function generatePageStructure() {
                chartConfigKeys = [];
                for (var key in ChartConfig) { chartConfigKeys.push(key); }
                generateSummaryCards();
                generateChartBoxes();
            }
            function generateSummaryCards() {
                var $summaryRow = $('#summaryRow'); $summaryRow.empty();
                $summaryRow.append('<div class="summary-card total-card" id="card-total"><div class="summary-number">0</div><div class="summary-label">总计</div></div>');
                chartConfigKeys.forEach(key => {
                    var config = ChartConfig[key];
                    var label = config.chartTitle.replace('统计', '');
                    $summaryRow.append(`<div class="summary-card" id="card-${key}"><div class="summary-number">0</div><div class="summary-label">${label}</div></div>`);
                });
            }
            function generateChartBoxes() {
                var $c = $('#chartContainer'); $c.empty();
                chartConfigKeys.forEach(key => {
                    $c.append(`<div class="chart-box" id="chart-${key}"><div class="empty-tip">暂无数据</div></div>`);
                });
            }
            //查询
            form.on('submit(btnReSearch)', function (data) {
                set_ClearQuery();
            });
            //重置
            form.on('submit(btnSearch)', function (data) {
                get_FastQuery();
            });
            //日期间隔下拉列表监听
            form.on('select(HInitTimeCycle)', function (data) {
                var HInitTimeCycle = $("#HInitTimeCycle").val() * 1;
                if (HInitTimeCycle != -1) {
                    $('#HBeginDate').prop('disabled', true);
                    $('#HEndDate').prop('disabled', true);
                    $("#HBeginDate").val(Format(new Date(new Date() - 1000 * 60 * 60 * 24 * HInitTimeCycle), "yyyy-MM-dd"));
                    $("#HEndDate").val(Format(new Date(), "yyyy-MM-dd"));
                    get_FastQuery();
                } else {
                    $('#HBeginDate').prop('disabled', false);
                    $('#HEndDate').prop('disabled', false);
                }
            });
            //初始化
            function set_ClearBill() {
                generatePageStructure();
                setSelect_HInitTimeCycle();
                var HInitTimeCycle = $("#HInitTimeCycle").val() * 1;
                if (HInitTimeCycle != -1) {
                    $('#HBeginDate').prop('disabled', true);
                    $('#HEndDate').prop('disabled', true);
                } else {
                    $('#HBeginDate').prop('disabled', false);
                    $('#HEndDate').prop('disabled', false);
                }
                $("#HBeginDate").val(Format(new Date(new Date() - 1000 * 60 * 60 * 24 * HInitTimeCycle), "yyyy-MM-dd"));
                $("#HEndDate").val(Format(new Date(), "yyyy-MM-dd"));
                get_FastQuery();
            }
            //重置
            function set_ClearQuery() {
                var today = Format(new Date(), "yyyy-MM-dd");
                $("#HBeginDate").val(today);
                $("#HEndDate").val(today);
                get_FastQuery();
            }
            //初始日期间隔 ä¸‹æ‹‰åˆ—表
            function setSelect_HInitTimeCycle() {
                var valueList = [0, 1, 2, 3, 4, 5, 6, 29];
                var titleList = ["今天", "近两天", "近三天", "近四天", "近五天", "近六天", "近七天", "近30天"];
                var HInitTimeCycle_ArrayList = '<option  value="-1" selected="selected" >任意间隔</option>';
                for (var i = 0; i < valueList.length; i++) {
                    HInitTimeCycle_ArrayList += '<option  style="color:blue;" value="' + valueList[i] + '">' + titleList[i] + '</option>';
                }
                $("#HInitTimeCycle").empty().append(HInitTimeCycle_ArrayList);
                $("#HInitTimeCycle").val("0");
                form.render('select');
            }
            // ==============================================
            // æŸ¥è¯¢ è‡ªåŠ¨è¡¥é½æ‰€æœ‰æ—¥æœŸï¼ˆç©ºæ•°æ®=0)
            // ==============================================
            function get_FastQuery() {
                var wait = layer.load();
                var beginDate = $("#HBeginDate").val();
                var endDate = $("#HEndDate").val();
                var sWhere = JSON.stringify({ HBeginDate: beginDate, HEndDate: endDate });
                var params = { sWhere: sWhere, user: sessionStorage["HUserName"] || '' };
                $.ajax({
                    url: GetWEBURL() + 'WEBSController/GetKf_WMSDailyRunStateReport_Json',
                    type: 'GET',
                    data: params,
                    success: function (result) {
                        var data = {};
                        var fullDateList = getDateRange(beginDate, endDate);
                        if (result && result.code == "1" && result.data) {
                            chartConfigKeys.forEach(key => {
                                var cfg = ChartConfig[key];
                                var tb = "h_p_Kf_WMSDailyRunStateReport" + (cfg.dataTableIndex > 0 ? cfg.dataTableIndex : "");
                                var list = (result.data[tb] && Array.isArray(result.data[tb])) ? result.data[tb] : [];
                                // è½¬ map(日期统一格式化)
                                var dataMap = {};
                                list.forEach(x => {
                                    var date = x.日期 || "";
                                    try {
                                        date = Format(new Date(date), "yyyy-MM-dd");
                                    } catch (e) {
                                        date = "";
                                    }
                                    var num = parseInt(x.数量) || 0;
                                    if (date) dataMap[date] = num;
                                });
                                // è¡¥é½æ‰€æœ‰æ—¥æœŸ
                                data[key] = fullDateList.map(date => ({
                                    name: date,
                                    value: dataMap[date] || 0
                                }));
                            });
                        } else {
                            // åŽç«¯æ— æœ‰æ•ˆæ•°æ®ï¼šå…¨éƒ¨åˆå§‹åŒ–为 0
                            chartConfigKeys.forEach(key => {
                                data[key] = fullDateList.map(date => ({ name: date, value: 0 }));
                            });
                        }
                        renderAll(data);
                        layer.close(wait);
                    },
                    error: function () {
                        var fullDateList = getDateRange(beginDate, endDate);
                        var data = {};
                        chartConfigKeys.forEach(key => {
                            data[key] = fullDateList.map(date => ({ name: date, value: 0 }));
                        });
                        renderAll(data);
                        layer.close(wait);
                    }
                });
            }
            // ==============================================
            // ç”Ÿæˆå¼€å§‹~结束的所有日期(自动跨月/跨年)
            // ==============================================
            function getDateRange(startDate, endDate) {
                var arr = [];
                var start = new Date(startDate);
                var end = new Date(endDate);
                while (start <= end) {
                    arr.push(Format(start, "yyyy-MM-dd"));
                    start.setDate(start.getDate() + 1);
                }
                return arr;
            }
            // ==============================================
            // æ¸²æŸ“所有图表和卡片(取消“全0跳过”,始终绘图)
            // ==============================================
            function renderAll(data) {
                chartConfigKeys.forEach(key => {
                    var cfg = ChartConfig[key];
                    var d = data[key] || [];
                    var $chartBox = $('#chart-' + key);
                    var dom = $chartBox[0];
                    var chartKey = 'chart-' + key;
                    // 1. é”€æ¯æ—§å®žä¾‹ï¼Œæ–­å¼€ ResizeObserver å¹¶æ¸…空容器
                    if (chartInstances[chartKey]) {
                        try {
                            if (chartInstances[chartKey]._resizeObserver) chartInstances[chartKey]._resizeObserver.disconnect();
                        } catch (e) { }
                        chartInstances[chartKey].dispose();
                        delete chartInstances[chartKey];
                    }
                    $chartBox.empty();
                    // 2. æ›´æ–°å¡ç‰‡æ€»æ•°
                    var total = d.reduce((a, b) => a + b.value, 0);
                    $('#card-' + key + ' .summary-number').text(total);
                    // 3. å§‹ç»ˆç»˜åˆ¶å›¾è¡¨ï¼ˆæŸ±çŠ¶å›¾ä¼šæ˜¾ç¤º0值柱子,饼图全0时特殊处理)
                    if (cfg.chartType === 'pie') {
                        // é¥¼å›¾æ— è®ºæ˜¯å¦æœ‰0都绘制
                        renderPie(key, cfg.chartTitle, d);
                    } else if (cfg.chartType === 'bar') {
                        // æŸ±çŠ¶å›¾æ— è®ºæ˜¯å¦æœ‰0都绘制,让横轴日期完整展示
                        renderBar(key, cfg.chartTitle, d);
                    }
                });
                // æ›´æ–°æ€»è®¡å¡ç‰‡
                var totalAll = 0;
                chartConfigKeys.forEach(key => {
                    var d = data[key] || [];
                    totalAll += d.reduce((a, b) => a + b.value, 0);
                });
                $("#card-total .summary-number").text(totalAll);
            }
            function renderPie(key, title, data) {
                var dom = document.getElementById('chart-' + key);
                var $chartBox = $('#chart-' + key);
                $chartBox.empty();
                var chart = echarts.init(dom);
                chartInstances['chart-' + key] = chart;
                // è‡ªåŠ¨å“åº”å®¹å™¨å°ºå¯¸å˜åŒ–ï¼ˆä¼˜å…ˆä½¿ç”¨ ResizeObserver)
                if (window.ResizeObserver) {
                    try {
                        var ro = new ResizeObserver(function () { try { chart.resize(); } catch (e) { } });
                        ro.observe(dom);
                        chart._resizeObserver = ro;
                    } catch (e) { }
                }
                // è®¡ç®—总和
                var total = data.reduce((s, x) => s + x.value, 0);
                var isAllZero = total === 0;
                // ç»˜åˆ¶æ•°æ®ï¼ˆå…¨0时用极小值占位)
                var pieData = data.map(x => ({
                    name: x.name,
                    value: isAllZero ? 0.0001 : x.value,
                    originalValue: x.value
                }));
                // åŸºç¡€ç³»åˆ—配置
                var seriesConfig = {
                    type: 'pie',
                    radius: ['30%', '50%'],
                    data: pieData,
                    label: {
                        show: true,
                        fontSize: 11,
                        // å¼ºåˆ¶æ˜¾ç¤ºæ ‡ç­¾ï¼Œé˜²æ­¢è¢«éšè—
                        overflow: 'none',
                        hideOverlap: false
                    },
                    labelLine: {
                        show: true,
                        length: 10,
                        length2: 8
                    },
                    avoidLabelOverlap: false // å…è®¸æ ‡ç­¾é‡å ï¼Œç¡®ä¿éƒ½æ˜¾ç¤º
                };
                chart.setOption({
                    title: { text: title, left: 'center', textStyle: { fontSize: 12 } },
                    tooltip: {
                        trigger: 'item',
                        formatter: function (params) {
                            return `${params.name}: ${params.data.originalValue}`;
                        }
                    },
                    series: [
                        // ç¬¬ä¸€å±‚:外部显示日期
                        {
                            ...seriesConfig,
                            label: {
                                ...seriesConfig.label,
                                position: 'outside',
                                formatter: function (params) {
                                    // å¤–部始终显示日期(名称)
                                    return params.name;
                                }
                            }
                        },
                        // ç¬¬äºŒå±‚:内部显示数量(全0时也显示0)
                        {
                            ...seriesConfig,
                            label: {
                                ...seriesConfig.label,
                                position: 'inside',
                                formatter: function (params) {
                                    // å†…部显示原始数量,全0时显示 '0'
                                    return params.data.originalValue;
                                }
                            },
                            labelLine: { show: false } // å†…部不需要引导线
                        }
                    ]
                });
            }
            // ==============================================
            // æŸ±çŠ¶å›¾æ¸²æŸ“ï¼ˆæ”¯æŒå…¨0数据,显示横轴标签和0值)
            // ==============================================
            function renderBar(key, title, data) {
                var dom = document.getElementById('chart-' + key);
                var chart = echarts.init(dom);
                chartInstances['chart-' + key] = chart;
                if (window.ResizeObserver) {
                    try {
                        var ro = new ResizeObserver(function () { try { chart.resize(); } catch (e) { } });
                        ro.observe(dom);
                        chart._resizeObserver = ro;
                    } catch (e) { }
                }
                var colorList = ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'];
                chart.setOption({
                    title: { text: title, left: 'center', textStyle: { fontSize: 12 } },
                    tooltip: { trigger: 'axis' },
                    xAxis: { type: 'category', data: data.map(x => x.name) },
                    yAxis: { type: 'value' },
                    series: [{
                        type: 'bar',
                        data: data.map(x => x.value),
                        barWidth: '40%',
                        itemStyle: {
                            color: function (params) {
                                return colorList[params.dataIndex % colorList.length];
                            },
                            borderRadius: [4, 4, 0, 0]
                        },
                        label: {
                            show: true,
                            position: 'top',
                            fontSize: 11,
                            formatter: '{c}'
                        }
                    }]
                });
            }
            // åˆå§‹åŒ–
            set_ClearBill();
            window.onresize = function () {
                for (var k in chartInstances) {
                    if (chartInstances[k]) chartInstances[k].resize();
                }
            };
        });
    </script>
</body>
</html>
WebTM/views/Êý²É¹ÜÀí/DAQ_EquipRunningSlice copy.html
New file
@@ -0,0 +1,1476 @@
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>设备运行切片</title>
    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
    <script src="../../layuiadmin/layui/layui.js"></script>
    <script src="../../layuiadmin/layui/layui.js"></script>
    <script src="../../layuiadmin/Scripts/json2.js"></script>
    <script src="../../layuiadmin/Scripts/jquery-1.4.1.js"></script>
    <script src="../../layuiadmin/layui/layui1.js"></script>
    <script src="../../layuiadmin/echarts.min.js"></script>
    <script src="../../layuiadmin/dayjs.min.js"></script>
    <link href="../../layuiadmin/layui/css/ReportPlatform.css" rel="stylesheet" />
    <script src="../../layuiadmin/Scripts/webConfig.js"></script>
    <style>
        /*树状图点击高亮变色*/
        .layui-tree-set-active>.layui-tree-entry .layui-tree-main {
            background: #aef0f7;
        }
        .cnt {
            border: 1px solid #5FB878;
            height: 50px;
            border-radius: 5px;
            /*background: -webkit-gradient(linear, 0% 0%, 0% 50%,from(#262525), to(#262525));*/
            /*谷歌*/
        }
        .bottomright {
            cursor: pointer;
            /*鼠标变成手指样式*/
            transition: all 0.1s;
            /*所有属性变化在0.6秒内执行动画*/
        }
        .bottomright:hover {
            transform: scale(1.3);
            /*鼠标放上之后元素变成1.4倍大小*/
        }
        .imgtitle {
            width: 70%;
            height: 50px;
            text-align: center;
            display: block;
            font-size: 15px;
            float: left;
            line-height: 50px;
        }
        .cns {
            border: 1px solid #5FB878;
            height: 130px;
            border-radius: 5px;
        }
        .cns p {
            font-size: 12px;
            line-height: 18px;
            margin: 0 5px;
            white-space: nowrap;
            text-overflow: ellipsis;
            overflow: hidden;
        }
        .check1 {
            cursor: pointer;
            /*鼠标变成手指样式*/
            -webkit-transition: border linear .1s, -webkit-box-shadow linear .5s;
            border-color: rgba(0, 148, 255, .75);
            -webkit-box-shadow: 0 0 18px rgba(0, 148, 255);
        }
        .prs {
            font-family: "微软雅黑";
            font-weight: bold;
            line-height: 30px;
            margin: 0 0px 0px 10px;
            float: left;
        }
        .layui-progress {
            width: 45%;
            float: left;
            top: 6px;
        }
        .tr1-1,
        .tr1-2,
        .tr1-3,
        .tr1-4 {
            margin-left: 3%;
            margin-top: 4%;
            height: 310px;
            border: 1px solid rgb(0 0 0 / 10%);
            width: 95%;
        }
        .btnM {
            width: 30%;
            height: 50px;
            line-height: 50px;
            float: left;
            text-align: right;
        }
        .layui-icon {
            font-size: 20px;
        }
    </style>
</head>
<body>
    <div class="layui-fluid">
        <div class="layui-col-md12">
            <div class="layui-card" style="padding: 1px">
                <div class="layui-card-body" style="padding: 1px;">
                    <form class="layui-form" action="" lay-filter="component-form-group">
                        <div class="layui-row">
                            <div class="layui-col-xs2 layui-inline" style="border: solid 1.5px #e0d6d64d;">
                                <div id="TreeTable" class="demo-tree demo-tree-box"
                                    style="height: 600px; overflow: scroll;"></div>
                            </div>
                            <div class="layui-col-xs10 layui-inline" style="border: solid 1.5px #e0d6d64d;">
                                <div class="layui-form-item" style="display: flex; justify-content: space-around;">
                                    <div class="layui-inline">
                                        <label class="layui-form-label">日期范围</label>
                                        <div class="layui-inline" id="ID-laydate-range">
                                            <div class="layui-input-inline">
                                                <input type="text" autocomplete="off" id="ID-laydate-start-date"
                                                    class="layui-input" placeholder="开始日期">
                                            </div>
                                            <div class="layui-form-mid">-</div>
                                            <div class="layui-input-inline">
                                                <input type="text" autocomplete="off" id="ID-laydate-end-date"
                                                    class="layui-input" placeholder="结束日期">
                                            </div>
                                        </div>
                                    </div>
                                    <div class="layui-btn-group layui-inline" id="modeBtnGroup">
                                        <button type="button" class="layui-btn" data-mode="day">单日数据</button>
                                        <button type="button" class="layui-btn layui-btn-primary layui-border"
                                            data-mode="history">历史数据</button>
                                    </div>
                                </div>
                                <div id="chartContainer" style="height:600px;display:block;overflow-y:auto;">
                                </div>
                            </div>
                            <!-- <div class="layui-col-xs1 layui-inline" style="border: solid 1.5px #e0d6d64d;">
                                <fieldset style="border: 1px solid #eee; box-shadow: 0 2px 5px 0 rgb(0 0 0 / 10%); height: 585px;">
                                    <legend style="color: #5FB878">操作台</legend>
                                    <div class="content4">
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="PowerOn(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-pause imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">开机</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="PowerOff(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-logout imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">停机</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="DotCheck(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-list imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">点检记录</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="FaultRegistration(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-list imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">故障登记</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="Maintenance(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-form imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">ç»´ä¿®</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="Resume(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-table imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">履历</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="Process(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-file imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">工艺</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="HStatus(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-set imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">状态</span>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </fieldset>
                            </div> -->
                        </div>
                        <div class="layui-row">
                            <!-- <div class="layui-col-xs3 layui-inline">
                                <div class="tr1-1" id="mychart11"> </div>
                            </div>
                            <div class="layui-col-xs3 layui-inline">
                                <div class="tr1-2" id="mychart22"> </div>
                            </div>
                            <div class="layui-col-xs3 layui-inline">
                                <div class="tr1-3" id="mychart3"> </div>
                            </div>
                            <div class="layui-col-xs3 layui-inline">
                                <div class="tr1-4" id="mychart4"> </div>
                            </div> -->
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</body>
<script>
    var wktag = 0;
    var HEquipID = 0;//设备id
    var HEquipNumber = "";//设备编码
    var HEquipName = "";//设备名称
    var HSourceID = "";//产线id
    var HDeptID = "";
    var pieData = []; // é¥¼å›¾æ•°æ®é›†åˆ
    var timelineData = []; //时序图数据集合
    layui.config({
        base: '../../layuiadmin/' //静态资源所在路径
    }).extend({
        index: 'lib/index', //主入口模块
    }).use(['index', 'form', 'table', 'element', 'laypage', 'laydate', 'tree', 'util'], function () {
        //#region å…¬ç”¨å˜é‡
        var $ = layui.$
            , admin = layui.admin
            , layer = layui.layer
            , table = layui.table
            , form = layui.form
            , element = layui.element
            , laypage = layui.laypage
            , laydate = layui.laydate
            , tree = layui.tree
            , util = layui.util
        //#endregion
        //#region è¿›å…¥é¡µé¢å³åŠ è½½
        //初始化界面
        set_ClearBill();
        //#endregion
        //#region è§¦å‘事件:包括form.on(){}格式的所有点击事件、选择事件等
        //#endregion
        //#region æœ¬é¡µé¢è¢«è°ƒç”¨çš„æ‰€æœ‰æ–¹æ³•
        //#region åˆå§‹åŒ–界面
        function set_ClearBill() {
            Init_dateRange()
            // var mychart11 = echarts.init(document.getElementById('mychart11'));
            // var mychart22 = echarts.init(document.getElementById('mychart22'));
            // var mychart3 = echarts.init(document.getElementById('mychart3'));
            // var mychart4 = echarts.init(document.getElementById('mychart4'));
            // get_Histogram1(mychart11, '');//柱状图1
            // get_LineChart(mychart22, '');//折线
            // get_Statistics(mychart3, '');//饼图
            // get_Histogram4(mychart4, '');//柱状图4
            //查询
            get_Display_Tree();
        }
        //#endregion
        //#region åˆå§‹åŒ–日期选择器
        function Init_dateRange() {
            $("#ID-laydate-start-date").val(util.toDateString(new Date(), 'yyyy-MM-dd'))
            $("#ID-laydate-end-date").val(util.toDateString(new Date(), 'yyyy-MM-dd'))
            var laydate = layui.laydate;
            // æ—¥æœŸèŒƒå›´ - å·¦å³é¢æ¿ç‹¬ç«‹é€‰æ‹©æ¨¡å¼
            laydate.render({
                elem: '#ID-laydate-range',
                range: ['#ID-laydate-start-date', '#ID-laydate-end-date']
            });
            // æ—¥æœŸèŒƒå›´ - å·¦å³é¢æ¿è”动选择模式
            laydate.render({
                elem: '#ID-laydate-rangeLinked',
                range: ['#ID-laydate-start-date-1', '#ID-laydate-end-date-1'],
                rangeLinked: true // å¼€å¯æ—¥æœŸèŒƒå›´é€‰æ‹©æ—¶çš„区间联动标注模式 ---  2.8+ æ–°å¢ž
            });
        }
        //#endregion
        //查询部门 è®¾å¤‡å¯¹åº”的报表
        function Check() {
            var HBeginDate = $("#ID-laydate-start-date").val()
            var HEndDate = $("#ID-laydate-end-date").val()
            $.ajax({
                url: GetWEBURL() + '/DAQ_EquipRunningSlice/GetHEquipStatusReportList_DAQ',
                type: "GET",
                async: false,
                data: { "HDeptID": HDeptID, "HEquipID": HEquipID, HBeginDate: HBeginDate, HEndDate: HEndDate, "user": sessionStorage["HUserName"] },
                dataType: "json",//数据类型可以为 text xml json  script  jsonp
                success: function (res) {
                    data = res.data
                    if (data.length < 1) {
                        return
                    }
                    pieData = data
                }
            })
            $.ajax({
                url: GetWEBURL() + '/DAQ_EquipRunningSlice/GetHEquipStatusReportList2_DAQ',
                type: "GET",
                async: false,
                data: { "HDeptID": HDeptID, "HEquipID": HEquipID, HBeginDate: HBeginDate, HEndDate: HEndDate, "user": sessionStorage["HUserName"] },
                dataType: "json",//数据类型可以为 text xml json  script  jsonp
                success: function (res) {
                    data = res.data
                    if (data.length < 1) {
                        return
                    }
                    console.log(timelineData)
                    timelineData = data
                }
            })
            drawCharts()
            //wktag = 0;
            //$("#btomleft").html("");
            //$.ajax({
            //    url: GetWEBURL() + '/Sc_HEquipStateDistribution/Sc_HEquipStateDistribution_Souce',
            //    type: "GET",
            //    data: { "HDeptID": HDeptID, "user": sessionStorage["HUserName"], "OrganizationID": sessionStorage["OrganizationID"] },
            //    dataType: "json",//数据类型可以为 text xml json  script  jsonp
            //    success: function (data) {
            //
            //        var LoadData1 = data.data.h_p_sc_HDeptSouceMOList;
            //        if (LoadData1.length > 0)  //工单列表数据
            //        {
            //
            //            for (var i = 0; i < LoadData1.length; i++) {
            //                var html1 = '';
            //                html1 += '<div class="layui-col-sm12 layui-col-md2" style="margin: 6px;width: 180px;">';
            //                html1 += '<div class="cns" id="bs' + (i + 1) + '" onclick="CheckBtom(this,' + (i + 1) + ')">';
            //                html1 += '<dl>';
            //                html1 += '<dd class="tcenter">';
            //                html1 += '<h1 style="display:none;"><span>生产订单号主ID:</span><span id="df' + (i + 1) + '">' + LoadData1[i].生产订单主内码 + '</span></h1>';
            //                html1 += '<h1 style="display:none;"><span>生产订单子ID:</span><span id="ds' + (i + 1) + '">' + LoadData1[i].生产订单子内码 + '</span></h1>';
            //                html1 += '<h1 style="display:none;"><span>产线ID:</span><span id="cs' + (i + 1) + '">' + LoadData1[i].HSourceID + '</span></h1>';
            //                html1 += '<h1 style="display:none;"><span>设备ID:</span><span id="sb' + (i + 1) + '">' + LoadData1[i].设备id + '</span></h1>';
            //
            //                html1 += '<p><span>设备编码:</span><span id="sbbm' + (i + 1) + '">' + LoadData1[i].设备编码 + '</span></p>';
            //                html1 += '<p><span>设备名称:</span><span id="sbmc' + (i + 1) + '">' + LoadData1[i].设备名称 + '</span></p>';
            //                html1 += '<p><span>产线:</span><span id="cxmc' + (i + 1) + '">' + LoadData1[i].产线 + '</span></p>';
            //                html1 += '<p><span>当前订单:</span><span id="gd' + (i + 1) + '">' + LoadData1[i].生产订单 + '</span></p>';
            //                html1 += '<p><span>订单数量:</span><span id="ddqty' + (i + 1) + '">' + LoadData1[i].任务单数量 + '</span></p>';
            //                html1 += '<p><span>完成数量:</span><span id="wcqty' + (i + 1) + '">' + LoadData1[i].流转卡数量 + '</span></p>';
            //                switch (LoadData1[i].设备状态) {
            //                    case "空闲":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border6"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    case "开机":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border4"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    case "停机":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border3"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    case "生产":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border2"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    case "维修中":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border5"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    case "故障":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border1"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    case "维修完成":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border7"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    default:
            //                }
            //                html1 += '</dd>';
            //                html1 += '</dl>';
            //                html1 += '</div>';
            //                html1 += '</div>';
            //                $("#btomleft").append(html1);
            //            }
            //        }
            //    },
            //    error: function (err) {
            //        layer.alert(err.Message, { time: 1 * 2000, icon: 5 });
            //        return false;
            //    }
            //});
        }
        //#region ç»˜åˆ¶å›¾è¡¨
        function drawCharts() {
            var $container = $("#chartContainer");
            $container.empty();
            var data = pieData
            console.log(pieChart)
            var data1 = timelineData
            for (var i = 0; i < data.length; i++) {
                var hmainid = data[i].hmainid;
                var equipName = data[i].设备名称;
                var dateStr = data[i].所属日期.split('T')[0];
                // æ—¶é—´å­—段
                var runTime = data[i].运行时间 || 0;         // è¿è¡Œ
                var stopTime = data[i].停机时间 || 0;         // åœæœº
                var alarmTime = data[i].告警时间 || 0;      // å‘Šè­¦
                var offTime = data[i].关机时间 || 0;        // å…³æœº
                var total = runTime + stopTime + alarmTime + offTime;
                // ==============================================
                // 1. åˆ›å»ºæ¯ä¸ªè®¾å¤‡çš„图表外壳(左右布局:饼图 + æ—¶åºå›¾ï¼‰
                // ==============================================
                var itemHtml = `
            <div style="width:100%; height:200px; margin-bottom:20px; border:1px solid #eee; padding:15px; border-radius:8px;">
                <div style="display: inline-block; height:20%; display:flex; gap:20px;">
                    <div style="width:40%;">${dateStr} ${equipName}</div>
                    <div style="width:60%; display: flex; justify-content: right; align-items: center; gap: 8px;">
                        <div style="width: 18px; height: 18px; background-color: #73cc3f; display: inline-block"></div>
                        <div style="padding-left: 4px ;display: inline-block">运行(${runTime}H)</div>
                        <div style="width: 18px; height: 18px; background-color: #f2a439; display: inline-block"></div>
                        <div style="padding-left: 4px ;display: inline-block">停机(${stopTime}H)</div>
                        <div style="width: 18px; height: 18px; background-color: #ff796a; display: inline-block"></div>
                        <div style="padding-left: 4px ;display: inline-block">告警(${alarmTime}H)</div>
                        <div style="width: 18px; height: 18px; background-color: #9b9a9b; display: inline-block"></div>
                        <div style="padding-left: 4px ;display: inline-block">关机(${offTime}H)</div>
                    </div>
                </div>
                <div style="display: inline-block; height:80%; display:flex; gap:20px;">
                    <div id="chart_pie_${hmainid}_${i}" style="width:25%; height:100%;"></div>
                    <div id="chart_time_${hmainid}_${i}" style="width:70%; height:100%;"></div>
                </div>
            </div>`;
                $container.append(itemHtml);
                // ==============================================
                // 2. å·¦ä¾§çŽ¯å½¢é¥¼å›¾ï¼ˆè¿è¡Œ/停机/告警/关机 å æ¯”)
                // ==============================================
                var pieChart = echarts.init(document.getElementById(`chart_pie_${hmainid}_${i}`));
                pieChart.setOption({
                    // title: { text: `${dateStr} ${equipName}`, left: 'center', textStyle: { fontSize: 16 } },
                    tooltip: {
                        trigger: 'item', formatter: '{b}: {c}H ({d}%)', textStyle: {
                            lineHeight: 22  // æ–‡å­—间距更大
                        },
                    },
                    legend: {
                        orient: 'vertical', right: '2%', top: 'middle', textStyle: { fontSize: 13 }
                        , formatter: function (name, value) {
                            var getRate = function () {
                                if (name == '运行') {
                                    return (runTime / total * 100.0).toFixed(2)
                                }
                                if (name == '停机') {
                                    return (stopTime / total * 100.0).toFixed(2)
                                }
                                if (name == '告警') {
                                    return (alarmTime / total * 100.0).toFixed(2)
                                }
                                if (name == '关机') {
                                    return (offTime / total * 100.0).toFixed(2)
                                }
                            }()
                            return name + '率(' + getRate
                                + '%)'
                        }
                    },
                    series: [{
                        type: 'pie',
                        radius: ['42%', '70%'],
                        center: ['25%', '50%'],
                        itemStyle: { borderRadius: 4, borderColor: '#fff', borderWidth: 2 },
                        label: { show: false },
                        data: [
                            { value: runTime, name: '运行', itemStyle: { color: '#73cc3f' } },
                            { value: stopTime, name: '停机', itemStyle: { color: '#f2a439' } },
                            { value: alarmTime, name: '告警', itemStyle: { color: '#ff796a' } },
                            { value: offTime, name: '关机', itemStyle: { color: '#9b9a9b' } }
                        ]
                    }]
                });
                // ==============================================
                // 3. å³ä¾§ 24小时 è®¾å¤‡è¿è¡Œæ—¶åºå›¾
                // ==============================================
                var timeChart = echarts.init(document.getElementById(`chart_time_${hmainid}_${i}`));
                // ä½ çš„原始数据
                var data1Instance = data1["2026-04-16"]
                var startTime = dayjs("2026-04-16 00:00:00").valueOf();
                var endTime = dayjs("2026-04-16 23:59:59").valueOf();
                var categories = [data1Instance[0]["生产资源"]];
                var types = [
                    { name: '正常运行', color: '#73cc3f' },
                    { name: '离线', color: '#9b9a9b' },
                    { name: '待机', color: '#f2a439' },
                ];
                var getColor = function (name) {
                    for (var i = 0; i < types.length; i++) {
                        if (name == types[i].name) {
                            return types[i].color
                        }
                    }
                }
                chartDataTimeline = []
                for (var cursor = 0; cursor < data1Instance.length; cursor++) {
                    chartDataTimeline.push({
                        "name": data1Instance[cursor]["HResult"],
                        "value": [
                            0,
                            dayjs(data1Instance[cursor]["时间"]).valueOf(),
                            dayjs(data1Instance[cursor]["时间"]).add(5, 'm').valueOf(),
                            300000
                        ],
                        "itemStyle": {
                            "normal": {
                                "color": getColor(data1Instance[cursor]["HResult"])
                            }
                        }
                    })
                }
                timeChart.setOption({
                    tooltip: {
                        formatter: function (params) {
                            return params.marker + params.name;
                        }
                    },
                    grid: {
                        top: 0,
                        bottom: 0,
                        left: 20,  // ç»™Y轴文字留一点位置
                        right: 20,
                        containLabel: true
                    },
                    xAxis: {
                        type: 'time',
                        min: startTime,  //  å¼€å§‹æ—¶é—´æˆ³
                        max: endTime,  //  ç»“束时间戳
                        minInterval: 7200000, // é—´éš”两小时
                        scale: true,
                        axisLabel: {
                            formatter: function (val) {
                                return echarts.format.formatTime('hh:mm', val);
                            }
                        },
                        axisLine: {
                            show: false   //  éšè— x è½´è½´çº¿
                        }
                    },
                    yAxis: {
                        data: categories,
                        axisLine: {
                            show: false   //  éšè— y è½´è½´çº¿
                        },
                        name: "",
                        axisLabel: { show: false }, //  éšè—Y轴标签
                    },
                    series: [
                        {
                            type: 'custom',
                            renderItem: renderItem,
                            itemStyle: {
                                opacity: 0.8
                            },
                            encode: {
                                x: [1, 2],
                                y: 0
                            },
                            data: chartDataTimeline
                        }
                    ]
                })
            }
        }
        //#endregion
        // æ ‘状图查询
        function get_Display_Tree() {
            var sWhere = " AND HUSEORGID=" + sessionStorage["OrganizationID"];
            var ajaxLoad = layer.load();
            $.ajax({
                url: GetWEBURL() + '/DAQ_EquipRunningSlice/GetHEquipTreeList_DAQ',
                data: { "sWhere": "" },
                type: "GET",
                success: function (data1) {
                    if (data1.count == 1) {
                        layer.close(ajaxLoad);
                        var data = data1.data;
                        MenuMain(data);
                    } else {
                        layer.close(ajaxLoad);
                        layer.alert(data1.code + data1.Message, { icon: 5 });
                    }
                }, error: function () {
                    layer.close(ajaxLoad);
                    layer.alert("接口请求失败!", { icon: 5 });
                }
            });
        }
        //遍历生成主菜单
        function MenuMain(data) {
            var liStr = '[';
            //遍历生成主菜单
            HDeptID = data[0].id
            for (var i = 0; i < data.length; i++) {
                // åˆ¤æ–­æ˜¯å¦å­˜åœ¨å­èœå•
                if (data[i].children != null && data[i].children.length > 0) {
                    liStr += '{"title": "' + data[i].id + "-" + data[i].title + '", "id": "' + data[i].id + '","spread":true, "children":[ ';
                    // éåŽ†èŽ·å–å­èœå•
                    for (var k = 0; k < data[i].children.length; k++) {
                        liStr += getChildMenu(data[i].children[k], 0, data[i].id);
                    }
                    liStr = liStr.substring(0, liStr.length - 1);
                    liStr += ']},';
                } else {
                    liStr += '{"title": "' + data[i].id + "-" + data[i].title + '", "id": "' + data[i].id + '"},';
                }
            };
            liStr = liStr.substring(0, liStr.length - 1);
            liStr += "]";
            var treeTable = JSON.parse(liStr);
            tree.render({
                elem: '#TreeTable' //默认是点击节点可进行收缩
                , data: treeTable
                , click: function (obj) {
                    //高亮变色
                    $(".layui-tree-set").removeClass('layui-tree-set-active');
                    obj.elem.addClass('layui-tree-set-active');
                    var data = obj.data;  //获取当前点击的节点数据
                    HDeptID = 0;
                    HEquipID = 0;
                    if (data.HPID) {
                        // æœ‰PID åˆ¤å®šä¸ºå­èŠ‚ç‚¹
                        HDeptID = data.HPID || 0
                        HEquipID = data.id
                    } else {
                        HDeptID = data.id || 0
                    }
                    Check();
                }
            });
        }
        // é€’归生成子菜单
        function getChildMenu(subMenu, num, parentID) {
            num++;
            var subStr = '';
            if (subMenu.children != null && subMenu.children.length > 0) {
                subStr += '{"title": "' + subMenu.id + "-" + subMenu.title + '", "id": "' + subMenu.id + '", "HPID": "' + parentID + '","children":[';
                for (var j = 0; j < subMenu.children.length; j++) {
                    subStr += getChildMenu(subMenu.children[j], num, parentID);
                    if (j + 1 == subMenu.children.length) {
                        subStr = subStr.substring(0, subStr.length - 1);
                    }
                }
                subStr += ']},';
            } else {
                subStr += '{"title": "' + subMenu.id + "-" + subMenu.title + '", "id": "' + subMenu.id + '","HPID": "' + parentID + '"},';
            }
            return subStr;
        }
        $('#modeBtnGroup').on('click', 'button', function (e) {
            console.log("点击成功!event =", e);  // event äº‹ä»¶æ‹¿åˆ°
            var $btn = $(this);
            var $btnGroup = $btn.closest('div');
            $btnGroup.find('button').addClass("layui-btn-primary").addClass("layui-border")
            $btn.removeClass("layui-btn-primary").removeClass("layui-border")
            var mode = $btn.data('mode');  // day / history
            //通过mode判断执行哪个查询,如果是day,则查询的时候,开始日期和结束日期都是当天(与日期范围无关),如果是history,则按照日期范围和历史数据进行筛选
        });
    });
    //#endregion
    //工单列表选中
    function CheckBtom(obj, i) {
        workcode = $("#gd" + i + "").html(); //通过样式ID获取html内容(工单号)
        HICMOInterID = $("#df" + i + "").html();     //生产订单主内码
        HICMOEntryID = $("#ds" + i + "").html();     //生产订单子内码
        HEquipID = $("#sb" + i + "").html();     //设备id
        HEquipNumber = $("#sbbm" + i + "").html();     //设备编码
        HEquipName = $("#sbmc" + i + "").html();     //设备名称
        HSourceID = $("#cs" + i + "").html();     //产线id
        $('.cns').removeClass('check1');  //删除不同父级clss样式相同的所有元素
        $("#bs" + i + "").addClass('check1'); // æ·»åŠ å½“å‰å…ƒç´ çš„æ ·å¼
        if (HEquipID != "" && HEquipID != null) {
            wktag = 1;
        }
        sWhere = {
            HDeptID: HDeptID
            , HSourceID: HSourceID
        }
        /* ç‚¹å‡» è®¾å¤‡ å¼€å¯è®¾å¤‡è¯¦æƒ…弹窗,设备状态详情页面
        *详情页面:日期过滤、设备运行分析、警报(可以先取值为最近的安灯管理)取值用 è®¾å¤‡è¿è¡ŒçŠ¶æ€è¡¨ Sb_EquipRunningStatus(设备当前状态效率分析)
        */
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '设备详情',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: './DAQ_EvidenceEquipmentCockpitDetail.html?HEquipID=' + HEquipID,
            end: function () {
            },
            success: function (dom, index) {
            },
        });
        // FourReport(JSON.stringify(sWhere));
    }
    //查询 éƒ¨é—¨+产线 4个图表 èµ‹å€¼
    function FourReport(sWhere) {
        $.ajax({
            url: GetWEBURL() + '/Sc_HEquipStateDistribution/Get_EquipStateDistribution_FourReport',
            type: "GET",
            data: { "sWhere": sWhere, "user": sessionStorage["HUserName"], "OrganizationID": sessionStorage["OrganizationID"] },
            dataType: "json",//数据类型可以为 text xml json  script  jsonp
            success: function (data) {
                var chartData = data.data.h_p_Sc_FourStateDistributionReport;
                var chartData1 = data.data.h_p_Sc_FourStateDistributionReport1;
                var chartData2 = data.data.h_p_Sc_FourStateDistributionReport2;
                var chartData3 = data.data.h_p_Sc_FourStateDistributionReport3;
                var mychart11 = echarts.init(document.getElementById('mychart11'));
                var mychart22 = echarts.init(document.getElementById('mychart22'));
                var mychart3 = echarts.init(document.getElementById('mychart3'));
                var mychart4 = echarts.init(document.getElementById('mychart4'));
                get_Histogram1(mychart11, chartData);
                get_LineChart(mychart22, chartData1);
                get_Statistics(mychart3, chartData2);
                get_Histogram4(mychart4, chartData3);
            },
            error: function (err) {
                layer.alert(err.Message, { time: 1 * 2000, icon: 5 });
                return false;
            }
        });
    }
    //柱状图
    function get_Histogram1(mychart11, chartData) {
        // é»˜è®¤çš„option结构
        var option = {
            title: {
                text: '近七天产能', // é»˜è®¤æ ‡é¢˜ä¸ºç©º
                left: 'center',
                top: '10%', // è°ƒæ•´æ ‡é¢˜ä½ç½®ï¼Œæ”¾åˆ°æœ€ä¸Šé¢
                textStyle: {
                    fontSize: 18,
                    color: '#ff0000'
                }
            },
            grid: {
                top: '25%', // è°ƒæ•´grid的top值,给标题留出空间
                bottom: '20%',
                left: '10%',
                right: '10%'
            },
            xAxis: {
                type: 'category',
                data: [] // é»˜è®¤x轴数据为空
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    data: [], // é»˜è®¤series数据为空
                    type: 'bar'
                }
            ]
        };
        // å¦‚果有数据,更新option的内容
        if (chartData && chartData.length > 0) {
            option.title.text = '近七天产能'; // æ­£å¸¸æ•°æ®æ—¶æ²¡æœ‰æ ‡é¢˜
            option.xAxis.data = chartData.map(item => item.日期); // è®¾ç½®x轴数据
            option.series[0].data = chartData.map(item => item['生产总数']); // è®¾ç½®y轴数据
            option.series[0].label = {
                normal: {
                    show: true,
                    position: 'top',
                    formatter: function (params) {
                        return echarts.format.addCommas(params.value);
                    }
                }
            };
            option.series[0].itemStyle = {
                normal: {
                    color: '#15b1fa',
                    label: {
                        show: true // åœ¨æŸ±çŠ¶å›¾ä¸Šæ˜¾ç¤ºæ•°æ®
                    }
                }
            };
        } else {
            // æ²¡æœ‰æ•°æ®æ—¶ï¼Œæ˜¾ç¤º"暂无数据"提示
            option.title.text = '暂无数据';
        }
        // æ›´æ–°å›¾è¡¨
        mychart11.setOption(option);
    }
    //柱状图2
    function get_LineChart(mychart22, chartData1) {
        // é»˜è®¤çš„option结构
        var option = {
            title: {
                text: 'ç»´ä¿®', // é»˜è®¤æ ‡é¢˜ä¸ºç©º
                left: 'center',
                top: '10%', // è°ƒæ•´æ ‡é¢˜ä½ç½®ï¼Œæ”¾åˆ°æœ€ä¸Šé¢
                textStyle: {
                    fontSize: 18,
                    color: '#ff0000'
                }
            },
            axisLabel: {
                show: true,
                interval: 0,
                color: '#15b1fa',
                formatter: function (value) {
                    var ret = "";//拼接加\n返回的类目项
                    var maxLength = 1;//每项显示文字个数
                    var valLength = value.length;//X轴类目项的文字个数
                    var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
                    if (rowN > 1)//如果类目项的文字大于3,
                    {
                        for (var i = 0; i < rowN; i++) {
                            var temp = "";//每次截取的字符串
                            var start = i * maxLength;//开始截取的位置
                            var end = start + maxLength;//结束截取的位置
                            //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
                            temp = value.substring(start, end) + "\n";
                            ret += temp; //凭借最终的字符串
                        }
                        return ret;
                    }
                    else {
                        return value;
                    }
                }
            },
            grid: {
                top: '25%', // è°ƒæ•´grid的top值,给标题留出空间
                bottom: '20%',
                left: '10%',
                right: '10%'
            },
            xAxis: {
                type: 'category',
                data: [] // é»˜è®¤x轴数据为空
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    data: [], // é»˜è®¤series数据为空
                    type: 'bar'
                }
            ]
        };
        // å¦‚果有数据,更新option的内容
        if (chartData1 && chartData1.length > 0) {
            option.title.text = '不良原因'; // æ­£å¸¸æ•°æ®æ—¶æ²¡æœ‰æ ‡é¢˜
            option.xAxis.data = chartData1.map(item => item.不良原因); // è®¾ç½®x轴数据
            option.series[0].data = chartData1.map(item => item['数量']); // è®¾ç½®y轴数据
            option.series[0].label = {
                normal: {
                    show: true,
                    position: 'top',
                    formatter: function (params) {
                        return echarts.format.addCommas(params.value);
                    }
                }
            };
            option.series[0].itemStyle = {
                normal: {
                    color: '#15b1fa',
                    label: {
                        show: true // åœ¨æŸ±çŠ¶å›¾ä¸Šæ˜¾ç¤ºæ•°æ®
                    }
                }
            };
        } else {
            // æ²¡æœ‰æ•°æ®æ—¶ï¼Œæ˜¾ç¤º"暂无数据"提示
            option.title.text = '暂无数据';
        }
        // æ›´æ–°å›¾è¡¨
        mychart22.setOption(option);
    }
    //饼图
    function get_Statistics(mychart3, chartData2) {
        // å¦‚æžœ chartData2 ä¸ºç©ºï¼Œæä¾›ä¸€ä¸ªâ€œæ— æ•°æ®â€æç¤º
        if (chartData2.length === 0) {
            mychart3.setOption({
                title: {
                    text: '暂无数据',
                    left: 'center',
                    top: '10%',
                    textStyle: {
                        color: 'red', // è®¾ç½®æ ‡é¢˜é¢œè‰²ä¸ºçº¢è‰²
                        fontSize: 18,
                        fontWeight: 'bold'
                    }
                },
                series: [],  // æ¸…空数据
                graphic: []  // æ¸…空图形中的文本
            });
            return;
        }
        // çŠ¶æ€é¢œè‰²æ˜ å°„
        const statusColorMap = {
            '开机': '#28a745',    // ç»¿è‰²
            '故障': '#ff63a5',    // æ¡ƒçº¢è‰²
            '停机': '#f0ad4e',    // é»„色
            '未知': '#6c757d'     // ç°è‰²
        };
        // è®¡ç®—开机率
        const totalDevices = chartData2.reduce((sum, item) => sum + item.数量, 0);
        const onlineDevices = chartData2.find(item => item.状态 === '开机')?.数量 || 0;
        const onlineRate = totalDevices === 0 ? 0 : (onlineDevices / totalDevices * 100).toFixed(2);
        // åŠ¨æ€ç”Ÿæˆé¥¼å›¾æ•°æ®ï¼Œå¹¶æ ¹æ®çŠ¶æ€è®¾ç½®é¢œè‰²
        var data = chartData2.map(function (item) {
            // èŽ·å–å½“å‰çŠ¶æ€çš„é¢œè‰²ï¼Œé»˜è®¤ä¸ºç°è‰²
            var color = statusColorMap[item.状态] || statusColorMap['未知'];
            return {
                value: item.数量,
                name: item.状态,
                itemStyle: {
                    color: color  // ä¸ºæ¯ä¸ªçŠ¶æ€è®¾ç½®å¯¹åº”çš„é¢œè‰²
                }
            };
        });
        // å›¾è¡¨çš„配置项
        var option = {
            title: {
                text: '设备状态分析对比',
                left: 'center',
                top: '10%',  // å°†æ ‡é¢˜æ”¾ç½®åˆ°é¡¶éƒ¨
                textStyle: {
                    color: 'red',  // è®¾ç½®æ ‡é¢˜å­—体颜色为红色
                    fontSize: 18,
                    fontWeight: 'bold'
                }
            },
            tooltip: {
                trigger: 'item'
            },
            legend: {
                orient: 'vertical',
                left: 'left'
            },
            series: [
                {
                    name: '设备状态',
                    type: 'pie',
                    radius: '50%',
                    data: data,  // ä½¿ç”¨åŠ¨æ€ç”Ÿæˆçš„æ•°æ®
                    emphasis: {
                        itemStyle: {
                            shadowBlur: 10,
                            shadowOffsetX: 0,
                            shadowColor: 'rgba(0, 0, 0, 0.5)'
                        }
                    }
                }
            ],
            graphic: [{
                type: 'text',
                left: 'center',
                top: '85%',  // è°ƒæ•´æ–‡æœ¬ä½ç½®ï¼Œè®©å…¶ç¨å¾®æ›´å¾€ä¸‹
                style: {
                    text: `开机率: ${onlineRate}%`,  // æ˜¾ç¤ºå¼€æœºçއ
                    font: '16px Arial',
                    fill: '#00aaff'  // ä½¿ç”¨æµ…蓝色显示开机率
                }
            }]
        };
        // è®¾ç½®å›¾è¡¨çš„配置项
        mychart3.setOption(option);
    }
    //柱状图4
    function get_Histogram4(mychart4, chartData3) {
        // é»˜è®¤çš„option结构
        var option = {
            title: {
                text: 'ç»´ä¿®', // é»˜è®¤æ ‡é¢˜ä¸ºç©º
                left: 'center',
                top: '10%', // è°ƒæ•´æ ‡é¢˜ä½ç½®ï¼Œæ”¾åˆ°æœ€ä¸Šé¢
                textStyle: {
                    fontSize: 18,
                    color: '#ff0000'
                }
            },
            axisLabel: {
                show: true,
                interval: 0,
                color: '#15b1fa',
                formatter: function (value) {
                    var ret = "";//拼接加\n返回的类目项
                    var maxLength = 1;//每项显示文字个数
                    var valLength = value.length;//X轴类目项的文字个数
                    var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
                    if (rowN > 1)//如果类目项的文字大于3,
                    {
                        for (var i = 0; i < rowN; i++) {
                            var temp = "";//每次截取的字符串
                            var start = i * maxLength;//开始截取的位置
                            var end = start + maxLength;//结束截取的位置
                            //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
                            temp = value.substring(start, end) + "\n";
                            ret += temp; //凭借最终的字符串
                        }
                        return ret;
                    }
                    else {
                        return value;
                    }
                }
            },
            grid: {
                top: '25%', // è°ƒæ•´grid的top值,给标题留出空间
                bottom: '20%',
                left: '10%',
                right: '10%'
            },
            xAxis: {
                type: 'category',
                data: [] // é»˜è®¤x轴数据为空
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    data: [], // é»˜è®¤series数据为空
                    type: 'bar'
                }
            ]
        };
        // å¦‚果有数据,更新option的内容
        if (chartData3 && chartData3.length > 0) {
            option.title.text = 'ç»´ä¿®'; // æ­£å¸¸æ•°æ®æ—¶æ²¡æœ‰æ ‡é¢˜
            option.xAxis.data = chartData3.map(item => item.维修项目); // è®¾ç½®x轴数据
            option.series[0].data = chartData3.map(item => item['维修次数']); // è®¾ç½®y轴数据
            option.series[0].label = {
                normal: {
                    show: true,
                    position: 'top',
                    formatter: function (params) {
                        return echarts.format.addCommas(params.value);
                    }
                }
            };
            option.series[0].itemStyle = {
                normal: {
                    color: '#15b1fa',
                    label: {
                        show: true // åœ¨æŸ±çŠ¶å›¾ä¸Šæ˜¾ç¤ºæ•°æ®
                    }
                }
            };
        } else {
            // æ²¡æœ‰æ•°æ®æ—¶ï¼Œæ˜¾ç¤º"暂无数据"提示
            option.title.text = '暂无数据';
        }
        // æ›´æ–°å›¾è¡¨
        mychart4.setOption(option);
    }
    //#region   æ“ä½œå°æŒ‰é’®ç‚¹å‡»äº‹ä»¶
    //开机按钮点击事件
    function PowerOn(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '新增开机单',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/设备开机单/Sb_EquipBeginBill.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //停机按钮点击事件
    function PowerOff(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '新增停机单',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/设备停机单/Sb_EquipStopBill.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //点检记录按钮点击事件
    function DotCheck(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '查看设备月点检记录',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../车间管理/启动点检单/Sc_WorkDotCheckBillList_Day.html?OperationType=设备&linterid=' + HEquipID + '',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID,
                    "HEquipType": "设备"
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //故障登记按钮点击事件
    function FaultRegistration(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '新增故障登记单',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/Sb_Add_EqpConkBookBillList.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //维修记录按钮点击事件
    function Maintenance(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '新增维修记录单',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/Sb_Add_EqpMaintenanceBillList.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //履历按钮点击事件
    function Resume(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '查看设备履历',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/设备报表/Sb_EquipResumeCheckQuery.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID,
                    "HEquipNumber": HEquipNumber,
                    "HEquipName": HEquipName
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //工艺按钮点击事件
    function Process(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '查看设备工艺参数',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../生产管理/订单状态分布/Sc_EquipmentProcessList.html?OperationType=4&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID,
                    "HICMOInterID": HICMOInterID,
                    "HICMOEntryID": HICMOEntryID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //状态按钮点击事件
    function HStatus(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '查看设备OEE',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../生产管理/订单状态分布/Sc_OEEStatusReport.html?OperationType=4&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipNumber": HEquipNumber
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    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()
            }
        );
    }
    //#endregion
</script>
</html>
WebTM/views/Êý²É¹ÜÀí/DAQ_EquipRunningSlice.html
@@ -12,12 +12,12 @@
    <script src="../../layuiadmin/Scripts/jquery-1.4.1.js"></script>
    <script src="../../layuiadmin/layui/layui1.js"></script>
    <script src="../../layuiadmin/echarts.min.js"></script>
    <script src="../../layuiadmin/dayjs.min.js"></script>
    <link href="../../layuiadmin/layui/css/ReportPlatform.css" rel="stylesheet" />
    <script src="../../layuiadmin/Scripts/webConfig.js"></script>
    <script src="../../layuiadmin/zgqCustom/zgqCustom.js"></script>
    <style>
        /*树状图点击高亮变色*/
        .layui-tree-set-active > .layui-tree-entry .layui-tree-main {
        .layui-tree-set-active>.layui-tree-entry .layui-tree-main {
            background: #aef0f7;
        }
@@ -36,10 +36,10 @@
            /*所有属性变化在0.6秒内执行动画*/
        }
            .bottomright:hover {
                transform: scale(1.3);
                /*鼠标放上之后元素变成1.4倍大小*/
            }
        .bottomright:hover {
            transform: scale(1.3);
            /*鼠标放上之后元素变成1.4倍大小*/
        }
        .imgtitle {
            width: 70%;
@@ -57,14 +57,14 @@
            border-radius: 5px;
        }
            .cns p {
                font-size: 12px;
                line-height: 18px;
                margin: 0 5px;
                white-space: nowrap;
                text-overflow: ellipsis;
                overflow: hidden;
            }
        .cns p {
            font-size: 12px;
            line-height: 18px;
            margin: 0 5px;
            white-space: nowrap;
            text-overflow: ellipsis;
            overflow: hidden;
        }
        .check1 {
            cursor: pointer;
@@ -127,42 +127,131 @@
                            <div class="layui-col-xs10 layui-inline" style="border: solid 1.5px #e0d6d64d;">
                                <div class="layui-form-item" style="display: flex; justify-content: space-around;">
                                    <div class="layui-inline">
                                        <label class="layui-form-label">日期间隔</label>
                                        <div class="layui-input-block">
                                            <select name="HInitTimeCycle" id="HInitTimeCycle"
                                                    class="ForFilteringSchemes" lay-filter="HInitTimeCycle"
                                                    style="width:190px;">
                                            </select>
                                        <label class="layui-form-label">日期范围</label>
                                        <div class="layui-inline" id="ID-laydate-range">
                                            <div class="layui-input-inline">
                                                <input type="text" autocomplete="off" id="ID-laydate-start-date"
                                                    class="layui-input" placeholder="开始日期">
                                            </div>
                                            <div class="layui-form-mid">-</div>
                                            <div class="layui-input-inline">
                                                <input type="text" autocomplete="off" id="ID-laydate-end-date"
                                                    class="layui-input" placeholder="结束日期">
                                            </div>
                                        </div>
                                    </div>
                                    <div class="layui-inline">
                                        <label class="layui-form-label">开始日期</label>
                                        <div class="layui-input-block">
                                            <input type="date" class="layui-input ForFilteringSchemes" name="HDate1"
                                                   id="HDate1">
                                    <div class="layui-btn-group layui-inline" id="modeBtnGroup">
                                        <button type="button" class="layui-btn" data-mode="day">单日数据</button>
                                        <button type="button" class="layui-btn layui-btn-primary layui-border"
                                            data-mode="history">历史数据</button>
                                    </div>
                                </div>
                                <div id="chartContainer" style="height:600px;display:block;overflow-y:auto;">
                                </div>
                            </div>
                            <!-- <div class="layui-col-xs1 layui-inline" style="border: solid 1.5px #e0d6d64d;">
                                <fieldset style="border: 1px solid #eee; box-shadow: 0 2px 5px 0 rgb(0 0 0 / 10%); height: 585px;">
                                    <legend style="color: #5FB878">操作台</legend>
                                    <div class="content4">
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="PowerOn(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-pause imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">开机</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="PowerOff(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-logout imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">停机</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="DotCheck(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-list imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">点检记录</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="FaultRegistration(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-list imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">故障登记</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="Maintenance(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-form imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">ç»´ä¿®</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="Resume(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-table imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">履历</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="Process(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-file imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">工艺</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="HStatus(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-set imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">状态</span>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="layui-inline">
                                        <label class="layui-form-label">结束日期</label>
                                        <div class="layui-input-block">
                                            <input type="date" class="layui-input ForFilteringSchemes" name="HDate2"
                                                   id="HDate2" style="width:190px;">
                                        </div>
                                    </div>
                                    <button class="layui-btn layuiadmin-btn-order" type="button" lay-submit=""
                                            lay-filter="btnSearch" id="btnSearch">
                                        <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
                                    </button>
                                    <button class="layui-btn layuiadmin-btn-order" type="button" lay-submit=""
                                            lay-filter="btnReSearch" id="btnReSearch" style="padding:0 5px">
                                        é€€å‡º
                                    </button>
                                </div>
                                <div id="chartContainer" style="height:800px;display:block;overflow-y:auto;">
                                </div>
                            </div>
                                </fieldset>
                            </div> -->
                        </div>
                        <div class="layui-row">
                        <div class="layui-row">
                            <!-- <div class="layui-col-xs3 layui-inline">
                                <div class="tr1-1" id="mychart11"> </div>
                            </div>
                            <div class="layui-col-xs3 layui-inline">
                                <div class="tr1-2" id="mychart22"> </div>
                            </div>
                            <div class="layui-col-xs3 layui-inline">
                                <div class="tr1-3" id="mychart3"> </div>
                            </div>
                            <div class="layui-col-xs3 layui-inline">
                                <div class="tr1-4" id="mychart4"> </div>
                            </div> -->
                        </div>
                    </form>
                </div>
@@ -171,7 +260,15 @@
    </div>
</body>
<script>
<script>
    var wktag = 0;
    var HEquipID = 0;//设备id
    var HEquipNumber = "";//设备编码
    var HEquipName = "";//设备名称
    var HSourceID = "";//产线id
    var HDeptID = "";
    var pieData = []; // é¥¼å›¾æ•°æ®é›†åˆ
    var timelineData = []; //时序图数据集合
    layui.config({
        base: '../../layuiadmin/' //静态资源所在路径
    }).extend({
@@ -199,25 +296,6 @@
        //#region è§¦å‘事件:包括form.on(){}格式的所有点击事件、选择事件等
        //日期间隔下拉列表监听
        form.on('select(HInitTimeCycle)', function (data) {
            var HInitTimeCycle = $("#HInitTimeCycle").val() * 1;
            //若日期间隔不为 ä»»æ„é—´éš”,则禁用开始日期与结束日期的选择
            if (HInitTimeCycle != -1) {
                $('#HDate1').prop('disabled', true);
                $('#HDate2').prop('disabled', true);
                $("#HDate1").val(Format(new Date(new Date() - 1000 * 60 * 60 * 24 * HInitTimeCycle), "yyyy-MM-dd"));
                $("#HDate2").val(Format(new Date(), "yyyy-MM-dd"));
                //执行查询方法
                Check();
            } else {
                $('#HDate1').prop('disabled', false);
                $('#HDate2').prop('disabled', false);
            }
        });
        //#endregion
@@ -226,141 +304,349 @@
        //#region åˆå§‹åŒ–界面
        function set_ClearBill() {
            //初始化日期间隔、开始日期、结束日期
            setSelect_HInitTimeCycle();
            //若日期间隔不为 ä»»æ„é—´éš”,则禁用开始日期与结束日期的选择
            var HInitTimeCycle = $("#HInitTimeCycle").val() * 1;
            if (HInitTimeCycle != -1) {
                $('#HDate1').prop('disabled', true);
                $('#HDate2').prop('disabled', true);
            } else {
                $('#HDate1').prop('disabled', false);
                $('#HDate2').prop('disabled', false);
            }
            $("#HDate1").val(Format(new Date(new Date() - 1000 * 60 * 60 * 24 * HInitTimeCycle), "yyyy-MM-dd"));
            $("#HDate2").val(Format(new Date(), "yyyy-MM-dd"));
            Init_dateRange()
            // var mychart11 = echarts.init(document.getElementById('mychart11'));
            // var mychart22 = echarts.init(document.getElementById('mychart22'));
            // var mychart3 = echarts.init(document.getElementById('mychart3'));
            // var mychart4 = echarts.init(document.getElementById('mychart4'));
            // get_Histogram1(mychart11, '');//柱状图1
            // get_LineChart(mychart22, '');//折线
            // get_Statistics(mychart3, '');//饼图
            // get_Histogram4(mychart4, '');//柱状图4
            //查询
            get_Display_Tree();
        }
        //#endregion
        //#region åˆå§‹åŒ–日期选择器
        function Init_dateRange() {
            $("#ID-laydate-start-date").val(util.toDateString(new Date(), 'yyyy-MM-dd'))
            $("#ID-laydate-end-date").val(util.toDateString(new Date(), 'yyyy-MM-dd'))
        //#region åˆå§‹æ—¥æœŸé—´éš” ä¸‹æ‹‰åˆ—表
        function setSelect_HInitTimeCycle() {
            var valueList = [0, 1, 2, 3, 4, 5, 6, 29];
            var titleList = ["今天", "近两天", "近三天", "近四天", "近五天", "近六天", "近七天", "近30天"];
            var HInitTimeCycle_ArrayList = '<option  value="-1" selected="selected" >任意间隔</option>';
            for (var i = 0; i < valueList.length; i++) {
                HInitTimeCycle_ArrayList += '<option  style="color:blue;" value="' + valueList[i] + '">' + titleList[i] + '</option>';
            }
            $("#HInitTimeCycle").empty();
            $("#HInitTimeCycle").append(HInitTimeCycle_ArrayList);
            $("#HInitTimeCycle").val("0");
            form.render('select');
            var laydate = layui.laydate;
            // æ—¥æœŸèŒƒå›´ - å·¦å³é¢æ¿ç‹¬ç«‹é€‰æ‹©æ¨¡å¼
            laydate.render({
                elem: '#ID-laydate-range',
                range: ['#ID-laydate-start-date', '#ID-laydate-end-date']
            });
            // æ—¥æœŸèŒƒå›´ - å·¦å³é¢æ¿è”动选择模式
            laydate.render({
                elem: '#ID-laydate-rangeLinked',
                range: ['#ID-laydate-start-date-1', '#ID-laydate-end-date-1'],
                rangeLinked: true // å¼€å¯æ—¥æœŸèŒƒå›´é€‰æ‹©æ—¶çš„区间联动标注模式 ---  2.8+ æ–°å¢ž
            });
        }
        //#endregion
        //查询部门 è®¾å¤‡å¯¹åº”的报表
        function Check() {
            var HBeginDate = $("#HDate1").val()
            var HEndDate = $("#HDate2").val()
            var HBeginDate = $("#ID-laydate-start-date").val()
            var HEndDate = $("#ID-laydate-end-date").val()
            $.ajax({
                url: GetWEBURL() + '/DAQ_EquipRunningSlice/GetHEquipStatusReportList_DAQ',
                type: "GET",
                async: false,
                data: { "HDeptID": HDeptID, "HEquipID": HEquipID, HBeginDate: HBeginDate, HEndDate: HEndDate, "user": sessionStorage["HUserName"] },
                dataType: "json",//数据类型可以为 text xml json  script  jsonp
                success: function (res) {
                    data = res.data
                    debugger
                    if (data.length < 1) {
                        return
                    }
                    var $container = $("#chartContainer");
                    $container.empty();
                    for (var i = 0; i < data.length; i++) {
                        var hmainid = data[i].hmainid;
                        var equipName = data[i].设备名称;
                        var dateStr = data[i].所属日期.split('T')[0];
                        // æ—¶é—´å­—段
                        var runTime = data[i].运行时间;         // è¿è¡Œ
                        var stopTime = data[i].机时间;         // åœæœº
                        var alarmTime = data[i].告警时间;      // å‘Šè­¦
                        var offTime = data[i].关机时间;        // å…³æœº
                        var total = runTime + stopTime + alarmTime + offTime;
                        // ==============================================
                        // 1. åˆ›å»ºæ¯ä¸ªè®¾å¤‡çš„图表外壳(左右布局:饼图 + æ—¶åºå›¾ï¼‰
                        // ==============================================
                        var itemHtml = `
            <div style="width:100%; height:420px; display:flex; gap:20px; margin-bottom:30px; border:1px solid #eee; padding:15px; border-radius:8px;">
                <div id="chart_pie_${hmainid}" style="width:38%; height:100%;"></div>
                <div id="chart_time_${hmainid}" style="width:62%; height:100%;"></div>
            </div>`;
                        $container.append(itemHtml);
                        // ==============================================
                        // 2. å·¦ä¾§çŽ¯å½¢é¥¼å›¾ï¼ˆè¿è¡Œ/停机/告警/关机 å æ¯”)
                        // ==============================================
                        var pieChart = echarts.init(document.getElementById(`chart_pie_${hmainid}`));
                        pieChart.setOption({
                            title: { text: `${dateStr} ${equipName}`, left: 'center', textStyle: { fontSize: 16 } },
                            tooltip: { trigger: 'item', formatter: '{b}: {c}H ({d}%)' },
                            legend: { orient: 'vertical', right: '2%', top: 'middle', textStyle: { fontSize: 13 } },
                            series: [{
                                type: 'pie',
                                radius: ['42%', '70%'],
                                center: ['45%', '55%'],
                                itemStyle: { borderRadius: 4, borderColor: '#fff', borderWidth: 2 },
                                label: { show: false },
                                data: [
                                    { value: runTime, name: '运行', itemStyle: { color: '#4CAF50' } },
                                    { value: stopTime, name: '停机', itemStyle: { color: '#FF9800' } },
                                    { value: alarmTime, name: '告警', itemStyle: { color: '#F44336' } },
                                    { value: offTime, name: '关机', itemStyle: { color: '#9E9E9E' } }
                                ]
                            }]
                        });
                        // ==============================================
                        // 3. å³ä¾§ 24小时 è®¾å¤‡è¿è¡Œæ—¶åºå›¾ï¼ˆå’Œæ•ˆæžœå›¾å®Œå…¨ä¸€è‡´ï¼‰
                        // ==============================================
                        var timeChart = echarts.init(document.getElementById(`chart_time_${hmainid}`));
                        timeChart.setOption({
                            title: {
                                text: `运行:${runTime.toFixed(1)}H | åœæœº:${stopTime.toFixed(1)}H | å‘Šè­¦:${alarmTime.toFixed(1)}H | å…³æœº:${offTime.toFixed(1)}H`,
                                left: 'center',
                                textStyle: { fontSize: 14 }
                            },
                            grid: { left: '3%', right: '3%', top: '20%', bottom: '10%', containLabel: true },
                            xAxis: {
                                type: 'category',
                                data: ['00:00', '04:00', '08:00', '12:00', '16:00', '20:00', '24:00']
                            },
                            yAxis: { type: 'value', max: 1, show: false },
                            series: [
                                { type: 'bar', stack: 'total', barWidth: '80%', itemStyle: { color: '#9E9E9E' }, data: [offTime / 24, 0, 0, 0, 0, 0, 0] },
                                { type: 'bar', stack: 'total', barWidth: '80%', itemStyle: { color: '#FF9800' }, data: [stopTime / 24, 0, 0, 0, 0, 0, 0] },
                                { type: 'bar', stack: 'total', barWidth: '80%', itemStyle: { color: '#F44336' }, data: [alarmTime / 24, 0, 0, 0, 0, 0, 0] },
                                { type: 'bar', stack: 'total', barWidth: '80%', itemStyle: { color: '#4CAF50' }, data: [runTime / 24, 0, 0, 0, 0, 0, 0] }
                            ]
                        });
                    }
                    pieData = data
                }
            })
            $.ajax({
                url: GetWEBURL() + '/DAQ_EquipRunningSlice/GetHEquipStatusReportList2_DAQ',
                type: "GET",
                async: false,
                data: { "HDeptID": HDeptID, "HEquipID": HEquipID, HBeginDate: HBeginDate, HEndDate: HEndDate, "user": sessionStorage["HUserName"] },
                dataType: "json",//数据类型可以为 text xml json  script  jsonp
                success: function (res) {
                    data = res.data
                    if (data.length < 1) {
                        return
                    }
                    console.log(timelineData)
                    timelineData = data
                }
            })
            drawCharts()
            //wktag = 0;
            //$("#btomleft").html("");
            //$.ajax({
            //    url: GetWEBURL() + '/Sc_HEquipStateDistribution/Sc_HEquipStateDistribution_Souce',
            //    type: "GET",
            //    data: { "HDeptID": HDeptID, "user": sessionStorage["HUserName"], "OrganizationID": sessionStorage["OrganizationID"] },
            //    dataType: "json",//数据类型可以为 text xml json  script  jsonp
            //    success: function (data) {
            //
            //        var LoadData1 = data.data.h_p_sc_HDeptSouceMOList;
            //        if (LoadData1.length > 0)  //工单列表数据
            //        {
            //
            //            for (var i = 0; i < LoadData1.length; i++) {
            //                var html1 = '';
            //                html1 += '<div class="layui-col-sm12 layui-col-md2" style="margin: 6px;width: 180px;">';
            //                html1 += '<div class="cns" id="bs' + (i + 1) + '" onclick="CheckBtom(this,' + (i + 1) + ')">';
            //                html1 += '<dl>';
            //                html1 += '<dd class="tcenter">';
            //                html1 += '<h1 style="display:none;"><span>生产订单号主ID:</span><span id="df' + (i + 1) + '">' + LoadData1[i].生产订单主内码 + '</span></h1>';
            //                html1 += '<h1 style="display:none;"><span>生产订单子ID:</span><span id="ds' + (i + 1) + '">' + LoadData1[i].生产订单子内码 + '</span></h1>';
            //                html1 += '<h1 style="display:none;"><span>产线ID:</span><span id="cs' + (i + 1) + '">' + LoadData1[i].HSourceID + '</span></h1>';
            //                html1 += '<h1 style="display:none;"><span>设备ID:</span><span id="sb' + (i + 1) + '">' + LoadData1[i].设备id + '</span></h1>';
            //
            //                html1 += '<p><span>设备编码:</span><span id="sbbm' + (i + 1) + '">' + LoadData1[i].设备编码 + '</span></p>';
            //                html1 += '<p><span>设备名称:</span><span id="sbmc' + (i + 1) + '">' + LoadData1[i].设备名称 + '</span></p>';
            //                html1 += '<p><span>产线:</span><span id="cxmc' + (i + 1) + '">' + LoadData1[i].产线 + '</span></p>';
            //                html1 += '<p><span>当前订单:</span><span id="gd' + (i + 1) + '">' + LoadData1[i].生产订单 + '</span></p>';
            //                html1 += '<p><span>订单数量:</span><span id="ddqty' + (i + 1) + '">' + LoadData1[i].任务单数量 + '</span></p>';
            //                html1 += '<p><span>完成数量:</span><span id="wcqty' + (i + 1) + '">' + LoadData1[i].流转卡数量 + '</span></p>';
            //                switch (LoadData1[i].设备状态) {
            //                    case "空闲":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border6"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    case "开机":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border4"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    case "停机":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border3"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    case "生产":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border2"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    case "维修中":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border5"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    case "故障":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border1"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    case "维修完成":
            //                        html1 += '<p><span>当前状态:</span><span class="gj_icon color_border7"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
            //                        break;
            //                    default:
            //                }
            //                html1 += '</dd>';
            //                html1 += '</dl>';
            //                html1 += '</div>';
            //                html1 += '</div>';
            //                $("#btomleft").append(html1);
            //            }
            //        }
            //    },
            //    error: function (err) {
            //        layer.alert(err.Message, { time: 1 * 2000, icon: 5 });
            //        return false;
            //    }
            //});
        }
        //#region ç»˜åˆ¶å›¾è¡¨
        function drawCharts() {
            var $container = $("#chartContainer");
            $container.empty();
            var data = pieData
            console.log(pieChart)
            var data1 = timelineData
            for (var i = 0; i < data.length; i++) {
                var hmainid = data[i].hmainid;
                var equipName = data[i].设备名称;
                var dateStr = data[i].所属日期.split('T')[0];
                // æ—¶é—´å­—段
                var runTime = data[i].运行时间 || 0;         // è¿è¡Œ
                var stopTime = data[i].停机时间 || 0;         // åœæœº
                var alarmTime = data[i].告警时间 || 0;      // å‘Šè­¦
                var offTime = data[i].关机时间 || 0;        // å…³æœº
                var total = runTime + stopTime + alarmTime + offTime;
                // ==============================================
                // 1. åˆ›å»ºæ¯ä¸ªè®¾å¤‡çš„图表外壳(左右布局:饼图 + æ—¶åºå›¾ï¼‰
                // ==============================================
                var itemHtml = `
            <div style="width:100%; height:200px; margin-bottom:20px; border:1px solid #eee; padding:15px; border-radius:8px;">
                <div style="display: inline-block; height:20%; display:flex; gap:20px;">
                    <div style="width:40%;">${dateStr} ${equipName}</div>
                    <div style="width:60%; display: flex; justify-content: right; align-items: center; gap: 8px;">
                        <div style="width: 18px; height: 18px; background-color: #73cc3f; display: inline-block"></div>
                        <div style="padding-left: 4px ;display: inline-block">运行(${runTime}H)</div>
                        <div style="width: 18px; height: 18px; background-color: #f2a439; display: inline-block"></div>
                        <div style="padding-left: 4px ;display: inline-block">停机(${stopTime}H)</div>
                        <div style="width: 18px; height: 18px; background-color: #ff796a; display: inline-block"></div>
                        <div style="padding-left: 4px ;display: inline-block">告警(${alarmTime}H)</div>
                        <div style="width: 18px; height: 18px; background-color: #9b9a9b; display: inline-block"></div>
                        <div style="padding-left: 4px ;display: inline-block">关机(${offTime}H)</div>
                    </div>
                </div>
                <div style="display: inline-block; height:80%; display:flex; gap:20px;">
                    <div id="chart_pie_${hmainid}_${i}" style="width:25%; height:100%;"></div>
                    <div id="chart_time_${hmainid}_${i}" style="width:70%; height:100%;"></div>
                </div>
            </div>`;
                $container.append(itemHtml);
                // ==============================================
                // 2. å·¦ä¾§çŽ¯å½¢é¥¼å›¾ï¼ˆè¿è¡Œ/停机/告警/关机 å æ¯”)
                // ==============================================
                var pieChart = echarts.init(document.getElementById(`chart_pie_${hmainid}_${i}`));
                pieChart.setOption({
                    // title: { text: `${dateStr} ${equipName}`, left: 'center', textStyle: { fontSize: 16 } },
                    tooltip: {
                        trigger: 'item', formatter: '{b}: {c}H ({d}%)', textStyle: {
                            lineHeight: 22  // æ–‡å­—间距更大
                        },
                    },
                    legend: {
                        orient: 'vertical', right: '2%', top: 'middle', textStyle: { fontSize: 13 }
                        , formatter: function (name, value) {
                            var getRate = function () {
                                if (name == '运行') {
                                    return (runTime / total * 100.0).toFixed(2)
                                }
                                if (name == '停机') {
                                    return (stopTime / total * 100.0).toFixed(2)
                                }
                                if (name == '告警') {
                                    return (alarmTime / total * 100.0).toFixed(2)
                                }
                                if (name == '关机') {
                                    return (offTime / total * 100.0).toFixed(2)
                                }
                            }()
                            return name + '率(' + getRate
                                + '%)'
                        }
                    },
                    series: [{
                        type: 'pie',
                        radius: ['42%', '70%'],
                        center: ['25%', '50%'],
                        itemStyle: { borderRadius: 4, borderColor: '#fff', borderWidth: 2 },
                        label: { show: false },
                        data: [
                            { value: runTime, name: '运行', itemStyle: { color: '#73cc3f' } },
                            { value: stopTime, name: '停机', itemStyle: { color: '#f2a439' } },
                            { value: alarmTime, name: '告警', itemStyle: { color: '#ff796a' } },
                            { value: offTime, name: '关机', itemStyle: { color: '#9b9a9b' } }
                        ]
                    }]
                });
                // ==============================================
                // 3. å³ä¾§ 24小时 è®¾å¤‡è¿è¡Œæ—¶åºå›¾
                // ==============================================
                // data的时间和设备id以‘_’进行拼接可得出data1对象的key,简化操作
                var key = dateStr + "_" + hmainid
                var timeChart = echarts.init(document.getElementById(`chart_time_${hmainid}_${i}`));
                // ä½ çš„原始数据
                var data1Instance = data1[key]
                if(!data1Instance){
                    continue
                }
                var startTime = dayjs(dateStr + " 00:00:00").valueOf();
                var endTime = dayjs(dateStr + " 23:59:59").valueOf();
                var categories = [data1Instance[0]["生产资源"]];
                var types = [
                    { name: '正常运行', color: '#73cc3f' },
                    { name: '离线', color: '#9b9a9b' },
                    { name: '待机', color: '#f2a439' },
                ];
                var getColor = function (name) {
                    for (var i = 0; i < types.length; i++) {
                        if (name == types[i].name) {
                            return types[i].color
                        }
                    }
                }
                chartDataTimeline = []
                for (var cursor = 0; cursor < data1Instance.length; cursor++) {
                    chartDataTimeline.push({
                        "name": data1Instance[cursor]["HResult"],
                        "value": [
                            0,
                            dayjs(data1Instance[cursor]["时间"]).valueOf(),
                            dayjs(data1Instance[cursor]["时间"]).add(5, 'm').valueOf(),
                            300000
                        ],
                        "itemStyle": {
                            "normal": {
                                "color": getColor(data1Instance[cursor]["HResult"])
                            }
                        }
                    })
                }
                timeChart.setOption({
                    tooltip: {
                        formatter: function (params) {
                            return params.marker + params.name;
                        }
                    },
                    grid: {
                        top: 0,
                        bottom: 0,
                        left: 20,  // ç»™Y轴文字留一点位置
                        right: 20,
                        containLabel: true
                    },
                    xAxis: {
                        type: 'time',
                        min: startTime,  //  å¼€å§‹æ—¶é—´æˆ³
                        max: endTime,  //  ç»“束时间戳
                        minInterval: 7200000, // é—´éš”两小时
                        scale: true,
                        axisLabel: {
                            formatter: function (val) {
                                return echarts.format.formatTime('hh:mm', val);
                            }
                        },
                        axisLine: {
                            show: false   //  éšè— x è½´è½´çº¿
                        }
                    },
                    yAxis: {
                        data: categories,
                        axisLine: {
                            show: false   //  éšè— y è½´è½´çº¿
                        },
                        name: "",
                        axisLabel: { show: false }, //  éšè—Y轴标签
                    },
                    series: [
                        {
                            type: 'custom',
                            renderItem: renderItem,
                            itemStyle: {
                                opacity: 0.8
                            },
                            encode: {
                                x: [1, 2],
                                y: 0
                            },
                            data: chartDataTimeline
                        }
                    ]
                })
            }
        }
        //#endregion
        // æ ‘状图查询
        function get_Display_Tree() {
@@ -451,9 +737,747 @@
                subStr += '{"title": "' + subMenu.id + "-" + subMenu.title + '", "id": "' + subMenu.id + '","HPID": "' + parentID + '"},';
            }
            return subStr;
        }
        }
        $('#modeBtnGroup').on('click', 'button', function (e) {
            console.log("点击成功!event =", e);  // event äº‹ä»¶æ‹¿åˆ°
            var $btn = $(this);
            var $btnGroup = $btn.closest('div');
            $btnGroup.find('button').addClass("layui-btn-primary").addClass("layui-border")
            $btn.removeClass("layui-btn-primary").removeClass("layui-border")
            var mode = $btn.data('mode');  // day / history
            //通过mode判断执行哪个查询,如果是day,则查询的时候,开始日期和结束日期都是当天(与日期范围无关),如果是history,则按照日期范围和历史数据进行筛选
        });
    });
    //#endregion
    //工单列表选中
    function CheckBtom(obj, i) {
        workcode = $("#gd" + i + "").html(); //通过样式ID获取html内容(工单号)
        HICMOInterID = $("#df" + i + "").html();     //生产订单主内码
        HICMOEntryID = $("#ds" + i + "").html();     //生产订单子内码
        HEquipID = $("#sb" + i + "").html();     //设备id
        HEquipNumber = $("#sbbm" + i + "").html();     //设备编码
        HEquipName = $("#sbmc" + i + "").html();     //设备名称
        HSourceID = $("#cs" + i + "").html();     //产线id
        $('.cns').removeClass('check1');  //删除不同父级clss样式相同的所有元素
        $("#bs" + i + "").addClass('check1'); // æ·»åŠ å½“å‰å…ƒç´ çš„æ ·å¼
        if (HEquipID != "" && HEquipID != null) {
            wktag = 1;
        }
        sWhere = {
            HDeptID: HDeptID
            , HSourceID: HSourceID
        }
        /* ç‚¹å‡» è®¾å¤‡ å¼€å¯è®¾å¤‡è¯¦æƒ…弹窗,设备状态详情页面
        *详情页面:日期过滤、设备运行分析、警报(可以先取值为最近的安灯管理)取值用 è®¾å¤‡è¿è¡ŒçŠ¶æ€è¡¨ Sb_EquipRunningStatus(设备当前状态效率分析)
        */
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '设备详情',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: './DAQ_EvidenceEquipmentCockpitDetail.html?HEquipID=' + HEquipID,
            end: function () {
            },
            success: function (dom, index) {
            },
        });
        // FourReport(JSON.stringify(sWhere));
    }
    //查询 éƒ¨é—¨+产线 4个图表 èµ‹å€¼
    function FourReport(sWhere) {
        $.ajax({
            url: GetWEBURL() + '/Sc_HEquipStateDistribution/Get_EquipStateDistribution_FourReport',
            type: "GET",
            data: { "sWhere": sWhere, "user": sessionStorage["HUserName"], "OrganizationID": sessionStorage["OrganizationID"] },
            dataType: "json",//数据类型可以为 text xml json  script  jsonp
            success: function (data) {
                var chartData = data.data.h_p_Sc_FourStateDistributionReport;
                var chartData1 = data.data.h_p_Sc_FourStateDistributionReport1;
                var chartData2 = data.data.h_p_Sc_FourStateDistributionReport2;
                var chartData3 = data.data.h_p_Sc_FourStateDistributionReport3;
                var mychart11 = echarts.init(document.getElementById('mychart11'));
                var mychart22 = echarts.init(document.getElementById('mychart22'));
                var mychart3 = echarts.init(document.getElementById('mychart3'));
                var mychart4 = echarts.init(document.getElementById('mychart4'));
                get_Histogram1(mychart11, chartData);
                get_LineChart(mychart22, chartData1);
                get_Statistics(mychart3, chartData2);
                get_Histogram4(mychart4, chartData3);
            },
            error: function (err) {
                layer.alert(err.Message, { time: 1 * 2000, icon: 5 });
                return false;
            }
        });
    }
    //柱状图
    function get_Histogram1(mychart11, chartData) {
        // é»˜è®¤çš„option结构
        var option = {
            title: {
                text: '近七天产能', // é»˜è®¤æ ‡é¢˜ä¸ºç©º
                left: 'center',
                top: '10%', // è°ƒæ•´æ ‡é¢˜ä½ç½®ï¼Œæ”¾åˆ°æœ€ä¸Šé¢
                textStyle: {
                    fontSize: 18,
                    color: '#ff0000'
                }
            },
            grid: {
                top: '25%', // è°ƒæ•´grid的top值,给标题留出空间
                bottom: '20%',
                left: '10%',
                right: '10%'
            },
            xAxis: {
                type: 'category',
                data: [] // é»˜è®¤x轴数据为空
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    data: [], // é»˜è®¤series数据为空
                    type: 'bar'
                }
            ]
        };
        // å¦‚果有数据,更新option的内容
        if (chartData && chartData.length > 0) {
            option.title.text = '近七天产能'; // æ­£å¸¸æ•°æ®æ—¶æ²¡æœ‰æ ‡é¢˜
            option.xAxis.data = chartData.map(item => item.日期); // è®¾ç½®x轴数据
            option.series[0].data = chartData.map(item => item['生产总数']); // è®¾ç½®y轴数据
            option.series[0].label = {
                normal: {
                    show: true,
                    position: 'top',
                    formatter: function (params) {
                        return echarts.format.addCommas(params.value);
                    }
                }
            };
            option.series[0].itemStyle = {
                normal: {
                    color: '#15b1fa',
                    label: {
                        show: true // åœ¨æŸ±çŠ¶å›¾ä¸Šæ˜¾ç¤ºæ•°æ®
                    }
                }
            };
        } else {
            // æ²¡æœ‰æ•°æ®æ—¶ï¼Œæ˜¾ç¤º"暂无数据"提示
            option.title.text = '暂无数据';
        }
        // æ›´æ–°å›¾è¡¨
        mychart11.setOption(option);
    }
    //柱状图2
    function get_LineChart(mychart22, chartData1) {
        // é»˜è®¤çš„option结构
        var option = {
            title: {
                text: 'ç»´ä¿®', // é»˜è®¤æ ‡é¢˜ä¸ºç©º
                left: 'center',
                top: '10%', // è°ƒæ•´æ ‡é¢˜ä½ç½®ï¼Œæ”¾åˆ°æœ€ä¸Šé¢
                textStyle: {
                    fontSize: 18,
                    color: '#ff0000'
                }
            },
            axisLabel: {
                show: true,
                interval: 0,
                color: '#15b1fa',
                formatter: function (value) {
                    var ret = "";//拼接加\n返回的类目项
                    var maxLength = 1;//每项显示文字个数
                    var valLength = value.length;//X轴类目项的文字个数
                    var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
                    if (rowN > 1)//如果类目项的文字大于3,
                    {
                        for (var i = 0; i < rowN; i++) {
                            var temp = "";//每次截取的字符串
                            var start = i * maxLength;//开始截取的位置
                            var end = start + maxLength;//结束截取的位置
                            //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
                            temp = value.substring(start, end) + "\n";
                            ret += temp; //凭借最终的字符串
                        }
                        return ret;
                    }
                    else {
                        return value;
                    }
                }
            },
            grid: {
                top: '25%', // è°ƒæ•´grid的top值,给标题留出空间
                bottom: '20%',
                left: '10%',
                right: '10%'
            },
            xAxis: {
                type: 'category',
                data: [] // é»˜è®¤x轴数据为空
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    data: [], // é»˜è®¤series数据为空
                    type: 'bar'
                }
            ]
        };
        // å¦‚果有数据,更新option的内容
        if (chartData1 && chartData1.length > 0) {
            option.title.text = '不良原因'; // æ­£å¸¸æ•°æ®æ—¶æ²¡æœ‰æ ‡é¢˜
            option.xAxis.data = chartData1.map(item => item.不良原因); // è®¾ç½®x轴数据
            option.series[0].data = chartData1.map(item => item['数量']); // è®¾ç½®y轴数据
            option.series[0].label = {
                normal: {
                    show: true,
                    position: 'top',
                    formatter: function (params) {
                        return echarts.format.addCommas(params.value);
                    }
                }
            };
            option.series[0].itemStyle = {
                normal: {
                    color: '#15b1fa',
                    label: {
                        show: true // åœ¨æŸ±çŠ¶å›¾ä¸Šæ˜¾ç¤ºæ•°æ®
                    }
                }
            };
        } else {
            // æ²¡æœ‰æ•°æ®æ—¶ï¼Œæ˜¾ç¤º"暂无数据"提示
            option.title.text = '暂无数据';
        }
        // æ›´æ–°å›¾è¡¨
        mychart22.setOption(option);
    }
    //饼图
    function get_Statistics(mychart3, chartData2) {
        // å¦‚æžœ chartData2 ä¸ºç©ºï¼Œæä¾›ä¸€ä¸ªâ€œæ— æ•°æ®â€æç¤º
        if (chartData2.length === 0) {
            mychart3.setOption({
                title: {
                    text: '暂无数据',
                    left: 'center',
                    top: '10%',
                    textStyle: {
                        color: 'red', // è®¾ç½®æ ‡é¢˜é¢œè‰²ä¸ºçº¢è‰²
                        fontSize: 18,
                        fontWeight: 'bold'
                    }
                },
                series: [],  // æ¸…空数据
                graphic: []  // æ¸…空图形中的文本
            });
            return;
        }
        // çŠ¶æ€é¢œè‰²æ˜ å°„
        const statusColorMap = {
            '开机': '#28a745',    // ç»¿è‰²
            '故障': '#ff63a5',    // æ¡ƒçº¢è‰²
            '停机': '#f0ad4e',    // é»„色
            '未知': '#6c757d'     // ç°è‰²
        };
        // è®¡ç®—开机率
        const totalDevices = chartData2.reduce((sum, item) => sum + item.数量, 0);
        const onlineDevices = chartData2.find(item => item.状态 === '开机')?.数量 || 0;
        const onlineRate = totalDevices === 0 ? 0 : (onlineDevices / totalDevices * 100).toFixed(2);
        // åŠ¨æ€ç”Ÿæˆé¥¼å›¾æ•°æ®ï¼Œå¹¶æ ¹æ®çŠ¶æ€è®¾ç½®é¢œè‰²
        var data = chartData2.map(function (item) {
            // èŽ·å–å½“å‰çŠ¶æ€çš„é¢œè‰²ï¼Œé»˜è®¤ä¸ºç°è‰²
            var color = statusColorMap[item.状态] || statusColorMap['未知'];
            return {
                value: item.数量,
                name: item.状态,
                itemStyle: {
                    color: color  // ä¸ºæ¯ä¸ªçŠ¶æ€è®¾ç½®å¯¹åº”çš„é¢œè‰²
                }
            };
        });
        // å›¾è¡¨çš„配置项
        var option = {
            title: {
                text: '设备状态分析对比',
                left: 'center',
                top: '10%',  // å°†æ ‡é¢˜æ”¾ç½®åˆ°é¡¶éƒ¨
                textStyle: {
                    color: 'red',  // è®¾ç½®æ ‡é¢˜å­—体颜色为红色
                    fontSize: 18,
                    fontWeight: 'bold'
                }
            },
            tooltip: {
                trigger: 'item'
            },
            legend: {
                orient: 'vertical',
                left: 'left'
            },
            series: [
                {
                    name: '设备状态',
                    type: 'pie',
                    radius: '50%',
                    data: data,  // ä½¿ç”¨åŠ¨æ€ç”Ÿæˆçš„æ•°æ®
                    emphasis: {
                        itemStyle: {
                            shadowBlur: 10,
                            shadowOffsetX: 0,
                            shadowColor: 'rgba(0, 0, 0, 0.5)'
                        }
                    }
                }
            ],
            graphic: [{
                type: 'text',
                left: 'center',
                top: '85%',  // è°ƒæ•´æ–‡æœ¬ä½ç½®ï¼Œè®©å…¶ç¨å¾®æ›´å¾€ä¸‹
                style: {
                    text: `开机率: ${onlineRate}%`,  // æ˜¾ç¤ºå¼€æœºçއ
                    font: '16px Arial',
                    fill: '#00aaff'  // ä½¿ç”¨æµ…蓝色显示开机率
                }
            }]
        };
        // è®¾ç½®å›¾è¡¨çš„配置项
        mychart3.setOption(option);
    }
    //柱状图4
    function get_Histogram4(mychart4, chartData3) {
        // é»˜è®¤çš„option结构
        var option = {
            title: {
                text: 'ç»´ä¿®', // é»˜è®¤æ ‡é¢˜ä¸ºç©º
                left: 'center',
                top: '10%', // è°ƒæ•´æ ‡é¢˜ä½ç½®ï¼Œæ”¾åˆ°æœ€ä¸Šé¢
                textStyle: {
                    fontSize: 18,
                    color: '#ff0000'
                }
            },
            axisLabel: {
                show: true,
                interval: 0,
                color: '#15b1fa',
                formatter: function (value) {
                    var ret = "";//拼接加\n返回的类目项
                    var maxLength = 1;//每项显示文字个数
                    var valLength = value.length;//X轴类目项的文字个数
                    var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
                    if (rowN > 1)//如果类目项的文字大于3,
                    {
                        for (var i = 0; i < rowN; i++) {
                            var temp = "";//每次截取的字符串
                            var start = i * maxLength;//开始截取的位置
                            var end = start + maxLength;//结束截取的位置
                            //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
                            temp = value.substring(start, end) + "\n";
                            ret += temp; //凭借最终的字符串
                        }
                        return ret;
                    }
                    else {
                        return value;
                    }
                }
            },
            grid: {
                top: '25%', // è°ƒæ•´grid的top值,给标题留出空间
                bottom: '20%',
                left: '10%',
                right: '10%'
            },
            xAxis: {
                type: 'category',
                data: [] // é»˜è®¤x轴数据为空
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    data: [], // é»˜è®¤series数据为空
                    type: 'bar'
                }
            ]
        };
        // å¦‚果有数据,更新option的内容
        if (chartData3 && chartData3.length > 0) {
            option.title.text = 'ç»´ä¿®'; // æ­£å¸¸æ•°æ®æ—¶æ²¡æœ‰æ ‡é¢˜
            option.xAxis.data = chartData3.map(item => item.维修项目); // è®¾ç½®x轴数据
            option.series[0].data = chartData3.map(item => item['维修次数']); // è®¾ç½®y轴数据
            option.series[0].label = {
                normal: {
                    show: true,
                    position: 'top',
                    formatter: function (params) {
                        return echarts.format.addCommas(params.value);
                    }
                }
            };
            option.series[0].itemStyle = {
                normal: {
                    color: '#15b1fa',
                    label: {
                        show: true // åœ¨æŸ±çŠ¶å›¾ä¸Šæ˜¾ç¤ºæ•°æ®
                    }
                }
            };
        } else {
            // æ²¡æœ‰æ•°æ®æ—¶ï¼Œæ˜¾ç¤º"暂无数据"提示
            option.title.text = '暂无数据';
        }
        // æ›´æ–°å›¾è¡¨
        mychart4.setOption(option);
    }
    //#region   æ“ä½œå°æŒ‰é’®ç‚¹å‡»äº‹ä»¶
    //开机按钮点击事件
    function PowerOn(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '新增开机单',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/设备开机单/Sb_EquipBeginBill.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //停机按钮点击事件
    function PowerOff(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '新增停机单',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/设备停机单/Sb_EquipStopBill.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //点检记录按钮点击事件
    function DotCheck(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '查看设备月点检记录',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../车间管理/启动点检单/Sc_WorkDotCheckBillList_Day.html?OperationType=设备&linterid=' + HEquipID + '',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID,
                    "HEquipType": "设备"
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //故障登记按钮点击事件
    function FaultRegistration(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '新增故障登记单',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/Sb_Add_EqpConkBookBillList.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //维修记录按钮点击事件
    function Maintenance(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '新增维修记录单',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/Sb_Add_EqpMaintenanceBillList.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //履历按钮点击事件
    function Resume(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '查看设备履历',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/设备报表/Sb_EquipResumeCheckQuery.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID,
                    "HEquipNumber": HEquipNumber,
                    "HEquipName": HEquipName
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //工艺按钮点击事件
    function Process(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '查看设备工艺参数',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../生产管理/订单状态分布/Sc_EquipmentProcessList.html?OperationType=4&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID,
                    "HICMOInterID": HICMOInterID,
                    "HICMOEntryID": HICMOEntryID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //状态按钮点击事件
    function HStatus(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '查看设备OEE',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../生产管理/订单状态分布/Sc_OEEStatusReport.html?OperationType=4&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipNumber": HEquipNumber
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    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()
            }
        );
    }
    //#endregion
</script>
</html>
WebTM/views/Êý²É¹ÜÀí/DAQ_EvidenceEquipmentCockpitDetail.html
@@ -16,6 +16,7 @@
    <script src="../../layuiadmin/soulTable.slim.js"></script>
    <script src="../../layuiadmin/PageTitle.js"></script>
    <script src="../../layuiadmin/echarts.min.js"></script>
    <script src="../../layuiadmin/dayjs.min.js"></script>
    <script src="../../layuiadmin/Scripts/webConfig.js"></script>
    <style type="text/css">
@@ -299,106 +300,95 @@
            function get_LineChart(mychart22, chartData1) {
                var baseTime = $("HBeginDate").val()
                var endTime = $("HEndDate").val()
                var startTime = dayjs(baseTime).valueOf();
                var endTime = dayjs(endTime).valueOf();
                var yAxisData = [$("#HDeptName").val()]
                var seriesData = chartData1.map(item => [
                    item.StartTime,
                    item.EndTime,
                    item.EquipName,
                    item.Status
                ]);
                // é»˜è®¤çš„option结构
                chartsOption = {
                    // æ ‡é¢˜
                    title: {
                        text: '设备运行时序',
                        left: 'left',
                        show: false
                    },
                    // å›¾ä¾‹ï¼ˆå³ä¸Šè§’的状态标识)
                    legend: {
                        data: ['运行', '开机', '停机', '告警', '关机'],
                        right: 10,
                        top: 5,
                        show: true
                    },
                    // æç¤ºæ¡†ï¼ˆé¼ æ ‡æ‚¬æµ®æ—¶æ˜¾ç¤ºï¼‰
                if (chartData1.length == 0) {
                    return
                }
                var categories = [chartData1[0]["生产资源"]];
                var types = [
                    { name: '正常运行', color: '#73cc3f' },
                    { name: '离线', color: '#9b9a9b' },
                    { name: '待机', color: '#f2a439' },
                ];
                var getColor = function (name) {
                    for (var i = 0; i < types.length; i++) {
                        if (name == types[i].name) {
                            return types[i].color
                        }
                    }
                }
                var chartDataTimeline = []
                for (var cursor = 0; cursor < chartData1.length; cursor++) {
                    chartDataTimeline.push({
                        "name": chartData1[cursor]["HResult"],
                        "value": [
                            0,
                            dayjs(chartData1[cursor]["时间"]).valueOf(),
                            dayjs(chartData1[cursor]["时间"]).add(5, 'm').valueOf(),
                            300000
                        ],
                        "itemStyle": {
                            "normal": {
                                "color": getColor(chartData1[cursor]["HResult"])
                            }
                        }
                    })
                }
                var chartsOption = {
                    tooltip: {
                        trigger: 'axis',
                        formatter: function (params) {
                            // params æ˜¯ä¸€ä¸ªæ•°ç»„,这里只有一条数据
                            const data = params[0];
                            const start = new Date(data.value[0]);
                            const end = new Date(data.value[1]);
                            // æ ¼å¼åŒ–时间显示
                            return `${data.name}<br/>${start.toLocaleTimeString()} ~ ${end.toLocaleTimeString()}`;
                            return params.marker + params.name;
                        }
                    },
                    // ç½‘格(调整图表内边距,给Y轴和X轴标签留出空间)
                    grid: {
                        left: '3%',
                        right: '4%',
                        bottom: '3%',
                        top: 0,
                        bottom: 0,
                        left: 20,  // ç»™Y轴文字留一点位置
                        right: 20,
                        containLabel: true
                    },
                    // X轴配置:时间轴
                    xAxis: {
                        type: 'time', // å…³é”®ï¼šæ—¶é—´ç±»åž‹è½´
                        min: baseTime, // å›ºå®šæœ€å°æ—¶é—´ï¼š14:00
                        max: endTime,  // å›ºå®šæœ€å¤§æ—¶é—´ï¼šæ¬¡æ—¥12:00
                        type: 'time',
                        min: startTime,  //  å¼€å§‹æ—¶é—´æˆ³
                        max: endTime,  //  ç»“束时间戳
                        minInterval: 7200000, // é—´éš”两小时
                        scale: true,
                        axisLabel: {
                            // æ ¼å¼åŒ–X轴标签显示为 14:00, 16:00 æ ¼å¼
                            formatter: function (value) {
                                const date = new Date(value);
                                return `${date.getHours()}:${String(date.getMinutes()).padStart(2, '0')}`;
                            },
                            interval: 2 * 3600 * 1000 // æ¯2小时显示一个刻度(对应14, 16, 18...)
                            formatter: function (val) {
                                return echarts.format.formatTime('hh:mm', val);
                            }
                        },
                        axisLine: { show: true },
                        splitLine: { show: true }
                        axisLine: {
                            show: false   //  éšè— x è½´è½´çº¿
                        }
                    },
                    // Y轴配置:类目轴
                    yAxis: {
                        type: 'category',
                        data: yAxisData,
                        axisLine: { show: false },
                        axisTick: { show: false } // éšè—Y轴刻度线
                        data: categories,
                        axisLine: {
                            show: false   //  éšè— y è½´è½´çº¿
                        },
                        name: "",
                        axisLabel: { show: false }, //  éšè—Y轴标签
                    },
                    // ç³»åˆ—数据
                    series: [
                        {
                            name: ['运行', '开机', '停机', '告警', '关机'],
                            type: 'bar', // ä½¿ç”¨æŸ±çŠ¶å›¾å®žçŽ°ç”˜ç‰¹å›¾æ•ˆæžœ
                            barWidth: '80%', // æŸ±å­é«˜åº¦
                            // æ•°æ®æ˜ å°„:将时间戳数据关联到Xè½´
                            encode: {
                                x: [0, 1], // value çš„第0项作为起始,第1项作为结束
                                y: 2       // value çš„第2项作为Y轴类目
                            },
                            // å…·ä½“数据
                            data: seriesData,
                            // çŠ¶æ€é¢œè‰²æ˜ å°„
                            type: 'custom',
                            renderItem: renderItem,
                            itemStyle: {
                                color: function (params) {
                                    // æ ¹æ®æ•°æ®åç§°åŒ¹é…é¢œè‰²
                                    const name = params.data[2];
                                    const colorMap = {
                                        '运行': '#67C23A',
                                        '运行中': '#67C23A',
                                        '开机': '#409EFF',
                                        '停机': '#E6A23C',
                                        '告警': '#F56C6C',
                                        '关机': '#909399',
                                        '维修中': '#F56C6C',
                                        '维护中': '#F56C6C'
                                    };
                                    return colorMap[name] || '#ccc';
                                }
                                opacity: 0.8
                            },
                            // æŸ±å­ä¸Šä¸æ˜¾ç¤ºæ–‡å­—标签
                            label: { show: false }
                            encode: {
                                x: [1, 2],
                                y: 0
                            },
                            data: chartDataTimeline
                        }
                    ]
                };
                }
                // å¦‚果有数据,更新option的内容
@@ -450,16 +440,18 @@
                // èŽ·å–è®¾å¤‡è¿è¡Œæ—¶åºä¿¡æ¯
                $.ajax({
                    url: GetWEBURL() + '/SB_EquipRunningStatus/ReportByID',
                    url: GetWEBURL() + '/DAQ_EquipRunningSlice/GetHEquipStatusReportList2_DAQ',
                    type: "GET",
                    data: { "HEquipID": HEquipID, "sWhere": sWhere2, "user": sessionStorage["HUserName"] },
                    data: { "HEquipID": HEquipID, HDeptID: 0, HBeginDate: util.toDateString(HBeginDate, 'yyyy-MM-dd'), HEndDate: util.toDateString(HEndDate, 'yyyy-MM-dd'), "user": sessionStorage["HUserName"] },
                    dataType: "json",//数据类型可以为 text xml json  script  jsonp
                    success: function (data) {
                        console.log(data)
                        if (data.count == 1) {
                            var dataInstance = []
                            for (var key in data.data) {
                                $.merge(dataInstance, data.data[key])
                            }
                            var EquipRunningStatusCharts = echarts.init(document.getElementById("EquipRunningStatusCharts"))
                            get_LineChart(EquipRunningStatusCharts, data.data);//折线
                            get_LineChart(EquipRunningStatusCharts, dataInstance);//折线
                        } else {
                            layer.alert(data.Message, { time: 1 * 2000, icon: 5 });
                            return false;
@@ -524,6 +516,35 @@
            //#endregion
        })
        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()
            }
        );
    }
    </script>
</body>