#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""把浙江检验价格PDF + 六省横向对比XLSX转成MD，并生成对比分析。"""
import os, re, json, statistics, shutil
import fitz
import openpyxl

BASE = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
PDF = '/Users/liuxinyuan/.hermes/profiles/zone-b/cache/documents/native-inputs/93d8f988480895d3eb974a9ab09d3ecef7db4844f3df56e863031ca72b948644/doc_13a94ce52463_浙江省检验类医疗服务价格项目表（征求意见稿）.pdf'
XLSX = '/Users/liuxinyuan/.hermes/profiles/zone-b/cache/documents/native-inputs/4469e61e11ea1c696839414e898a4f38129b4a934d5d116322a31499bc75e1f6/doc_eddbb1799b8f_检验类立项指南_662项_六省横向对比.xlsx'
OUTDIR = os.path.join(BASE, '产品与市场/政策')
SRCDIR = os.path.join(OUTDIR, '原件')
os.makedirs(OUTDIR, exist_ok=True)
os.makedirs(SRCDIR, exist_ok=True)

PDF_MD = os.path.join(OUTDIR, '浙江省检验类医疗服务价格项目表_征求意见稿_转写.md')
XLSX_MD = os.path.join(OUTDIR, '检验类立项指南_662项_六省横向对比_转写.md')
ANALYSIS_MD = os.path.join(OUTDIR, '浙江检验价格_六省对比分析_20261107.md')

def clean(s):
    if s is None: return ''
    return str(s).replace('\r', '\n').replace('\n', '<br>').strip()

def cell(s):
    return clean(s).replace('|', '\\|')

def norm(s):
    return re.sub(r'\s+', '', str(s or '')).replace('（', '(').replace('）', ')')

# ---------- PDF ----------
doc = fitz.open(PDF)
raw = []
last_parent = None
for pi, page in enumerate(doc):
    for table in page.find_tables().tables:
        for row in table.extract():
            c = [(x or '').replace('\n', '').strip() for x in row]
            if len(c) < 7: continue
            seq, name, output, comp, unit, price, note = c[:7]
            if not name or name == '项目名称': continue
            if seq.isdigit():
                last_parent = int(seq)
                raw.append(dict(page=pi+1, seq=seq, parent=last_parent, kind='num',
                                name=name, output=output, composition=comp,
                                unit=unit, price=price, note=note))
            elif seq == '' and last_parent is not None:
                raw.append(dict(page=pi+1, seq='', parent=last_parent, kind='blank',
                                name=name, output=output, composition=comp,
                                unit=unit, price=price, note=note))

# XLSX full table
wb = openpyxl.load_workbook(XLSX, data_only=True)
ws = wb['横向价格对比']
xrows = []
for r in ws.iter_rows(min_row=3, values_only=True):
    if r[0] is None or not str(r[0]).strip().isdigit(): continue
    vals = [str(x).strip() if x is not None else '' for x in r[:11]]
    xrows.append(dict(seq=int(vals[0]), cat=vals[1], code=vals[2], name=vals[3],
                      unit=vals[4], bj=vals[5], ah=vals[6], jx=vals[7],
                      ln=vals[8], qh=vals[9], zj=vals[10]))
xmap = {r['seq']: r for r in xrows}

# Match PDF descriptions to XLSX main rows.
pdf_main_desc = {}
used_raw = set()
for i, r in enumerate(raw):
    if r['kind'] != 'num': continue
    x = xmap.get(int(r['seq']))
    if not x: continue
    if norm(r['name']) == norm(x['name']):
        pdf_main_desc[int(r['seq'])] = r
        used_raw.add(i)
# blank-seq rows that are actually the page-break main row (196, 266)
for i, r in enumerate(raw):
    if r['kind'] != 'blank': continue
    for seq, x in xmap.items():
        if seq in pdf_main_desc: continue
        if norm(r['name']) == norm(x['name']) and norm(r['price']) == norm(x['zj']):
            pdf_main_desc[seq] = r
            used_raw.add(i)
            break

