From 1b88366ba0cd86fc712834b3c046c2fa026b6204 Mon Sep 17 00:00:00 2001 From: mac Date: Mon, 6 Jul 2026 19:19:41 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B4=B9=E7=94=A8=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=BA=BF=E4=B8=8A=E4=BF=9D=E5=AD=98=E5=A4=B1=E8=B4=A5=20?= =?UTF-8?q?=E2=80=94=20=E7=A9=BA=E5=80=BC=E8=BD=AC0=E5=85=BC=E5=AE=B9MySQL?= =?UTF-8?q?=E4=B8=A5=E6=A0=BC=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit expense.js保存时amount/incurred_amount空字符串转为0 避免MySQL 8.x strict mode报Data truncated --- backend/routes.py | 37 ++++++++++++++++++++++++++----------- static/modules/expense.js | 5 ++++- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/backend/routes.py b/backend/routes.py index 000bb27..e010991 100644 --- a/backend/routes.py +++ b/backend/routes.py @@ -327,20 +327,25 @@ def bootstrap(): all_metrics[-1]["paid_month"] = t_sum_budget("paid", [_now_month]) all_metrics[-1]["paid_prev_q"] = t_sum_budget("paid", _prev_q_range) all_metrics[-1]["paid_prev_month"] = t_sum_budget("paid", [_prev_month]) if _prev_month else 0 + all_metrics[-1]["proj_expense_annual"] = t_sum_budget("expense", range(1, 13)) + all_metrics[-1]["proj_expense_q2"] = t_sum_budget("expense", _q_range) + all_metrics[-1]["proj_expense_month"] = t_sum_budget("expense", [_now_month]) + all_metrics[-1]["proj_expense_prev_q"] = t_sum_budget("expense", _prev_q_range) + all_metrics[-1]["proj_expense_prev_month"] = t_sum_budget("expense", [_prev_month]) if _prev_month else 0 all_metrics[-1]["cashflow_annual"] = all_metrics[-1]["payment_annual"] - all_metrics[-1]["paid_annual"] all_metrics[-1]["cashflow_q2"] = all_metrics[-1]["payment_q2"] - all_metrics[-1]["paid_q2"] all_metrics[-1]["cashflow_month"] = all_metrics[-1]["payment_month"] - all_metrics[-1]["paid_month"] all_metrics[-1]["cashflow_prev_q"] = all_metrics[-1]["payment_prev_q"] - all_metrics[-1]["paid_prev_q"] all_metrics[-1]["cashflow_prev_month"] = all_metrics[-1]["payment_prev_month"] - all_metrics[-1]["paid_prev_month"] - all_metrics[-1]["profit_annual"] = all_metrics[-1]["gross_annual"] - all_metrics[-1]["expense_annual"] - all_metrics[-1]["profit_q2"] = all_metrics[-1]["gross_q2"] - all_metrics[-1]["expense_q2"] - all_metrics[-1]["profit_month"] = all_metrics[-1]["monthly_net_profit"] - all_metrics[-1]["expense_month"] - all_metrics[-1]["profit_prev_q"] = all_metrics[-1]["gross_prev_q"] - all_metrics[-1]["expense_prev_q"] - all_metrics[-1]["profit_prev_month"] = all_metrics[-1]["gross_prev_month"] - all_metrics[-1]["expense_prev_month"] + all_metrics[-1]["profit_annual"] = all_metrics[-1]["gross_annual"] - all_metrics[-1]["proj_expense_annual"] + all_metrics[-1]["profit_q2"] = all_metrics[-1]["gross_q2"] - all_metrics[-1]["proj_expense_q2"] + all_metrics[-1]["profit_month"] = all_metrics[-1]["monthly_net_profit"] - all_metrics[-1]["proj_expense_month"] + all_metrics[-1]["profit_prev_q"] = all_metrics[-1]["gross_prev_q"] - all_metrics[-1]["proj_expense_prev_q"] + all_metrics[-1]["profit_prev_month"] = all_metrics[-1]["gross_prev_month"] - all_metrics[-1]["proj_expense_prev_month"] all_monthly.append(monthly_finance(conn, t)) all_recent.extend(rows(conn, "SELECT * FROM follow_up_records WHERE tenant=? ORDER BY id DESC LIMIT 4", [t])) agg = {} - for key in ["total_projects","total_proposals","total_products","upcoming_products","signed_amount","signed_annual","signed_q2","signed_month","signed_prev_q","signed_prev_month","revenue_annual","revenue_q2","monthly_revenue","revenue_prev_q","revenue_prev_month","gross_annual","gross_q2","monthly_net_profit","gross_prev_q","gross_prev_month","payment_annual","payment_q2","payment_month","payment_prev_q","payment_prev_month","cost_annual","cost_q2","cost_month","cost_prev_q","cost_prev_month","expense_annual","expense_q2","expense_month","expense_prev_q","expense_prev_month","paid_annual","paid_q2","paid_month","paid_prev_q","paid_prev_month","cashflow_annual","cashflow_q2","cashflow_month","cashflow_prev_q","cashflow_prev_month","profit_annual","profit_q2","profit_month","profit_prev_q","profit_prev_month"]: + for key in ["total_projects","total_proposals","total_products","upcoming_products","signed_amount","signed_annual","signed_q2","signed_month","signed_prev_q","signed_prev_month","revenue_annual","revenue_q2","monthly_revenue","revenue_prev_q","revenue_prev_month","gross_annual","gross_q2","monthly_net_profit","gross_prev_q","gross_prev_month","payment_annual","payment_q2","payment_month","payment_prev_q","payment_prev_month","cost_annual","cost_q2","cost_month","cost_prev_q","cost_prev_month","expense_annual","expense_q2","expense_month","expense_prev_q","expense_prev_month","paid_annual","paid_q2","paid_month","paid_prev_q","paid_prev_month","cashflow_annual","cashflow_q2","cashflow_month","cashflow_prev_q","cashflow_prev_month","profit_annual","profit_q2","profit_month","profit_prev_q","profit_prev_month","proj_expense_annual","proj_expense_q2","proj_expense_month","proj_expense_prev_q","proj_expense_prev_month"]: agg[key] = sum(m.get(key, 0) for m in all_metrics) merged_monthly = [] for i in range(12): @@ -432,16 +437,21 @@ def bootstrap(): paid_month = sum_budget("paid", [_now_month]) paid_prev_q = sum_budget("paid", _prev_q_range) paid_prev_month = sum_budget("paid", [_prev_month]) if _prev_month else 0 + proj_expense_annual = sum_budget("expense", range(1, 13)) + proj_expense_q2 = sum_budget("expense", _q_range) + proj_expense_month = sum_budget("expense", [_now_month]) + proj_expense_prev_q = sum_budget("expense", _prev_q_range) + proj_expense_prev_month = sum_budget("expense", [_prev_month]) if _prev_month else 0 cashflow_annual = payment_annual - paid_annual cashflow_q2 = payment_q2 - paid_q2 cashflow_month = payment_month - paid_month cashflow_prev_q = payment_prev_q - paid_prev_q cashflow_prev_month = payment_prev_month - paid_prev_month - profit_annual = gross_annual - expense_annual - profit_q2 = gross_q2 - expense_q2 - profit_month = gross_month - expense_month_val - profit_prev_q = gross_prev_q - expense_prev_q - profit_prev_month = gross_prev_month - expense_prev_month + profit_annual = gross_annual - proj_expense_annual + profit_q2 = gross_q2 - proj_expense_q2 + profit_month = gross_month - proj_expense_month + profit_prev_q = gross_prev_q - proj_expense_prev_q + profit_prev_month = gross_prev_month - proj_expense_prev_month def pf_status_sum(status): return sum(x["sign_amount"] or 0 for x in pfs if x["status"] == status) signed_amount = pf_status_sum("已签约") @@ -513,6 +523,11 @@ def bootstrap(): "profit_month": profit_month, "profit_prev_q": profit_prev_q, "profit_prev_month": profit_prev_month, + "proj_expense_annual": proj_expense_annual, + "proj_expense_q2": proj_expense_q2, + "proj_expense_month": proj_expense_month, + "proj_expense_prev_q": proj_expense_prev_q, + "proj_expense_prev_month": proj_expense_prev_month, "signed_not_executed": signed_not_executed, }, "recent": q("SELECT * FROM follow_up_records WHERE tenant=? ORDER BY id DESC LIMIT 8", tenant), diff --git a/static/modules/expense.js b/static/modules/expense.js index e4ff43d..12080c0 100644 --- a/static/modules/expense.js +++ b/static/modules/expense.js @@ -137,6 +137,9 @@ window.saveExpense = async function(event) { event.preventDefault(); var form = event.target; var data = Object.fromEntries(new FormData(form).entries()); + // 数字字段空值转 0,避免线上 MySQL 严格模式报错 + if (data.amount === '' || data.amount === undefined) data.amount = 0; + if (data.incurred_amount === '' || data.incurred_amount === undefined) data.incurred_amount = 0; var isEdit = !!data.expense_id; delete data.expense_id; @@ -145,7 +148,7 @@ window.saveExpense = async function(event) { var method = isEdit ? "PUT" : "POST"; var resp = await fetch(url, { method: method, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ data: Object.assign({}, data, { tenant: state.tenant }) }) }); - if (!resp.ok) { alert("保存失败"); return; } + if (!resp.ok) { var err = await resp.text(); alert("保存失败:" + err); return; } var bResp = await fetch("/api/bootstrap?tenant=" + encodeURIComponent(state.tenant)); if (bResp.ok) {