fix(dashboard): 统一所有时间字段为本地时区展示 (#277)

将流转日志、会话详情、奏章时间线、巡检报告中的原始 substring
时间提取替换为 parseDateFlexible + 本地格式化,消除 UTC/本地混用。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
cft0808
2026-04-14 23:05:15 +08:00
parent 70cd997a25
commit f41c981a19

View File

@@ -1382,7 +1382,7 @@ function openTask(id){
const isOk = (fl.remark||'').includes('✅')||fl.to==='皇上';
const dotCls = isOk ? 'fl-ok' : (fl.from==='皇上'||fl.to==='皇上') ? 'fl-purple' : 'fl-blue';
return `<div class="fl-item">
<div class="fl-time">${fl.at?fl.at.substring(11,16):''}</div>
<div class="fl-time">${fl.at?fmtLocalHM(fl.at):''}</div>
<div class="fl-dot" style="background:${col}"></div>
<div class="fl-content">
<div class="fl-who">
@@ -1772,6 +1772,18 @@ function fmtActivityTime(ts){
if(!d) return '';
return `${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')}:${String(d.getSeconds()).padStart(2,'0')}`;
}
function fmtLocalHM(ts){
const d = parseDateFlexible(ts);
if(!d) return '';
return `${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')}`;
}
function fmtLocalFull(ts){
const d = parseDateFlexible(ts);
if(!d) return '';
const Y=d.getFullYear(), M=String(d.getMonth()+1).padStart(2,'0'), D=String(d.getDate()).padStart(2,'0');
const h=String(d.getHours()).padStart(2,'0'), m=String(d.getMinutes()).padStart(2,'0'), s=String(d.getSeconds()).padStart(2,'0');
return `${Y}-${M}-${D} ${h}:${m}:${s}`;
}
/* ══ MODEL CONFIG ══ */
// Fallback 硬编码列表,优先从后端 knownModels 动态获取
@@ -2163,7 +2175,7 @@ function openSessionDetail(jsonStr){
const kLabel = kind==='assistant'?'回复':kind==='tool'?'工具':kind==='user'?'用户':'事件';
let txt = (a.text||'').replace(/\[\[.*?\]\]/g,'').replace(/\*\*/g,'').trim();
if(txt.length>200) txt=txt.substring(0,200)+'…';
const time = (a.at||'').substring(11,19);
const time = fmtActivityTime(a.at);
return `<div style="padding:8px 12px;border-bottom:1px solid var(--line);font-size:12px;line-height:1.5">
<div style="display:flex;align-items:center;gap:6px;margin-bottom:3px">
<span>${kIcon}</span>
@@ -2768,7 +2780,7 @@ function renderGlobalScanDetails(){
}
function buildGlobalScanReport(){
const checked = globalScanCheckedAt ? globalScanCheckedAt.replace('T',' ').replace('Z','') : '未知时间';
const checked = globalScanCheckedAt ? fmtLocalFull(globalScanCheckedAt) || globalScanCheckedAt.replace('T',' ').replace('Z','') : '未知时间';
const count = Number(globalScanCount || globalScanActions.length || 0);
const lines = [
'【太子巡检报告】',
@@ -2934,7 +2946,7 @@ function openMemorial(jsonStr){
<span class="md-tl-to">→ ${esc(f.to||'')}</span>
</div>
<div class="md-tl-remark">${esc(f.remark||'')}</div>
<div class="md-tl-time">${esc((f.at||'').substring(0,19).replace('T',' '))}</div>
<div class="md-tl-time">${esc(fmtLocalFull(f.at))}</div>
</div>`;
}).join('')}</div>
</div>`;