# Subitems: all raw rows not used as a main description.
subs = []
for i, r in enumerate(raw):
    if i in used_raw: continue
    # numeric row 189/196/266 that is actually a subitem; keep parent
    parent = int(r['seq']) if r['seq'].isdigit() else r['parent']
    subs.append(dict(page=r['page'], parent=parent, name=r['name'],
                     unit=r['unit'], price=r['price'], note=r['note']))

main_missing = [s for s in sorted(xmap) if s not in pdf_main_desc]
assert len(xrows) == 662, len(xrows)
assert len(xmap) == 662
assert sorted(xmap) == list(range(1, 663))
assert len(subs) == 121, len(subs)

# ---------- MD1 ----------
lines = []
lines.append('---')
lines.append('title: 浙江省检验类医疗服务价格项目表（征求意见稿）转写')
lines.append('source: 浙江省检验类医疗服务价格项目表（征求意见稿）.pdf')
lines.append('transcribed: 2026-11-07')
lines.append('pages: 50')
lines.append('items_main: 662')
lines.append('items_sub: 121')
lines.append('self_priced: 22')
lines.append('confidence: 高（表格逐格抽取；3处跨页主项行按横向对比表补正并标注）')
lines.append('owner: 营销中心')
lines.append('---')
lines.append('')
lines.append('# 浙江省检验类医疗服务价格项目表（征求意见稿）转写')
lines.append('')
lines.append('## 0. 转写说明')
lines.append('')
lines.append('- 原件：`浙江省检验类医疗服务价格项目表（征求意见稿）.pdf`，共 50 页。')
lines.append('- 抽取方式：PyMuPDF `find_tables()` 逐页抽取，未使用 OCR；原文表格均为文本层。')
lines.append('- 完整性：主项 **662** 个（序号 1–662 连续），子项 **121** 个，合计 **783** 行；22 个主项为“自主定价”。')
lines.append('- 主项名称、计价单位、拟定价格以 PDF 表格为准；PDF 在 189、196、266 三处跨页，主项行被拆到页边界，按同名《662项六省横向对比》补正名称/单位/价格，并在表内标注“跨页补正”。')
lines.append('- 子项保留原 PDF 写法；部分子项名称在 PDF 单元格内被截断（如“（加收”缺右括号），照实保留，未擅自补字。')
lines.append('- “价格构成”是价格包含的服务步骤说明，不等于成本构成；原文多数项目使用同一段通用文字，逐行保留。')
lines.append('')
lines.append('## 1. 主项表')
lines.append('')
lines.append('| 序号 | 项目名称 | 服务产出 | 价格构成 | 计价单位 | 拟定价格 | 拟定计价说明 | 页码 | 转写备注 |')
lines.append('|---:|---|---|---|---|---|---:|---:|---|')
for seq in range(1, 663):
    x = xmap[seq]
    d = pdf_main_desc.get(seq)
    note = ''
    if seq in (189, 196, 266):
        note = '跨页补正：名称/单位/价格按横向表回填'
    if seq in main_missing:
        note = 'PDF跨页缺主项行；名称/单位/价格按横向表补正'
    if d:
        output, comp, price, unit, desc_note, page = d['output'], d['composition'], d['price'], d['unit'], d['note'], d['page']
    else:
        output, comp, price, unit, desc_note, page = '', '', x['zj'] if x['zj'] else '自主定价', x['unit'], '', ''
    lines.append('| %d | %s | %s | %s | %s | %s | %s | %s | %s |' % (
        seq, cell(x['name']), cell(output), cell(comp), cell(unit), cell(price), cell(desc_note), cell(page), cell(note)))
