From 0450b2569821cef5d0f9827afea8612bf645cbfe Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期二, 16 六月 2026 11:11:03 +0800
Subject: [PATCH] yxh

---
 big.html            |  202 ++++++++++++----
 .vscode/launch.json |    2 
 small.html          |    2 
 big.html.bak        |  472 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 622 insertions(+), 56 deletions(-)

diff --git a/.vscode/launch.json b/.vscode/launch.json
index f37bc99..8114be3 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -8,7 +8,7 @@
             "type": "editor-browser",
             "request": "launch",
             "name": "Open big.html",
-            "url": "file:///d%3A/publish/web/call_jh/integration.html"
+            "url": "file:///d%3A/publish/web/call_jh/big.html"
         }
     ]
 }
\ No newline at end of file
diff --git a/big.html b/big.html
index 48e44da..54c827d 100644
--- a/big.html
+++ b/big.html
@@ -3,7 +3,7 @@
 
 <head>
     <meta charset="UTF-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, target-densitydpi=device-dpi" />
     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
     <title>澶у巺</title>
     <style>
@@ -11,28 +11,36 @@
             margin: 0;
             padding: 0;
             box-sizing: border-box;
-            font-family: "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
+            /* Android 6 鍙敤涓枃瀛椾綋 */;
+            font-family: "Droid Sans Fallback", "Noto Sans CJK SC", "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
         }
 
         /* 1. 鍏ㄥ眬娣辫壊鑳屾櫙 */
         body {
             background: #001f3f;
-            /* 娣辫摑鑹茶儗鏅紝閫傚悎澶у睆 */
             color: #fff;
             height: 100vh;
             overflow: hidden;
+            display: -webkit-box;
+            display: -webkit-flex;
             display: flex;
+            -webkit-box-orient: vertical;
+            -webkit-box-direction: normal;
+            -webkit-flex-direction: column;
             flex-direction: column;
             font-size: 14px;
         }
 
