#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""生成《科研经费_单位级清单_广东浙江_2026.xlsx》
Sheet：汇总_产品线 / 浙江_单位级 / 广东_单位级 / 国自然样本 / 口径与来源
"""
import csv
import io
import json

from openpyxl import Workbook
from openpyxl.styles import Alignment, Font, PatternFill
from openpyxl.utils import get_column_letter

J = '/Users/liuxinyuan/Desktop/Hermes输出-工作类/数据/科研经费_两省产品线映射.json'
OUT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类/销售分析/科研经费_单位级清单_广东浙江_2026.xlsx'
LINES = ['分子·RT-qPCR', '分子·PCR/克隆', '分子·核酸提取', '分子·LAMP/恒温', '分子·其他', 'WB']

d = json.load(open(J, encoding='utf-8'))
P = d['provinces']

wb = Workbook()
HEAD = PatternFill('solid', fgColor='1F4E79')
HF = Font(color='FFFFFF', bold=True, size=10)


def style(ws, ncol, widths):
    for c in range(1, ncol + 1):
        cell = ws.cell(row=1, column=c)
        cell.fill = HEAD; cell.font = HF
        cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
        ws.column_dimensions[get_column_letter(c)].width = widths[c - 1]
    ws.freeze_panes = 'A2'


# 1 汇总
ws = wb.active; ws.title = '汇总_产品线'
ws.append(['产品线（宝锐科研）', '浙江 关联经费(万元)', '浙江 占比', '广东 关联经费(万元)', '广东 占比', '两省合计(万元)', '权重性质'])
zj = P['浙江']['by_line']; gd = P['广东']['by_line']
zjs = sum(zj.values()); gds = sum(gd.values())
for ln in LINES:
    ws.append([ln, round(zj[ln], 1), round(zj[ln] / zjs * 100, 1) / 100, round(gd[ln], 1), round(gd[ln] / gds * 100, 1) / 100,
               round(zj[ln] + gd[ln], 1), '经验值（用户确认基线 30/20/15/5/10/20，按项目关键词微调）'])
ws.append(['合计', round(zjs, 1), 1.0, round(gds, 1), 1.0, round(zjs + gds, 1), ''])
for r in range(2, ws.max_row + 1):
    for c in (3, 5):
        ws.cell(row=r, column=c).number_format = '0.0%'
style(ws, 7, [22, 18, 10, 18, 10, 16, 46])

# 2/3 单位级
for prov, title in (('浙江', '浙江_单位级'), ('广东', '广东_单位级')):
    ws = wb.create_sheet(title)
    ws.append(['单位', '类型', '总项数', '总经费(万元)', '生医项数', '生医经费(万元)', '生医占比'] + [l + '(万元)' for l in LINES])
    for u in P[prov]['units']:
        ws.append([u['unit'], u['type'], u['n'], round(u['amt'], 1), u['bio_n'], round(u['bio_amt'], 1),
                   round(u['bio_amt'] / u['amt'], 3) if u['amt'] else 0] +
                  [round(u['lines'][l], 1) for l in LINES])
    for r in range(2, ws.max_row + 1):
        ws.cell(row=r, column=7).number_format = '0.0%'
    style(ws, 7 + len(LINES), [34, 8, 8, 14, 9, 14, 9] + [13] * len(LINES))

# 4 国自然样本
ws = wb.create_sheet('国自然_已公开单位样本')
ws.append(['单位', '省份', '2026 立项项数', '直接经费(万元)', '来源', '备注'])
SAMPLE = [
    ['深圳大学', '广东', 465, 20505, '深圳大学官网 2026-08', '首批获资助 465 项'],
    ['中山大学生命科学学院', '广东', 34, 1808, '中山大学官网 2026-08-28', '仅一个学院'],
    ['浙江工业大学', '浙江', 197, 9500, '高校国自然汇总 2026-09', '直接经费超 9,500 万'],
    ['浙江农林大学', '浙江', 110, 4344, '浙江农林大学科技处 2026-08-26', '生命科学部 79 项 / 全校 110 项'],
    ['浙江大学转化医学研究院', '浙江', 32, 1983, '浙大转化医学研究院 2026-08-28', '仅一个研究院'],
]
for r in SAMPLE:
    ws.append(r)
ws.append(['合计（仅样本）', '', sum(r[2] for r in SAMPLE), sum(r[3] for r in SAMPLE), '', '非全量，不能代表全省'])
style(ws, 6, [30, 8, 14, 16, 34, 34])

# 5 口径
ws = wb.create_sheet('口径与来源')
rows = [
    ['项目', '内容'],
    ['浙江省基金源文件', 'https://zjnsf.kjt.zj.gov.cn/isp/staticfiles/ueditor/202511/2026年度浙江省自然科学基金拟资助项目清单.pdf'],
    ['广东省基金源文件', '广东省科技厅公示附件（gdstc.gd.gov.cn/attachment/0/597/597966/4796434.pdf，本机被 WAF 拦截，使用 hcwgx.com 转载件，内容含“总计 3171 项 / 42110 万元”）'],
    ['浙江清单校验', 'PDF 共 92 页，解析 2,667 项（与官方序号 1–2667 一致）'],
    ['广东清单校验', 'PDF 共 137 页，解析 3,171 项、42,110 万元（与表内“总计（3171项）42110”一致）'],
    ['浙江金额口径', '按项目类别标准额测算：重大 100 / 杰青 80 / 重点 30 / 探索 10 / 青基 10 / 青稞 10 / 地区科学 10（万元），合计 49,910 万元'],
    ['广东金额口径', 'PDF 表内“拟立项金额”逐项相加，合计 42,110 万元（可核）'],
    ['生医相关判定', '浙江：申请编号学科代码 C（生命科学）/ H（医学）；广东：项目名称关键词（基因/蛋白/细胞/免疫/临床等）'],
    ['产品线权重', '经验值：RT-qPCR 30%、PCR/克隆 20%、核酸提取 15%、LAMP/恒温 5%、其他分子 10%、WB 20%；再按项目关键词命中数做±调整（先验×(1+2×命中) 归一）'],
    ['权重性质说明', '该权重是经验判断，不是官方统计；同一项目可能需要多条产品线，按分布拆分，不做非此即彼归类'],
    ['国自然单位级', '国家层面不公布全量单位级立项名单；本表只列已公开的单位样本，不能代表全省总量'],
]
for r in rows:
    ws.append(r)
style(ws, 2, [22, 120])

wb.save(OUT)
print('✅', OUT)