lines.append('')
lines.append('## 2. 子项表（PDF 中未单独编号的加收/分型项）')
lines.append('')
lines.append('| 父项序号 | 子项名称 | 计价单位 | 拟定价格 | 拟定计价说明 | 页码 |')
lines.append('|---:|---|---|---:|---|---:|')
for s in sorted(subs, key=lambda z: (z['parent'], z['page'], z['name'])):
    lines.append('| %s | %s | %s | %s | %s | %s |' % (
        s['parent'], cell(s['name']), cell(s['unit']), cell(s['price']), cell(s['note']), cell(s['page'])))
lines.append('')
lines.append('## 3. 交叉核对与异常')
lines.append('')
lines.append('- PDF 主项 662 个，序号完整；子项 121 个；合计 783 行。')
lines.append('- 与《检验类立项指南_662项_六省横向对比》逐项比对：662 个序号全部对上；其中 3 个主项在 PDF 跨页处被拆（189、196、266），名称/单位/价格按横向表补正；其余 659 个主项名称、单位、价格一致。')
lines.append('- PDF 有 3 处跨页主项在表格抽取时被拆成多个行（189、196、266）；名称/单位/价格已按横向表回填，服务产出/价格构成/计价说明从 PDF 相应页取到，表内以“跨页补正”标注。')
lines.append('')
open(PDF_MD, 'w', encoding='utf-8').write('\n'.join(lines))

# ---------- MD2 ----------
lines = []
lines.append('---')
lines.append('title: 检验类立项指南 662项 六省横向对比 转写')
lines.append('source: 检验类立项指南_662项_六省横向对比.xlsx')
lines.append('transcribed: 2026-11-07')
lines.append('items: 662')
lines.append('provinces: 北京（第三版）、浙江、安徽、江西、辽宁、青海')
lines.append('confidence: 高（全表逐格转写，含空值）')
lines.append('owner: 营销中心')
lines.append('---')
lines.append('')
lines.append('# 检验类立项指南 662项 六省横向对比 转写')
lines.append('')
lines.append('## 0. 工作簿结构')
lines.append('')
lines.append('- 全表 Sheet：`横向价格对比`，标题行 1 行、表头 1 行、数据 662 行。')
lines.append('- 分类 Sheet：`生化`（216项）、`免疫`（223项）、`血液分析`（116项）、`尿液分析`（17项）、`分子诊断-PCR`（25项）、`微生物`（21项）、`其他-综合`（44项）；这些是 `横向价格对比` 的分类视图，不重复计入。')
lines.append('- 汇总 Sheet：`各省价格相同`、`差异较大`、`有高有低`；为派生视图，本转写件只保留全表，不重复展开。')
lines.append('- 价格列：北京三版、安徽、江西、辽宁、青海、浙江；空值表示该省未列价格/自主定价，不补 0。')
lines.append('')
lines.append('## 1. 横向价格对比（662 项）')
lines.append('')
lines.append('| 序号 | 分类 | 项目编码 | 项目名称 | 计价单位 | 北京三版价格 | 安徽价格 | 江西价格 | 辽宁价格 | 青海价格 | 浙江价格 |')
lines.append('|---:|---|---|---|---|---:|---:|---:|---:|---:|---:|')
for x in xrows:
    lines.append('| %d | %s | %s | %s | %s | %s | %s | %s | %s | %s | %s |' % (
        x['seq'], cell(x['cat']), cell(x['code']), cell(x['name']), cell(x['unit']),
        cell(x['bj']), cell(x['ah']), cell(x['jx']), cell(x['ln']), cell(x['qh']), cell(x['zj'])))
lines.append('')
lines.append('## 2. 分类计数')
lines.append('')
lines.append('| 分类 | 项目数 |')
lines.append('|---|---:|')
for cat, n in sorted(((c, sum(1 for x in xrows if x['cat'] == c)) for c in {x['cat'] for x in xrows}), key=lambda z: (-z[1], z[0])):
    lines.append('| %s | %d |' % (cat, n))
