#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""冻干分子诊断产品「水分 均值≤2%/单瓶≤3%」依据核查 → 自包含 HTML 证据卡"""
import io
import os
import re
import sys

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

W = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'

ROWS = [
    ('《体外诊断试剂注册与备案管理办法》', '国家局令第48号（2021-10-01 施行）', '部门规章<b>（强制）</b>',
     '❌ 无水分条款', '规定三类 IVD 须注册；产品技术要求由申请人自订并按《医疗器械产品技术要求编写指导原则》编制'),
    ('《呼吸道病毒多重核酸检测试剂注册技术审查指导原则》', 'CMDE，2019 年发布', '指导原则（不作为法规强制）',
     '❌ <b>全文无「水分」二字</b>', '即客户这类产品的对口审评要点：稳定性需覆盖<b>实时/开瓶/冻融/复溶/运输</b>；产品技术要求列 物理性状/参考品符合率/精密度/最低检出限'),
    ('《体外诊断试剂稳定性研究注册审查指导原则》', '2025 年第 4 号', '指导原则',
     '❌ 未设水分限度', '冻干品须做<b>复溶稳定性 + 运输稳定性</b>；水分是支撑稳定性的内部指标，限度由企业自定'),
    ('《体外诊断试剂生产质量管理规范》及检查要点指南', '2017 修订版（体系检查）', '规范性文件（强制）',
     '❌ 未给水分数字', '<b>唯一直接管到冻干工序的文件</b>：冻干为特殊工序，须建立冻干工艺（时间/压力/温度）；冻干品外观应呈<b>疏松粉末状固体、规定时间（一般不超 60 分钟）复溶完全</b>；干燥间湿度 10%~30%'),
    ('行业标准（YY/T、GB）', '专项检索', '行业/国家标准',
     '❌ 未检索到「冻干 IVD 水分限度」专用标准', 'YY/T 类按检测项目分（如 YY/T 1244 体外诊断试剂用水）；冻干试剂的水分限度无专用行标'),
    ('《中国药典》三部 冻干制品（药品口径）', '2020/2025 版各论', '药品标准（IVD <b>不适用</b>，仅可参照）',
     '⚠️ 常见 <b>≤3.0%</b>（单瓶）', '例：治疗用卡介苗 = 水分不高于 3.0%（专利 CN116077634A、论文《治疗用卡介苗…》原文引「法规规定成品水分应≤3%」）'),
    ('境外口径', 'WOAH / 印度药典 IP 2018 / VICH GL26', '境外标准/指南',
     '⚠️ WOAH ≤3.5%；IP 2018 ≤3%', 'VICH GL26（EMA/USDA-APHIS）只规定冻干兽用生物制品残留水分<b>测定方法</b>，不设限度'),
    ('行业文献与厂商口径', 'Leukocare、American Pharmaceutical Review、Metrohm', '厂商/文献（<b>非标准</b>）',
     '⚠️ 目标区间 1~3%', '厂商博客称「相关法规规定冻干产品含水量需低于 2%」——<b>未指明条款，不可作依据</b>'),
]

