#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""MD2091 全预混保存 · 客户案例卡（数据 + 自包含 HTML）"""
import json
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输出-工作类'
ACT = json.load(open(os.path.join(W, '数据/daily_activities_mcp.json'), encoding='utf-8'))
if isinstance(ACT, dict):
    ACT = ACT.get('items') or ACT.get('data') or []


def clean(t):
    t = re.sub(r'<[^>]+>', '', t or '')
    t = re.sub(r'!\[\]\([^)]*\)', '', t)
    t = re.sub(r'<!--.*?-->', '', t)
    t = re.sub(r'\s+', ' ', t)
    return t.strip()


def pick_quote(cust, day, keys=('MD2091', '全预混', '2-8', '4度', '4℃', '加速')):
    best = None
    best_score = -1
    for a in ACT:
        c = a.get('field_5f20fc')
        c = c.get('label') if isinstance(c, dict) else c
        if c != cust or str(a.get('start_time'))[:10] != day:
            continue
        body = clean(a.get('field_b99055') or '')
        score = (2 if 'MD2091' in body else 0) + sum(1 for k in keys if k in body)
        if score <= best_score:
            continue
        sents = [s.strip() for s in re.split(r'(?<=[。；;])', body) if s.strip()]
        idxs = [i for i, s in enumerate(sents) if 'MD2091' in s]
        if idxs:
            keep = []
            for i in idxs:
                if i > 0 and sents[i - 1] not in keep:
                    keep.append(sents[i - 1])
                if sents[i] not in keep:
                    keep.append(sents[i])
            q = ' '.join(keep)
        else:
            q = ' '.join([s for s in sents if any(k in s for k in keys)])
        best = (q or body, (a.get('owner') or {}).get('name_cn') or '', str(a.get('work_item_id') or ''))
        best_score = score
    if not best:
        return '', '', ''
    q, owner, wid = best
    return q[:420], owner, wid