lines.append('')
lines.append('## 3. 转写校验')
lines.append('')
lines.append('- 数据行 662，序号 1–662 连续、无重复；分类计数合计 662。')
lines.append('- 浙江列有数值 640 项、空值 22 项；空值与 PDF 的“自主定价”逐项对应。')
lines.append('- 北京 658、安徽 659、江西 658、辽宁 650、青海 653 项有数值；空值照实保留。')
open(XLSX_MD, 'w', encoding='utf-8').write('\n'.join(lines))

# ---------- ANALYSIS ----------
def num(v):
    try: return float(str(v).replace(',', '').strip())
    except: return None

recs = []
for x in xrows:
    recs.append(dict(seq=x['seq'], cat=x['cat'], name=x['name'], unit=x['unit'],
                     bj=num(x['bj']), ah=num(x['ah']), jx=num(x['jx']),
                     ln=num(x['ln']), qh=num(x['qh']), zj=num(x['zj'])))

pairs = [(r['bj'], r['zj']) for r in recs if r['bj'] is not None and r['zj'] is not None]
ratios = [z / b for b, z in pairs if b]
cat_stats = []
for cat in sorted({r['cat'] for r in recs}, key=lambda c: -sum(1 for r in recs if r['cat'] == c)):
    arr = [r for r in recs if r['cat'] == cat]
    pp = [(r['bj'], r['zj']) for r in arr if r['bj'] is not None and r['zj'] is not None]
    rr = [z / b for b, z in pp if b]
    cat_stats.append(dict(cat=cat, n=len(arr), pairs=len(pp),
                          median=statistics.median(rr) if rr else None,
                          low=sum(1 for b, z in pp if z < b),
                          eq=sum(1 for b, z in pp if z == b),
                          high=sum(1 for b, z in pp if z > b)))
for r in recs:
    vals = [r[k] for k in ('bj', 'ah', 'jx', 'ln', 'qh', 'zj') if r[k] is not None]
    r['prov_n'] = len(vals)
    r['rank_low'] = (sum(1 for v in vals if v < r['zj']) + 1) if r['zj'] is not None else None
    r['is_min'] = bool(r['zj'] is not None and vals and r['zj'] == min(vals))
    r['is_max'] = bool(r['zj'] is not None and vals and r['zj'] == max(vals))
    r['min_n'] = vals.count(min(vals)) if vals else 0
    r['max_n'] = vals.count(max(vals)) if vals else 0
low_tie = sum(1 for r in recs if r['is_min'])
high_tie = sum(1 for r in recs if r['is_max'])
unique_low = sum(1 for r in recs if r['is_min'] and r['min_n'] == 1)
unique_high = sum(1 for r in recs if r['is_max'] and r['max_n'] == 1)
mol = [r for r in recs if r['cat'] == '分子诊断/PCR']
blank = [r for r in recs if r['zj'] is None]
big = sorted([r for r in recs if r['bj'] is not None and r['zj'] is not None],
             key=lambda r: abs(r['zj'] - r['bj']), reverse=True)[:12]

def fmt(v):
    if v is None: return ''
    return ('%.2f' % v).rstrip('0').rstrip('.')