ROWS2 = [
    ('《呼吸道病毒多重核酸检测试剂注册技术审查指导原则》', 'CMDE 2019（对口）', '指导原则',
     '✅ 相关 · ❌ 无水分', '同类产品必须按它准备资料：稳定性（实时/开瓶/冻融/<b>复溶</b>/运输）、产品技术要求（物理性状·参考品符合率·精密度·LOD）。通篇无「水分」'),
    ('《核酸扩增法检测试剂注册技术审查指导原则》', '食药监办械函〔2013〕3 号（2013-01-04 发布）', '指导原则',
     '✅ <b>已逐字核</b> · ❌ 无冻干试剂水分', '唯一出现「冻干」的地方是<b>引物/探针原材料的形态</b>（合成后为冻干粉、-20℃保存）；生产工艺只列 配制工作液→半成品检定→分装→包装（<b>无冻干工序</b>）；成品检验项为 参考品符合率/灵敏度/特异性/精密度/线性/稳定性 —— <b>均无水分项</b>'),
    ('《体外诊断试剂稳定性研究注册审查指导原则》', '2025 年第 4 号（2025-03-27）', '指导原则',
     '✅ 直接相关 · ❌ 无水分限度', '明确：<b>冻干产品应对其复溶稳定性进行研究</b>；说明书【储存条件及有效期】须载明复溶稳定性；开封/机载/冻融同理'),
    ('<b>YY/T 1579-2018《体外诊断医疗器械 体外诊断试剂稳定性评价》</b>（=ISO 23640:2011 IDT）', '行业标准（现行）', '行业标准',
     '✅ <b>扫描件 10 页全文 OCR 核过</b> · ❌ 无水分限度', '规定实时/加速/运输/<b>复溶稳定性</b>评价要求（5.2.3 使用稳定性等）；全文「冻干」只出现 1 次（复溶后冻干材料的制备使用）、「水分」0 次 —— 不规定水分限值'),
    ('《体外诊断试剂生产质量管理规范》及体系检查要点指南', '2017 年修订版', '规范性文件（强制）',
     '✅ 直接管冻干工序 · ❌ 无水分数字', '冻干＝特殊工序：须建立并验证冻干工艺（时间/压力/温度）；冻干品外观呈<b>疏松粉末状固体、规定时间（一般 ≤60 分钟）复溶完全</b>；干燥间湿度 10%~30%'),
    ('《家用体外诊断医疗器械注册技术审查指导原则》', '2020 年第 80 号 附件 1（NMPA 官方 .doc，14 页）', '指导原则',
     '⚠️ <b>全文零命中</b>（已更正）', '<b>更正</b>：此前依二手文章记「提到冻干试剂复溶后稳定性」——<b>NMPA 官方附件全文 5,578 字内 冻干/水分/复溶 均 0 次</b>，该表述不出自本文件，已撤回'),
    ('《核酸检测试剂冻干技术及其评价方法研究进展》', '生物技术进展 2025,15(5):804-811', '学术综述（<b>非法规</b>）',
     '⚠️ 把「含水率」列为评价项 · 无 2%/3% 值', '第 4.2 节「含水率测定」：卡尔-费休法 / 热重分析法 —— <b>只给方法，不给限值</b>；全文无 2%、3% 水分数字'),
]

ROWS3 = [
    ('1', '《呼吸道病毒多重核酸检测试剂注册技术审查指导原则》(CMDE 2019)',
     '抓全文（原页 GB2312，编码修正后）', '11,120', '0 次', '0 次', '1 次', '无水分条款'),
    ('2', '《核酸扩增法检测试剂注册技术审查指导原则》(食药监办械函〔2013〕3 号)',
     '官方 .doc 原件（解析 3,009 字）', '3,009', '2 次（引物/探针<b>原料</b>形态）', '0 次', '0 次', '无水分条款'),
    ('3', '《体外诊断试剂稳定性研究注册审查指导原则》(2025 年第 4 号)',
     'CMDE 官方 .docx 附件', '4,318', '0 次', '0 次', '2 次', '无水分限度'),
    ('4', '《体外诊断试剂生产质量体系检查要点指南》(2017 修订版)',
     '药监局全文页（28,674 字）', '28,674', '10 次', '1 次（仅<b>设备名</b>「水分滴定仪」）', '2 次（≤60 min 复溶完全）', '无水分限值'),
    ('5', '《家用体外诊断医疗器械注册技术审查指导原则》(2020 年第 80 号 附件 1)',
     'NMPA 官方 .doc（14 页）· <b>两种提取方式互证</b>', '5,578', '0 次', '0 次', '0 次', '<b>全文零命中</b>（更正处）'),
    ('6', '《体外诊断试剂注册与备案管理办法》(总局令第 48 号)',
     '官方 .docx', '13,603', '0 次', '0 次', '0 次', '无'),
    ('7', '《核酸检测试剂冻干技术及其评价方法研究进展》(生物技术进展 2025)',
     '期刊 PDF 全文', '23,065', '151 次', '12 次（仅方法与机理；唯一数字＝升华后残留约 10%）', '14 次', '只给方法、不给限值'),
    ('8', '<b>YY/T 1579-2018</b>（=ISO 23640:2011 IDT）',
     '扫描件 10 页 → macOS Vision OCR', '6,359（OCR）', '1 次', '0 次', '3 次', '无水分限值'),
    ('9', '《流行性感冒病毒核酸检测试剂注册申报资料指导原则》(2011 版，食药监办械函〔2011〕540 号)',
     'NMPA 正文 11 页 · 取得 <b>6 页</b>（11,811 字）；余 5 页被 WAF 拦截', '11,811（6/11 页）', '0 次', '0 次', '0 次', '<b>已于 2024-01-03 废止</b>，被下条替代'),
    ('10', '<b>《流行性感冒病毒核酸检测试剂注册审查指导原则（2023 年修订版）》（2024 年第 1 号 · 现行）</b>',
     '<b>CMDE 官方 .docx 附件</b>（42,934 bytes 原件）', '10,272', '0 次', '0 次', '0 次', '现行版；要求在「非临床资料→稳定性研究」做 实时/开瓶/运输/机载/冻融 —— <b>不含冻干与水分</b>'),
]

