#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""国自然 / 省部委科研基金 2024–2026 分布与市场容量（C9/985/211 之外）

口径（用户 2026-10-17 确认）：
  1) 省部委 = 省自然科学基金 + 省重点研发 + 教育部（不含人文社科）+ 卫健委/农业农村部等部委
  2) 机构：单列「中科院/院所」「医院」「企业」，不并入高校
  3) 2026 用已公布数据，标注「截至 2026-10」
  4) 输出：市场容量 + 目标单位名单

输出：销售分析/国自然与省部委基金分布_2024-2026_市场容量与目标单位.html
"""
import io
import os
import sys

sys.path.insert(0, '/Users/liuxinyuan/Desktop/Hermes输出-工作类/脚本')
import brand_kit as BK  # noqa: E402

W = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
OUT = W + '/销售分析/国自然与省部委基金分布_2024-2026_市场容量与目标单位.html'

CSS = """
*{box-sizing:border-box}
body{margin:0;background:#f4f6fa;font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;color:#1b2430;font-size:13px;line-height:1.6}
.wrap{max-width:1280px;margin:0 auto;padding:0 18px 44px}
h1{font-size:22px;margin:12px 0 4px}
.meta{color:#5b6675;font-size:12.4px;line-height:1.85;margin-bottom:12px}
.card{background:#fff;border:1px solid #e3e8f1;border-radius:10px;padding:14px 16px;margin-bottom:14px}
.card h2{font-size:15.4px;margin:0 0 10px;padding-left:9px;border-left:3px solid #1F4E79;display:flex;align-items:baseline;gap:8px}
.card h2 span{font-size:10.8px;color:#8a94a3;font-weight:600}
h3{font-size:13px;margin:13px 0 6px;color:#1F4E79}
table{width:100%;border-collapse:collapse;font-size:11.8px}
th{background:#1F4E79;color:#fff;padding:7px 8px;text-align:left}
td{padding:6px 8px;border-bottom:1px solid #eef1f6;vertical-align:top}
td.n{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.tag{display:inline-block;font-size:10px;font-weight:800;padding:1px 6px;border-radius:8px;white-space:nowrap}
.ok{background:#e8f6ee;color:#1c7c54}.est{background:#fff4e0;color:#8a5a12}.gap{background:#fde8e6;color:#b3261e}
.kpis{display:grid;grid-template-columns:repeat(5,1fr);gap:9px;margin:12px 0 16px}
.kpi{background:#fff;border:1px solid #e3e8f1;border-top:3px solid #1F4E79;border-radius:9px;padding:9px 11px}
.kpi .l{font-size:10.5px;color:#66707d;font-weight:700}.kpi .v{font-size:19px;font-weight:900;line-height:1.3}.kpi .s{font-size:10px;color:#9aa3b2}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.box{background:#f7f9fc;border:1px solid #e3e8f1;border-radius:9px;padding:11px 13px}
.box.warn{background:#fffdf6;border-color:#efe0bb}
.box.ok2{background:#f5fbf7;border-color:#cfe8d9}
.box h4{margin:0 0 6px;font-size:12.6px}
ul{margin:3px 0 0;padding-left:19px}li{margin-bottom:3px}
.fn{font-size:10.8px;color:#8a94a3;line-height:1.7}
.big{font-size:15px;font-weight:900;color:#1F4E79}
@media print{@page{size:A4;margin:9mm}body{background:#fff;font-size:10.2px}.card{break-inside:avoid}}
@media(max-width:900px){.kpis{grid-template-columns:repeat(2,1fr)}.grid2{grid-template-columns:1fr}}
"""

NSFC = [
    ('2024', '54,859', '393.1 亿（执行）', '400.3 亿', '面上 20,758 项 / 101.37 亿；青年 23,226 项；重点 745；优青 654；杰青 433；地区 3,519', '<span class="tag ok">可核</span>'),
    ('2025', '53,159（集中接收）<br>全年 5.88 万', '未取得决算<br>（通常次年 9 月发布）', '—', '优青（B 类）800 项 / 16 亿；杰青（A 类）450 项 / 近 18 亿 + 延续 62 项 / 4.9 亿', '<span class="tag ok">可核</span>'),
    ('2026（截至 10 月）', '69,563', '预算 418.6 亿', '418.6 亿', '青年 C 类 +12,046 项（+50.1%）；面上 +3,400 项（+14.8%）；总项数创历史新高', '<span class="tag ok">可核</span>'),
]

STRUCT = [
    ('面上项目', '20,758 项', '101.37 亿', '48.83 万/项，资助率 11.7%', '存量最大，覆盖全学科'),
    ('青年科学基金 C 类', '23,226 项（2024）→ 2026 年再增 12,046 项', '约 30 万/项', '2026 增幅 50.1%', '<b>新 PI 主力，最值得抢</b>'),
    ('地区科学基金', '3,519 项（2024）', '约 34 万/项', '面向欠发达地区', '省属院校占比高'),
    ('重点项目', '745 项（2024）', '约 230 万/项', '—', '大课题组，已被锁定'),
    ('杰青 / 优青（A/B 类）', '433 / 654 项（2024）；2025 年 A 类 450、B 类 800', 'A 类约 400 万、B 类约 200 万', '人才项目', '标杆客户，做背书'),
]

INST = [
    ('高校（双一流）', '约 147 所', '约 55–60%', '<span class="tag est">估算</span>', '诺唯赞/全式金主战场，只做单点'),
    ('高校（非双一流）', '约 2,800 所', '<b>约 20–25%</b>', '<span class="tag est">估算</span>', '<b>农村包围城市主战场</b>'),
    ('医院（含附属医院）', '—', '<b>约 15–20%</b>', '<span class="tag est">估算</span>', '<b>被低估的增量：临床 PI 经费足、决策快</b>'),
    ('中科院 / 院所', '—', '约 8–12%', '<span class="tag est">估算</span>', '集中采购，门槛高'),
    ('企业', '—', '<3%', '<span class="tag est">估算</span>', '不是国自然主力，走省重点研发'),
]

PROV = [
    ('广东', '省自然科学基金 2026：3,171 项（面上 3,001 / 优青 70 / 杰青 100）', '约 4.2 亿（按 10 万/30 万/100 万测算）', '国自然 2026：江苏 29.76 亿（占全国 9.2%）可作参照，广东体量相近', '<span class="tag est">项目数可核 / 金额测算</span>'),
    ('浙江', '省自然科学基金 2026：2,667 项（重大 63 / 杰青 128 / 重点 304 / 探索 630 / 青年 1,048 / 联合 494）', '约 5.2 亿（按 100/80/30/10/10 万测算）', '资助强度：杰青 ≤80 万、重点 ≤30 万、探索/青基 ≤10 万', '<span class="tag est">项目数可核 / 金额测算</span>'),
    ('福建（样本）', '省自然科学基金 2025：2,224 项', '2.32 亿（其中科技计划经费 9,061 万）', '国自然 2025：1,190 项 / 5.78 亿（37 家依托单位）', '<span class="tag ok">可核</span>'),
]

TARGETS_GD = [
    ('南方医科大学', '省属/双非', '2023 年国自然 434 项 / 1.85 亿；附属医院贡献大', '已有医院客户（南医皮肤）', '一线进门 + 提取/WB'),
    ('深圳大学', '省属/双非', '2025 年 383 项 / 1.93 亿', '未成规模', 'RT-qPCR + 提取'),
    ('广东工业大学', '省属/双非', '省属工科强校，材料/环境为主', '待开发', '分子 + WB 全线'),
    ('广州大学', '省属/双非', '综合类，生物医药在建', '待开发', '一线 + 二线'),
    ('广东医科大学', '省属/双非', '医科类，附属医院多', '已有附二院客户', 'RT-qPCR + 提取'),
    ('广东药科大学', '省属/双非', '药学/生物制药', '2026 已成交 1.35 万', 'M5244 复购 + 扩品类'),
    ('佛山大学', '省属/双非', '2026 已成交 1.08 万', '已有客户', '高保真 + 一步法 RTQ'),
    ('东莞理工学院', '省属/双非', '东莞产业配套强', '待开发', 'OEM/横向合作'),
    ('五邑大学 / 汕头大学 / 广东海洋 / 仲恺', '省属/双非', '地方院校，经费分散', '零星', '按青椒名单逐个攻'),
]

TARGETS_ZJ = [
    ('浙江工业大学', '省属/双非', '省属工科第一梯队', '待开发', '分子 + WB'),
    ('温州医科大学', '省属/双非', '眼视光/检验强；附属医院多', '已有温医二院客户（2.59 万）', 'RT-qPCR + 提取 + 技术服务'),
    ('浙江师范大学', '省属/双非', '2026 国自然 98 项 / 4,373 万（同比 +44%）', '待开发', '一线进门'),
    ('杭州师范大学', '省属/双非', '2026 已成交 1.10 万（+1120%）', '已有客户', 'WB + RT'),
    ('浙江理工大学', '省属/双非', '2026 已成交 0.70 万', '已有客户', '替换试点'),
    ('浙江工商大学', '省属/双非', '食品/生物，WB 需求', '零星', 'WB 打包'),
    ('浙江中医药大学', '省属/双非', '中医药，分子生物学起步', '已有省中医院客户', '提取 + RT'),
    ('浙江农林大学', '省属/双非', '2026 已成交 3.12 万（+2398%）', '已有客户（最大增长）', '连接酶 102 + 提取'),
    ('中国计量大学 / 温州大学 / 湖州师范 / 绍兴文理 / 嘉兴学院 / 台州学院', '省属/地方', '地方院校，青椒集中', '零星', '青椒名单逐个攻'),
]

SIZE = [
    ('国自然（2026 预算）', '418.6 亿', '<span class="tag ok">可核</span>'),
    ('省部委（估）', '150–250 亿', '<span class="tag est">估算</span>'),
    ('总盘子', '约 570–670 亿/年', '<span class="tag est">估算</span>'),
    ('非双一流 + 医院可及份额', '30%（25–35%）', '<span class="tag est">估算</span>'),
    ('试剂耗材占科研经费', '20%（15–25%）', '<span class="tag est">估算</span>'),
    ('全国可及市场', '<b>约 34–47 亿/年</b>', '<span class="tag est">估算</span>'),
    ('广东 + 浙江可及市场', '<b>约 3.0–4.0 亿/年</b>', '<span class="tag est">估算</span>'),
    ('宝锐 2026 科研收入', '49.5 万', '<span class="tag ok">可核</span>'),
    ('当前份额（两省）', '<b>约 0.13–0.16%</b>', '<span class="tag est">测算</span>'),
    ('2027 目标 300 万对应份额', '<b>约 0.8–1.0%</b>', '<span class="tag est">测算</span>'),
]

GAPS = [
    ('各地省基金 2024/2025 全量立项清单', '省科技厅公示 PDF', '2026 已拿到广东/浙江全量；往年需逐省抓取'),
    ('广东、浙江 2026 国自然单位级立项数/经费', '国家层面不公布全量；仅各校官网零散公告', '只有样本（深大 465 项/2.05 亿、浙工大 197 项/0.95 亿等），不能代表全省'),
    ('产品线权重（30/20/15/5/10/20）', '经验值，用户确认基线', '未用客户实际采购结构校准；WB 被关键词抬到 26–27%，需访谈验证'),
    ('教育部（基本科研业务费）年度总额', '教育部/财政部预算', '未公开汇总，需按高校预算抽样'),
    ('卫健委 / 农业农村部 项目金额', '部门预算、项目公示', '需逐年查，颗粒度粗'),
    ('试剂耗材占科研经费比例', '文献/行业报告', '用 15–25% 区间，需用客户实际支出校准'),
]

page = """<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>国自然与省部委基金分布 2024–2026：市场容量与目标单位</title>
<style>__CSS__</style></head><body><div class="wrap">
<h1>国自然 / 省部委科研基金分布（2024–2026）</h1>
<div class="meta">
口径（2026-10-17 确认）：<b>省自然科学基金 + 省重点研发 + 教育部（不含人文社科）+ 卫健委/农业农村部等部委</b>；机构<b>单列中科院/院所、医院、企业</b>；2026 用已公布数据、标注截至 10 月；输出<b>市场容量 + 目标单位名单</b>。<br>
阅读方式：<span class="tag ok">可核</span> 为官方/公开原文可溯源；<span class="tag est">估算</span> 为基于可核锚点的测算，方法写在第七节。
</div>

<div class="kpis">
  <div class="kpi"><div class="l">国自然 2026 预算</div><div class="v">418.6 亿</div><div class="s">同比 +6.09%</div></div>
  <div class="kpi"><div class="l">2026 立项数</div><div class="v">69,563</div><div class="s">创历史新高</div></div>
  <div class="kpi"><div class="l">青年 C 类增幅</div><div class="v">+50.1%</div><div class="s">+12,046 项（新 PI）</div></div>
  <div class="kpi"><div class="l">两省可及市场</div><div class="v">3.0–4.0 亿</div><div class="s">广东 + 浙江/年（估算）</div></div>
  <div class="kpi"><div class="l">宝锐份额</div><div class="v">0.15%</div><div class="s">49.5 万 / 两省可及市场</div></div>
</div>

<div class="card"><h2>一、国自然三年：总量、结构、变化 <span>全部为官方通告/决算口径</span></h2>
<table><thead><tr><th style="width:11%">年度</th><th class="n" style="width:13%">立项数</th><th class="n" style="width:13%">资助经费</th><th class="n" style="width:11%">预算</th><th>结构要点</th><th style="width:7%">口径</th></tr></thead><tbody>
__NSFC__
</tbody></table>
<h3>1.1 钱在哪些类型里（2024 为完整年）</h3>
<table><thead><tr><th style="width:16%">项目类型</th><th style="width:22%">规模</th><th style="width:14%">资助强度</th><th style="width:16%">关键变化</th><th>对我们的含义</th></tr></thead><tbody>
__STRUCT__
</tbody></table>
<div class="box ok2" style="margin-top:9px"><h4>最重要的一个信号：2026 年青年 C 类扩容 50.1%</h4>
<p style="margin:4px 0">青年 C 类（原青年基金）是 <b>28–35 岁新 PI 的第一桶金</b>，单项约 30 万，通常 3 年，第一年集中采购试剂。2026 年多出 <b>1.2 万个</b>新立项 = 1.2 万个新实验室开张。<b>这是“青椒包围”最硬的需求侧证据</b>：不是我们去找客户，是客户在 2026–2027 年集中出现。</p></div></div>

<div class="card"><h2>二、钱在谁手里：C9/985/211 之外有多少 <span>官方只公布申请量结构，经费结构需估算</span></h2>
<table><thead><tr><th style="width:18%">机构类型</th><th style="width:12%">数量</th><th style="width:14%">国自然经费占比</th><th style="width:8%">口径</th><th>作战判断</th></tr></thead><tbody>
__INST__
</tbody></table>
<div class="fn" style="margin-top:6px">锚点：① 2009–2018 累计，前 100 依托单位拿走 <b>82.4%</b> 的资助项目（其中高校 83 所占 91.2%）；② 2025 年福建全省 37 家单位 1,190 项 / 5.78 亿，厦大一家 343 项 / 2.16 亿（占全省 37%）；③ 深圳大学 2025 年 383 项 / 1.93 亿、南方医科大学 2023 年 434 项 / 1.85 亿 —— 说明“非双一流”里的头部校，体量已接近中游 211。</div>
<div class="grid2" style="margin-top:10px">
  <div class="box warn"><h4>结论 1：非双一流不是“没钱”，是“分散”</h4>
  <p style="margin:3px 0">非双一流高校约 20–25% 经费，但摊在 2,800 所学校 → 单校少、决策快、品牌未定。<b>这正是农村包围城市的物理基础</b>。</p></div>
  <div class="box"><h4>结论 2：医院是被低估的增量</h4>
  <p style="margin:3px 0">医院系统约占 15–20%，且临床 PI 经费足、采购周期短（南医大 434 项中大量来自附属医院）。<b>建议把“医院科研”列为与省属院校并列的主攻</b>。</p></div>
</div></div>

<div class="card"><h2>三、省部委基金：广东 / 浙江 / 福建样本</h2>
<table><thead><tr><th style="width:9%">地区</th><th style="width:30%">省自然科学基金规模（2025/2026）</th><th style="width:20%">金额</th><th style="width:26%">国自然参照</th><th>口径</th></tr></thead><tbody>
__PROV__
</tbody></table>
<div class="fn" style="margin-top:6px">省基金的特点：<b>单项小（10 万级）、覆盖广、门槛低</b>。对宝锐的含义：省基金项目是“首单”最好的切入点（10 万项目买 5,000–1 万试剂很常见），而国自然面上（48.83 万/项）才是“上量”的主力。</div></div>

<div class="card"><h2>三·五 哪些经费与宝锐科研产品线相关：两省 × 六条产品线 <span>省基金逐项归类，金额可核；权重为经验值</span></h2>
<div class="kpis" style="grid-template-columns:repeat(4,1fr)">
  <div class="kpi"><div class="kl">浙江 省基金总盘</div><div class="kv">4.99 亿</div><div class="ks">2,667 项（清单逐项可核）</div></div>
  <div class="kpi"><div class="kl">浙江 生医相关</div><div class="kv">1.94 亿</div><div class="ks">989 项（学科代码 C/H）</div></div>
  <div class="kpi"><div class="kl">广东 省基金总盘</div><div class="kv">4.21 亿</div><div class="ks">3,171 项（金额逐项可核）</div></div>
  <div class="kpi"><div class="kl">广东 生医相关</div><div class="kv">2.14 亿</div><div class="ks">1,666 项（名称关键词）</div></div>
</div>
<table><thead><tr><th style="width:24%">宝锐产品线</th><th style="width:13%">浙江（万元）</th><th style="width:9%">占比</th><th style="width:13%">广东（万元）</th><th style="width:9%">占比</th><th style="width:13%">两省合计</th><th>权重性质</th></tr></thead><tbody>
__LINES__
</tbody></table>
<div class="grid2" style="margin-top:10px">
<div class="box warn"><h4>权重是经验值，不是官方统计</h4>
<p style="margin:3px 0">基线（用户 2026-10 确认）：RT-qPCR 30%、PCR/克隆 20%、核酸提取 15%、LAMP/恒温 5%、其他分子 10%、WB 20%。<br>
再按每个项目名称的关键词命中数做调整（先验 ×(1+2×命中) 后归一）。<b>同一项目可能同时需要多条产品线，按分布拆分，不做非此即彼。</b></p></div>
<div class="box"><h4>怎么读这张表</h4>
<ul style="margin:3px 0">
<li><b>RT-qPCR 是最大单一品类</b>（两省合计 1.12 亿），对应逆转录 + qPCR 预混，是我们一线产品的主战场。</li>
<li><b>WB 权重被关键词抬高到 26–27%</b>（高于基线 20%），因为生医项目名称里“蛋白/信号/通路”密度高；<b>这说明 WB 产品线弱是我们的结构性短板</b>，不是小问题。</li>
<li><b>LAMP/恒温只有 4%</b>（两省 1,687 万），与 ERP 事实一致（LAMP 年销 125 万）——是差异化品类，不是主战场。</li>
</ul></div>
</div>
<h3>广东：生医经费 Top 15 单位（省基金，逐项可核）</h3>
<table><thead><tr><th style="width:24%">单位</th><th style="width:8%">类型</th><th style="width:10%">生医项数</th><th style="width:12%">生医经费(万元)</th><th style="width:10%">生医占比</th><th>主产品线（按经费）</th></tr></thead><tbody>
__U_GD__
</tbody></table>
<h3 style="margin-top:14px">浙江：生医经费 Top 15 单位（省基金，逐项可核）</h3>
<table><thead><tr><th style="width:24%">单位</th><th style="width:8%">类型</th><th style="width:10%">生医项数</th><th style="width:12%">生医经费(万元)</th><th style="width:10%">生医占比</th><th>主产品线（按经费）</th></tr></thead><tbody>
__U_ZJ__
</tbody></table>
<div class="fn" style="margin-top:8px">完整单位级清单（浙江 231 家 / 广东 255 家，含每家 6 条产品线拆分）见附件 Excel：<b>科研经费_单位级清单_广东浙江_2026.xlsx</b>。国自然单位级全量名单国家层面不公布，本报告只列已公开的单位样本（见第七节缺口）。</div></div>

<div class="card"><h2>四、市场容量测算：从“总盘子”到“我们能碰到的钱”</h2>
<table><thead><tr><th style="width:30%">环节</th><th style="width:24%">数值</th><th>口径 / 方法</th></tr></thead><tbody>
__SIZE__
</tbody></table>
<div class="box warn" style="margin-top:10px"><h4>这个测算怎么用</h4>
<ul>
<li><b>300 万目标并不激进</b>：两省可及市场 3.0–4.0 亿/年，做到 300 万只是 0.8–1.0% 份额；当前 0.15%。</li>
<li><b>但“可及”不等于“好拿”</b>：可及市场里 70% 已被诺唯赞/全式金/翌圣用预付款和促销锁定，我们的真实可抢份额是“新开实验室 + 换供应商窗口”。</li>
<li><b>抓手是青年 C 类新增的 1.2 万个新 PI</b>：他们 2026–2027 年建实验室，是唯一“品牌未定”的人群。</li>
</ul></div></div>

<div class="card"><h2>五、目标单位名单（广东）：非双一流 + 医院</h2>
<table><thead><tr><th style="width:18%">单位</th><th style="width:10%">层级</th><th style="width:26%">依据 / 体量</th><th style="width:18%">我司现状</th><th>建议切入</th></tr></thead><tbody>
__GD__
</tbody></table></div>

<div class="card"><h2>六、目标单位名单（浙江）：非双一流 + 医院</h2>
<table><thead><tr><th style="width:18%">单位</th><th style="width:10%">层级</th><th style="width:26%">依据 / 体量</th><th style="width:18%">我司现状</th><th>建议切入</th></tr></thead><tbody>
__ZJ__
</tbody></table>
<div class="fn" style="margin-top:6px">备注：表中“依据/体量”仅列已核到的数据；未列数据的单位不等于没钱，属于<b>待补名单</b>（见第七节）。我司现状取自 ERP 2026 年 1–10 月与客户清单。</div></div>

<div class="card"><h2>七、数据缺口与测算方法（必须写清）</h2>
<div class="grid2">
<div class="box"><h4>测算方法</h4><ul>
<li>国自然：2026 预算 418.6 亿（官方）为基数。</li>
<li>省部委：以广东 4.2 亿、浙江 5.2 亿、福建 2.32 亿三个已核样本，按经济体量外推全国 → <b>150–250 亿</b>区间。</li>
<li>非双一流+医院份额：用“前 100 单位占 82.4%”与省级样本反推，取 <b>30%（25–35%）</b>。</li>
<li>试剂耗材占比：生物医学基础研究常用 <b>15–25%</b>，取 20%。</li>
<li>两省可及市场 = （广东国自然约 25 亿 + 浙江约 20 亿 + 两省省部委约 9.4 亿）× 30% × 20% ≈ <b>3.0–4.0 亿</b>。</li>
</ul></div>
<div class="box warn"><h4>还缺什么（会影响精度）</h4><ul>
__GAPS__
</ul></div>
</div></div>

<div class="card"><h2>八、结论与下一步</h2>
<div class="grid2">
<div class="box ok2"><h4>三条结论</h4><ul>
<li><b>盘子足够大</b>：两省可及 3–4 亿/年，300 万只是 1% 份额，目标在数学上成立。</li>
<li><b>增量在“新 PI”</b>：2026 青年 C 类 +50.1%（1.2 万个新立项），这是唯一品牌未定的人群，必须用青椒名单去接。</li>
<li><b>医院被低估</b>：医院系统占国自然 15–20%，且决策链短，建议与省属院校并列主攻。</li>
</ul></div>
<div class="box"><h4>下一步（可执行）</h4><ul>
<li>① 采购/抓取广东、浙江 2026 国自然<b>单位级立项名单</b>（含负责人），按 PI 建台账。</li>
<li>② 抓 2026 年青年 C 类立项名单，筛“广东/浙江 + 省属/医院 + 35 岁以下”，直接进青椒池。</li>
<li>③ 省基金 2026 立项清单（广东 3,171 / 浙江 2,667）逐条落单位，做首单名单。</li>
<li>④ 用客户实际采购额校准“试剂耗材占比”，把 20% 换成宝锐自己的系数。</li>
</ul></div>
</div></div>
__FOOTER__
</div></body></html>"""


def rows(d):
    return '\n'.join('<tr>' + ''.join('<td>%s</td>' % c for c in r) + '</tr>' for r in d)


from openpyxl import load_workbook  # noqa: F401  (占位，避免误删依赖)
import json  # noqa: E402

J = W + '/数据/科研经费_两省产品线映射.json'
_L = ['分子·RT-qPCR', '分子·PCR/克隆', '分子·核酸提取', '分子·LAMP/恒温', '分子·其他', 'WB']
_d = json.load(io.open(J, encoding='utf-8'))
_P = _d['provinces']
_zj, _gd = _P['浙江']['by_line'], _P['广东']['by_line']
_zs, _gs = sum(_zj.values()), sum(_gd.values())
LINES_HTML = '\n'.join(
    '<tr><td><b>%s</b></td><td class="n">%.0f</td><td class="n">%.1f%%</td><td class="n">%.0f</td><td class="n">%.1f%%</td>'
    '<td class="n"><b>%.0f</b></td><td><span class="tag est">经验值</span></td></tr>'
    % (l, _zj[l], _zj[l] / _zs * 100, _gd[l], _gd[l] / _gs * 100, _zj[l] + _gd[l]) for l in _L)
LINES_HTML += ('<tr><td><b>合计</b></td><td class="n"><b>%.0f</b></td><td class="n">100%%</td>'
               '<td class="n"><b>%.0f</b></td><td class="n">100%%</td><td class="n"><b>%.0f</b></td>'
               '<td><span class="tag ok">生医相关省基金</span></td></tr>' % (_zs, _gs, _zs + _gs))


def unit_rows(prov, n=15):
    out = []
    for u in _P[prov]['units'][:n]:
        main = max(_L, key=lambda l: u['lines'][l])
        out.append([u['unit'], u['type'], u['bio_n'], '%.0f' % u['bio_amt'],
                    '%.0f%%' % (u['bio_amt'] / u['amt'] * 100 if u['amt'] else 0),
                    '%s（%.0f 万）' % (main, u['lines'][main])])
    return out


U_GD = unit_rows('广东')
U_ZJ = unit_rows('浙江')

page = (page.replace('__CSS__', CSS)
        .replace('__NSFC__', rows(NSFC))
        .replace('__STRUCT__', rows(STRUCT))
        .replace('__INST__', rows(INST))
        .replace('__PROV__', rows(PROV))
        .replace('__SIZE__', rows(SIZE))
        .replace('__GD__', rows(TARGETS_GD))
        .replace('__ZJ__', rows(TARGETS_ZJ))
        .replace('__GAPS__', ''.join('<li><b>%s</b>：%s（%s）</li>' % g for g in GAPS))
        .replace('__LINES__', LINES_HTML)
        .replace('__U_GD__', rows(U_GD))
        .replace('__U_ZJ__', rows(U_ZJ)))
page = BK.inject(page, theme='dark', tag='科研基金分布调研 · 2027 战略输入',
                 footer_extra='内部资料 · 请勿外发 ｜ 数据源：NSFC 官方通告/决算、各省科技厅公示')
v = BK.verify(page)
bad = [k for k, ok in v.items() if not ok]
assert not bad, bad
io.open(OUT, 'w', encoding='utf-8').write(page)
print('✅ %s（%.0f KB）' % (OUT, os.path.getsize(OUT) / 1024))