lines = []
lines.append('---')
lines.append('title: 浙江检验价格（征求意见稿）与六省横向对比分析')
lines.append('date: 2026-11-07')
lines.append('sources: [浙江省检验类医疗服务价格项目表（征求意见稿）.pdf, 检验类立项指南_662项_六省横向对比.xlsx]')
lines.append('scope: 662项检验类医疗服务价格；北京第三版、浙江、安徽、江西、辽宁、青海')
lines.append('confidence: 中高（价格表逐项转写；省级价格为文件口径，非最终执行价）')
lines.append('owner: 营销中心')
lines.append('---')
lines.append('')
lines.append('# 浙江检验价格（征求意见稿）与六省横向对比分析')
lines.append('')
lines.append('## 一、结论')
lines.append('')
lines.append('1. 浙江这份表覆盖 **662 项**检验类项目，640 项有拟定价格，22 项为“自主定价”。价格构成把样本接收、校准、质控、检测、AI 辅助诊断、数据上传、报告、储存、废弃物处理和必要复检都包在一个价格里，医院端可单独拆收的空间很小。')
lines.append('2. 浙江整体价格低于北京：640 个可比值中，**414 项低于北京、116 项持平、110 项高于北京**，中位数为北京的 **80%**。按六省可比值排序，浙江处于最低价（含并列）**358 项**，其中独有最低 **195 项**；处于最高价 **46 项**。')
lines.append('3. 降价压力最集中在 **免疫（中位数 0.75）、微生物（0.70）、血液分析（0.75）**；分子诊断/PCR 的中位数为北京的 **0.89**，但项目间差异大，不能用“整体低”一概而论。')
lines.append('4. 分子诊断里，浙江的 **病原体核酸扩增 67.1 元**为六省最低（其余 80 元）；**肿瘤基因高通量面板 1800 元**也是六省最低；**病原宏基因组 1800 元**低于其余 2000 元；但 **丙型肝炎 RNA 108 元**高于其余 60–80 元，是明显反向项。')
lines.append('5. 对宝锐：这份文件直接影响医院/ICL 的检验收费和试剂成本空间，不直接约束高校科研经费采购。诊断原料客户会拿它压试剂价格；科研部 11–12 月促销不能拿这份文件当降价理由，科研客户应按课题组经费和项目需求谈。')
lines.append('')
lines.append('## 二、两件文件的一致性')
lines.append('')
lines.append('- PDF 主项 662 个、子项 121 个；XLSX 662 行、序号 1–662 连续；两件主项逐项对齐。')
lines.append('- PDF 跨页处 189、196、266 三行被拆成子项，XLSX 的主项名称/价格用于补正；其余 659 项名称、单位、价格一致。')
lines.append('- XLSX 的浙江列 640 个数值 + 22 个空值；22 个空值与 PDF 的“自主定价”逐项对应。')
lines.append('')
lines.append('## 三、总体价格位置')
lines.append('')
lines.append('| 指标 | 数值 |')
lines.append('|---|---:|')
lines.append('| 项目总数 | 662 |')
lines.append('| 浙江有拟定价格 | 640 |')
lines.append('| 浙江自主定价 | 22 |')
lines.append('| 浙江 vs 北京：低于/持平/高于 | 414 / 116 / 110 |')
lines.append('| 浙江/北京价格比中位数 | 0.80 |')
lines.append('| 浙江处于最低价（含并列）/其中独有最低 | 358 / 195 |')
lines.append('| 浙江处于最高价（唯一） | 46 |')
lines.append('')
lines.append('## 四、分类结构')
lines.append('')
lines.append('| 分类 | 项目数 | 可比北京项数 | 浙江/北京中位数 | 低于北京 | 持平 | 高于北京 |')
lines.append('|---|---:|---:|---:|---:|---:|---:|')
for s in cat_stats:
    lines.append('| %s | %d | %d | %s | %d | %d | %d |' % (
        s['cat'], s['n'], s['pairs'], ('%.2f' % s['median']) if s['median'] is not None else '', s['low'], s['eq'], s['high']))
