<!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, target-densitydpi=device-dpi" />
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<title>大厅</title>
|
<style>
|
* {
|
margin: 0;
|
padding: 0;
|
box-sizing: border-box;
|
/* 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. 顶部栏 */
|
.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;
|
}
|
|
.top-header img {
|
height: 50px;
|
margin-right: 20px;
|
z-index: 2;
|
}
|
|
.top-header .title-text {
|
position: absolute;
|
left: 50%;
|
-webkit-transform: translateX(-50%);
|
transform: translateX(-50%);
|
font-size: 32px;
|
font-weight: bold;
|
color: #fff;
|
z-index: 1;
|
}
|
|
.top-header .time-info {
|
font-size: 20px;
|
color: #aaa;
|
margin-left: auto;
|
z-index: 2;
|
text-align: right;
|
line-height: 1.3;
|
}
|
|
.time-info-inner {
|
display: -webkit-box;
|
display: -webkit-flex;
|
display: flex;
|
-webkit-box-align: center;
|
-webkit-align-items: center;
|
align-items: center;
|
}
|
|
.time-left {
|
display: -webkit-box;
|
display: -webkit-flex;
|
display: flex;
|
-webkit-box-orient: vertical;
|
-webkit-flex-direction: column;
|
flex-direction: column;
|
text-align: right;
|
line-height: 1.3;
|
}
|
|
.time-right {
|
margin-left: 8px;
|
}
|
|
.top-header .time-info .time-clock {
|
font-size: 36px;
|
font-weight: bold;
|
color: #ffcc00;
|
line-height: 1.1;
|
}
|
|
/* 3. 主体内容(gap 替换为 margin 兼容旧 Chrome) */
|
.main-content {
|
-webkit-box-flex: 1;
|
-webkit-flex: 1;
|
flex: 1;
|
display: -webkit-box;
|
display: -webkit-flex;
|
display: flex;
|
-webkit-box-orient: vertical;
|
-webkit-box-direction: normal;
|
-webkit-flex-direction: column;
|
flex-direction: column;
|
padding: 15px 20px;
|
overflow: hidden;
|
}
|
|
/* 列行容器 */
|
.columns-row {
|
-webkit-box-flex: 1;
|
-webkit-flex: 1;
|
flex: 1;
|
display: -webkit-box;
|
display: -webkit-flex;
|
display: flex;
|
overflow: hidden;
|
}
|
|
.columns-row > .column-box {
|
margin-left: 5px;
|
margin-right: 5px;
|
}
|
|
.columns-row > .column-box:first-child {
|
margin-left: 0;
|
}
|
|
.columns-row > .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 {
|
padding-bottom: 8px;
|
border-bottom: 1px solid #003366;
|
margin-bottom: 10px;
|
text-align: center;
|
}
|
|
.col-subtitle {
|
font-size: 14px;
|
color: #999;
|
text-align: center;
|
min-height: 20px;
|
/* 即使为空也保留高度,防止标题栏高低不平 */;
|
line-height: 1.4;
|
word-break: keep-all;
|
}
|
|
/* 患者列表 */
|
.patient-list {
|
-webkit-box-flex: 1;
|
-webkit-flex: 1;
|
flex: 1;
|
overflow-y: auto;
|
padding-right: 5px;
|
}
|
|
/* 第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;
|
}
|
|
.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;
|
}
|
|
/* 患者项目 */
|
.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;
|
}
|
|
#col-0 .patient-item {
|
width: 45%;
|
font-size: 20px;
|
margin: 0 2.5%;
|
}
|
|
.p-number {
|
color: #ffcc00;
|
font-weight: bold;
|
margin-right: 8px;
|
}
|
|
.p-name {
|
overflow: hidden;
|
text-overflow: ellipsis;
|
white-space: nowrap;
|
}
|
|
.p-name-wrap {
|
-webkit-box-flex: 1;
|
-webkit-flex: 1;
|
flex: 1;
|
overflow: hidden;
|
text-overflow: ellipsis;
|
white-space: nowrap;
|
}
|
|
.p-room {
|
color: #4da6ff;
|
font-weight: bold;
|
font-size: 18px;
|
margin-left: 4px;
|
}
|
|
/* 过号栏(固定在 main-content 底部,自动滚动) */
|
.missed-bar {
|
-webkit-flex-shrink: 0;
|
flex-shrink: 0;
|
display: -webkit-box;
|
display: -webkit-flex;
|
display: flex;
|
-webkit-box-align: center;
|
-webkit-align-items: center;
|
align-items: center;
|
background: rgba(80, 20, 20, 0.7);
|
border: 1px solid #993333;
|
padding: 6px 10px;
|
margin-top: 8px;
|
}
|
|
.missed-bar-empty {
|
display: none;
|
}
|
|
.missed-bar-title {
|
-webkit-flex-shrink: 0;
|
flex-shrink: 0;
|
color: #ff6666;
|
font-size: 18px;
|
font-weight: bold;
|
margin-right: 16px;
|
line-height: 30px;
|
}
|
|
/* 滚动裁剪区 */
|
.missed-bar-scroll-area {
|
-webkit-box-flex: 1;
|
-webkit-flex: 1;
|
flex: 1;
|
overflow: hidden;
|
white-space: nowrap;
|
}
|
|
/* 滚动轨道 */
|
.missed-bar-track {
|
display: inline-block;
|
white-space: nowrap;
|
will-change: transform;
|
}
|
|
.missed-bar-scroll .missed-bar-track {
|
/* 动画时长由 JS 动态设置,见 updateMissedBarSpeed */
|
-webkit-animation-name: missed-scroll;
|
animation-name: missed-scroll;
|
-webkit-animation-timing-function: linear;
|
animation-timing-function: linear;
|
-webkit-animation-iteration-count: infinite;
|
animation-iteration-count: infinite;
|
}
|
|
@-webkit-keyframes missed-scroll {
|
0% { -webkit-transform: translateX(0); transform: translateX(0); }
|
100% { -webkit-transform: translateX(-50%); transform: translateX(-50%); }
|
}
|
@keyframes missed-scroll {
|
0% { transform: translateX(0); }
|
100% { transform: translateX(-50%); }
|
}
|
|
.missed-bar .patient-item {
|
display: -webkit-inline-box;
|
display: -webkit-inline-flex;
|
display: inline-flex;
|
font-size: 17px;
|
padding: 3px 12px;
|
margin-right: 8px;
|
border-right: 1px solid #664444;
|
color: #cc9999;
|
}
|
|
.missed-bar .patient-item:last-child {
|
border-right: none;
|
}
|
|
.missed-bar .p-number {
|
color: #ff9966;
|
font-weight: bold;
|
margin-right: 6px;
|
}
|
|
.missed-bar .p-name {
|
color: #bbaaaa;
|
}
|
|
.missed-bar .p-room {
|
color: #ff6666;
|
font-size: 15px;
|
}
|
|
/* 底部栏 */
|
.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);
|
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;
|
}
|
|
/* 调试面板 */
|
.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: -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;
|
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 {
|
-webkit-box-flex: 1;
|
-webkit-flex: 1;
|
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();
|
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 = document.getElementById("debugBody");
|
if (body) {
|
body.insertAdjacentHTML("beforeend", logHtml);
|
body.scrollTop = body.scrollHeight;
|
}
|
}
|
|
// ================= 应用状态 =================
|
var appState = {
|
columnTitles: ["常规心电图", "动态心电图/血压", "心电图运动试验", "食道电生理", "动脉硬化监测"],
|
columnSubTitles: ["床边心电图(常规+频谱) / 心电向量图", "", "", "", ""],
|
patients: [],
|
apiBaseUrl: "http://localhost/admin-api",
|
// apiBaseUrl: "http://192.168.100.110/admin-api",
|
pollTimer: null,
|
callRepeatTimes: 2,
|
spokenPatients: {},
|
ttsQueue: [],
|
isSpeaking: false,
|
// 过号患者滚动速度配置:数值为动画周期秒数,越大越慢
|
missedScrollSpeedSlowest: 10, // 最慢速度(患者少时使用,秒数大=慢)
|
missedScrollSpeedFastest: 5 // 最快速度(患者多时上限,秒数小=快)
|
};
|
|
// ================= 语音播报 =================
|
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);
|
// Android 6 默认语速可能很快,适当调慢
|
utterance.rate = 0.85;
|
utterance.onend = function () {
|
appState.isSpeaking = false;
|
processTtsQueue();
|
};
|
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); }
|
}
|
|
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) {
|
if (!text) return;
|
appState.ttsQueue.push(text);
|
processTtsQueue();
|
}
|
|
// ================= 渲染:标题框架(仅初始化一次)=================
|
function initLayout() {
|
var main = document.getElementById("mainContent");
|
var html = '<div class="columns-row">';
|
|
for (var i = 0; i < appState.columnTitles.length; i++) {
|
// 标题和副标题都有固定占位,避免有/无副标题时高度跳动
|
var subtitle = appState.columnSubTitles[i] || " ";
|
var colClass = (i === 0) ? 'col-wide' : 'col-normal';
|
html += '<div class="column-box ' + colClass + '">' +
|
'<div class="col-title">' +
|
'<div class="col-title-line">' + appState.columnTitles[i] + '</div>' +
|
'<div class="col-subtitle">' + subtitle + '</div>' +
|
'</div>' +
|
'<div class="patient-list" id="col-' + i + '"></div>' +
|
'</div>';
|
}
|
html += '</div>';
|
html += '<div class="missed-bar missed-bar-empty" id="missedBar">' +
|
'<span class="missed-bar-title">过号患者</span>' +
|
'<div class="missed-bar-scroll-area"><div class="missed-bar-track" id="missedBarTrack"></div></div>' +
|
'</div>';
|
main.innerHTML = html;
|
}
|
|
// ================= 渲染:患者列表(diff 更新,只改变化的列)=================
|
function desensitizeName(name) {
|
if (!name || name.length < 2) return name || '';
|
return name.charAt(0) + '*' + name.substring(2);
|
}
|
|
function isMissedStatus(status) {
|
var s = parseInt(status, 10);
|
return s === 3 || s === 5 || s === 7;
|
}
|
|
function buildColumnHtml(colData) {
|
if (!Array.isArray(colData) || colData.length === 0) return "";
|
var h = "";
|
for (var p = 0; p < colData.length; p++) {
|
var pat = colData[p];
|
// 过号患者不显示在列内,统一在底部过号栏展示
|
if (isMissedStatus(pat.status)) continue;
|
var roomHtml = pat.roomName ? '<span class="p-room">(' + pat.roomName + ')</span>' : '';
|
h += '<div class="patient-item">' +
|
'<span class="p-number">' + (pat.seqNum || '') + '</span>' +
|
'<span class="p-name-wrap"><span class="p-name">' + desensitizeName(pat.patName) + '</span>' + roomHtml + '</span>' +
|
'</div>';
|
}
|
return h;
|
}
|
|
function buildMissedBarHtml(dataList) {
|
var allMissed = [];
|
for (var i = 0; i < appState.columnTitles.length; i++) {
|
var colData = (dataList && dataList[i]) ? dataList[i] : [];
|
for (var p = 0; p < colData.length; p++) {
|
var pat = colData[p];
|
if (isMissedStatus(pat.status)) {
|
allMissed.push({ patient: pat, colIndex: i });
|
}
|
}
|
}
|
if (allMissed.length === 0) return "";
|
var h = "";
|
for (var m = 0; m < allMissed.length; m++) {
|
var item = allMissed[m];
|
var pat = item.patient;
|
var colName = appState.columnTitles[item.colIndex];
|
var roomHtml = pat.roomName ? ' <span class="p-room">' + pat.roomName + '</span>' : '';
|
h += '<span class="patient-item">' +
|
'<span class="p-number">[' + colName + '] ' + (pat.seqNum || '') + '</span>' +
|
'<span class="p-name">' + desensitizeName(pat.patName) + '</span>' + roomHtml +
|
'</span>';
|
}
|
// 复制一份内容实现无缝循环滚动
|
return h + h;
|
}
|
|
function isSameColumn(a, b) {
|
if (!Array.isArray(a) || !Array.isArray(b)) return a === b;
|
if (a.length !== b.length) return false;
|
for (var i = 0; i < a.length; i++) {
|
if (a[i].patId !== b[i].patId) return false;
|
if (a[i].roomName !== b[i].roomName) return false;
|
if (parseInt(a[i].status, 10) !== parseInt(b[i].status, 10)) return false;
|
}
|
return true;
|
}
|
|
function updatePatients(dataList) {
|
for (var i = 0; i < appState.columnTitles.length; i++) {
|
var newData = (dataList && dataList[i]) ? dataList[i] : [];
|
var oldData = appState.patients[i];
|
|
// diff:数据未变化则跳过该列 DOM 操作
|
if (isSameColumn(oldData, newData)) continue;
|
|
var col = document.getElementById("col-" + i);
|
if (col) col.innerHTML = buildColumnHtml(newData);
|
}
|
|
// 更新底部过号栏
|
var missedBar = document.getElementById("missedBar");
|
var missedTrack = document.getElementById("missedBarTrack");
|
if (missedBar && missedTrack) {
|
var missedHtml = buildMissedBarHtml(dataList);
|
if (missedHtml) {
|
missedTrack.innerHTML = missedHtml;
|
missedBar.className = "missed-bar missed-bar-scroll";
|
// 根据过号患者人数动态调整滚动速度
|
updateMissedBarSpeed(missedTrack, dataList);
|
} else {
|
missedBar.className = "missed-bar missed-bar-empty";
|
}
|
}
|
}
|
|
// ================= 过号栏滚动速度 =================
|
// 统计过号患者总数,在 0 到 20 人之间线性插值动画时长
|
// 人少时用最慢速度(秒数大),人多时逼近最快速度(秒数小),最多 20 人达到上限
|
function updateMissedBarSpeed(trackEl, dataList) {
|
var count = 0;
|
for (var i = 0; i < appState.columnTitles.length; i++) {
|
var colData = (dataList && dataList[i]) ? dataList[i] : [];
|
for (var p = 0; p < colData.length; p++) {
|
if (isMissedStatus(colData[p].status)) count++;
|
}
|
}
|
if (count === 0) return;
|
|
var slowest = appState.missedScrollSpeedSlowest;
|
var fastest = appState.missedScrollSpeedFastest;
|
// 人数阈值:超过此人数即使用最快速度
|
var maxCount = 20;
|
// 线性插值:count=1 -> slowest, count>=maxCount -> fastest
|
var ratio = Math.min(count, maxCount) / maxCount;
|
var duration = slowest - (slowest - fastest) * ratio;
|
// 取整到一位小数,兼具精度和简洁
|
duration = Math.round(duration * 10) / 10;
|
|
var animValue = 'missed-scroll ' + duration + 's linear infinite';
|
trackEl.style.webkitAnimation = animValue;
|
trackEl.style.animation = animValue;
|
}
|
|
// ================= 数据对比与播报 =================
|
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.seqNum + " 号 " + newPat.patName + " 到 " + newPat.roomName + " 就诊。";
|
}
|
speak(repeatText);
|
appState.spokenPatients[newPat.patId] = true;
|
logDebug("[排队] " + newPat.patName + " -> " + newPat.roomName);
|
}
|
}
|
}
|
}
|
}
|
}
|
|
// ================= 数据获取 =================
|
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] : [];
|
}
|
}
|
// 先 diff 更新 DOM,再播报,最后保存数据用于下次对比
|
updatePatients(dataList);
|
checkAndSpeakNewRooms(appState.patients, dataList);
|
appState.patients = dataList;
|
|
// 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 || "网络错误"));
|
}
|
});
|
}
|
|
// ================= 初始化 =================
|
function onReady() {
|
initLayout();
|
updateHeaderTime();
|
setInterval(updateHeaderTime, 1000);
|
fetchQueueData();
|
appState.pollTimer = setInterval(fetchQueueData, 5000);
|
logDebug("[系统] 启动完成 - Android 6.0.1");
|
}
|
|
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()) + "日";
|
var weekStr = weekDays[now.getDay()];
|
var timeStr = padZero(now.getHours()) + ":" + padZero(now.getMinutes());
|
var el = document.getElementById("headerTime");
|
// 星期和日期各占一行在左,时间大字在右跨两行
|
if (el) el.innerHTML = '<div class="time-info-inner"><div class="time-left"><div>' + weekStr + '</div><div>' + dateStr + '</div></div><div class="time-right"><span class="time-clock">' + timeStr + '</span></div></div>';
|
}
|
|
// 兼容 DOM ready(Android 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>
|