HTML = """<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>冻干分子诊断产品「水分均值≤2%/单瓶≤3%」依据核查</title>
<style>
*{box-sizing:border-box}body{margin:0;background:#f4f6fa;font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;color:#20242c;font-size:13px}
.wrap{max-width:1300px;margin:0 auto;padding:16px 18px 40px}
h1{font-size:22px;margin:14px 0 6px}.meta{color:#6b7280;font-size:12.5px;line-height:1.85;margin-bottom:14px}
.verdict{background:#fff;border:1px solid #e6eaf2;border-left:5px solid #b91c1c;border-radius:10px;padding:14px 16px;margin-bottom:14px}
.verdict .t{font-size:15px;font-weight:900;color:#b91c1c;margin-bottom:7px}
.verdict .b{font-size:13px;line-height:1.95}
.card{background:#fff;border:1px solid #e6eaf2;border-radius:10px;padding:14px 16px;margin-bottom:14px}
.card h2{font-size:15px;margin:0 0 10px;padding-left:9px;border-left:3px solid #1a5276}
table{width:100%;border-collapse:collapse;font-size:12.5px}
th{background:#1a5276;color:#fff;font-weight:600;padding:8px 9px;text-align:left;vertical-align:middle}
td{padding:8px 9px;border-bottom:1px solid #eef1f6;vertical-align:top;line-height:1.7}
td.b{font-weight:700}
.ok{color:#15803d;font-weight:800}.no{color:#b91c1c;font-weight:800}.warn{color:#b45309;font-weight:800}
.two{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.box{background:#fbfcfe;border:1px solid #e6eaf2;border-radius:9px;padding:12px 14px;font-size:12.5px;line-height:1.9}
.box h3{margin:0 0 7px;font-size:13.5px}
.box.bad{border-left:4px solid #b91c1c}.box.good{border-left:4px solid #15803d}
.mono{font-family:ui-monospace,Menlo,monospace;background:#f1f5f9;padding:1px 4px;border-radius:4px}
ol{margin:6px 0 0;padding-left:20px;line-height:1.95}li{margin-bottom:5px}
.src{font-size:11.5px;color:#6b7280;line-height:1.9;word-break:break-all}
@media(max-width:1000px){.two{grid-template-columns:1fr}table{font-size:12px}}
</style></head><body><div class="wrap">
<h1>「冻干产品水分 均值≤2%、单瓶≤3%」依据核查</h1>
<div class="meta">对象：客户提供的<b>呼吸道冻干分子诊断产品（IVD，荧光 PCR 类）</b>水分口径 ｜ 核查日 2026-10-16<br>
核查范围：《体外诊断试剂注册与备案管理办法》、CMDE 对口指导原则（呼吸道病毒多重核酸检测试剂 / 体外诊断试剂稳定性研究）、IVD 生产质量管理规范与体系检查要点、YY/T 与 GB 行业/国家标准库、境外药典与指南、行业文献</div>

<div class="verdict">
 <div class="t">核查结论：这不是任何法规、注册要求或行业标准的原文 —— 属客户自订内控口径</div>
 <div class="b">
 ① 中国现行 IVD 法规体系中，<b>没有</b>对冻干体外诊断试剂规定「平均水分 ≤2%、单瓶 ≤3%」的条款；<br>
 ② 客户这类产品的对口审评文件《呼吸道病毒多重核酸检测试剂注册技术审查指导原则》<b>通篇未出现「水分」二字</b>，只要求稳定性覆盖实时/开瓶/冻融/复溶/运输；<br>
 ③ 唯一管到冻干工序的强制文件（IVD 生产质量管理规范与体系检查要点）只说冻干品应呈<b>疏松粉末状固体、规定时间内（一般 ≤60 分钟）复溶完全</b>，<b>没有水分数字</b>；<br>
 ④ 因此「2% 均值 / 3% 单瓶」最可能是客户在<b>药典 3% 上限</b>之下、结合自身冻干工艺能力设定的<b>企业内控/放行标准</b>（写入其产品技术要求）。合理，但<b>不能标为法规引用</b>。
 </div>
</div>

<div class="card"><h2>一、逐条核查：法规 / 指导原则 / 标准里到底有没有这条</h2>
<table><thead><tr><th style="width:20%">文件</th><th style="width:15%">文号 / 版本</th><th style="width:13%">性质</th><th style="width:15%">是否含水分限度</th><th>与本议题的关系</th></tr></thead><tbody>
{{rows}}
</tbody></table></div>

<div class="card"><h2>一·附：全文逐字核验记录（10 份文件 · 全文字数 × 关键词命中数）</h2>
<table><thead><tr><th>#</th><th style="width:28%">文件</th><th style="width:17%">原文获取方式</th><th style="width:9%">全文字数</th><th style="width:11%">「冻干」</th><th style="width:16%">「水分」</th><th style="width:9%">「复溶」</th><th>判定</th></tr></thead><tbody>
{{rows3}}
</tbody></table>
<div class="note" style="margin-top:10px;background:#fbfcfe;border:1px dashed #cbd5e1;border-radius:8px;padding:11px 13px;font-size:12px;color:#4b5563;line-height:1.9">
<b>核查纪律</b>：全部 10 份均取<b>原文/官方附件</b>后做全文关键词扫描，不靠片段或摘要下结论；命中数按<b>全文逐句检索</b>统计。过程中已修正三处自身问题 —— ①《家用体外诊断医疗器械注册技术审查指导原则》此前依二手文章记为「提到冻干试剂复溶后稳定性」，官方附件全文核后<b>零命中，已撤回</b>；②《呼吸道病毒多重核酸检测试剂注册技术审查指导原则》原网页为 GB2312，首轮按 UTF-8 读成乱码导致<b>假零命中</b>，修正编码后为 11,120 字、「复溶」1 次；③**编码判定启发式一度只看汉字数**（UTF-8 字节按 GBK 读同样产出大量"汉字"乱码），已改为按<b>常用字频率</b>判别并复验全部文件。YY/T 1579-2018 为**扫描件**，用 macOS Vision OCR 全 10 页提取（OCR 属二级来源、个别字可能失真，结论已由标准简介、条款框架与 ISO 23640:2011 等同关系三方互证）。流感 2011 版 11 页中 5 页被 NMPA WAF 拦截（返回空 body），已如实标注覆盖为 6/11 页 —— 但该版<b>已于 2024-01-03 废止</b>，现行 2023 修订版已取得官方 .docx 全文并核完。
</div></div>

<div class="card"><h2>二、冻干剂型 / 呼吸道核酸检测 专项：有哪些相关文件（逐份核过）</h2>
<table><thead><tr><th style="width:20%">文件</th><th style="width:15%">文号 / 版本</th><th style="width:13%">性质</th><th style="width:15%">与冻干/水分的关系</th><th>关键内容</th></tr></thead><tbody>
{{rows2}}
</tbody></table>
<div class="note" style="margin-top:10px;background:#fbfcfe;border:1px dashed #cbd5e1;border-radius:8px;padding:11px 13px;font-size:12px;color:#4b5563;line-height:1.9">
<b>一句话</b>：与「冻干型呼吸道核酸检测试剂」相关的指导原则/规章/标准有 <b>8 份</b>（上方 7 份 + 现行《流感病毒核酸检测试剂注册审查指导原则（2023 年修订版）》），但它们管的都是<b>工艺与复溶性</b>（冻干工艺验证 · ≤60 分钟复溶完全 · 复溶/实时/运输/机载/冻融稳定性研究），<b>没有任何一份规定 2%/3% 的水分限度</b>。IVD 体系里，水分是<b>企业自设的内控指标</b>，不是法定限度。
</div></div>

<div class="card"><h2>三、可以用的表述 vs 不能用的表述</h2>
<div class="two">
 <div class="box bad"><h3>❌ 不能说</h3>
 「法规要求冻干产品水分平均≤2%、单瓶≤3%」（无此条款，属虚构出处）<br>
 「行业标准规定…」（未检索到专用行标/国标）<br>
 「《呼吸道病毒多重核酸检测试剂注册技术审查指导原则》要求水分≤2%」（该文件全文无水分）
 </div>
 <div class="box good"><h3>✅ 应该说</h3>
 「<b>法定体系</b>：IVD 无水分统一限度；冻干工序须有验证过的冻干工艺，成品须在规定时间内复溶完全」<br>
 「<b>参照药品口径</b>：《中国药典》三部冻干制品水分通常 ≤3.0%（单瓶）」<br>
 「<b>本项目内控</b>：双方约定 均值 ≤2%、单瓶 ≤3%（企业自订放行标准，含于产品技术要求中）」
 </div>
</div></div>

<div class="card"><h2>四、对客户/销售的回复要点（可直接用）</h2>
<ol>
<li>「我们核了现行 IVD 法规与标准，<b>没有</b>针对冻干试剂水分 2%/3% 的法定限度；该数值属产品内控标准 —— 这一点我们说清楚，避免以后注册申报时被质疑出处。」</li>
<li>「冻干相关的<b>强制性</b>要求是：冻干工艺须经验证（时间/压力/温度参数），成品外观呈疏松粉末状固体，规定时间内（一般不超过 60 分钟）复溶完全。」</li>
<li>「如果贵方以 2%/3% 作为<b>内控放行标准</b>，我们可以配合做到，并建议在技术要求/质量标准中写明『企业内控标准』。”</li>
<li>「若贵方需要<b>法规级依据</b>，建议引用《中国药典》三部冻干制品 水分 ≤3.0% 的口径，或贵方产品的注册审查指导原则中关于稳定性与复溶性的要求。」</li>
<li>「如贵方手上有写有该数值的<b>原始文件</b>（注册资料/技术要求/团标），请发我们，我们帮忙逐条核对出处。」</li>
</ol></div>

<div class="card"><h2>五、下一步（到人）</h2>
<table><thead><tr><th style="width:26%">动作</th><th style="width:16%">主责</th><th>说明</th></tr></thead><tbody>
<tr><td>确认客户该数值的原始出处文件</td><td class="b">对接该客户的销售</td><td>拿到原始文件我这边逐条核，核完写入本证据卡</td></tr>
<tr><td>若涉及我方原料配套承诺（冻干体系水分）</td><td class="b">应用研究部 / 产品部</td><td>我方原料出厂水分指标是否可以按 2%/3% 承诺，需产品部确认后对客</td></tr>
<tr><td>对外表述定稿（法定 vs 内控 两段式）</td><td class="b">刘新元</td><td>避免销售在客户现场把内控说成法规</td></tr>
</tbody></table></div>

<div class="card"><h2>六、来源清单（可复核）</h2><div class="src">
1. 《呼吸道病毒多重核酸检测试剂注册技术审查指导原则》（CMDE 2019，对口）全文已逐字核 → <b>无「水分」二字</b> — https://caivd-org.cn/article.asp?id=8914<br>
2. 《体外诊断试剂稳定性研究注册审查指导原则》（国家药监局器审中心 2025 年第 4 号，2025-03-27 发布）— https://www.ydcmdei.org.cn/article/607 ｜ 原文：https://www.shcares.com.cn/faguizhinan/tiwaizhenduanshiji/1112.html<br>
3. <b>YY/T 1579-2018《体外诊断医疗器械 体外诊断试剂稳定性评价》</b>（行业标准，2018-02-24 发布 / 2019-03-01 实施）— 含复溶稳定性要求，无水分限值 — https://www.biaozhun.org/hangye/228211.html<br>
4. 《体外诊断试剂生产质量体系检查要点指南（2017 修订版）》冻干工序条款（冻干工艺验证 / 疏松粉末 / ≤60 分钟复溶完全 / 干燥间湿度 10%~30%）— https://yjj.beijing.gov.cn/yjj/ztzl48/ylqxjgfwzn/jdjczn61/747925/index.html<br>
5. 《家用体外诊断医疗器械注册技术审查指导原则》——「冻干试剂复溶后稳定性（如有）」<br>
6. 《核酸扩增法检测试剂注册技术审查指导原则》（食药监办械函〔2011〕3 号 6 项之一）——方法学通用框架（本卡未逐字核）<br>
7. 《核酸检测试剂冻干技术及其评价方法研究进展》生物技术进展 2025,15(5):804-811（DOI 10.19586/j.2095-2341.2025.0065）——4.2 含水率测定（卡尔-费休/热重），<b>只给方法不给限值</b><br>
8. 《体外诊断试剂注册与备案管理办法》（国家局令第 48 号，2021-10-01 施行）<br>
9. 参照口径（药品/境外）：《中国药典》三部 冻干制品 ≤3.0%（专利 CN116077634A 引）；WOAH ≤3.5%（Diallo 2024, PMC11599066）；印度药典 IP 2018 ≤3%；VICH GL26（EMA/USDA-APHIS）仅方法学<br>
10. 行业文献目标区间 1~3% — Leukocare；American Pharmaceutical Review（冻干生物材料 0.5~3% w/w）<br>
11. 《流行性感冒病毒核酸检测试剂注册申报资料指导原则》（2011 版，食药监办械函〔2011〕540 号，<b>已于 2024-01-03 废止</b>）— NMPA 正文 11 页：index/_1…_10（本次取得 6 页；余 5 页 WAF 拦截）<br>
12. <b>《流行性感冒病毒核酸检测试剂注册审查指导原则（2023 年修订版）》（2024 年第 1 号 · 现行）</b> — CMDE 官方附件：https://www.ydcmdei.org.cn/attachment/20240110/6ad9810799dc4454ac837091d662daa7.docx ｜ 全文 10,272 中文字，关键词 0 命中
</div></div>
</div><script>/* 静态自包含 */</script></body></html>"""

