From c26cbb3cf45c9661ae6b3bb2ce8f2623ff218cfd Mon Sep 17 00:00:00 2001 From: mac Date: Thu, 9 Jul 2026 16:20:21 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=85=A8=E9=A1=B9=E7=9B=AE=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E4=BC=98=E5=8C=96-16=E5=A4=84load()=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E8=BD=BB=E9=87=8F=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - plan.js: createPlanFinance/deletePlanItem/planInlineUpdate - finance.js: createFinance/deleteFinanceItem - drawer.js: deleteDrawerItem/submitComment/deleteActivity - products.js: createResource/submitProductDrawer - projects.js: duplicateProject/submitTaskForm - proposals.js: ensureStandardProposals/submitStandardComment/submitProposal - plan_expense.js: savePlanExpense/deletePlanExpItem(上版本已修) - 所有保存/删除/编辑后改为/api//list+单模块render - 仅保留app.js初始加载和switchTenant切换工作台的全量load() - 版本号 v1.0.0.38 --- static/modules/drawer.js | 15 +++++++++++---- static/modules/finance.js | 6 ++++-- static/modules/plan.js | 9 ++++++--- static/modules/products.js | 4 ++-- static/modules/projects.js | 4 ++-- static/modules/proposals.js | 7 ++++--- templates/index.html | 2 +- 7 files changed, 30 insertions(+), 17 deletions(-) diff --git a/static/modules/drawer.js b/static/modules/drawer.js index 8defd61..f3cc60a 100644 --- a/static/modules/drawer.js +++ b/static/modules/drawer.js @@ -175,7 +175,9 @@ window.deleteDrawerItem = async (resource, id) => { logActivity(resType, id, "删除了「" + name + "」"); } closeDrawer(); - await load(); + var rk = resource === 'projectFinances' ? 'projectFinances' : resource === 'planFinances' ? 'planFinances' : null; + if (rk) { try { state.data[rk] = await api("/api/" + rk + "/list?tenant=" + encodeURIComponent(state.tenant)); } catch(e) {} } + if (resource === 'projectFinances') renderFinance(); else if (resource === 'planFinances') renderPlan(); } catch (error) { toast("删除失败:" + error.message, "error"); } @@ -216,21 +218,26 @@ window.submitComment = async (event, targetType, targetId, resource) => { button.disabled = true; button.textContent = "发送中…"; await api(`/api/followups/${targetType}/${targetId}`, { method: "POST", body: JSON.stringify({ data: { content } }) }); - await load(); + var ck = resource === 'projectFinances' ? 'projectFinances' : resource === 'planFinances' ? 'planFinances' : null; + if (ck) { try { state.data[ck] = await api("/api/" + ck + "/list?tenant=" + encodeURIComponent(state.tenant)); } catch(e) {} } openDrawer(resource, targetId); }; window.deleteActivity = async (id) => { if (!confirm("确认删除这条动态?")) return; await api(`/api/followups/${id}`, { method: "DELETE" }); - await load(); + var dk = resource === 'projectFinances' ? 'projectFinances' : resource === 'planFinances' ? 'planFinances' : null; + if (dk) { try { state.data[dk] = await api("/api/" + dk + "/list?tenant=" + encodeURIComponent(state.tenant)); } catch(e) {} } + if (resource === 'projectFinances') renderFinance(); else if (resource === 'planFinances') renderPlan(); }; window.deleteFollowup = async (event, followupId, resource, targetId) => { event.stopPropagation(); if (!confirm("确认删除这条评论?")) return; await api(`/api/followups/${followupId}`, { method: "DELETE" }); - await load(); + var fkey2 = resource === 'projectFinances' ? 'projectFinances' : resource === 'planFinances' ? 'planFinances' : null; + if (fkey2) { try { state.data[fkey2] = await api("/api/" + fkey2 + "/list?tenant=" + encodeURIComponent(state.tenant)); } catch(e) {} } + if (resource === 'projectFinances') renderFinance(); else if (resource === 'planFinances') renderPlan(); openDrawer(resource, targetId); }; diff --git a/static/modules/finance.js b/static/modules/finance.js index 1407b3b..e29c105 100644 --- a/static/modules/finance.js +++ b/static/modules/finance.js @@ -908,7 +908,8 @@ window.createFinance = async (event) => { document.querySelector("#pf-id-input").value = ""; document.querySelector("#financeModalTitle").textContent = "新增项目财务"; closeFinanceModal(); - await load(); + state.data.projectFinances = await api("/api/projectFinances/list?tenant=" + encodeURIComponent(state.tenant)); + renderFinance(); } catch (error) { toast("保存失败:" + error.message, "error"); } @@ -923,7 +924,8 @@ window.deleteFinanceItem = async () => { try { await api(`/api/projectFinances/${pfId}`, { method: "DELETE" }); closeFinanceModal(); - await load(); + state.data.projectFinances = await api("/api/projectFinances/list?tenant=" + encodeURIComponent(state.tenant)); + renderFinance(); toast("已删除", "success"); } catch (error) { toast("删除失败:" + error.message, "error"); diff --git a/static/modules/plan.js b/static/modules/plan.js index af4af1b..bb98368 100644 --- a/static/modules/plan.js +++ b/static/modules/plan.js @@ -945,7 +945,8 @@ window.createPlanFinance = async (event) => { document.querySelector("#plan_pf-id-input").value = ""; document.querySelector("#planModalTitle").textContent = "新增项目财务"; closePlanModal(); - await load(); + state.data.planFinances = await api("/api/planFinances/list?tenant=" + encodeURIComponent(state.tenant)); + renderPlan(); } catch (error) { toast("刷新失败:" + error.message, "error"); } @@ -960,7 +961,8 @@ window.deletePlanItem = async () => { try { await api(`/api/planFinances/${pfId}`, { method: "DELETE" }); closePlanModal(); - await load(); + state.data.planFinances = await api("/api/planFinances/list?tenant=" + encodeURIComponent(state.tenant)); + renderPlan(); toast("已删除", "success"); } catch (error) { toast("删除失败:" + error.message, "error"); @@ -1285,7 +1287,8 @@ function planInlineSelect(name, pfId, field, currentVal, options) { window.planInlineUpdate = async (pfId, field, value) => { try { await api("/api/planFinances/" + pfId, { method: "PUT", body: JSON.stringify({ data: { [field]: value } }) }); - await load(); + state.data.planFinances = await api("/api/planFinances/list?tenant=" + encodeURIComponent(state.tenant)); + renderPlan(); toast("已更新", "success"); } catch (error) { toast("更新失败:" + error.message, "error"); diff --git a/static/modules/products.js b/static/modules/products.js index 3c36906..ce742b7 100644 --- a/static/modules/products.js +++ b/static/modules/products.js @@ -19,7 +19,7 @@ async function createResource(event, resource) { const name = data.project_name || data.target_customer || data.customer_or_project_name || data.product_name || ""; if (result.id && name) logActivity(resType, result.id, "创建了" + name); form.reset(); - await load(); + try { state.data.products = await api("/api/products/list?tenant=" + encodeURIComponent(state.tenant)); renderProducts(); } catch(e) {} } catch (error) { toast("创建失败:" + error.message, "error"); } @@ -141,7 +141,7 @@ window.submitProductDrawer = async (event) => { form.reset(); closeProductDrawer(); if (result.id) logActivity("product", result.id, "创建了产品版本「" + data.product_name + " " + data.version + "」"); - await load(); + try { state.data.products = await api("/api/products/list?tenant=" + encodeURIComponent(state.tenant)); renderProducts(); } catch(e) {} } catch (error) { toast("创建失败:" + error.message, "error"); } diff --git a/static/modules/projects.js b/static/modules/projects.js index a2e8431..e3ad0b4 100644 --- a/static/modules/projects.js +++ b/static/modules/projects.js @@ -226,7 +226,7 @@ window.duplicateProject = async () => { }); } toast("已创建副本", "success"); - await load(); + try { state.data.operations = await api("/api/operations/list?tenant=" + encodeURIComponent(state.tenant)); renderProjects(); } catch(e) {} } catch (error) { toast("创建副本失败:" + error.message, "error"); } @@ -463,7 +463,7 @@ window.submitTaskForm = async (event, projectId) => { const result = await api("/api/tasks", { method: "POST", body: JSON.stringify({ data }) }); if (result.id && data.task) logActivity("task", result.id, "创建了任务「" + data.task + "」"); closeTaskDrawer(projectId); - await load(); + try { state.data.tasks = await api("/api/tasks/list?tenant=" + encodeURIComponent(state.tenant)); } catch(e) {} } } catch (error) { toast("保存失败:" + error.message, "error"); diff --git a/static/modules/proposals.js b/static/modules/proposals.js index 1ea68d9..2d962c5 100644 --- a/static/modules/proposals.js +++ b/static/modules/proposals.js @@ -32,7 +32,8 @@ async function ensureStandardProposals() { }); } catch (e) { /* ignore */ } } - await load(); + state.data.proposals = await api("/api/proposals/list?tenant=" + encodeURIComponent(state.tenant)); + renderProposals(); } window.switchProposalTab = (tab) => { @@ -183,7 +184,7 @@ window.submitStandardComment = async (event, targetId) => { button.disabled = true; button.textContent = "发送中…"; await api(`/api/followups/proposal/${targetId}`, { method: "POST", body: JSON.stringify({ data: { content } }) }); - await load(); + try { state.data.proposals = await api("/api/proposals/list?tenant=" + encodeURIComponent(state.tenant)); renderProposals(); } catch(e) {} openStandardProposalDrawer(targetId); }; @@ -207,7 +208,7 @@ window.submitProposal = async (event) => { if (result.id && data.customer_or_project_name) logActivity("proposal", result.id, "创建了方案「" + data.customer_or_project_name + "」"); form.reset(); closeProposalModal(); - await load(); + try { state.data.proposals = await api("/api/proposals/list?tenant=" + encodeURIComponent(state.tenant)); renderProposals(); } catch(e) {} } catch (error) { toast("保存失败:" + error.message, "error"); } diff --git a/templates/index.html b/templates/index.html index 97d2007..bf4de69 100644 --- a/templates/index.html +++ b/templates/index.html @@ -76,7 +76,7 @@
-

OPC Manager v1.0.0.37

+

OPC Manager v1.0.0.38

科普 OPC 工作台