diff --git a/web/mobile/index.html b/web/mobile/index.html
index 554b2c5..d5fde78 100644
--- a/web/mobile/index.html
+++ b/web/mobile/index.html
@@ -13,7 +13,10 @@
只读展示:工艺四状态 / KPI / 告警;交接班摘要按 handover_brief 章节渲染。 -->
iAOP 移动驾驶舱
- 只读
+
+
+ 只读
+
diff --git a/web/mobile/mobile.css b/web/mobile/mobile.css
index 93b05a7..a513478 100644
--- a/web/mobile/mobile.css
+++ b/web/mobile/mobile.css
@@ -18,7 +18,9 @@ body { margin: 0; font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
position: sticky; top: 0; z-index: 2; }
#topbar h1 { font-size: 17px; margin: 0; color: var(--cockpit-accent); }
#ro-badge { font-size: 11px; color: var(--cockpit-warn); border: 1px solid var(--cockpit-warn);
- border-radius: 10px; padding: 2px 8px; }
+ border-radius: 10px; padding: 2px 8px; margin-left: 8px; }
+.ghost-btn { background: none; border: 1px solid var(--cockpit-grid-line); border-radius: 8px;
+ color: var(--cockpit-accent); font-size: 12px; padding: 4px 10px; cursor: pointer; }
.view { display: none; padding: 10px 12px; }
.view.active { display: block; }
diff --git a/web/mobile/mobile.js b/web/mobile/mobile.js
index fda9176..dee01ac 100644
--- a/web/mobile/mobile.js
+++ b/web/mobile/mobile.js
@@ -71,7 +71,8 @@ function renderMobileCockpit(plan) {
kpiBox.innerHTML = "";
plan.widgets.forEach(function (w) {
if (w.type !== "kpi_card") return;
- var rnd = seededRandom(w.props.metric || "");
+ // 30s 时间桶入种子:刷新/定时重渲染时数值滚动(接真实总线后替换)
+ var rnd = seededRandom((w.props.metric || "") + "|" + Math.floor(Date.now() / 30000));
var card = el("div", "kpi");
card.appendChild(el("div", "v", (60 + rnd() * 40).toFixed(2)));
card.appendChild(el("div", "l", w.props.label || w.props.metric));
@@ -231,11 +232,16 @@ function generateBrief() {
fetch(ALARM_PLAN_URL).then(function (r) { return r.ok ? r.json() : null; })
.then(function (p) { if (p && p.severityStyles) severityStyles = p.severityStyles; })
.catch(function () {});
- fetch(PLAN_URL).then(function (r) { return r.json(); })
- .then(renderMobileCockpit)
- .catch(function (e) {
- document.getElementById("m-stages").innerHTML = "";
- document.getElementById("m-stages").appendChild(
- el("div", "hint", "布局资产加载失败:" + e.message + "(请从 web/ 根目录起服务)"));
- });
+ // issue #157:只读数据手动刷新(重新加载布局资产并重渲染 KPI/告警)
+ function loadPlan() {
+ fetch(PLAN_URL).then(function (r) { return r.json(); })
+ .then(renderMobileCockpit)
+ .catch(function (e) {
+ document.getElementById("m-stages").innerHTML = "";
+ document.getElementById("m-stages").appendChild(
+ el("div", "hint", "布局资产加载失败:" + e.message + "(请从 web/ 根目录起服务)"));
+ });
+ }
+ document.getElementById("btn-refresh").onclick = loadPlan;
+ loadPlan();
})();