rows = ''
for name, no, kind, has, rel in ROWS:
    cls = 'no' if has.startswith('❌') else 'warn'
    rows += '<tr><td class="b">%s</td><td>%s</td><td>%s</td><td class="%s">%s</td><td>%s</td></tr>' % (name, no, kind, cls, has, rel)
rows2 = ''
for name, no, kind, has, rel in ROWS2:
    cls = 'no' if '❌' in has else ('warn' if '⚠' in has else 'ok')
    rows2 += '<tr><td class="b">%s</td><td>%s</td><td>%s</td><td class="%s">%s</td><td>%s</td></tr>' % (name, no, kind, cls, has, rel)
rows3 = ''
for c in ROWS3:
    rows3 += '<tr><td class="b">%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td class="b">%s</td></tr>' % c
page = HTML.replace('{{rows3}}', rows3).replace('{{rows2}}', rows2).replace('{{rows}}', rows)
assert '{{' not in page
page = BK.inject(page, theme='light', tag='营销中心 · 技术取证', footer_extra='核查范围：IVD 法规体系 / CMDE 指导原则 / 行业标准 / 境外药典 / 行业文献')
v = BK.verify(page)
assert all(v.values()), [k for k, ok in v.items() if not ok]
out = W + '/销售分析/冻干水分2%-3%依据核查_呼吸道冻干IVD_2026-10-16.html'
io.open(out, 'w', encoding='utf-8').write(page)
print('✅ HTML:', out, '%.0f KB' % (os.path.getsize(out) / 1024))
print('   行数 %d ｜ 来源 %d 条' % (len(ROWS), 8))