-        /* 2. 椤堕儴鏍� - 绠�鍖栬竟妗嗭紝娣辫壊涓婚 */
+        /* 2. 椤堕儴鏍� */
         .top-header {
+            display: -webkit-box;
+            display: -webkit-flex;
             display: flex;
+            -webkit-box-align: center;
+            -webkit-align-items: center;
             align-items: center;
             padding: 15px 30px;
             background: rgba(0, 30, 60, 0.9);
-            /* 娣辫壊鍗婇�忔槑 */
             white-space: nowrap;
             position: relative;
             border-bottom: 1px solid #003366;
@@ -47,6 +55,7 @@
         .top-header .title-text {
             position: absolute;
             left: 50%;
+            -webkit-transform: translateX(-50%);
             transform: translateX(-50%);
             font-size: 32px;
             font-weight: bold;
@@ -61,37 +70,70 @@
             z-index: 2;
         }
 
-        /* 3. 涓讳綋鍐呭 */
+        /* 3. 涓讳綋鍐呭锛坓ap 鏇挎崲涓� margin 鍏煎鏃� Chrome锛� */
         .main-content {
+            -webkit-box-flex: 1;
+            -webkit-flex: 1;
             flex: 1;
+            display: -webkit-box;
+            display: -webkit-flex;
             display: flex;
             padding: 15px 20px;
             overflow: hidden;
-            gap: 10px;
         }
 
-        /* 鍒楀鍣� - 绉婚櫎闃村奖鍜屽渾瑙掞紝鏇寸畝娲� */
+        .main-content > .column-box {
+            margin-left: 5px;
+            margin-right: 5px;
+        }
+
+        .main-content > .column-box:first-child {
+            margin-left: 0;
+        }
+
+        .main-content > .column-box:last-child {
+            margin-right: 0;
+        }
+
+        /* 鍒楀鍣� */
         .column-box {
+            display: -webkit-box;
+            display: -webkit-flex;
             display: flex;
+            -webkit-box-orient: vertical;
+            -webkit-box-direction: normal;
+            -webkit-flex-direction: column;
             flex-direction: column;
             background: rgba(10, 40, 80, 0.5);
-            /* 娣辫壊鍗婇�忔槑鑳屾櫙 */
             border-radius: 0;
             padding: 10px;
+            -webkit-box-flex: 1;
+            -webkit-flex: 1;
             flex: 1;
             min-width: 0;
             border: 1px solid #003366;
         }
 
         .column-box.col-wide {
+            -webkit-box-flex: 2.5;
+            -webkit-flex: 2.5;
             flex: 2.5;
         }
 
         .column-box.col-normal {
+            -webkit-box-flex: 1;
+            -webkit-flex: 1;
             flex: 1;
         }
 
-        /* 鏍囬鏍峰紡 - 绠�鍖栦笅鍒掔嚎 */
+        /* 鏍囬琛� */
+        .col-title-line {
+            font-size: 22px;
+            font-weight: bold;
+            color: #4da6ff;
+            text-align: center;
+        }
+
         .col-title {
             font-size: 22px;
             font-weight: bold;
@@ -110,41 +152,52 @@
 
         /* 鎮h�呭垪琛� */
         .patient-list {
+            -webkit-box-flex: 1;
+            -webkit-flex: 1;
             flex: 1;
             overflow-y: auto;
             padding-right: 5px;
         }
 
-        /* 銆愬叧閿慨鏀广�戠1鏍忓己鍒朵竴琛�2涓� */
+        /* 绗�1鏍忥細涓�琛屼袱涓� */
         #col-0 {
+            display: -webkit-box;
+            display: -webkit-flex;
             display: flex;
+            -webkit-flex-wrap: wrap;
             flex-wrap: wrap;
+            -webkit-align-content: flex-start;
             align-content: flex-start;
         }
 
-        /* 绗�2-5鏍忎繚鎸佸崟鍒� */
         .col-normal .patient-list {
+            display: -webkit-box;
+            display: -webkit-flex;
             display: flex;
+            -webkit-box-orient: vertical;
+            -webkit-box-direction: normal;
+            -webkit-flex-direction: column;
             flex-direction: column;
         }
 
-        /* 4. 鎮h�呴」鐩� - 鏋佺畝妯″紡 */
+        /* 鎮h�呴」鐩� */
         .patient-item {
             font-size: 22px;
             padding: 8px 5px;
+            display: -webkit-box;
+            display: -webkit-flex;
             display: flex;
+            -webkit-box-align: center;
+            -webkit-align-items: center;
             align-items: center;
             color: #fff;
             line-height: 1.4;
         }
 
-        /* 銆愪紭鍖栦慨鏀广�戠1鏍忥細澧炲姞鍒楅棿璺濓紝鏀瑰杽鎷ユ尋鎰� */
         #col-0 .patient-item {
             width: 45%;
-            /* 1. 缂╁噺瀹藉害锛屼负闂撮殧鐣欏嚭绌洪棿 */
             font-size: 20px;
             margin: 0 2.5%;
-            /* 2. 娣诲姞宸﹀彸澶栬竟璺濓紝涓ゅ垪涔嬮棿鎬婚棿闅斾负5% */
         }
 
         .p-number {
@@ -154,6 +207,8 @@
         }
 
         .p-name {
+            -webkit-box-flex: 1;
+            -webkit-flex: 1;
             flex: 1;
             overflow: hidden;
             text-overflow: ellipsis;
@@ -167,11 +222,16 @@
             margin-left: 5px;
         }
 
-        /* 5. 搴曢儴鏍� - 灞呬腑鏄剧ず */
+        /* 搴曢儴鏍� */
         .bottom-footer {
+            display: -webkit-box;
+            display: -webkit-flex;
             display: flex;
+            -webkit-box-pack: center;
+            -webkit-justify-content: center;
             justify-content: center;
-            /* 灞呬腑 */
+            -webkit-box-align: center;
+            -webkit-align-items: center;
             align-items: center;
             padding: 10px 30px;
             background: rgba(0, 30, 60, 0.9);
@@ -185,17 +245,16 @@
             text-align: center;
         }
 
-        /* 婊氬姩鏉$編鍖� - 缁嗕竴鐐� */
+        /* 婊氬姩鏉� */
         .patient-list::-webkit-scrollbar {
             width: 4px;
         }
-
         .patient-list::-webkit-scrollbar-thumb {
             background: #444;
             border-radius: 2px;
         }
 
