diff --git a/backend/routes.py b/backend/routes.py index 89b0ba2..356f528 100644 --- a/backend/routes.py +++ b/backend/routes.py @@ -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,7 +75,7 @@ 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] @@ -126,10 +126,9 @@ def auth_me(): if "user_id" not in session: return jsonify({"logged_in": False}) tenants = session.get("tenants", []) - tenants = [t if t != "总工作台" else "总览" for t in 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 + tenants = [t for t in tenants if t != "总览" and t != "总工作台"] return jsonify({ "logged_in": True, "user": {"id": session["user_id"], "username": session["username"], "display_name": session["display_name"], "role": session["role"]}, @@ -263,47 +262,13 @@ def bootstrap(): _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] allowed = [t if t != "学会·无界" else "学术·无界" for t in allowed] - if "总览" not in allowed: - allowed = ["总览"] + allowed + allowed = [t for t in allowed if t != "总览" and t != "总工作台"] if tenant not in allowed: - tenant = allowed[0] + tenant = allowed[0] if allowed else "" conn = db() try: - if tenant == "总览": - real_tenants = [t for t in allowed if t != "总览"] - all_metrics = [] - all_monthly = [] - all_recent = [] - for t in real_tenants: - t_ops = attach_common(conn, "operations", rows(conn, "SELECT * FROM operation_projects WHERE tenant=? ORDER BY id ASC", [t])) - t_sales = attach_common(conn, "sales", rows(conn, "SELECT * FROM sales_leads WHERE tenant=? ORDER BY id DESC", [t])) - t_products = attach_common(conn, "products", rows(conn, "SELECT * FROM product_versions WHERE tenant=? ORDER BY id DESC", [t])) - t_proposals = attach_common(conn, "proposals", rows(conn, "SELECT * FROM business_proposals WHERE tenant=? ORDER BY id DESC", [t])) - t_pfs = rows(conn, "SELECT * FROM project_finances WHERE tenant=? ORDER BY id DESC", [t]) - t_expense = rows(conn, "SELECT * FROM expense_records WHERE tenant=? ORDER BY id DESC", [t]) - t_metrics = compute_metrics(t_pfs, t_ops, t_sales, t_products, t_proposals, t_expense, _year, conn, t) - all_metrics.append(t_metrics) - 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","expense_paid_annual","expense_paid_q2","expense_paid_month","expense_paid_prev_q","expense_paid_prev_month","dept_cf_annual","dept_cf_q2","dept_cf_month","dept_cf_prev_q","dept_cf_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): - m = {"month": all_monthly[0][i]["month"] if all_monthly and len(all_monthly[0]) > i else f"{_year}-{i+1:02d}"} - 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 = { - "project_name": "总览", - "metrics": agg, - "recent": sorted(all_recent, key=lambda x: x.get("id", 0), reverse=True)[:8], - "risks": [], - } - return jsonify({"summary": summary, "financeMonthly": merged_monthly, "tenant": tenant, "tenants": allowed}) - # 普通工作台:只查 summary 所需的数据(project_finances + operations + sales + products + proposals + expense) pfs = rows(conn, "SELECT * FROM project_finances WHERE tenant=? ORDER BY id DESC", [tenant]) operations = attach_common(conn, "operations", rows(conn, "SELECT * FROM operation_projects WHERE tenant=? ORDER BY id ASC", [tenant])) diff --git a/static/modules/finance.js b/static/modules/finance.js index 620ec32..38058ab 100644 --- a/static/modules/finance.js +++ b/static/modules/finance.js @@ -114,7 +114,7 @@ function renderFinance() { const finHeaderBase = `
|年份:|季度:${qLabels.map((q,i) => ``).join('')}|月度:${activeMonths.map(m => { const ms = `${state.finYear}-${String(m).padStart(2,'0')}`; return ``; }).join('')}
`; const finAddBtn = ``; - const isOverviewMode = state.tenant === "总览"; + const isOverviewMode = false; const finFilterTabs = `
${isOverviewMode ? '' : ``}
`; document.querySelector("#finance").innerHTML = `
diff --git a/static/modules/home.js b/static/modules/home.js index 6b38e5f..b4897ae 100644 --- a/static/modules/home.js +++ b/static/modules/home.js @@ -117,7 +117,7 @@ function renderHome() { } document.querySelector("#home").innerHTML = `
- ${state.tenant === "总览" ? "" : `
+ ${`
${[ ["项目管理", m.total_projects, "finance"], ["重点工作与台账", m.total_proposals, "projects"], diff --git a/static/modules/plan.js b/static/modules/plan.js index 37e693d..a8d1d1f 100644 --- a/static/modules/plan.js +++ b/static/modules/plan.js @@ -112,7 +112,7 @@ function renderPlan() { const finHeaderBase = `
|年份:|季度:${qLabels.map((q,i) => ``).join('')}|月度:${activeMonths.map(m => { const ms = `${state.planYear}-${String(m).padStart(2,'0')}`; return ``; }).join('')}
`; const finAddBtn = ``; - const isOverviewMode = state.tenant === "总览"; + const isOverviewMode = false; const planFilterTabs = `
${isOverviewMode ? '' : ``}
`; document.querySelector("#plan").innerHTML = `
diff --git a/static/modules/projects.js b/static/modules/projects.js index 36a401c..5fafa5c 100644 --- a/static/modules/projects.js +++ b/static/modules/projects.js @@ -25,7 +25,7 @@ window.toggleTenantMenu = (event) => { if (menu) { menu.remove(); return; } const btn = event.currentTarget; const rect = btn.getBoundingClientRect(); - const tenants = (state.allowedTenants || []).slice().sort(function(a, b) { var order = ['总览','学术·无界','MCN·无界','科普·无界','医患·无界','科研·无界']; var ai = order.indexOf(a); var bi = order.indexOf(b); if (ai < 0) ai = 99; if (bi < 0) bi = 99; return ai - bi; }); + const tenants = (state.allowedTenants || []).slice().sort(function(a, b) { var order = ['学术·无界','MCN·无界','科普·无界','医患·无界','科研·无界']; var ai = order.indexOf(a); var bi = order.indexOf(b); if (ai < 0) ai = 99; if (bi < 0) bi = 99; return ai - bi; }); menu = document.createElement("div"); menu.id = "tenantMenu"; menu.className = "fixed bg-white rounded-lg shadow-xl border border-slate-200 py-1 min-w-[160px] z-[9999]"; @@ -56,7 +56,7 @@ window.switchTenantFromMenu = (tenant) => { }; function updateTenantLabel() { - const tenants = (state.allowedTenants || []).slice().sort(function(a, b) { var order = ['总览','学术·无界','MCN·无界','科普·无界','医患·无界','科研·无界']; var ai = order.indexOf(a); var bi = order.indexOf(b); if (ai < 0) ai = 99; if (bi < 0) bi = 99; return ai - bi; }); + const tenants = (state.allowedTenants || []).slice().sort(function(a, b) { var order = ['学术·无界','MCN·无界','科普·无界','医患·无界','科研·无界']; var ai = order.indexOf(a); var bi = order.indexOf(b); if (ai < 0) ai = 99; if (bi < 0) bi = 99; return ai - bi; }); var tenantIcons = { '学术·无界': 'graduation-cap', 'MCN·无界': 'video', @@ -84,7 +84,7 @@ window.toggleTenantMenu = (event) => { if (menu) { menu.remove(); return; } const btn = event.currentTarget; const rect = btn.getBoundingClientRect(); - const tenants = (state.allowedTenants || []).slice().sort(function(a, b) { var order = ['总览','学术·无界','MCN·无界','科普·无界','医患·无界','科研·无界']; var ai = order.indexOf(a); var bi = order.indexOf(b); if (ai < 0) ai = 99; if (bi < 0) bi = 99; return ai - bi; }); + const tenants = (state.allowedTenants || []).slice().sort(function(a, b) { var order = ['学术·无界','MCN·无界','科普·无界','医患·无界','科研·无界']; var ai = order.indexOf(a); var bi = order.indexOf(b); if (ai < 0) ai = 99; if (bi < 0) bi = 99; return ai - bi; }); var tenantIcons = { '学术·无界': 'graduation-cap', 'MCN·无界': 'video', diff --git a/templates/index.html b/templates/index.html index 5141179..18c0455 100644 --- a/templates/index.html +++ b/templates/index.html @@ -76,7 +76,7 @@
-

OPC Manager v1.2.0.7

+

OPC Manager v1.2.0.8

科普 OPC 工作台