feat: 经营报表年份支持 + 项目管理年份过滤修复
- 经营月报/季报增加年份选择入口,数据按选中年份过滤 - 年份下拉框扩展至 2020-2027,增加「所有年份」选项 - 项目管理视图全年/季度/月度均按年份过滤项目列表 - 修复月度视图在所有年份模式下数据查询(substring→slice) - 修复 finView/finFilter 初始化,确保全年标签默认选中 - 修复 yearly API 缺失 tenant 参数导致跨工作台数据错误 - 费用数据(expense)遍历加年份过滤,季报指标改为从 fm 累加
This commit is contained in:
@@ -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=?",
|
||||
|
||||
@@ -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"])
|
||||
|
||||
Reference in New Issue
Block a user