-        /* 6. 璋冭瘯妗嗘牱寮� */
+        /* 璋冭瘯闈㈡澘 */
         .debug-panel {
             position: fixed;
             right: 15px;
@@ -212,8 +271,14 @@
         }
 
         .debug-header {
+            display: -webkit-box;
+            display: -webkit-flex;
             display: flex;
+            -webkit-box-pack: justify;
+            -webkit-justify-content: space-between;
             justify-content: space-between;
+            -webkit-box-align: center;
+            -webkit-align-items: center;
             align-items: center;
             padding: 5px;
             background: #333;
@@ -235,6 +300,8 @@
         }
 
         .debug-body {
+            -webkit-box-flex: 1;
+            -webkit-flex: 1;
             flex: 1;
             padding: 5px;
             overflow-y: auto;
@@ -264,14 +331,13 @@
 
     <!-- 搴曢儴鏍� -->
     <div class="bottom-footer">
-        <!-- 娓╅Θ鎻愮ず璇眳涓� -->
         <div class="footer-tip">娓╅Θ鎻愮ず锛氳鍚埌鍛煎彨鍚庡墠寰�瀵瑰簲璇婂</div>
     </div>
 
     <!-- 璋冭瘯闈㈡澘 -->
     <div class="debug-panel" id="debugPanel">
         <div class="debug-header">
-            <span>馃洜锔� 杩愯鏃ュ織</span>
+            <span>[璋冭瘯] 杩愯鏃ュ織</span>
             <button onclick="document.getElementById('debugBody').innerHTML=''">娓呯┖</button>
         </div>
         <div class="debug-body" id="debugBody"></div>
@@ -279,15 +345,18 @@
 
     <script src="./static/jquery.min.js"></script>
     <script>
-        // ================= 璋冭瘯鏃ュ織鍑芥暟 =================
+        // ================= 璋冭瘯鏃ュ織 =================
         function logDebug(msg) {
             var now = new Date();
-            var timeStr = now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds();
-            var logHtml = '<div class="debug-line"><span class="debug-time">[' + timeStr + ']</span>' + msg + '</div>';
+            function pad(num) { return num < 10 ? '0' + num : '' + num; }
+            var timeStr = pad(now.getHours()) + ':' + pad(now.getMinutes()) + ':' + pad(now.getSeconds());
+            var logHtml = '<div class="debug-line"><span class="debug-time">[' + timeStr + ']</span> ' + msg + '</div>';
             console.log("[" + timeStr + "] " + msg);
-            var $body = $("#debugBody");
-            $body.append(logHtml);
-            $body.scrollTop($body[0].scrollHeight);
+            var body = document.getElementById("debugBody");
+            if (body) {
+                body.insertAdjacentHTML("beforeend", logHtml);
+                body.scrollTop = body.scrollHeight;
+            }
         }
 
         // ================= 搴旂敤鐘舵�� =================
@@ -295,7 +364,7 @@
             columnTitles: ["甯歌蹇冪數鍥�", "鍔ㄦ�佸績鐢�", "骞虫澘杩愬姩蹇冪數", "椋熼亾鐢电敓鐞�", "鍔ㄨ剦纭寲鐩戞祴"],
             columnSubTitles: ["搴婅竟蹇冪數鍥�(甯歌+棰戣氨)M / 蹇冪數鍚戦噺鍥綨", "鍔ㄦ�佽鍘婥", "", "", ""],
             patients: [],
-            apiBaseUrl: "http://192.168.3.12/admin-api",
+            apiBaseUrl: "http://192.168.100.110/admin-api",
             pollTimer: null,
             callRepeatTimes: 2,
             spokenPatients: {},
@@ -308,28 +377,39 @@
             if (appState.isSpeaking || appState.ttsQueue.length === 0) return;
             appState.isSpeaking = true;
             var text = appState.ttsQueue.shift();
-            logDebug("馃攰 寮�濮嬫挱鎶�: " + text);
+            logDebug("[鎾姤] " + text);
 
             var utterance = new SpeechSynthesisUtterance(text);
+            // Android 6 榛樿璇�熷彲鑳藉緢蹇紝閫傚綋璋冩參
+            utterance.rate = 0.85;
             utterance.onend = function () {
                 appState.isSpeaking = false;
                 processTtsQueue();
             };
-            utterance.onerror = function () {
+            utterance.onerror = function (e) {
+                logDebug("[TTS閿欒] " + (e.error || "unknown"));
                 appState.isSpeaking = false;
                 processTtsQueue();
             };
 
+            // 浼樺厛灏濊瘯璁惧鍘熺敓 TTS 鎺ュ彛
             if (typeof wowjoy !== 'undefined' && typeof wowjoy.speek === 'function') {
                 try {
                     wowjoy.speek(text);
                     setTimeout(function () { appState.isSpeaking = false; processTtsQueue(); }, 4000);
                     return;
-                } catch (e) { logDebug("鉂� wowjoy 璋冪敤澶辫触: " + e.message); }
+                } catch (e) { logDebug("[wowjoy澶辫触] " + e.message); }
             }
 
-            if (window.speechSynthesis) { window.speechSynthesis.speak(utterance); }
-            else { appState.isSpeaking = false; processTtsQueue(); }
+            if (window.speechSynthesis) {
+                // Android 6 WebView 鏈夋椂闇�瑕佸厛 cancel 鍐� speak
+                window.speechSynthesis.cancel();
+                window.speechSynthesis.speak(utterance);
+            } else {
+                logDebug("[TTS] 娴忚鍣ㄤ笉鏀寔璇煶鍚堟垚");
+                appState.isSpeaking = false;
+                processTtsQueue();
+            }
         }
 
         function speak(text) {
@@ -338,10 +418,10 @@
             processTtsQueue();
         }
 
