From dbf761cb549cdc0e8ef1ed266a41f515b8ef148d Mon Sep 17 00:00:00 2001
From: WXL <1785969728@qq.com>
Date: 星期五, 04 七月 2025 21:06:55 +0800
Subject: [PATCH] 11

---
 public/static/jinhua.png     |    0 
 public/integration.html      |  601 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/ConsultationRoom.html |    0 
 3 files changed, 601 insertions(+), 0 deletions(-)

diff --git a/public/roomtwo.html b/public/ConsultationRoom.html
similarity index 100%
rename from public/roomtwo.html
rename to public/ConsultationRoom.html
diff --git a/public/integration.html b/public/integration.html
new file mode 100644
index 0000000..f84d262
--- /dev/null
+++ b/public/integration.html
@@ -0,0 +1,601 @@
+<!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">
+  <title>閲戝崕浜烘皯鍖婚櫌澶у睆鍙彿绯荤粺</title>
+  <style>
+    /* 鍩虹鏍峰紡 */
+    * {
+      margin: 0;
+      padding: 0;
+      box-sizing: border-box;
+      font-family: 'Helvetica Neue', Arial, sans-serif;
+    }
+    
+    body {
+      background: linear-gradient(135deg, #e6f0f8, #d9e4f0);
+      color: #4a5568;
+      height: 100vh;
+      overflow: hidden;
+    }
+    
+    .bigscreen-container {
+      height: 100%;
+      display: flex;
+      flex-direction: column;
+      padding: 8px;
+    }
+    
+    /* 鍖婚櫌鏍囬鏍峰紡 */
+    .hospital-header {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      background: rgba(255, 255, 255, 0.9);
+      border-radius: 12px;
+      padding: 12px;
+      margin-bottom: 8px;
+      font-size: 22px;
+      font-weight: bold;
+      color: #4a7dff;
+      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+    }
+    
+    .hospital-header img {
+      margin-right: 8px;
+      height: 40px;
+    }
+    
+    .running-indicator {
+      width: 12px;
+      height: 12px;
+      border-radius: 50%;
+      margin-left: 12px;
+      transition: background-color 0.3s;
+    }
+    
+    /* 鍒楁爣棰樺尯鍩� */
+    .column-header {
+      display: flex;
+      background: rgba(255, 255, 255, 0.9);
+      border-radius: 12px;
+      padding: 12px 0;
+      margin-bottom: 8px;
+      font-size: 20px;
+      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+    }
+    
+    .column-title {
+      flex: 1;
+      min-width: 0;
+      text-align: center;
+      padding: 0 12px;
+      border-left: 1px solid rgba(91, 140, 255, 0.2);
+    }
+    
+    .column-title:first-child {
+      border-left: none;
+      flex: 2; /* 绗竴涓埧闂存爣棰樺崰涓ゅ垪瀹藉害 */
+    }
+    
+    /* 鎮h�呭垪琛ㄥ尯鍩� */
+    .patient-list-container {
+      display: flex;
+      flex-grow: 1;
+      background: rgba(255, 255, 255, 0.9);
+      border-radius: 12px;
+      padding: 12px 0;
+      margin-bottom: 8px;
+      font-size: 18px;
+      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+      overflow-y: auto;
+    }
+    
+    .patient-column {
+      flex: 1;
+      min-width: 0;
+      padding: 0 12px;
+      border-left: 1px solid rgba(91, 140, 255, 0.2);
+    }
+    
+    .patient-column:first-child {
+      border-left: none;
+      flex: 2; /* 绗竴涓埧闂村崰涓ゅ垪瀹藉害 */
+    }
+    
+    /* 绗竴涓埧闂村垎鎴愪袱鍒楃殑鐗规畩鏍峰紡 */
+    .first-room-columns {
+      display: flex;
+      flex: 2;
+      min-width: 0;
+    }
+    
+    .first-room-column {
+      flex: 1;
+      min-width: 0;
+      padding: 0 12px;
+    }
+    
+    .first-room-column:first-child {
+      border-right: 1px solid rgba(91, 140, 255, 0.2);
+    }
+    
+    /* 鎮h�呴」鏍峰紡 - 浼樺寲鍚庣殑甯冨眬 */
+    .patient-item {
+      padding: 10px 8px;
+      margin-bottom: 8px;
+      border-radius: 8px;
+      transition: all 0.3s;
+      background: rgba(255, 255, 255, 0.8);
+      box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+    }
+    
+    .patient-item:hover {
+      background: rgba(91, 140, 255, 0.1);
+    }
+    
+    .patient-info-row {
+      display: flex;
+      width: 100%;
+      margin-bottom: 4px;
+    }
+    
+    .patient-number-name {
+      display: flex;
+      flex-wrap: wrap;
+    }
+    
+    .patient-number {
+      color: #5b8cff;
+      font-weight: bold;
+      margin-right: 10px;
+      min-width: 80px;
+    }
+    
+    .patient-name {
+      flex: 1;
+      min-width: 100px;
+    }
+    
+    .patient-status {
+      width: 100%;
+      color: #67c23a;
+      margin-top: 4px;
+    }
+    
+    .warning-row {
+      background-color: rgba(230, 162, 60, 0.1);
+      color: #e6a23c;
+    }
+    
+    /* 搴曢儴鎺у埗鍖哄煙 */
+    .footer-controls {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      background: rgba(255, 255, 255, 0.9);
+      border-radius: 12px;
+      padding: 12px;
+      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+    }
+    
+    .welcome-btn {
+      background: rgba(91, 140, 255, 0.1);
+      color: #4a7dff;
+      border: none;
+      border-radius: 8px;
+      padding: 10px 20px;
+      font-size: 16px;
+      cursor: pointer;
+    }
+    
+    .welcome-btn:hover {
+      background: rgba(91, 140, 255, 0.2);
+    }
+    
+    /* 婊氬姩鏉℃牱寮� */
+    .patient-list-container::-webkit-scrollbar {
+      width: 6px;
+    }
+    
+    .patient-list-container::-webkit-scrollbar-track {
+      background: rgba(0, 0, 0, 0.05);
+      border-radius: 4px;
+    }
+    
+    .patient-list-container::-webkit-scrollbar-thumb {
+      background: rgba(91, 140, 255, 0.4);
+      border-radius: 4px;
+    }
+    
+    /* 鍝嶅簲寮忚皟鏁� */
+    @media (max-width: 1200px) {
+      .hospital-header {
+        font-size: 18px;
+      }
+      .column-header {
+        font-size: 16px;
+      }
+      .patient-list-container {
+        font-size: 14px;
+      }
+      .patient-number {
+        min-width: 60px;
+      }
+    }
+    
+    @media (max-width: 768px) {
+      .hospital-header {
+        font-size: 16px;
+        padding: 8px;
+      }
+      .column-header {
+        flex-direction: column;
+        padding: 8px 0;
+      }
+      .column-title {
+        min-width: 100%;
+        padding: 8px 0;
+        border-left: none;
+        border-bottom: 1px solid rgba(91, 140, 255, 0.2);
+      }
+      .patient-list-container {
+        flex-direction: column;
+      }
+      .patient-column, .first-room-columns {
+        min-width: 100%;
+        padding: 8px 0;
+        border-left: none;
+        border-bottom: 1px solid rgba(91, 140, 255, 0.2);
+      }
+      .first-room-column {
+        padding: 0 8px;
+      }
+    }
+  </style>
+</head>
+<body>
+  <div class="bigscreen-container">
+    <!-- 椤堕儴鍖婚櫌鏍囬 -->
+    <div class="hospital-header">
+      <img src="./static/jinhua.png"/>
+      <span>閲戝崕浜烘皯鍖婚櫌</span>
+      <div class="running-indicator" id="runningIndicator"></div>
+    </div>
+    
+    <!-- 鍒楁爣棰樺尯鍩� -->
+    <div class="column-header" id="columnHeader">
+      <!-- 鍒楁爣棰樺皢閫氳繃JS鍔ㄦ�佺敓鎴� -->
+    </div>
+    
+    <!-- 鎮h�呭垪琛ㄥ尯鍩� -->
+    <div class="patient-list-container" id="patientListContainer">
+      <!-- 鎮h�呭垪琛ㄥ皢閫氳繃JS鍔ㄦ�佺敓鎴� -->
+    </div>
+    
+    <div class="footer-controls">
+      <button class="welcome-btn" id="welcomeBtn">娆㈣繋璇�</button>
+    </div>
+  </div>
+
+  <script src="./static/jquery.min.js"></script>
+  <script>
+    // 搴旂敤鐘舵��
+    var appState = {
+      runningIndicator: 0,
+      displayColInfo: {
+        "0": ["甯歌蹇冪數鍥続", "搴婅竟蹇冪數鍥�(甯歌+棰戣氨)M", "甯歌蹇冪數鍥�-蹇冪數鍚戦噺鍥綨"],
+        "1": ["鍔ㄦ�佸績鐢礏", "鍔ㄦ�佽鍘婥"],
+        "2": ["骞虫澘杩愬姩蹇冪數D"],
+        "3": ["椋熼亾鐢电敓鐞咶"],
+        "4": ["鍔ㄨ剦纭寲鐩戞祴E"]
+      },
+      mapColumnVsPatients: new Map(),
+      curSpeakPat: null,
+      timer: null,
+      speechSynthesis: window.speechSynthesis || null,
+      apiBaseUrl: 'http://localhost:48080/admin-api'
+    };
+
+    // 椤甸潰鍔犺浇瀹屾垚鍚庡垵濮嬪寲
+    $(document).ready(function() {
+      // 鍒濆鍖栦簨浠剁洃鍚�
+      $('#welcomeBtn').click(function() {
+        speak('娆㈣繋浣跨敤閲戝崕浜烘皯鍖婚櫌鍙彿绯荤粺');
+      });
+
+      // 鍒濆鍖栨暟鎹�
+      updateColumnHeader();
+      startScrolling();
+
+      // 鍒濆鍖栬闊冲悎鎴�
+      if (appState.speechSynthesis) {
+        appState.speechSynthesis.onend = onSpeachEndEvent;
+      }
+    });
+
+    // 鏇存柊鍒楁爣棰樻樉绀�
+    function updateColumnHeader() {
+      var $header = $('#columnHeader');
+      $header.empty();
+
+      // 鎸夌収鍥哄畾椤哄簭鏄剧ず浜斾釜鎴块棿鐨勬爣棰�
+      for (var i = 0; i < 5; i++) {
+        var disColId = i.toString();
+        var disNameList = appState.displayColInfo[disColId] || [];
+        var isFirstColumn = disColId === "0";
+        
+        var $title = $('<div class="column-title' + (isFirstColumn ? ' double-column' : '') + '"></div>');
+        
+        disNameList.forEach(function(dispName) {
+          $title.append('<div>' + dispName + '</div>');
+        });
+        
+        $header.append($title);
+      }
+    }
+
+    // 鑾峰彇鎮h�呭垪琛�
+    function getList() {
+      // 杩欓噷鏇挎崲涓哄疄闄呯殑API璋冪敤
+      $.ajax({
+        url: appState.apiBaseUrl + '/ecg/screen/big-screen-data',
+        type: 'GET',
+        dataType: 'json',
+        success: function(response) {
+          // 纭繚鏁版嵁鎸夌収浜斾釜鎴块棿鐨勯『搴忔帓鍒�
+          var data = response.data || response;
+          appState.mapColumnVsPatients = new Map();
+          
+          // 鎸夌収鍥哄畾椤哄簭澶勭悊浜斾釜鎴块棿鐨勬暟鎹�
+          for (var i = 0; i < 5; i++) {
+            var roomId = i.toString();
+            appState.mapColumnVsPatients.set(roomId, data[roomId] || []);
+          }
+          
+          updatePatientList();
+        },
+        error: function(xhr, status, error) {
+          console.error('鑾峰彇鎮h�呭垪琛ㄥけ璐�:', error);
+          // 浣跨敤妯℃嫙鏁版嵁浣滀负鍚庡
+          appState.mapColumnVsPatients = generateMockPatients();
+          updatePatientList();
+        }
+      });
+    }
+
+    // 鏇存柊鎮h�呭垪琛ㄦ樉绀�
+    function updatePatientList() {
+      var $container = $('#patientListContainer');
+      $container.empty();
+
+      // 鎸夌収鍥哄畾椤哄簭鏄剧ず浜斾釜鎴块棿鐨勬偅鑰呮暟鎹�
+      for (var i = 0; i < 5; i++) {
+        var disColId = i.toString();
+        var patients = appState.mapColumnVsPatients.get(disColId) || [];
+        var isFirstColumn = disColId === "0";
+        
+        if (isFirstColumn) {
+          // 绗竴涓埧闂寸壒娈婂鐞�
+          if (patients.length > 10) {
+            // 瓒呰繃10浜猴紝鍒嗘垚涓ゅ垪
+            var $firstRoomColumns = $('<div class="first-room-columns"></div>');
+            
+            // 绗竴鍒�(鍓�10鏉�)
+            var $firstCol = $('<div class="first-room-column"></div>');
+            patients.slice(0, 10).forEach(function(item, itemIndex) {
+              $firstCol.append(createPatientItem(item));
+            });
+            $firstRoomColumns.append($firstCol);
+            
+            // 绗簩鍒�(鍓╀綑鏁版嵁)
+            var $secondCol = $('<div class="first-room-column"></div>');
+            patients.slice(10).forEach(function(item, itemIndex) {
+              $secondCol.append(createPatientItem(item, itemIndex + 10));
+            });
+            $firstRoomColumns.append($secondCol);
+            
+            $container.append($firstRoomColumns);
+          } else {
+            // 涓嶈秴杩�10浜猴紝鍗曞垪鏄剧ず浣嗗崰涓ゅ垪瀹藉害
+            var $col = $('<div class="patient-column" style="flex:2"></div>');
+            patients.forEach(function(item, itemIndex) {
+              $col.append(createPatientItem(item, itemIndex));
+            });
+            $container.append($col);
+          }
+        } else {
+          // 鍏朵粬鎴块棿鍗曞垪鏄剧ず
+          var $col = $('<div class="patient-column"></div>');
+          patients.forEach(function(item, itemIndex) {
+            $col.append(createPatientItem(item, itemIndex));
+          });
+          $container.append($col);
+        }
+      }
+    }
+
+    // 鍒涘缓鎮h�呴」 - 浼樺寲鍚庣殑鐗堟湰
+    function createPatientItem(item, index) {
+      var statusClass = getItemCssClass(item);
+      var $item = $('<div class="patient-item ' + statusClass + '"></div>');
+      
+      // 鍙风爜鍜屽鍚嶅湪涓�琛�
+      var $numberNameRow = $('<div class="patient-info-row patient-number-name"></div>');
+      $numberNameRow.append('<span class="patient-number">' + getCheckTypeSeqPrefix(item.bookCheckType) + item.bookSeqNum + '</span>');
+      $numberNameRow.append('<span class="patient-name">' + nameDesensitize(item.patName) + '</span>');
+      $item.append($numberNameRow);
+      
+      // 鐘舵�佸湪涓嬩竴琛�
+      var $statusRow = $('<div class="patient-info-row"></div>');
+      $statusRow.append('<span class="patient-status">' + queueStatusConvert(item.status) + '</span>');
+      $item.append($statusRow);
+      
+      return $item;
+    }
+
+    // 寮�濮嬪畾鏃跺埛鏂�
+    function startScrolling() {
+      getList();
+      appState.timer = setInterval(function() {
+        appState.runningIndicator++;
+        $('#runningIndicator').css('backgroundColor', appState.runningIndicator % 2 === 0 ? '#67c23a' : '#e6a23c');
+        getList();
+        
+        if (appState.curSpeakPat == null) {
+          initiateSpeak();
+        }
+      }, 5000);
+    }
+
+    // 璇煶缁撴潫浜嬩欢
+    function onSpeachEndEvent(event) {
+      console.log("Speech ended... " + event.currentTarget.text);
+      
+      // 杩欓噷鏇挎崲涓哄疄闄呯殑API璋冪敤
+      $.ajax({
+        url: appState.apiBaseUrl + '/ecg/call/update',
+        method: 'PUT',
+        data: { 
+          id: appState.curSpeakPat.id,
+          called: 1
+        },
+        success: function() {
+          initiateSpeak();
+        },
+        error: function(xhr, status, error) {
+          console.error('鏇存柊鍙彿鐘舵�佸け璐�:', error);
+        }
+      });
+    }
+
+    // 鍙彿鍔熻兘
+    function initiateSpeak() {
+      // 杩欓噷鏇挎崲涓哄疄闄呯殑API璋冪敤
+      $.ajax({
+        url: appState.apiBaseUrl + '/ecg/call/next',
+        type: 'GET',
+        dataType: 'json',
+        success: function(response) {
+          appState.curSpeakPat = response.data || response;
+          if (appState.curSpeakPat != null && appState.curSpeakPat.called === 0) {
+            speak("璇枫��" + appState.curSpeakPat.patName + "鍒�" + appState.curSpeakPat.roomName + "灏辫瘖");
+          }
+        },
+        error: function(xhr, status, error) {
+          console.error('鑾峰彇涓嬩竴涓彨鍙峰け璐�:', error);
+        }
+      });
+    }
+
+    // 璇煶鎾姤
+    function speak(msg) {
+      console.info("speak " + msg);
+
+      if (!appState.speechSynthesis) {
+        console.warn("褰撳墠娴忚鍣ㄤ笉鏀寔璇煶鍚堟垚");
+        return;
+      }
+
+      // 鍙栨秷褰撳墠姝e湪杩涜鐨勮闊�
+      appState.speechSynthesis.cancel();
+
+      var speech = new SpeechSynthesisUtterance();
+      speech.text = msg + "銆傘�傘��" + msg + "銆傘�傘��" + msg + "銆傘�傘��";
+      speech.pitch = 1;
+      speech.rate = 0.9;
+      speech.volume = 100;
+      speech.lang = 'zh-CN';
+      speech.onend = onSpeachEndEvent;
+
+      appState.speechSynthesis.speak(speech);
+    }
+
+    // 宸ュ叿鍑芥暟
+    function nameDesensitize(patName) {
+      if (!patName) return '';
+      if (patName.length === 2) {
+        return patName.substring(0, 1) + '*';
+      } else if (patName.length === 3) {
+        return patName.substring(0, 1) + '*' + patName.substring(2, 3);
+      } else if (patName.length > 3) {
+        return patName.substring(0, 1) + '*' + '*' + patName.substring(3, patName.length);
+      }
+      return patName;
+    }
+
+    function getItemCssClass(item) {
+      if (item.status === 5 || item.status === 7) {
+        return "warning-row";
+      }
+      return "";
+    }
+
+    function queueStatusConvert(status) {
+      var statusMap = {
+        3: '宸茶繃鍙�-鎺掗槦',
+        5: '宸茶繃鍙�',
+        7: '宸茶繃鍙�-瀹夎',
+        10: '鎺掗槦涓�',
+        12: '浜插拰',
+        13: '浜插拰-瀹夎',
+        15: '宸插彫鍥�',
+        20: '鍊欒瘖涓�',
+        30: '灏辫瘖涓�',
+        33: '宸查鐢�',
+        34: '宸插彫鍥�-瀹夎',
+        36: '瀹夎涓�',
+        40: '宸插氨璇�'
+      };
+      return statusMap[status] || '鏈煡鐘舵��';
+    }
+
+    function getCheckTypeSeqPrefix(type) {
+      var types = {
+        1: 'A001',
+        2: 'A002',
+        3: 'A003',
+        4: 'A004'
+      };
+      return types[type] || '';
+    }
+
+    // 鐢熸垚妯℃嫙鎮h�呮暟鎹�
+    function generateMockPatients() {
+      var mockData = {
+        "0": generateMockPatientsForRoom(15, "甯歌蹇冪數鍥続"),
+        "1": generateMockPatientsForRoom(8, "鍔ㄦ�佸績鐢礏"),
+        "2": generateMockPatientsForRoom(5, "骞虫澘杩愬姩蹇冪數D"),
+        "3": generateMockPatientsForRoom(3, "椋熼亾鐢电敓鐞咶"),
+        "4": generateMockPatientsForRoom(4, "鍔ㄨ剦纭寲鐩戞祴E")
+      };
+      return new Map(Object.entries(mockData));
+    }
+
+    function generateMockPatientsForRoom(count, checkTypeName) {
+      var mockPatients = [];
+      var names = ['寮犱笁', '鏉庡洓', '鐜嬩簲', '璧靛叚', '閽变竷', '瀛欏叓', '鍛ㄤ節', '鍚村崄'];
+      var rooms = ['蹇冪數鍥惧1', '蹇冪數鍥惧2', '鍔ㄦ�佸績鐢靛', '蹇冪數鐩戞姢瀹�'];
+      var statuses = [5, 7, 10, 12, 13, 15, 20, 30, 33, 34, 36, 40];
+      var checkTypes = [1, 2, 3, 4];
+      
+      for (var i = 0; i < count; i++) {
+        mockPatients.push({
+          id: i + 1,
+          patName: names[Math.floor(Math.random() * names.length)],
+          roomName: rooms[Math.floor(Math.random() * rooms.length)],
+          bedNo: '搴�' + (Math.floor(Math.random() * 20) + 1),
+          status: statuses[Math.floor(Math.random() * statuses.length)],
+          bookCheckType: checkTypes[Math.floor(Math.random() * checkTypes.length)],
+          bookSeqNum: Math.floor(Math.random() * 50) + 1,
+          called: 0,
+          checkTypeName: checkTypeName
+        });
+      }
+      
+      return mockPatients;
+    }
+  </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/public/static/jinhua.png b/public/static/jinhua.png
new file mode 100644
index 0000000..cf85138
--- /dev/null
+++ b/public/static/jinhua.png
Binary files differ

--
Gitblit v1.9.3