feat: 经营报表年份支持 + 项目管理年份过滤修复

- 经营月报/季报增加年份选择入口,数据按选中年份过滤
- 年份下拉框扩展至 2020-2027,增加「所有年份」选项
- 项目管理视图全年/季度/月度均按年份过滤项目列表
- 修复月度视图在所有年份模式下数据查询(substring→slice)
- 修复 finView/finFilter 初始化,确保全年标签默认选中
- 修复 yearly API 缺失 tenant 参数导致跨工作台数据错误
- 费用数据(expense)遍历加年份过滤,季报指标改为从 fm 累加
This commit is contained in:
mac
2026-07-14 15:25:35 +08:00
parent f619ed34a7
commit d2d1b0f99e
4 changed files with 163 additions and 51 deletions

View File

@@ -61,8 +61,8 @@ def attach_common(conn, resource, items):
return items
def monthly_finance(conn, tenant="科普·无界"):
_year = date.today().year
def monthly_finance(conn, tenant="科普·无界", year=None):
_year = year or date.today().year
months = [f"{_year}-{m:02d}" for m in range(1, 13)]
pfs = rows(conn,
"SELECT sign_amount, sign_month, budget_data, expense_data FROM project_finances WHERE tenant=?",

View File

@@ -489,6 +489,42 @@ def bootstrap():
conn.close()
@bp.route("/api/finance/yearly")
@login_required
def finance_yearly():
"""按年份返回经营月报/季报所需的 12 月财务数据支持历史年份切换。year=0 表示所有年份"""
_year = request.args.get("year", type=int)
if _year is None:
_year = date.today().year
tenant = request.args.get("tenant", session.get("tenants", ["科普·无界"])[0])
allowed = session.get("tenants", [])
allowed = [t if t != "总工作台" else "科普·无界" for t in allowed]
allowed = [t if t != "学会·无界" else "学术·无界" for t in allowed]
if tenant not in allowed:
tenant = allowed[0] if allowed else ""
conn = db()
try:
if _year == 0:
# 所有年份:查出所有有数据的年份,合并 12 个月
yr_rows = rows(conn,
"SELECT DISTINCT SUBSTRING(sign_month,1,4) AS y FROM project_finances WHERE tenant=? AND sign_month IS NOT NULL AND sign_month!='' ORDER BY y",
[tenant])
all_years = [int(r["y"]) for r in yr_rows if r["y"] and r["y"].isdigit()]
if not all_years:
all_years = [date.today().year]
merged = [{"month": f"所有-{m+1:02d}", "revenue": 0, "gross": 0, "payment": 0, "cost": 0, "paid": 0, "sign": 0}
for m in range(12)]
for y in all_years:
fm = monthly_finance(conn, tenant, y)
for i, m in enumerate(fm):
for k in ("revenue", "gross", "payment", "cost", "paid", "sign"):
merged[i][k] = round(merged[i][k] + (m[k] or 0), 2)
return jsonify({"year": 0, "financeMonthly": merged})
return jsonify({"year": _year, "financeMonthly": monthly_finance(conn, tenant, _year)})
finally:
conn.close()
# ---------- 通用 CRUD ----------
@bp.route("/api/<resource>/list", methods=["GET"])