fix: 切换工作台后数据不刷新
- 根因: ensureStandardProposals每次触发return跳过ensureTabData - 修复: ensureTabData移到ensureStandardProposals之前 - 增加_proposalsInitialized一次性flag避免重复检查 - switchTenant改为async+await load() - 版本号 v1.2.0.6
This commit is contained in:
@@ -185,18 +185,23 @@ async function load() {
|
|||||||
if (!state.data.planExpense) state.data.planExpense = [];
|
if (!state.data.planExpense) state.data.planExpense = [];
|
||||||
clearTabCache();
|
clearTabCache();
|
||||||
updateLoadingStep(0, allSteps.length);
|
updateLoadingStep(0, allSteps.length);
|
||||||
// 首次加载时确保标准资料库 7 项已初始化
|
// 按需加载当前 tab 的数据(必须在 ensureStandardProposals 之前,否则会被 return 跳过)
|
||||||
if (typeof ensureStandardProposals === "function") {
|
|
||||||
const existing = (state.data.proposals || []).filter(p => p.proposal_type === "标准资料");
|
|
||||||
const missingCount = 7 - existing.length;
|
|
||||||
if (missingCount > 0) {
|
|
||||||
hideLoadingOverlay();
|
|
||||||
await ensureStandardProposals();
|
|
||||||
return; // ensureStandardProposals 内部会再次 render
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 按需加载当前 tab 的数据
|
|
||||||
await ensureTabData(state.active);
|
await ensureTabData(state.active);
|
||||||
|
// 首次加载时确保标准资料库 7 项已初始化(仅首次,避免每次切换工作台都触发)
|
||||||
|
if (!_proposalsInitialized && typeof ensureStandardProposals === "function") {
|
||||||
|
_proposalsInitialized = true;
|
||||||
|
try {
|
||||||
|
const proposalsData = await api("/api/proposals/list?tenant=" + encodeURIComponent(state.tenant));
|
||||||
|
state.data.proposals = proposalsData;
|
||||||
|
const existing = (proposalsData || []).filter(p => p.proposal_type === "标准资料");
|
||||||
|
const missingCount = 7 - existing.length;
|
||||||
|
if (missingCount > 0) {
|
||||||
|
hideLoadingOverlay();
|
||||||
|
await ensureStandardProposals();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch(e) { /* non-critical */ }
|
||||||
|
}
|
||||||
// 逐步渲染
|
// 逐步渲染
|
||||||
for (var i = 0; i < _loadingSteps.length; i++) {
|
for (var i = 0; i < _loadingSteps.length; i++) {
|
||||||
var step = _loadingSteps[i];
|
var step = _loadingSteps[i];
|
||||||
@@ -223,6 +228,7 @@ var _tabResourceMap = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
var _tabLoaded = {};
|
var _tabLoaded = {};
|
||||||
|
var _proposalsInitialized = false;
|
||||||
|
|
||||||
async function ensureTabData(tab) {
|
async function ensureTabData(tab) {
|
||||||
if (tab === 'home' || tab === 'performance') return;
|
if (tab === 'home' || tab === 'performance') return;
|
||||||
@@ -233,10 +239,12 @@ async function ensureTabData(tab) {
|
|||||||
_tabLoaded[dataKey + '_' + state.tenant] = true;
|
_tabLoaded[dataKey + '_' + state.tenant] = true;
|
||||||
try {
|
try {
|
||||||
state.data[dataKey] = await api("/api/" + resource + "/list?tenant=" + encodeURIComponent(state.tenant));
|
state.data[dataKey] = await api("/api/" + resource + "/list?tenant=" + encodeURIComponent(state.tenant));
|
||||||
} catch(e) { /* non-critical */ }
|
} catch(e) { console.error('ensureTabData failed:', resource, e.message); }
|
||||||
// Load related expense data for finance/plan tabs
|
// Load related expense data for finance/plan tabs
|
||||||
if (tab === 'finance') {
|
if (tab === 'finance') {
|
||||||
try { state.data.expense = await api("/api/expense/list?tenant=" + encodeURIComponent(state.tenant)); } catch(e) {}
|
try { state.data.expense = await api("/api/expense/list?tenant=" + encodeURIComponent(state.tenant)); } catch(e) {}
|
||||||
|
try { state.data.finance = await api("/api/finance/list?tenant=" + encodeURIComponent(state.tenant)); } catch(e) {}
|
||||||
|
try { state.data.tasks = await api("/api/tasks/list?tenant=" + encodeURIComponent(state.tenant)); } catch(e) {}
|
||||||
} else if (tab === 'plan') {
|
} else if (tab === 'plan') {
|
||||||
try { state.data.planExpense = await api("/api/planExpense/list?tenant=" + encodeURIComponent(state.tenant)); } catch(e) {}
|
try { state.data.planExpense = await api("/api/planExpense/list?tenant=" + encodeURIComponent(state.tenant)); } catch(e) {}
|
||||||
}
|
}
|
||||||
@@ -358,7 +366,7 @@ window.setPlanSort = (key) => {
|
|||||||
else { state.planSort.key = key; state.planSort.asc = true; }
|
else { state.planSort.key = key; state.planSort.asc = true; }
|
||||||
renderPlan();
|
renderPlan();
|
||||||
};
|
};
|
||||||
window.switchTenant = (tenant) => {
|
window.switchTenant = async (tenant) => {
|
||||||
state.tenant = tenant;
|
state.tenant = tenant;
|
||||||
state.selectedProject = null;
|
state.selectedProject = null;
|
||||||
localStorage.setItem("opc-active-tenant", tenant);
|
localStorage.setItem("opc-active-tenant", tenant);
|
||||||
@@ -366,7 +374,8 @@ window.switchTenant = (tenant) => {
|
|||||||
if (typeof updateTenantLabel === "function") updateTenantLabel();
|
if (typeof updateTenantLabel === "function") updateTenantLabel();
|
||||||
updateSidebarTabs();
|
updateSidebarTabs();
|
||||||
if (tenant === "总览") { state.planFilter = 'overview'; state.finFilter = 'overview'; switchTab("home"); }
|
if (tenant === "总览") { state.planFilter = 'overview'; state.finFilter = 'overview'; switchTab("home"); }
|
||||||
load();
|
else if (state.active === 'home') { state.active = 'plan'; localStorage.setItem("opc-active-tab", "plan"); document.querySelectorAll(".sidebar-tab").forEach((btn) => btn.classList.toggle("active", btn.dataset.tab === "plan")); document.querySelectorAll(".panel").forEach((panel) => panel.classList.toggle("active", panel.id === "plan")); }
|
||||||
|
await load();
|
||||||
};
|
};
|
||||||
|
|
||||||
// 轻量刷新辅助函数
|
// 轻量刷新辅助函数
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
<header class="topbar border-b border-slate-200 bg-white px-8 py-5">
|
<header class="topbar border-b border-slate-200 bg-white px-8 py-5">
|
||||||
<div class="flex items-center gap-3 w-full">
|
<div class="flex items-center gap-3 w-full">
|
||||||
<div class="flex-1">
|
<div class="flex-1">
|
||||||
<p class="eyebrow text-xs font-semibold uppercase tracking-[0.18em] text-blue-700">OPC Manager <span class="ml-2 text-xs font-normal text-slate-400 tracking-normal">v1.2.0.5</span></p>
|
<p class="eyebrow text-xs font-semibold uppercase tracking-[0.18em] text-blue-700">OPC Manager <span class="ml-2 text-xs font-normal text-slate-400 tracking-normal">v1.2.0.6</span></p>
|
||||||
<div class="flex items-center gap-4 mt-1">
|
<div class="flex items-center gap-4 mt-1">
|
||||||
<h1 class="text-2xl font-semibold" id="workspaceTitle">科普 OPC 工作台</h1>
|
<h1 class="text-2xl font-semibold" id="workspaceTitle">科普 OPC 工作台</h1>
|
||||||
<div class="hidden sm:flex items-center gap-1.5 bg-gradient-to-r from-blue-50 to-indigo-50 border border-blue-100 rounded-full px-4 py-1.5">
|
<div class="hidden sm:flex items-center gap-1.5 bg-gradient-to-r from-blue-50 to-indigo-50 border border-blue-100 rounded-full px-4 py-1.5">
|
||||||
|
|||||||
Reference in New Issue
Block a user