# (客户, 日期, 标签[], 标题, 判断, 条件, 证据强度, 风险/边界)
SPEC = [
    ('苏州天隆生物科技有限公司', '2026-09-17', ['2-8℃', '全预混', '正面', '有条件'],
     '王小舟 · 分子流水线项目', 'DNA 项目在测 MD2091，客户评价“表现较好”；但低浓度下不太满足快速需求，9 月初已拿拆分版自行调整。',
     '客户明确要求 2–8℃ 全预混可存 1 周–1 个月（含模板）', '中（条件未写死）',
     '记录未写明“MD2091 的结果是在 2–8℃ 条件下取得”，对客户讲需注明“同项目、条件待补证”。'),
    ('宁波海尔施基因科技股份有限公司', '2026-10-14', ['全预混', '正面', '重点'],
     '痰液提取全预混项目', '三款平行测试中 MD2091 效果最好（000811 大肠杆菌假阳、020314 扩增曲线较差），客户同意继续测 MD2091。',
     '痰液提取全预混；温度条件未指明', '高（同场景平行对比）',
     '客户仍在继续测试，尚未给终局结论；现场拜访需带优化方案。'),
    ('武汉正大康瑞生物科技有限公司', '2026-07-27', ['全预混', '正面'],
     '细小项目 · 首轮 10 余款测评', 'MD2091-001102 性能最优，灵敏度优于对照试剂。',
     '预混体系，37℃ 3D/7D 加速在后续轮次', '高',
     '同轮另有一家原料略优于我司，需持续跟踪。'),
    ('武汉正大康瑞生物科技有限公司', '2026-08-07', ['全预混', '正面'],
     '细小项目 · 第 2 轮', 'MD2091-092402 最优，能同时兼容内参与靶标；灵敏度较客户对照试剂略低，客户计划做全拆分调整。',
     '预混体系', '中高', '灵敏度目标是 1 copies/μL，当前未达。'),
    ('武汉正大康瑞生物科技有限公司', '2026-09-30', ['加速', '全预混', '正面'],
     '细小项目 · 换引探后复测', '客户重新设计引探后重新匹配 MD2091-092402，并通过加速测试验证，节后进入议价采购。',
     '37℃ 加速老化', '高', '客户共 3 家体系合适，我司为其中之一，非唯一。'),
    ('武汉正大康瑞生物科技有限公司', '2026-10-15', ['加速', '正面'],
     '细小项目 · 终轮确认', '经性能测试与 37℃ 7D 热加速，我司匹配 MD2091-092402；客户开始收集临床样本，之后统一进入议价。',
     '37℃ 7D 热加速', '高', '另两家体系性能与我司相差不大，价格将成为关键。'),
    ('圣湘生物科技股份有限公司', '2026-07-31', ['全预混', '正面'],
     'DNA 直扩预混项目', '两款中 MD2091-000811-DB 表现较好，即时扩增性能符合客户需求，已进入加速验证。',
     'DNA 直扩预混', '高', '加速阶段后续出现起线问题（见反向卡）。'),
    ('圣湘生物科技股份有限公司', '2026-08-05', ['全预混', '正面'],
     '朱老师项目 · 复测', '客户反馈 MD2091-000811 表现不错，希望价格不要太高并增加测试量。',
     '预混体系', '高', '客户对价格敏感，放量前需先谈价。'),
    ('湖南冠牧生物科技有限公司', '2026-09-15', ['全预混', '正面'],
     'DNA/RNA 预混初筛', 'DNA 预混方向客户反馈 MD2091-092402 初筛性能 ok；客户 DNA 出货量 5–10 万盒/年。',
     'DNA 预混', '高（初筛）', '仅为初筛，后续还需深度测试与稳定性验证。'),
    ('湖南冠牧生物科技有限公司', '2026-09-17', ['全预混', '稳定性', '进行中'],
     '全预混稳定性验证启动', '客户把 3 个全预混体系 + 1 个 DNA 预混体系列入稳定性验证，已提供 MD2091-092402 / 000804 双组份试用装。',
     '全预混 + 酶保护液', '进行中', '结果未回，不能作为既有案例引用。'),
    ('重庆巴斯德生物医药科技有限公司', '2026-10-10', ['全预混', '正面'],
     '报证项目 · 拆分体系', 'MD2091-001102-FP 存在峰偏移但在客户可接受范围内，已寄拆分体系测试装复测。',
     '双组份拆分体系', '中', '峰偏移需持续观察；报证资料不再要求 UNG 稳定性指标。'),
    ('北京卓诚惠生生物科技股份有限公司', '2026-08-17', ['加速', '全预混', '部分正面'],
     '痰液细菌 · 优化5 体系', 'CY5 通道室温加速 3d 与 37℃ 加速 1d 均无明显差异；AF405 低浓度模板在 37℃ 1d 出现 Rn 明显下降。',
     '室温 3d / 37℃ 1d 加速', '中（通道差异）', 'AF405 低浓度是短板，多色项目需单独验证。'),
    ('江苏宏微特斯医药科技有限公司', '2026-09-11', ['全预混', '进行中'],
     '一体机生殖道项目', '一体机磁提、全预混、不冻干、30min 快速程序，已送测 MD2091；客户仍在稳定性评估中。',
     '全预混（不冻干）', '进行中', '无结论，不能作为正面案例。'),
    ('青岛嘉智生物技术有限公司', '2026-08-26', ['4℃', '全预混', '反向'],
     '非瘟 / RT 单管', 'MD2091-001102 临界值检出不如 M2181-4-095203；终端场景要求 4℃ 全预混 1 个月，37℃ 加速 7 天。',
     '4℃ 全预混 1 个月（终端要求）', '反向（明确）', '这是目前唯一明确 4℃ 全预混硬指标的客户，但我司未占优。'),
    ('圣湘生物科技股份有限公司', '2026-08-13', ['加速', '反向'],
     '朱军桥项目 · 加速复测', 'MD2091-000811 特异性有小问题：加速后更容易起线，客户自行调整中。',
     '加速后', '反向（明确）', '与 07-31 的正面结论构成同一项目的转折，引用时必须成对出现。'),
    ('武汉正大康瑞生物科技有限公司', '2026-09-11', ['加速', '反向'],
     '细小项目 · 第 2 轮热加速', 'MD2091-092402 复测加速 3D 仍出现非特异扩增与异常 Ct，客户判定为体系与项目匹配性问题。',
     '37℃ 加速 3D', '反向（已闭环）', '后续换引探后通过，此条作为过程风险保留。'),
]

cases = []
for cust, day, tags, title, verdict, cond, strength, risk in SPEC:
    quote, owner, wid = pick_quote(cust, day)
    cases.append({'cust': cust, 'date': day, 'tags': tags, 'title': title, 'verdict': verdict,
                  'cond': cond, 'strength': strength, 'risk': risk, 'quote': quote,
                  'owner': owner, 'wid': wid})

missing = [c for c in cases if 'MD2091' not in c['quote']]
print('案例', len(cases), '｜缺 MD2091 原文的', len(missing))
for m in missing:
    print('  !', m['cust'], m['date'], m['quote'][:80])

json.dump({'updated': '2026-10-20', 'sku': 'MD2091', 'cases': cases},
          open(os.path.join(W, '数据/md2091_premix_cases.json'), 'w'), ensure_ascii=False, indent=1)
print('✅ 数据层 数据/md2091_premix_cases.json')
