---
title: 公开财务
date: 2026-08-27
tags: [财务, 公开, 透明]
description: 廉中自然科学局第207研究所公开财务信息，包含月度/年度收支明细、预算执行情况及同比分析。
---

## 公开财务

本页面公开207研究所的财务收支信息，确保财务透明。数据按月度更新，支持按年/月查看。

<div id="finance-app">
  <div class="finance-controls">
    <div class="finance-select-group">
      <label for="yearSelect">年份：</label>
      <select id="yearSelect" class="finance-select"></select>
      <label for="monthSelect">月份：</label>
      <select id="monthSelect" class="finance-select">
        <option value="all">全年汇总</option>
      </select>
    </div>
  </div>

  <div id="financeSummary" class="finance-summary"></div>

  <div id="financeDetail" class="finance-detail"></div>
</div>

<script>
const financeData = {
  "2026": {
    "8": {
      "budget": { "total": 100.00, "breakdown": { "域名": 50.00, "自由支配": 50.00 } },
      "expenses": {
        "域名费用": 48.00,
        "服务器费用": 0.00,
        "公关费用": 0.00,
        "AI相关费用": 0.00,
        "仓库维护费用": 0.00,
        "成员工资": 0.00,
        "工程项目费用": 0.00,
        "内务费用": 6.00,
        "其他费用": 0.00
      },
      "expenseDetails": {
        "内务费用": [
          { "item": "垃圾桶（家用规格）", "qty": 1, "unit": "个", "price": 6.00, "total": 6.00 },
          { "item": "电费", "qty": 0, "unit": "kW·h", "price": 0.50, "total": 0.00 }
        ]
      },
      "income": {
        "一手工程承接": 0.00,
        "外包承接": 0.00,
        "工程售卖": 0.00,
        "收费咨询": 0.00,
        "代办理费用": 0.00,
        "内容授权费用": 0.00,
        "预算收入": 100.00,
        "其他收入": 0.00
      },
      "note": "工程项目费用包含：科学实验费用、实践工程费用、外包工程费用、其他工程项目费用等。"
    }
  }
};

const EXPENSE_CATEGORIES = ["域名费用","服务器费用","公关费用","AI相关费用","仓库维护费用","成员工资","工程项目费用","内务费用","其他费用"];
const INCOME_CATEGORIES = ["一手工程承接","外包承接","工程售卖","收费咨询","代办理费用","内容授权费用","预算收入","其他收入"];

function fmt(n) {
  return "￥" + Number(n).toFixed(2);
}

function calcMonth(year, month) {
  const d = financeData[year] && financeData[year][month];
  if (!d) return null;
  const totalExp = EXPENSE_CATEGORIES.reduce((s, k) => s + (d.expenses[k] || 0), 0);
  const totalInc = INCOME_CATEGORIES.reduce((s, k) => s + (d.income[k] || 0), 0);
  return {
    totalExpense: totalExp,
    totalIncome: totalInc,
    netProfit: totalInc - totalExp,
    budget: d.budget.total,
    overBudget: totalExp - d.budget.total,
    budgetRemaining: d.budget.total - totalExp,
    data: d
  };
}

function calcYear(year) {
  const months = financeData[year];
  if (!months) return null;
  let totalExp = 0, totalInc = 0, totalBudget = 0;
  const monthList = Object.keys(months).sort();
  monthList.forEach(m => {
    const c = calcMonth(year, m);
    if (c) { totalExp += c.totalExpense; totalInc += c.totalIncome; totalBudget += c.budget; }
  });
  return {
    totalExpense: totalExp,
    totalIncome: totalInc,
    netProfit: totalInc - totalExp,
    budget: totalBudget,
    overBudget: totalExp - totalBudget,
    budgetRemaining: totalBudget - totalExp,
    months: monthList
  };
}

function growthRate(current, previous) {
  if (previous === undefined || previous === null || previous === 0) return "-/-";
  const rate = ((current - previous) / Math.abs(previous) * 100);
  return (rate >= 0 ? "+" : "") + rate.toFixed(1) + "%";
}

function renderSummary(c, isYear, year, month) {
  const yoyExp = "-/-";
  const yoyInc = "-/-";
  const yoyNet = "-/-";
  const overBudgetClass = c.overBudget > 0 ? "finance-negative" : "finance-positive";
  const netClass = c.netProfit >= 0 ? "finance-positive" : "finance-negative";

  return `
    <div class="finance-cards">
      <div class="finance-card">
        <div class="finance-card-label">总支出</div>
        <div class="finance-card-value">${fmt(c.totalExpense)}</div>
        <div class="finance-card-sub">同比 ${yoyExp}</div>
      </div>
      <div class="finance-card">
        <div class="finance-card-label">总收入</div>
        <div class="finance-card-value">${fmt(c.totalIncome)}</div>
        <div class="finance-card-sub">同比 ${yoyInc}</div>
      </div>
      <div class="finance-card">
        <div class="finance-card-label">净利润</div>
        <div class="finance-card-value ${netClass}">${fmt(c.netProfit)}</div>
        <div class="finance-card-sub">同比 ${yoyNet}</div>
      </div>
      <div class="finance-card">
        <div class="finance-card-label">原始预算</div>
        <div class="finance-card-value">${fmt(c.budget)}</div>
        <div class="finance-card-sub ${overBudgetClass}">${c.overBudget > 0 ? "超支 " + fmt(c.overBudget) : "结余 " + fmt(c.budgetRemaining)}</div>
      </div>
    </div>
  `;
}