-        // ================= 娓叉煋鍑芥暟 =================
+        // ================= 娓叉煋 =================
         function renderMainContent() {
-            var $main = $("#mainContent");
-            $main.empty();
+            var main = document.getElementById("mainContent");
+            main.innerHTML = "";
 
             for (var i = 0; i < appState.columnTitles.length; i++) {
                 var titleHtml = '<div class="col-title-line">' + appState.columnTitles[i] + '</div>';
@@ -350,24 +430,25 @@
                 }
 
                 var colClass = (i === 0) ? 'col-wide' : 'col-normal';
-                // 娉ㄦ剰锛氳繖閲屼笉鍐嶇粰绗�1鏍忓姞 col-flex锛岀敱 CSS #col-0 寮哄埗鎺у埗
                 var colHtml = '<div class="column-box ' + colClass + '">' +
                     '<div class="col-title">' + titleHtml + '</div>' +
                     '<div class="patient-list" id="col-' + i + '"></div>' +
                     '</div>';
-                $main.append(colHtml);
+                main.insertAdjacentHTML("beforeend", colHtml);
             }
         }
 
         function renderPatients() {
             for (var i = 0; i < appState.columnTitles.length; i++) {
-                $("#col-" + i).empty();
+                var col = document.getElementById("col-" + i);
+                if (col) col.innerHTML = "";
             }
 
             for (var c = 0; c < appState.patients.length; c++) {
                 var colData = appState.patients[c];
                 if (Array.isArray(colData)) {
-                    var $col = $("#col-" + c);
+                    var col = document.getElementById("col-" + c);
+                    if (!col) continue;
                     for (var p = 0; p < colData.length; p++) {
                         var pat = colData[p];
                         var roomHtml = pat.roomName ? '<span class="p-room">(' + pat.roomName + ')</span>' : '';
@@ -376,7 +457,7 @@
                             '<span class="p-name">' + (pat.patName || '') + '</span>' +
                             roomHtml +
                             '</div>';
-                        $col.append(itemHtml);
+                        col.insertAdjacentHTML("beforeend", itemHtml);
                     }
                 }
             }
@@ -409,7 +490,7 @@
                                 }
                                 speak(repeatText);
                                 appState.spokenPatients[newPat.patId] = true;
-                                logDebug("馃敂 鍔犲叆鎾姤闃熷垪: " + newPat.patName);
+                                logDebug("[鎺掗槦] " + newPat.patName + " -> " + newPat.roomName);
                             }
                         }
                     }
@@ -437,26 +518,29 @@
                     appState.patients = dataList;
                     renderPatients();
 
-                    if (window.performance && window.performance.memory) {
-                        var usedMB = (window.performance.memory.usedJSHeapSize / 1048576).toFixed(2);
-                        logDebug("馃捑 鍐呭瓨: " + usedMB + " MB");
-                    }
+                    // Android 6 WebView 閫氬父涓嶆敮鎸� performance.memory锛屽畨鍏ㄥ畧鍗�
+                    try {
+                        if (window.performance && window.performance.memory) {
+                            var usedMB = (window.performance.memory.usedJSHeapSize / 1048576).toFixed(2);
+                            logDebug("[鍐呭瓨] " + usedMB + " MB");
+                        }
+                    } catch (e) {}
                 },
                 error: function (err) {
-                    logDebug("鉂� 璇锋眰澶辫触: " + err.statusText);
+                    logDebug("[璇锋眰澶辫触] " + (err.statusText || "缃戠粶閿欒"));
                 }
             });
         }
 
         // ================= 鍒濆鍖� =================