lines.append('')
lines.append('**读法**：免疫、微生物、血液分析是价格压缩最明显的三类；分子诊断项目数少但单价高，适合逐项看，不适合按品类平均做判断。')
lines.append('')
lines.append('## 五、分子诊断/PCR 逐项')
lines.append('')
lines.append('| 序号 | 项目 | 单位 | 北京 | 安徽 | 江西 | 辽宁 | 青海 | 浙江 | 浙江位置 |')
lines.append('|---:|---|---|---:|---:|---:|---:|---:|---:|---|')
for r in mol:
    pos = ''
    if r['zj'] is not None:
        if r['is_min'] and r['min_n'] == 1:
            pos = '最低'
        elif r['is_min']:
            pos = '并列最低'
        elif r['is_max'] and r['max_n'] == 1:
            pos = '最高'
        elif r['is_max']:
            pos = '并列最高'
        else:
            pos = '第%d低' % r['rank_low']
    lines.append('| %d | %s | %s | %s | %s | %s | %s | %s | %s | %s |' % (
        r['seq'], cell(r['name']), cell(r['unit']), fmt(r['bj']), fmt(r['ah']), fmt(r['jx']),
        fmt(r['ln']), fmt(r['qh']), fmt(r['zj']), pos))
lines.append('')
lines.append('**关键项**：')
lines.append('')
lines.append('- 病原体核酸扩增：浙江 67.1 元，六省均为 80 元；浙江低 16.1%。')
lines.append('- 病原体耐药基因：浙江 86.7 元，北京 80 元、安徽/江西 120 元、辽宁/青海 150 元；浙江仅高于北京。')
lines.append('- 肿瘤基因高通量面板：浙江 1800 元，北京 2200、安徽/江西/辽宁 2000、青海 1980；浙江最低。')
lines.append('- 病原宏基因组：浙江 1800 元，其余五省均 2000 元；浙江低 10%。')
lines.append('- 丙型肝炎病毒核酸：浙江 108 元，北京/安徽/江西/辽宁/青海 60–80 元；浙江最高，需单独核对是否含高敏/定量口径。')
lines.append('- 乙型肝炎病毒核酸 60 元、结核 100 元、HIV 200 元、HPV 160 元：浙江处于低位或持平，属于价格压力最大的常规分子项目。')
lines.append('')
lines.append('## 六、价格差异最大的项目（浙江 vs 北京，绝对差前 12）')
lines.append('')
lines.append('| 序号 | 分类 | 项目 | 北京 | 浙江 | 差额 |')
lines.append('|---:|---|---|---:|---:|---:|')
for r in big:
    lines.append('| %d | %s | %s | %s | %s | %+.2f |' % (
        r['seq'], cell(r['cat']), cell(r['name']), fmt(r['bj']), fmt(r['zj']), r['zj'] - r['bj']))
