feat: 大版本更新-工作台改版+总报完善+UI优化

工作台改版:
- 学会→学术, 总工作台→总览(数据库迁移+session清理)
- 侧边栏工作台从下拉菜单改为竖向平铺+独立图标
- 5个工作台去除部门模块, 只有总览显示
- 工作台顺序: 总览→学术→MCN→科普→医患→科研

经营月报+季度月报:
- 月度/季度总览改名(月度总览→经营月报, 季度总览→季度月报)
- 财务概览增加回款/项目现金流行(7行)
- 新增业务线经营情况卡片(毛利/平台费用/利润)
- 新增业务线现金流卡片(项目现金流/平台费用已付/业务线现金流)
- 季度月报完善为三卡片结构, 与经营月报一致
- 计划模块总览独立数据源(computePlanMonthly)

UI优化:
- 汇总卡片单行显示+5x2网格+去外层卡片
- 项目表格行高压缩(py-px+line-height:0.95)
- 表头不压缩, 只压缩tbody
- 加权/项目类型内联下拉去原生箭头+自定义箭头
- 加权/项目类型表头去除排序箭头
- 实际模块已付→支出, 已回款→回款, 成本→成本(不含平台费用)
- 现金流注释(回款-支出)
- 卡片间距/筛选区/tip高度压缩
- 实际模块增加执行提示tip

修复:
- routes.py planFinances client_name列去重
- plan_expense.js savePlanExpense改用api()+load()
- plan.js createPlanFinance拆分try-catch
- 版本号 v1.0.0.35
This commit is contained in:
mac
2026-07-08 20:39:44 +08:00
parent e1b549b3f9
commit c0fb382d78
12 changed files with 365 additions and 160 deletions

View File

@@ -14,7 +14,7 @@ from helpers import add_file_index, attach_common, monthly_finance
bp = Blueprint("api", __name__)
ALL_TENANTS = ["工作台", "科普·无界", "科研·无界", "医患·无界", "MCN·无界", "·无界"]
ALL_TENANTS = ["", "科普·无界", "科研·无界", "医患·无界", "MCN·无界", "·无界"]
TABLES = {
"sales": ("sales_leads", ["target_customer", "priority", "status", "tenant"]),
@@ -75,10 +75,13 @@ def auth_login():
session["display_name"] = user["display_name"]
session["role"] = user["role"]
if user["role"] == "admin":
session["tenants"] = ["工作台", "科普·无界", "科研·无界", "医患·无界", "MCN·无界", "·无界"]
session["tenants"] = ["", "科普·无界", "科研·无界", "医患·无界", "MCN·无界", "·无界"]
else:
ut = rows(conn, "SELECT tenant FROM user_tenants WHERE user_id=?", (user["id"],))
session["tenants"] = [x["tenant"] for x in ut]
# 清理旧名称
session["tenants"] = [t if t != "总工作台" else "总览" for t in session["tenants"]]
session["tenants"] = [t if t != "学会·无界" else "学术·无界" for t in session["tenants"]]
return jsonify({
"ok": True,
"user": {"id": user["id"], "username": user["username"], "display_name": user["display_name"], "role": user["role"]},
@@ -123,8 +126,10 @@ def auth_me():
if "user_id" not in session:
return jsonify({"logged_in": False})
tenants = session.get("tenants", [])
if "总工作台" not in tenants:
tenants = ["总工作台"] + tenants
tenants = [t if t != "总工作台" else "总览" for t in tenants]
tenants = [t if t != "学会·无界" else "学术·无界" for t in tenants]
if "总览" not in tenants:
tenants = ["总览"] + tenants
return jsonify({
"logged_in": True,
"user": {"id": session["user_id"], "username": session["username"], "display_name": session["display_name"], "role": session["role"]},
@@ -257,15 +262,17 @@ def bootstrap():
_year = date.today().year
tenant = request.args.get("tenant", session.get("tenants", ["科普·无界"])[0])
allowed = session.get("tenants", [])
if "总工作台" not in allowed:
allowed = ["总工作台"] + allowed
allowed = [t if t != "总工作台" else "总览" for t in allowed]
allowed = [t if t != "学会·无界" else "学术·无界" for t in allowed]
if "总览" not in allowed:
allowed = ["总览"] + allowed
if tenant not in allowed:
tenant = allowed[0]
conn = db()
try:
# 总工作台:聚合所有工作台的首页数据
if tenant == "工作台":
real_tenants = [t for t in allowed if t != "工作台"]
if tenant == "":
real_tenants = [t for t in allowed if t != ""]
all_metrics = []
all_monthly = []
all_recent = []
@@ -423,7 +430,7 @@ def bootstrap():
m[field] = sum(tl[i][field] if i < len(tl) else 0 for tl in all_monthly)
merged_monthly.append(m)
summary = {
"project_name": "工作台",
"project_name": "",
"metrics": agg,
"recent": sorted(all_recent, key=lambda x: x.get("id", 0), reverse=True)[:8],
"risks": [],