-        $(document).ready(function () {
+        function onReady() {
             renderMainContent();
             updateHeaderTime();
             setInterval(updateHeaderTime, 1000);
             fetchQueueData();
             appState.pollTimer = setInterval(fetchQueueData, 5000);
-            logDebug("鉁� 绯荤粺鍚姩");
-        });
+            logDebug("[绯荤粺] 鍚姩瀹屾垚 - Android 6.0.1");
+        }
 
         function updateHeaderTime() {
             var now = new Date();
@@ -464,9 +548,19 @@
             function padZero(num) { return num < 10 ? '0' + num : '' + num; }
             var dateStr = now.getFullYear() + "骞�" + padZero(now.getMonth() + 1) + "鏈�" + padZero(now.getDate()) + "鏃� " + weekDays[now.getDay()];
             var timeStr = padZero(now.getHours()) + ":" + padZero(now.getMinutes());
-            $("#headerTime").text(dateStr + " " + timeStr);
+            var el = document.getElementById("headerTime");
+            if (el) el.textContent = dateStr + " " + timeStr;
+        }
+
+        // 鍏煎 DOM ready锛圓ndroid 6 鏌愪簺 WebView 鍙兘娌℃湁 $锛�
+        if (typeof $ !== 'undefined') {
+            $(document).ready(onReady);
+        } else if (document.readyState === 'complete' || document.readyState === 'interactive') {
+            setTimeout(onReady, 1);
+        } else {
+            document.addEventListener('DOMContentLoaded', onReady);
         }
     </script>
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/big.html.bak b/big.html.bak
new file mode 100644
index 0000000..871e128
--- /dev/null
+++ b/big.html.bak
@@ -0,0 +1,472 @@
+<!doctype html>
+<html lang="zh-CN">
+
+<head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <title>澶у巺</title>
+    <style>
+        * {
+            margin: 0;
+            padding: 0;
+            box-sizing: border-box;
+            font-family: "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
+        }
+
+        /* 1. 鍏ㄥ眬娣辫壊鑳屾櫙 */
+        body {
+            background: #001f3f;
+            /* 娣辫摑鑹茶儗鏅紝閫傚悎澶у睆 */
+            color: #fff;
+            height: 100vh;
+            overflow: hidden;
+            display: flex;
+            flex-direction: column;
+            font-size: 14px;
+        }
+
+        /* 2. 椤堕儴鏍� - 绠�鍖栬竟妗嗭紝娣辫壊涓婚 */
+        .top-header {
+            display: flex;
+            align-items: center;
+            padding: 15px 30px;
+            background: rgba(0, 30, 60, 0.9);
+            /* 娣辫壊鍗婇�忔槑 */
+            white-space: nowrap;
+            position: relative;
+            border-bottom: 1px solid #003366;
+        }
+
+        .top-header img {
+            height: 50px;
+            margin-right: 20px;
+            z-index: 2;
+        }
+
+        .top-header .title-text {
+            position: absolute;
+            left: 50%;
+            transform: translateX(-50%);
+            font-size: 32px;
+            font-weight: bold;
+            color: #fff;
+            z-index: 1;
+        }
+
+        .top-header .time-info {
+            font-size: 24px;
+            color: #aaa;
+            margin-left: auto;
+            z-index: 2;
+        }
+
+        /* 3. 涓讳綋鍐呭 */
+        .main-content {
+            flex: 1;
+            display: flex;
+            padding: 15px 20px;
+            overflow: hidden;
+            gap: 10px;
+        }
+
+        /* 鍒楀鍣� - 绉婚櫎闃村奖鍜屽渾瑙掞紝鏇寸畝娲� */
+        .column-box {
+            display: flex;
+            flex-direction: column;
+            background: rgba(10, 40, 80, 0.5);
+            /* 娣辫壊鍗婇�忔槑鑳屾櫙 */
+            border-radius: 0;
+            padding: 10px;
+            flex: 1;
+            min-width: 0;
+            border: 1px solid #003366;
+        }
+
+        .column-box.col-wide {
+            flex: 2.5;
+        }
+
+        .column-box.col-normal {
+            flex: 1;
+        }
+
+        /* 鏍囬鏍峰紡 - 绠�鍖栦笅鍒掔嚎 */
+        .col-title {
+            font-size: 22px;
+            font-weight: bold;
+            color: #4da6ff;
+            padding-bottom: 8px;
+            border-bottom: 1px solid #003366;
+            margin-bottom: 10px;
+            text-align: center;
+        }
+
+        .col-subtitle {
+            font-size: 14px;
+            color: #999;
+            text-align: center;
+        }
+
+        /* 鎮h�呭垪琛� */
+        .patient-list {
+            flex: 1;
+            overflow-y: auto;
+            padding-right: 5px;
+        }
+
+        /* 銆愬叧閿慨鏀广�戠1鏍忓己鍒朵竴琛�2涓� */
+        #col-0 {
+            display: flex;
+            flex-wrap: wrap;
+            align-content: flex-start;
+        }
+
+        /* 绗�2-5鏍忎繚鎸佸崟鍒� */
+        .col-normal .patient-list {
+            display: flex;
+            flex-direction: column;
+        }
+
+        /* 4. 鎮h�呴」鐩� - 鏋佺畝妯″紡 */
+        .patient-item {
+            font-size: 22px;
+            padding: 8px 5px;
+            display: flex;
+            align-items: center;
+            color: #fff;
+            line-height: 1.4;
+        }
+
+        /* 銆愪紭鍖栦慨鏀广�戠1鏍忥細澧炲姞鍒楅棿璺濓紝鏀瑰杽鎷ユ尋鎰� */
+        #col-0 .patient-item {
+            width: 45%;
+            /* 1. 缂╁噺瀹藉害锛屼负闂撮殧鐣欏嚭绌洪棿 */
+            font-size: 20px;
+            margin: 0 2.5%;
+            /* 2. 娣诲姞宸﹀彸澶栬竟璺濓紝涓ゅ垪涔嬮棿鎬婚棿闅斾负5% */
+        }
+
+        .p-number {
+            color: #ffcc00;
+            font-weight: bold;
+            margin-right: 8px;
+        }
+
+        .p-name {
+            flex: 1;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+        }
+
+        .p-room {
+            color: #4da6ff;
+            font-weight: bold;
+            font-size: 18px;
+            margin-left: 5px;
+        }
+
+        /* 5. 搴曢儴鏍� - 灞呬腑鏄剧ず */
+        .bottom-footer {
+            display: flex;
+            justify-content: center;
+            /* 灞呬腑 */
+            align-items: center;
+            padding: 10px 30px;
+            background: rgba(0, 30, 60, 0.9);
+            border-top: 1px solid #003366;
+        }
+
+        .footer-tip {
+            font-size: 22px;
+            color: #ffcc00;
+            font-weight: bold;
+            text-align: center;
+        }
+
+        /* 婊氬姩鏉$編鍖� - 缁嗕竴鐐� */
+        .patient-list::-webkit-scrollbar {
+            width: 4px;
+        }
+
+        .patient-list::-webkit-scrollbar-thumb {
+            background: #444;
+            border-radius: 2px;
+        }
+
+        /* 6. 璋冭瘯妗嗘牱寮� */
+        .debug-panel {
+            position: fixed;
+            right: 15px;
+            bottom: 70px;
+            width: 350px;
+            height: 200px;
+            background: rgba(0, 0, 0, 0.9);
+            color: #0f0;
+            border-radius: 4px;
+            font-family: monospace;
+            font-size: 12px;
+            z-index: 9999;
+            overflow: hidden;
+        }
+
+        .debug-header {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            padding: 5px;
+            background: #333;
+            border-bottom: 1px solid #000;
+        }
+
+        .debug-header span {
+            font-weight: bold;
+            font-size: 13px;
+        }
+
+        .debug-header button {
+            background: #c00;
+            color: #fff;
+            border: none;
+            padding: 2px 6px;
+            font-size: 10px;
+            cursor: pointer;
+        }
+
+        .debug-body {
+            flex: 1;
+            padding: 5px;
+            overflow-y: auto;
+            font-size: 11px;
+        }
+
+        .debug-line {
+            margin-bottom: 2px;
+        }
+
+        .debug-time {
+            color: #888;
+        }
+    </style>
+</head>
+
+<body>
+    <!-- 椤堕儴鏍� -->
+    <div class="top-header">
+        <img src="logo.png" alt="logo" />
+        <span class="title-text">鏈嶅姟澶у巺鎺掑垪</span>
+        <span class="time-info" id="headerTime"></span>
+    </div>
+
+    <!-- 涓讳綋鍐呭 -->
+    <div class="main-content" id="mainContent"></div>
+
+    <!-- 搴曢儴鏍� -->
+    <div class="bottom-footer">
+        <!-- 娓╅Θ鎻愮ず璇眳涓� -->
+        <div class="footer-tip">娓╅Θ鎻愮ず锛氳鍚埌鍛煎彨鍚庡墠寰�瀵瑰簲璇婂</div>
+    </div>
+
+    <!-- 璋冭瘯闈㈡澘 -->
+    <div class="debug-panel" id="debugPanel">
+        <div class="debug-header">
+            <span>馃洜锔� 杩愯鏃ュ織</span>
+            <button onclick="document.getElementById('debugBody').innerHTML=''">娓呯┖</button>
+        </div>
+        <div class="debug-body" id="debugBody"></div>
+    </div>
+
+    <script src="./static/jquery.min.js"></script>
+    <script>
+        // ================= 璋冭瘯鏃ュ織鍑芥暟 =================
+        function logDebug(msg) {
+            var now = new Date();
+            var timeStr = now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds();
+            var logHtml = '<div class="debug-line"><span class="debug-time">[' + timeStr + ']</span>' + msg + '</div>';
+            console.log("[" + timeStr + "] " + msg);
+            var $body = $("#debugBody");
+            $body.append(logHtml);
+            $body.scrollTop($body[0].scrollHeight);
+        }
+
+        // ================= 搴旂敤鐘舵�� =================
+        var appState = {
+            columnTitles: ["甯歌蹇冪數鍥�", "鍔ㄦ�佸績鐢�", "骞虫澘杩愬姩蹇冪數", "椋熼亾鐢电敓鐞�", "鍔ㄨ剦纭寲鐩戞祴"],
+            columnSubTitles: ["搴婅竟蹇冪數鍥�(甯歌+棰戣氨)M / 蹇冪數鍚戦噺鍥綨", "鍔ㄦ�佽鍘婥", "", "", ""],
+            patients: [],
+            apiBaseUrl: "http://192.168.100.110/admin-api",
+            pollTimer: null,
+            callRepeatTimes: 2,
+            spokenPatients: {},
+            ttsQueue: [],
+            isSpeaking: false
+        };
+
+        // ================= 璇煶鎾姤 =================
+        function processTtsQueue() {
+            if (appState.isSpeaking || appState.ttsQueue.length === 0) return;
+            appState.isSpeaking = true;
+            var text = appState.ttsQueue.shift();
+            logDebug("馃攰 寮�濮嬫挱鎶�: " + text);
+
+            var utterance = new SpeechSynthesisUtterance(text);
+            utterance.onend = function () {
+                appState.isSpeaking = false;
+                processTtsQueue();
+            };
+            utterance.onerror = function () {
+                appState.isSpeaking = false;
+                processTtsQueue();
+            };
+
+            if (typeof wowjoy !== 'undefined' && typeof wowjoy.speek === 'function') {
+                try {
+                    wowjoy.speek(text);
+                    setTimeout(function () { appState.isSpeaking = false; processTtsQueue(); }, 4000);
+                    return;
+                } catch (e) { logDebug("鉂� wowjoy 璋冪敤澶辫触: " + e.message); }
+            }
+
+            if (window.speechSynthesis) { window.speechSynthesis.speak(utterance); }
+            else { appState.isSpeaking = false; processTtsQueue(); }
+        }
+
+        function speak(text) {
+            if (!text) return;
+            appState.ttsQueue.push(text);
+            processTtsQueue();
+        }
+
+        // ================= 娓叉煋鍑芥暟 =================
+        function renderMainContent() {
+            var $main = $("#mainContent");
+            $main.empty();
+
+            for (var i = 0; i < appState.columnTitles.length; i++) {
+                var titleHtml = '<div class="col-title-line">' + appState.columnTitles[i] + '</div>';
+                if (appState.columnSubTitles[i]) {
+                    titleHtml += '<div class="col-subtitle">' + appState.columnSubTitles[i] + '</div>';
+                }
+
+                var colClass = (i === 0) ? 'col-wide' : 'col-normal';
+                // 娉ㄦ剰锛氳繖閲屼笉鍐嶇粰绗�1鏍忓姞 col-flex锛岀敱 CSS #col-0 寮哄埗鎺у埗
+                var colHtml = '<div class="column-box ' + colClass + '">' +
+                    '<div class="col-title">' + titleHtml + '</div>' +
+                    '<div class="patient-list" id="col-' + i + '"></div>' +
+                    '</div>';
+                $main.append(colHtml);
+            }
+        }
+
+        function renderPatients() {
+            for (var i = 0; i < appState.columnTitles.length; i++) {
+                $("#col-" + i).empty();
+            }
+
+            for (var c = 0; c < appState.patients.length; c++) {
+                var colData = appState.patients[c];
+                if (Array.isArray(colData)) {
+                    var $col = $("#col-" + c);
+                    for (var p = 0; p < colData.length; p++) {
+                        var pat = colData[p];
+                        var roomHtml = pat.roomName ? '<span class="p-room">(' + pat.roomName + ')</span>' : '';
+                        var itemHtml = '<div class="patient-item">' +
+                            '<span class="p-number">' + (pat.bookSeqNum || '') + '</span>' +
+                            '<span class="p-name">' + (pat.patName || '') + '</span>' +
+                            roomHtml +
+                            '</div>';
+                        $col.append(itemHtml);
+                    }
+                }
+            }
+        }
+
+        // ================= 鏁版嵁瀵规瘮涓庢挱鎶� =================
+        function checkAndSpeakNewRooms(oldData, newData) {
+            if (!oldData || oldData.length === 0) return;
+            for (var c = 0; c < newData.length; c++) {
+                var newCol = newData[c];
+                var oldCol = oldData[c];
+                if (Array.isArray(newCol)) {
+                    for (var p = 0; p < newCol.length; p++) {
+                        var newPat = newCol[p];
+                        if (newPat.roomName) {
+                            if (appState.spokenPatients[newPat.patId]) continue;
+                            var oldPat = null;
+                            if (Array.isArray(oldCol)) {
+                                for (var k = 0; k < oldCol.length; k++) {
+                                    if (oldCol[k].patId === newPat.patId) {
+                                        oldPat = oldCol[k];
+                                        break;
+                                    }
+                                }
+                            }
+                            if (!oldPat || !oldPat.roomName) {
+                                var repeatText = "";
+                                for (var r = 0; r < appState.callRepeatTimes; r++) {
+                                    repeatText += "璇� " + newPat.bookSeqNum + " 鍙� " + newPat.patName + " 鍒� " + newPat.roomName + " 灏辫瘖銆�";
+                                }
+                                speak(repeatText);
+                                appState.spokenPatients[newPat.patId] = true;
+                                logDebug("馃敂 鍔犲叆鎾姤闃熷垪: " + newPat.patName);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        // ================= 鏁版嵁鑾峰彇 =================
+        function fetchQueueData() {
+            var url = appState.apiBaseUrl + "/ecg/screen/big-screen-data";
+            $.ajax({
+                url: url,
+                type: "GET",
+                dataType: "json",
+                timeout: 5000,
+                success: function (res) {
+                    var dataList = [];
+                    if (res && res.code === 0 && res.data) {
+                        for (var i = 0; i < appState.columnTitles.length; i++) {
+                            var key = i.toString();
+                            dataList[i] = (res.data[key] && Array.isArray(res.data[key])) ? res.data[key] : [];
+                        }
+                    }
+                    checkAndSpeakNewRooms(appState.patients, dataList);
+                    appState.patients = dataList;
+                    renderPatients();
+
+                    if (window.performance && window.performance.memory) {
+                        var usedMB = (window.performance.memory.usedJSHeapSize / 1048576).toFixed(2);
+                        logDebug("馃捑 鍐呭瓨: " + usedMB + " MB");
+                    }
+                },
+                error: function (err) {
+                    logDebug("鉂� 璇锋眰澶辫触: " + err.statusText);
+                }
+            });
+        }
+
+        // ================= 鍒濆鍖� =================
+        $(document).ready(function () {
+            renderMainContent();
+            updateHeaderTime();
+            setInterval(updateHeaderTime, 1000);
+            fetchQueueData();
+            appState.pollTimer = setInterval(fetchQueueData, 5000);
+            logDebug("鉁� 绯荤粺鍚姩");
+        });
+
+        function updateHeaderTime() {
+            var now = new Date();
+            var weekDays = ["鏄熸湡鏃�", "鏄熸湡涓�", "鏄熸湡浜�", "鏄熸湡涓�", "鏄熸湡鍥�", "鏄熸湡浜�", "鏄熸湡鍏�"];
+            function padZero(num) { return num < 10 ? '0' + num : '' + num; }
+            var dateStr = now.getFullYear() + "骞�" + padZero(now.getMonth() + 1) + "鏈�" + padZero(now.getDate()) + "鏃� " + weekDays[now.getDay()];
+            var timeStr = padZero(now.getHours()) + ":" + padZero(now.getMinutes());
+            $("#headerTime").text(dateStr + " " + timeStr);
+        }
+    </script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/small.html b/small.html
index 0657284..e3515a3 100644
--- a/small.html
+++ b/small.html
@@ -264,7 +264,7 @@
     <script>
         // ================= 閰嶇疆鍙傛暟 =================
         var CONFIG = {
-            apiBaseUrl: "http://192.168.3.12:48080/admin-api",
+            apiBaseUrl: "http://192.168.100.110:48080/admin-api",
             // apiBaseUrl: "http://192.168.100.110:48080/admin-api",
             roomId: "116",
             refreshRate: 5000

--
Gitblit v1.9.3