lines.append('')
lines.append('## 七、对宝锐业务的含义')
lines.append('')
lines.append('### 7.1 诊断原料')
lines.append('')
lines.append('- 浙江检验价格整体低于北京，医院/ICL 的单测试收入被压缩，采购端会把压力传导向试剂和原料。只讲“酶活/单价”不够，需要讲 **每测试成本**（酶+mix+耗材+质控+复检）。')
lines.append('- 分子诊断项目分层明显：病原体核酸扩增、乙肝、结核、HIV、HPV 等常规项价格低，适合用高性价比的酶/mix 打成本；肿瘤高通量、病原宏基因组、细胞核酸扩增等高价项，仍有做价值定价的空间。')
lines.append('- 浙江 22 项“自主定价”里包含长读长测序、循环肿瘤细胞、HER2、造血干细胞植活分析等；这些项目不是靠低价竞争，适合做技术证据和项目绑定。')
lines.append('- 丙肝 RNA 108 元是异常高点，不能按“浙江整体低”去谈价；先确认检测方法、定量/高敏口径，再决定是否作为重点。')
lines.append('')
lines.append('### 7.2 科研部')
lines.append('')
lines.append('- 这份文件是**医疗服务价格**，不是高校/科研院所试剂采购价格；科研部 11–12 月促销的主战场仍是课题组经费、测试转二单、组合包，不是医院检验收费。')
lines.append('- 浙江医院客户如果同时有检验科和科研课题组，检验价格下降会影响医院整体预算气氛，但不能直接推导科研经费下降；对客话术要分开：检验科谈成本，课题组谈项目和数据。')
lines.append('')
lines.append('### 7.3 产品与市场')
lines.append('')
lines.append('- 产品端优先做“每测试成本”证据：酶用量、mix 体积、扩增效率、复检率、批间稳定性；没有这些数据，价格表只能当背景，不能当报价依据。')
lines.append('- 市场端可把 662 项按“浙江低价/持平/高价/自主定价”分四类，形成浙江客户对话清单；低价项谈成本，高价项谈性能和项目，不要一套话术打全部。')
lines.append('')
lines.append('## 八、不确定与边界')
lines.append('')
lines.append('- 浙江 PDF 是**征求意见稿**，不是最终执行价；最终版本、执行日期、过渡政策都未在文件内给出。')
lines.append('- 六省 XLSX 的省级价格是文件口径，是否已执行、是否含不同年份/不同版本，表中没有说明；不能当成同一年、同一时点的绝对价格。')
lines.append('- 没有试剂成本、测试量、项目组合数据，因此不能计算毛利影响；本报告只做价格位置和结构判断，不做利润测算。')
lines.append('- PDF 3 处跨页主项行按 XLSX 补正；其余描述照 PDF 原文，部分单元格本身有截断。')
lines.append('')
lines.append('## 九、建议动作')
lines.append('')
lines.append('| # | 动作 | 主责 | 时限 | 验收 |')
lines.append('|---:|---|---|---|---|')
lines.append('| 1 | 建浙江分子诊断 25 项的“每测试成本”模型：酶/mix 用量、耗材、复检率、目标毛利率 | 诊断原料产品经理 + 财务 | 11/30 | 25 项均有成本区间和报价底线 |')
lines.append('| 2 | 把 662 项按浙江低价/持平/高价/自主定价分四类，交浙江区域做客户对话清单 | 市场 + 浙江区域负责人 | 11/20 | 四类清单，低价项和高价项各≥10项 |')
lines.append('| 3 | 对丙肝 RNA 108 元、细胞核酸扩增 220 元、肿瘤面板 1800 元、病原宏基因组 1800 元做专项核对 | 产品经理 | 11/15 | 每项确认方法学/口径/竞品价 |')
lines.append('| 4 | 科研部 11–12 月促销保持“二单冲刺”，不引用本价格表做降价依据 | 科研区域经理 | 11/10 | 促销方案不含医疗服务价格话术 |')
lines.append('| 5 | 跟踪浙江最终版及执行日期，更新本分析 | 市场/政府事务 | 文件发布后 5 个工作日 | 版本号、执行日、差异项 |')
lines.append('')
lines.append('## 十、数据源与复算')
lines.append('')
lines.append('- 转写件：`产品与市场/政策/浙江省检验类医疗服务价格项目表_征求意见稿_转写.md`')
lines.append('- 转写件：`产品与市场/政策/检验类立项指南_662项_六省横向对比_转写.md`')
lines.append('- 项目明细 CSV：`产品与市场/政策/浙江省检验类医疗服务价格项目表_征求意见稿_项目明细.csv`')
lines.append('- 统计口径：按序号逐项；浙江/北京比值只取两边都有数值的 640 项；六省最低/最高按该项可得省份排序，空值不参与。')
lines.append('')
open(ANALYSIS_MD, 'w', encoding='utf-8').write('\n'.join(lines))

# copy originals with clean names
shutil.copy2(PDF, os.path.join(SRCDIR, '浙江省检验类医疗服务价格项目表_征求意见稿.pdf'))
shutil.copy2(XLSX, os.path.join(SRCDIR, '检验类立项指南_662项_六省横向对比.xlsx'))

print('PDF_MD', PDF_MD, os.path.getsize(PDF_MD))
print('XLSX_MD', XLSX_MD, os.path.getsize(XLSX_MD))
print('ANALYSIS_MD', ANALYSIS_MD, os.path.getsize(ANALYSIS_MD))
print('main', len(xrows), 'subs', len(subs), 'missing desc', main_missing)