function renderDetail(c, isYear, year, month) {
  let html = "";

  if (isYear) {
    html += `<h3 class="finance-section-title">${year}年 月度汇总</h3>`;
    html += `<table class="finance-table"><thead><tr><th>月份</th><th>总支出</th><th>总收入</th><th>净利润</th><th>原始预算</th><th>预算执行</th></tr></thead><tbody>`;
    c.months.forEach(m => {
      const mc = calcMonth(year, m);
      const exec = mc.budget > 0 ? (mc.totalExpense / mc.budget * 100).toFixed(1) + "%" : "-/-";
      html += `<tr><td>${year}年${m}月</td><td>${fmt(mc.totalExpense)}</td><td>${fmt(mc.totalIncome)}</td><td class="${mc.netProfit >= 0 ? 'finance-positive' : 'finance-negative'}">${fmt(mc.netProfit)}</td><td>${fmt(mc.budget)}</td><td>${exec}</td></tr>`;
    });
    html += `</tbody></table>`;
  } else {
    const d = c.data;
    html += `<h3 class="finance-section-title">${year}年${month}月 支出明细</h3>`;
    html += `<table class="finance-table"><thead><tr><th>项目</th><th>金额</th><th>占比</th></tr></thead><tbody>`;
    EXPENSE_CATEGORIES.forEach(k => {
      const v = d.expenses[k] || 0;
      const pct = c.totalExpense > 0 ? (v / c.totalExpense * 100).toFixed(1) + "%" : "0.0%";
      html += `<tr><td>${k}</td><td>${fmt(v)}</td><td>${pct}</td></tr>`;
    });
    html += `<tr class="finance-total-row"><td>合计</td><td>${fmt(c.totalExpense)}</td><td>100.0%</td></tr>`;
    html += `</tbody></table>`;

    if (d.expenseDetails) {
      Object.keys(d.expenseDetails).forEach(cat => {
        const items = d.expenseDetails[cat];
        if (items.some(i => i.total > 0)) {
          html += `<h4 class="finance-subtitle">${cat} 详细账目</h4>`;
          html += `<table class="finance-table finance-table-sm"><thead><tr><th>项目</th><th>数量</th><th>单价</th><th>小计</th></tr></thead><tbody>`;
          items.forEach(i => {
            html += `<tr><td>${i.item}</td><td>${i.qty}${i.unit}</td><td>${fmt(i.price)}/${i.unit}</td><td>${fmt(i.total)}</td></tr>`;
          });
          html += `</tbody></table>`;
        }
      });
    }

    html += `<h3 class="finance-section-title">${year}年${month}月 收入明细</h3>`;
    html += `<table class="finance-table"><thead><tr><th>项目</th><th>金额</th><th>占比</th></tr></thead><tbody>`;
    INCOME_CATEGORIES.forEach(k => {
      const v = d.income[k] || 0;
      const pct = c.totalIncome > 0 ? (v / c.totalIncome * 100).toFixed(1) + "%" : "0.0%";
      html += `<tr><td>${k}</td><td>${fmt(v)}</td><td>${pct}</td></tr>`;
    });
    html += `<tr class="finance-total-row"><td>合计</td><td>${fmt(c.totalIncome)}</td><td>100.0%</td></tr>`;
    html += `</tbody></table>`;

    if (d.budget && d.budget.breakdown) {
      html += `<h3 class="finance-section-title">原始预算分配</h3>`;
      html += `<table class="finance-table"><thead><tr><th>预算项目</th><th>分配金额</th></tr></thead><tbody>`;
      Object.keys(d.budget.breakdown).forEach(k => {
        html += `<tr><td>${k}</td><td>${fmt(d.budget.breakdown[k])}</td></tr>`;
      });
      html += `<tr class="finance-total-row"><td>合计</td><td>${fmt(d.budget.total)}</td></tr>`;
      html += `</tbody></table>`;
    }

    if (d.note) {
      html += `<p class="finance-note">注：${d.note}</p>`;
    }
  }

  return html;
}

function update() {
  const year = document.getElementById("yearSelect").value;
  const month = document.getElementById("monthSelect").value;
  const isYear = month === "all";

  const c = isYear ? calcYear(year) : calcMonth(year, month);
  if (!c) {
    document.getElementById("financeSummary").innerHTML = "<p>暂无数据</p>";
    document.getElementById("financeDetail").innerHTML = "";
    return;
  }
  document.getElementById("financeSummary").innerHTML = renderSummary(c, isYear, year, month);
  document.getElementById("financeDetail").innerHTML = renderDetail(c, isYear, year, month);
}

function init() {
  const yearSel = document.getElementById("yearSelect");
  const monthSel = document.getElementById("monthSelect");
  const years = Object.keys(financeData).sort().reverse();
  years.forEach(y => {
    const opt = document.createElement("option");
    opt.value = y; opt.textContent = y + "年";
    yearSel.appendChild(opt);
  });

  function updateMonths() {
    const year = yearSel.value;
    const months = financeData[year] ? Object.keys(financeData[year]).sort() : [];
    monthSel.innerHTML = '<option value="all">全年汇总</option>';
    months.forEach(m => {
      const opt = document.createElement("option");
      opt.value = m; opt.textContent = m + "月";
      monthSel.appendChild(opt);
    });
  }

  yearSel.addEventListener("change", () => { updateMonths(); update(); });
  monthSel.addEventListener("change", update);
  updateMonths();
  update();
}

if (document.readyState === "loading") {
  document.addEventListener("DOMContentLoaded", init);
} else {
  init();
}
</script>
