feat: 首页重构 — 财务概览转置+部门经营卡片+命名统一
首页: - 5卡片→表格(行=指标,列=时间),新增已付/现金流/项目利润行,费用行 - 行列对换:8列(年度/季度/季环比/本月/月环比/上季度/上月)×9行 - 新增「部门经营情况」卡片(部门利润/费用/净利) - 趋势图3→4列,新增月度项目利润折线图(indigo) - 命名:利润→项目利润,费用→项目费用,月度利润→月度项目利润 - 卡片改名:经营管理→项目管理,财务概览→业务(项目)财务概览 - 指标列统一颜色,去掉行编号 项目模块: - 利润→项目利润,费用→项目费用,总费用→总项目费用 - 月度回款与费用→月度回款与已付,柱状图→折线图 后端: - 新增paid/cashflow/profit指标聚合(单/多租户) - monthly_finance新增paid字段 - helpers.py修复重复return data
This commit is contained in:
@@ -322,15 +322,30 @@ def bootstrap():
|
||||
all_metrics[-1]["expense_month"] = t_expense_sum([_now_month])
|
||||
all_metrics[-1]["expense_prev_q"] = t_expense_sum(_prev_q_range)
|
||||
all_metrics[-1]["expense_prev_month"] = t_expense_sum([_prev_month]) if _prev_month else 0
|
||||
all_metrics[-1]["paid_annual"] = t_sum_budget("paid", range(1, 13))
|
||||
all_metrics[-1]["paid_q2"] = t_sum_budget("paid", _q_range)
|
||||
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]["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_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"]:
|
||||
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"]:
|
||||
agg[key] = sum(m.get(key, 0) for m in all_metrics)
|
||||
merged_monthly = []
|
||||
for i in range(12):
|
||||
m = {"month": all_monthly[0][i]["month"] if all_monthly and len(all_monthly[0]) > i else f"2026-{i+1:02d}"}
|
||||
for field in ["revenue","gross","payment","cost","sign"]:
|
||||
for field in ["revenue","gross","payment","cost","paid","sign"]:
|
||||
m[field] = sum(tl[i][field] if i < len(tl) else 0 for tl in all_monthly)
|
||||
merged_monthly.append(m)
|
||||
summary = {
|
||||
@@ -412,6 +427,21 @@ def bootstrap():
|
||||
expense_month_val = expense_sum([_now_month])
|
||||
expense_prev_q = expense_sum(_prev_q_range)
|
||||
expense_prev_month = expense_sum([_prev_month]) if _prev_month else 0
|
||||
paid_annual = sum_budget("paid", range(1, 13))
|
||||
paid_q2 = sum_budget("paid", _q_range)
|
||||
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
|
||||
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
|
||||
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("已签约")
|
||||
@@ -468,6 +498,21 @@ def bootstrap():
|
||||
"expense_month": expense_month_val,
|
||||
"expense_prev_q": expense_prev_q,
|
||||
"expense_prev_month": expense_prev_month,
|
||||
"paid_annual": paid_annual,
|
||||
"paid_q2": paid_q2,
|
||||
"paid_month": paid_month,
|
||||
"paid_prev_q": paid_prev_q,
|
||||
"paid_prev_month": paid_prev_month,
|
||||
"cashflow_annual": cashflow_annual,
|
||||
"cashflow_q2": cashflow_q2,
|
||||
"cashflow_month": cashflow_month,
|
||||
"cashflow_prev_q": cashflow_prev_q,
|
||||
"cashflow_prev_month": cashflow_prev_month,
|
||||
"profit_annual": profit_annual,
|
||||
"profit_q2": profit_q2,
|
||||
"profit_month": profit_month,
|
||||
"profit_prev_q": profit_prev_q,
|
||||
"profit_prev_month": profit_prev_month,
|
||||
"signed_not_executed": signed_not_executed,
|
||||
},
|
||||
"recent": q("SELECT * FROM follow_up_records WHERE tenant=? ORDER BY id DESC LIMIT 8", tenant),
|
||||
|
||||
Reference in New Issue
Block a user