#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import base64, os
ROOT='/Users/liuxinyuan/Desktop/Hermes输出-工作类'
OUT=os.path.join(ROOT,'客户管理/拜访卡/上海万子健_访前作战卡_20261028.html')
os.makedirs(os.path.dirname(OUT),exist_ok=True)
LOGO=base64.b64encode(open('/Users/liuxinyuan/work/公司资料/logo_transparent.png','rb').read()).decode()

html=f'''<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8">
<title>上海万子健 · 访前作战卡 2026-10-28</title>
<style>
@page{{size:A4;margin:0}}
*{{box-sizing:border-box;margin:0;padding:0}}
html,body{{width:210mm;background:#eef3f8}}
body{{font-family:"PingFang SC","Microsoft YaHei",-apple-system,sans-serif;color:#17324d;-webkit-print-color-adjust:exact;print-color-adjust:exact}}
.page{{width:210mm;height:297mm;background:#fff;padding:9mm 11mm 8mm;margin:0 auto 6mm;position:relative;display:flex;flex-direction:column;overflow:hidden}}
.page:last-child{{margin-bottom:0}}
@media print{{html,body{{background:#fff}}.page{{margin:0;page-break-after:always}}.page:last-child{{page-break-after:auto}}}}
.top{{display:flex;align-items:center;border-bottom:.6pt solid #dbe6f0;padding-bottom:1.3mm;flex:0 0 auto}}
.top img{{height:8mm}}
.top .sl{{margin-left:auto;font-size:6.6pt;color:#1565c0;letter-spacing:.8pt}}
.hero{{display:flex;align-items:flex-end;gap:5mm;border-bottom:2.2pt solid #1a73e8;padding:3mm 0 2.2mm;flex:0 0 auto}}
.hero .eyebrow{{font-size:6.2pt;color:#1a73e8;letter-spacing:1pt;font-weight:700}}
.hero h1{{font-size:22pt;line-height:1.1;color:#0b3f7a;margin-top:.7mm}}
.hero .sub{{font-size:8.2pt;color:#5f7183;margin-top:.8mm}}
.hero .meta{{margin-left:auto;text-align:right;font-size:6.4pt;line-height:1.55;color:#5f7183;white-space:nowrap}}
.hero .meta b{{color:#0b3f7a}}
.kpis{{display:grid;grid-template-columns:repeat(4,1fr);gap:2.2mm;margin-top:2.4mm;flex:0 0 auto}}
.kpi{{background:#f3f8fe;border:.5pt solid #d7e6f7;border-radius:1.6mm;padding:2.2mm 2.4mm}}
.kpi b{{display:block;font-size:16pt;color:#1a73e8;line-height:1.05}}
.kpi span{{display:block;font-size:6.5pt;color:#415a70;margin-top:.4mm}}
.kpi em{{display:block;font-style:normal;font-size:5.6pt;color:#8a9bac;margin-top:.3mm}}
.judge{{margin-top:2.4mm;background:#0b2f57;color:#fff;border-radius:1.6mm;padding:2.4mm 3mm;font-size:7.1pt;line-height:1.5;flex:0 0 auto}}
.judge b{{color:#9ff4ff;margin-right:1.5mm}}
.grid2{{display:grid;grid-template-columns:1fr 1fr;gap:2.6mm;margin-top:2.4mm}}
.card{{border:.5pt solid #dbe6f0;border-radius:1.6mm;padding:2.2mm 2.6mm;background:#fff}}
h2{{font-size:8.6pt;color:#0b3f7a;display:flex;align-items:center;gap:1.8mm;margin-bottom:1.4mm}}
h2:before{{content:"";width:1.1mm;height:3.2mm;background:#1a73e8;border-radius:.5mm}}
.org{{font-size:6.6pt;line-height:1.55;color:#415a70}}
.org b{{color:#0b3f7a}}
.org .indent{{padding-left:3.2mm;border-left:.5pt solid #cfe0ef;margin-left:1mm;margin-top:.6mm}}
.org .tag{{display:inline-block;background:#eaf4ff;color:#1565c0;border-radius:.8mm;padding:.2mm 1.2mm;font-size:5.7pt;margin-left:1mm}}
table{{width:100%;border-collapse:collapse;font-size:6.15pt}}
th{{background:#eaf3fd;color:#17456e;text-align:left;padding:.9mm 1.1mm;border:.5pt solid #cfe0ef;font-weight:600}}
td{{padding:.9mm 1.1mm;border:.5pt solid #dbe6f0;vertical-align:top;line-height:1.38}}
td b{{color:#0b2a4a}}
.p0{{color:#c0392b;font-weight:700}}.p1{{color:#d68910;font-weight:700}}.p2{{color:#7b8ea2;font-weight:700}}
.projects{{margin-top:2.4mm;flex:0 0 auto}}
.projects table td:nth-child(1){{width:18%}}.projects table td:nth-child(2){{width:39%}}.projects table td:nth-child(3){{width:35%}}.projects table td:nth-child(4){{width:8%;text-align:center}}
.note{{font-size:5.6pt;color:#8a9bac;line-height:1.4;margin-top:1.2mm}}
.footer{{margin-top:auto;border-top:.5pt solid #dbe6f0;padding-top:1.4mm;display:flex;align-items:center;font-size:5.8pt;color:#7b8ea2;flex:0 0 auto}}
.footer .r{{margin-left:auto;color:#1565c0}}
.page2 .hero2{{display:flex;align-items:flex-end;border-bottom:2pt solid #1a73e8;padding:2.5mm 0 1.8mm;flex:0 0 auto}}
.page2 h1{{font-size:17pt;color:#0b3f7a}}
.page2 .sub{{font-size:7pt;color:#5f7183;margin-top:.5mm}}
.goals{{display:grid;grid-template-columns:repeat(3,1fr);gap:2.2mm;margin-top:2.4mm;flex:0 0 auto}}
.goal{{background:#0b2f57;color:#fff;border-radius:1.6mm;padding:2.4mm 2.6mm}}
.goal b{{display:block;color:#9ff4ff;font-size:6.2pt;letter-spacing:.5pt;margin-bottom:.8mm}}
.goal strong{{display:block;font-size:7.6pt;line-height:1.4}}
.goal span{{display:block;font-size:6pt;color:#cfe3f5;line-height:1.4;margin-top:.8mm}}
.script{{margin-top:2.4mm;background:#f3f8fe;border-left:2.5pt solid #1a73e8;border-radius:1mm;padding:2.3mm 3mm;font-size:7pt;line-height:1.55;color:#17456e;flex:0 0 auto}}
.script b{{color:#0b3f7a}}
.cols{{display:grid;grid-template-columns:1.03fr .97fr;gap:2.6mm;margin-top:2.4mm;flex:0 0 auto}}
ol,ul{{padding-left:4.2mm}}
li{{font-size:6.35pt;line-height:1.48;margin-bottom:.9mm;color:#415a70}}
li b{{color:#0b3f7a}}
.risk td:nth-child(1){{width:23%;font-weight:600;color:#0b3f7a}}.risk td:nth-child(2){{width:32%}}
.unc{{margin-top:2.2mm;border:.5pt dashed #c7d8e8;border-radius:1.4mm;padding:2.2mm 2.6mm;background:#fbfdff;flex:0 0 auto}}
.unc h2{{margin-bottom:1mm}} .unc p{{font-size:6.2pt;line-height:1.5;color:#5f7183}}
.timeline{{margin-top:2.3mm;flex:0 0 auto}}
.timeline td:nth-child(1){{width:12%;white-space:nowrap;color:#1565c0;font-weight:600}}
.timeline td:nth-child(2){{width:24%;font-weight:600;color:#0b3f7a}}
.actions{{display:grid;grid-template-columns:repeat(3,1fr);gap:2.2mm;margin-top:2.4mm}}
.action{{background:#f3f8fe;border:.5pt solid #d7e6f7;border-radius:1.4mm;padding:2.2mm 2.6mm}}
.action b{{display:block;color:#1a73e8;font-size:6.2pt;letter-spacing:.4pt}}
.action strong{{display:block;font-size:7.1pt;color:#0b3f7a;line-height:1.4;margin-top:.5mm}}
.action span{{display:block;font-size:6pt;color:#5f7183;line-height:1.45;margin-top:.6mm}}
.check{{display:grid;grid-template-columns:repeat(3,1fr);gap:2.2mm;margin-top:2.4mm;flex:0 0 auto}}
.check div{{border:.5pt solid #d7e6f7;border-radius:1.2mm;padding:1.6mm 2.2mm;background:#fbfdff;font-size:6.2pt;color:#415a70;line-height:1.4}}
.check b{{color:#1a73e8;margin-right:1mm}}
.answers{{margin-top:2.4mm;flex:0 0 auto}}
.answers td:nth-child(1){{width:34%;font-weight:600;color:#0b3f7a}}
.sources{{margin-top:2mm;font-size:5.5pt;color:#8a9bac;line-height:1.45;border-top:.5pt solid #dbe6f0;padding-top:1.2mm}}
</style></head><body>
<div class="page">
<div class="top"><img src="data:image/png;base64,{LOGO}"><span class="sl">守护生命健康，缔造美好生活</span></div>
<div class="hero"><div><div class="eyebrow">VISIT BRIEF · 2026-10-28</div><h1>上海万子健生物</h1><div class="sub">沙海天 · 研发经理（东方基因 / 万子健）｜会面主题：项目复盘与下一步测试</div></div>
<div class="meta">宝锐销售：<b>路要峰</b><br>客户级别：<b>重点客户</b><br>累计供货：<b>2.32 万元</b><br>本次性质：<b>研发/技术拜访</b></div></div>

<div class="kpis">
<div class="kpi"><b>2.32万</b><span>累计供货（2024–2026）</span><em>ERP 价税合计</em></div>
<div class="kpi"><b>1.05万</b><span>2026 年供货</span><em>6 张正式单 · 21 张测试单</em></div>
<div class="kpi"><b>4</b><span>CRM 商机</span><em>2 个已实现销售</em></div>
<div class="kpi"><b>6</b><span>跟踪项目</span><em>本次 P0：2 个</em></div>
</div>

<div class="judge"><b>30 秒判断</b>万子健是东方基因的研发/POCT 主体，丹威承担转产、报证与采购抬头。近期最强抓手是<b>生殖道六重转产</b>，最急的技术问题是<b>HIV 冻干后性能下降</b>；先保转产、再攻冻干、后铺 RT-LAMP。</div>

<div class="grid2">
<div class="card"><h2>客户结构</h2><div class="org">
<b>浙江东方基因（688298）</b><span class="tag">上市母公司</span>
<div class="indent"><b>上海万子健生物</b> <span class="tag">研发 / POCT / 液态芯片</span><br>本次会面主体；自研 POCT 仪器，项目研发在这里。<br>
<b>杭州丹威</b> <span class="tag">转产 / 报证 / 采购抬头</span><br>生殖道六重已提交转产；部分订单走丹威抬头。<br>
<b>万子健医检</b> <span class="tag">第三方实验室</span><br>与本次原料项目不直接相关。</div>
</div><p class="note">公开资料：万子健生物为东方基因全资子公司，2021-04-29 成立，注册资本 2.45 亿元，嘉定区新冠路 296 号；主营液态芯片、分子/免疫 IVD。</p></div>

<div class="card"><h2>关键人</h2><table>
<tr><th>姓名</th><th>角色 / 依据</th><th>本次作用</th></tr>
<tr><td><b>沙海天</b></td><td>东方基因/万子健 研发经理（公开资料）</td><td>主谈；项目技术负责人，转产话语权待确认</td></tr>
<tr><td><b>王佳琳</b></td><td>HIV 可冻干项目对接人（活动记录）</td><td>冻干后性能下降；拿原始数据</td></tr>
<tr><td><b>李雅雅</b></td><td>HBV/HCV、血筛、RT-LAMP（活动记录）</td><td>项目暂停/方法学筛选；问重启条件</td></tr>
<tr><td><b>袁梦瑶</b></td><td>生殖道六重、宠物冻干（活动记录）</td><td>冻干形态、低浓度漏检</td></tr>
<tr><td><b>石怡</b></td><td>采购对接（2024-12 活动，可能已变动）</td><td>单酶采购历史；现场确认现采购接口</td></tr>
</table><p class="note">角色仅按活动记录/公开资料标注；未在 CRM 联系表中找到职务字段，会上以客户自我介绍为准。</p></div>
</div>

<div class="projects"><h2>项目盘（按本次优先级）</h2><table>
<tr><th>项目</th><th>当前状态（来源）</th><th>本次动作</th><th>优先级</th></tr>
<tr><td><b>生殖道六重</b><br><span style="color:#7b8ea2">CRM：念珠菌六重报证冻干</span></td><td>FM2181-4-095203 + FM2181-4-NA；冻干工艺优化完成，表面不平但可转产，已提交丹威转产通知（2026-09-17）</td><td>确认丹威首单量/转产时间/采购抬头；确认宝锐是独家还是双供</td><td class="p0">P0</td></tr>
<tr><td><b>HIV 可冻干</b></td><td>FMD5104-074901 + AS212-9-T1；冻干后性能下降明显，正在优化（2026-10-20）</td><td>拿冻干前后 CT/RLU 原始数据；约 T1/T2 + 保护剂 + 冻干程序平行复测</td><td class="p0">P0</td></tr>
<tr><td><b>RT-LAMP</b></td><td>探针/目视/染料法未定；已送 FHW1008 系列（2026-10-08 测试单）</td><td>定方法学与酶组合（Bst 2.0/3.0、RTase、UNG）；锁 1–2 个面板</td><td class="p1">P1</td></tr>
<tr><td><b>宠物 RT-LAMP</b></td><td>新项目，1–2 重/7 联检，可冻干，程序未定（2026-09-17）</td><td>进入送样；拿目标面板、样本类型、灵敏度与冻干形态</td><td class="p1">P1</td></tr>
<tr><td><b>HBV/HCV 可冻干</b></td><td>905 体系更优但 5 copy 灵敏度不足、曲线折；项目近期暂停，转 RT-LAMP 筛选（2026-09-21 / 10-09）</td><td>不硬推；问重启条件与卡点，保持技术沟通</td><td class="p2">P2</td></tr>
<tr><td><b>实验动物十六/十八重</b></td><td>客户选诺唯赞；科研项目、政府经费 100 万、量少（2026-09-17）；CRM 商机仍为“沟通需求确认”</td><td>只做失单复盘：诺唯赞胜在菜单/价格/交付哪一点；不反复报价</td><td class="p2">观察</td></tr>
</table><p class="note">活动记录写“十六重”，CRM 商机写“实验动物18重一管”；生殖道六重与 CRM“念珠菌六重报证冻干”名称不一致，均按原文标注，会上请客户确认当前口径。</p></div>

<div class="card timeline"><h2>最近互动（倒序）</h2><table>
<tr><th>日期</th><th>事件</th><th>关键信息</th></tr>
<tr><td>10-20</td><td>HIV 可冻干体系筛选</td><td>FMD5104-074901 + AS212-9-T1；冻干后性能下降明显；20 µL 冻干球，目标室温 1 年稳定。</td></tr>
<tr><td>10-09</td><td>血筛项目沟通</td><td>HIV 冻干结果较差、继续优化；HBV/HCV 暂停，转 RT-LAMP 试剂筛选。</td></tr>
<tr><td>09-21</td><td>抗吸湿冻干保护剂</td><td>HCV/HBV 近期不着急；RT-LAMP 探针/目视/染料法未定，本轮均可送测。</td></tr>
<tr><td>09-17</td><td>项目情况沟通</td><td>生殖道六重可转产、已提交丹威；实验动物选诺唯赞；宠物 RT-LAMP 新项目。</td></tr>
<tr><td>09-04</td><td>抗吸湿测试</td><td>45℃/65%RH 敞口过夜，冻干球萎缩；液体 CT 正常，AS212-156-5 更优。</td></tr>
</table></div>

<div class="check"><div><b>□ 生殖道六重</b>首单量 / 年度量 / 供货身份</div><div><b>□ HIV 冻干</b>失败数据 / 复测日期 / 责任人</div><div><b>□ RT-LAMP</b>方法学 / 酶组合 / 送样清单</div></div>

<div class="footer"><span>数据源：ERP 2026-01-01–2026-10-27；customer_360.json；daily_activities_mcp.json（2026-09/10）；公开资料</span><span class="r">第 1 / 2 页</span></div>
</div>

<div class="page page2">
<div class="hero2"><div><div class="eyebrow" style="font-size:6.2pt;color:#1a73e8;letter-spacing:1pt;font-weight:700">TALK TRACK · 2026-10-28</div><h1>今天怎么谈</h1><div class="sub">上海万子健 · 沙海天｜目标：技术准入 + 测试立项，不现场逼单</div></div><div class="meta" style="margin-left:auto;text-align:right;font-size:6.3pt;color:#5f7183;line-height:1.5">宝锐：路要峰<br>建议时长：45–60 分钟</div></div>

<div class="goals">
<div class="goal"><b>GOAL 01</b><strong>生殖道六重：锁转产</strong><span>拿到丹威首单预测、年度量、供货身份（独家/双供）。</span></div>
<div class="goal"><b>GOAL 02</b><strong>HIV：锁复测</strong><span>拿到冻干失败数据，约定 2–3 批平行复测与责任人/日期。</span></div>
<div class="goal"><b>GOAL 03</b><strong>RT-LAMP：锁送样</strong><span>定方法学与酶组合，争取 1–2 个面板进入下一轮。</span></div>
</div>

<div class="script"><b>开场 30 秒：</b>“沙老师，今天不铺产品，主要对齐三件事：一是生殖道六重转产后我们怎么保供；二是 HIV 冻干后性能下降，问题到底在体系、保护剂还是程序；三是 RT-LAMP 和宠物项目，我们能不能进入下一轮送样。您看先从哪块开始？”</div>

<div class="cols">
<div class="card"><h2>必问 6 问</h2><ol>
<li><b>生殖道六重：</b>丹威转产的首单预测和年度量是多少？宝锐是独家还是双供？冻干球表面不平会影响注册或长期稳定性吗？</li>
<li><b>HIV：</b>冻干前后 CT/RLU 差多少？T1 与 T2 哪个更接近液体？先动冻干程序还是保护剂？</li>
<li><b>RT-LAMP：</b>探针/目视/染料法定了吗？Bst 2.0/3.0、RT 酶、UNG 怎么配？先做 1–2 重还是 7 联检？</li>
<li><b>宠物：</b>目标面板、样本类型、灵敏度与冻干形态？谁负责立项、预算从哪来？</li>
<li><b>实验动物：</b>诺唯赞胜在菜单、价格还是交付？我们还有第二供应商或下一轮机会吗？</li>
<li><b>2027：</b>还有哪些可冻干项目？丹威的转产/采购流程谁拍板？我们下一步找谁对接？</li>
</ol></div>
<div class="card"><h2>必带材料</h2><ul>
<li><b>生殖道六重：</b>FM2181-4-095203 + FM2181-4-NA 批记录/冻干形态对比（如有）。</li>
<li><b>HIV：</b>FMD5104-014429-DB + AS212-9-T1；FMD5104-074901 + T1/T2 对照样品。</li>
<li><b>抗吸湿：</b>AS212-17、AS212-156-5 样品；45℃/65%RH 敞口数据。</li>
<li><b>RT-LAMP：</b>FHW1008 系列（Bst2.0/3.0 HS、RTase、染料、冻干 buffer）。</li>
<li><b>稳定性：</b>RNA 14 天 / DNA 1 年（4℃/室温）数据；冻干前后对比模板。</li>
<li><b>商务：</b>产品目录、试用二维码；不带报价单，现场不承诺价格。</li>
</ul></div>
</div>

<div class="card answers"><h2>客户可能反问 / 应答边界</h2><table>
<tr><th>客户可能问</th><th>建议应答</th></tr>
<tr><td>“冻干后性能下降，你们怎么保证？”</td><td>不承诺完全一致；先做同批平行复测，拿冻干前后 CT/RLU 与形态数据，再定保护剂/程序。</td></tr>
<tr><td>“价格还能不能降？”</td><td>价格按丹威采购口径确认；先把技术准入与年度用量锁定，再谈商务，不现场口头让价。</td></tr>
<tr><td>“为什么实验动物选了诺唯赞？”</td><td>尊重客户选择；只问菜单/交付/价格哪项差距最大，争取下一轮或第二供应商。</td></tr>
<tr><td>“转产后你们能保供吗？”</td><td>按丹威首单预测备料；确认年度量后给排产计划，不空口承诺独家或无限量供应。</td></tr>
</table></div>

<div class="card" style="margin-top:2.4mm"><h2>风险与雷区</h2><table class="risk">
<tr><th>风险</th><th>表现/依据</th><th>应对</th></tr>
<tr><td>把研发当采购</td><td>沙海天是研发经理；转产/采购在丹威</td><td>先拿技术准入与测试立项，再约丹威采购；不现场承诺独家/价格。</td></tr>
<tr><td>冻干性能过度承诺</td><td>活动记录明确“冻干后性能下降明显”“冻干球萎缩”</td><td>只承诺平行复测与数据；不承诺“完全替代”或“冻干前后一致”。</td></tr>
<tr><td>失单项目纠缠</td><td>实验动物项目已选诺唯赞，科研量少</td><td>只做失败复盘，不贬低竞品、不反复报价；把时间留给 P0。</td></tr>
<tr><td>名称/重数口径不一</td><td>生殖道六重 vs 念珠菌六重；16 重 vs 18 重</td><td>会上以客户当前口径为准，当场记录并复述确认。</td></tr>
</table></div>

<div class="actions">
<div class="action"><b>10-28 当天</b><strong>发纪要与数据清单</strong><span>给沙海天/王佳琳：确认冻干前后数据、样品清单、复测接口人。</span></div>
<div class="action"><b>10-29</b><strong>内部对齐复测</strong><span>技术支持定 T1/T2、保护剂、冻干程序方案；安排寄样。</span></div>
<div class="action"><b>10-31 前</b><strong>约丹威转产/采购</strong><span>确认首单预测、年度量、供货身份；把技术准入转成商务动作。</span></div>
</div>

<div class="script" style="margin-top:2.4mm"><b>收口 15 秒：</b>“今天先定三件事：生殖道六重的量和转产时间、HIV 冻干复测的样品和日期、RT-LAMP 下一轮送样清单。会后我把纪要和数据清单发您，周五前给复测排期。”</div>

<div class="unc"><h2>三个不确定点（会上确认）</h2><p>① 沙海天对丹威转产/采购的实际决策权——公开资料仅显示研发经理；② 生殖道六重首单量、年度用量、是否双供——内部无数据；③ HIV 冻干失败的具体数据与根因——目前只有活动记录，没有原始实验数据。</p></div>

<div class="sources">数据来源：ERP 销售订单 2026-01-01–2026-10-27（27 张订单/150 行，价税合计 10,460 元；6 张正式单）；customer_360.json（累计 23,166 元：2024 3,240 / 2025 9,466 / 2026 10,460；4 个 CRM 商机）；daily_activities_mcp.json（2026-10-20、10-09、09-21、09-17、09-04、09-03、09-01 等）；公开资料（东方基因/万子健官网、工商信息、LinkedIn）。金额均为含税价税合计，测试/赠品单不计入“正式单”。</div>

<div class="footer"><span>宝锐生物 · 营销中心｜内部访前材料，请勿外发</span><span class="r">第 2 / 2 页</span></div>
</div>
</body></html>'''
open(OUT,'w',encoding='utf-8').write(html)
print(OUT,len(html))
