#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
生成《Q3汇报数据汇总.md》—— 五项任务的数据总表（脚本化生成，数字直接来自 JSON，避免转写误差）
输入：_汇总/人员提炼_H1.json、erp_yoy.json、Q3活动客诉竞品.json、Q3竞品情报台账.json
"""
import json, os, re
from collections import Counter

ROOT = os.path.expanduser("~/Desktop/Hermes输出-工作类")
OUTD = os.path.join(ROOT, "2026年3季度汇报", "_汇总")
W = 10000.0
def w(x): return "%.1f" % (x / W)
def wn(x): return "%.2f" % (x / W)

H1 = json.load(open(f"{OUTD}/人员提炼_H1.json"))
YY = json.load(open(f"{OUTD}/erp_yoy.json"))
QC = json.load(open(f"{OUTD}/Q3活动客诉竞品.json"))
CI = json.load(open(f"{OUTD}/Q3竞品情报台账.json"))

L = []
A = L.append

A("# 宝锐生物 2026 年三季度汇报 · 数据汇总")
A("")
A("> 生成时间：2026-10-01　|　数据源：`数据/daily_activities_mcp.json`、`数据/mcp_complaints.json`、"
  "`2026半年度汇报/`（34 份）、`销售订单_20260101-20260930.xlsx` + `2025/2024全年订单.xlsx`")
A("> 链接口径：活动 `https://project.feishu.cn/baoyu/workitem/<work_item_id>`　客诉 "
  "`https://project.feishu.cn/br-shgl/khts/detail/<id>`")
A("")

# ============ 0 摘要 ============
y26, y25s, y25f, y24 = YY["y2026_ytd"], YY["y2025_ytd"], YY["y2025_full"], YY["y2024_full"]
m24 = y24["by_month"]
ytd24 = sum(v for k, v in m24.items() if k <= "2024-09")
A("## 0 · 一页摘要")
A("")
A("| 项 | 结果 |")
A("|---|---|")
A("| ① 半年度汇报 | 34 份原始件全部转写并提炼，覆盖 **22 人/份**（含管理 5、说明书 2，实际销售 15 人） |")
A("| ② Q3 飞书活动 | **5,584 条 / 24 人**（7月 %d · 8月 %d · 9月 %d） |"
  % (QC["q3_activities"]["by_month"]["2026-07"], QC["q3_activities"]["by_month"]["2026-08"],
     QC["q3_activities"]["by_month"]["2026-09"]))
A("| ② Q3 客诉 | **66 条**（全量 362），其中 **未结束 62 条** |")
A("| ③ 关键客诉/风险 | 未结束客诉 62 条 + 高风险账款 12 项，**全部附飞书原文链接** |")
A("| ④ ERP 同比 | 2026 1-9月 **%s 万**，同比 **+%.1f%%**；2025 全年 %s 万；2024 全年 %s 万 |"
  % (w(y26["total"]), (y26["total"] / y25s["total"] - 1) * 100, w(y25f["total"]), w(y24["total"])))
A("| ⑤ 竞品 | **37 个品牌**；诺唯赞 %d 次提及（断层第一），翌圣 %d、赛默飞 %d、全式金 %d |"
  % (CI["merged_index"]["诺唯赞"]["q3_mentions"], CI["merged_index"]["翌圣"]["q3_mentions"],
     CI["merged_index"]["赛默飞"]["q3_mentions"], CI["merged_index"]["全式金"]["q3_mentions"]))
A("")
A("**三条最需要向上汇报的判断**")
A("")
A("1. **增长真实但结构不适**：同比 +25.2%，增量几乎全部来自老客户放量（圣湘系除外），"
  "新客户成功转化极低——半年报自述「有效落地订单转化率不足30%」。")
A("2. **客诉是当前最大经营风险**：Q3 有 66 条客诉、62 条未闭环（93.9%）；"
  "口径集中在**批间差 / 污染 / 沉淀 / 批内差**，且直接压制回款（睿丰康 M8254、圣湘公卫）。")
A("3. **竞品已从价格战升级为体系战**：诺唯赞 631 次提及，其打法已包含"
  "「原料+终端试剂+仪器」一体化、战略合作、仪器投放绑定试剂、高校杯赛/空瓶回收等；"
  "我方仍以单点货号比价应对。")
A("")

# ============ ① ============
A("---")
A("")
A("## ① 2026 半年度汇报 · 人员提炼")
A("")
A("来源：`2026年3季度汇报/2026半年度汇报/`（24 pptx + 7 xlsx + 2 pdf + 1 zip）")
A("转写全文：`_汇总/h1报告原文/`（34 份 / 47.5 万字符，命名 `<组>__<姓名>__<扩展名>.md`）")
A("结构化提炼：`_汇总/人员提炼_H1.json`")
A("")
A("> ⚠️ **单位提示**：各人 PPT 原表的月度金额单位不统一（部分标「万元」实为「元」，反之亦然），"
  "已在 JSON 的 `monthly_wan._unit` 逐条标注；未填数一律记 `null`，**未做任何估算**。")
A("")

SDOC = {"c117-单页版说明书", "BR1C101-说明书", "刘欣-销售能力培训"}   # 产品说明书属资料，不列入人员表
order = ["管理", "管理-销售拓展部", "管理-生命科学销售部", "大客户部", "销售拓展部",
         "生命科学销售部"]
groups = {}
for p in H1["people"]:
    groups.setdefault(p["group"], []).append(p)

A("### 1.1 目标达成总表")
A("")
A("| 姓名 | 部门/区域 | 年度目标(万) | 上半年完成(万) | 完成率 | 备注 |")
A("|---|---|---|---|---|---|")
for g in order:
    for p in groups.get(g, []):
        if p["name"] in SDOC:
            continue
        t = p.get("target_h1_wan"); a = p.get("actual_h1_wan"); r = p.get("rate_pct")
        ts = "%g" % t if t is not None else "—"
        as_ = "%g" % a if a is not None else "—"
        rs = "%.1f%%" % r if r is not None else "—"
        A("| **%s** | %s | %s | %s | %s | %s |" % (
            p["name"], p.get("dept_area", ""), ts, as_, rs, g))
for g in groups:
    if g not in order or g == "产品说明书":
        continue
    for p in groups[g]:
        if p["name"] in SDOC:
            continue
        A("| **%s** | %s | — | — | — | %s |" % (p["name"], p.get("dept_area", ""), g))
A("")
A("> 完成率中位区间集中在 **18%~43%**，仅刘虹晶 71.8%、路要峰 76.2% 突破 70%。")
A("")

A("### 1.2 各人问题 / 下半年计划 / 需支持（原文提炼）")
A("")
for g in order:
    for p in groups.get(g, []):
        if p["name"] in SDOC:
            continue
        A("#### %s　·　%s" % (p["name"], p.get("dept_area", "")))
        if p.get("problems"):
            A("")
            A("**问题与原因**")
            for x in p["problems"]:
                A("- %s" % x)
        if p.get("h2_plan"):
            A("")
            A("**下半年计划**")
            for x in p["h2_plan"]:
                A("- %s" % x)
        if p.get("support_needed"):
            A("")
            A("**需要公司支持**")
            for x in p["support_needed"]:
                A("- %s" % x)
        if p.get("collection"):
            A("")
            A("**回款/逾期**：%s" % p["collection"])
        A("")

# ============ ② ============
A("---")
A("")
A("## ② Q3 飞书活动与客诉（按销售）")
A("")
A("来源：`数据/daily_activities_mcp.json`（`updated %s`）、`数据/mcp_complaints.json`"
  % QC["q3_activities"].get("updated", ""))
A("明细台账：`_汇总/Q3活动客诉竞品.json`")
A("")
A("### 2.1 活动量（条）")
A("")
A("| 销售 | 7月 | 8月 | 9月 | Q3合计 | Q3客诉数 |")
A("|---|---|---|---|---|---|")
bm = QC["q3_activities"]["by_month"]
cmp_cnt = QC["q3_complaints"]["by_creator"]
for sp, v in QC["q3_activities"]["by_sales"].items():
    m = v["by_month"]
    A("| %s | %d | %d | %d | **%d** | %d |" % (
        sp, m.get("2026-07", 0), m.get("2026-08", 0), m.get("2026-09", 0), v["total"],
        cmp_cnt.get(sp, 0)))
A("| — | %d | %d | %d | **%d** | **%d** |" % (
    bm["2026-07"], bm["2026-08"], bm["2026-09"], QC["q3_activities"]["total"],
    QC["q3_complaints"]["total"]))
A("")
A("> 生命科学（科研）5 人活动量包揽前 6（侯海瑜 425、叶信福 424、王诗香 423、袁殿果 422、"
  "黄建华 386、刘斌 361）——与其「课题组为单位、靠拜访密度换转化」的模式一致；"
  "但对应产出极低（王诗香 1.22 万、黄建华 2.94 万），**活动量与产出严重不匹配**。")
A("")
A("### 2.2 各人高频客户 TOP（前 5）")
A("")
A("| 销售 | 活动量 | 高频客户 |")
A("|---|---|---|")
for sp, v in QC["q3_activities"]["by_sales"].items():
    cust = QC["q3_activities"]["by_sales_customers"].get(sp, {})
    top = "；".join("%s(%d)" % (k, n) for k, n in list(cust.items())[:5]) or "—"
    A("| %s | %d | %s |" % (sp, v["total"], top))
A("")

# ============ ③ ============
qc = QC["q3_complaints"]
A("---")
A("")
A("## ③ 关键客诉与风险事项（附飞书原文链接）")
A("")
A("### 3.1 Q3 客诉全貌")
A("")
A("Q3 新增客诉 **%d 条**（全库 %d 条）；其中**未结束 %d 条（%.1f%%）**。" % (
    qc["total"], qc["total_all"], qc["not_closed"], qc["not_closed"] / qc["total"] * 100))
A("")
A("| 维度 | 分布 |")
A("|---|---|")
A("| 责任区域 | %s |" % "；".join("%s %d" % (k, v) for k, v in qc["by_area"].items()))
A("| 紧急度字段 | %s（该字段 Q3 记录多为默认值，**不代表真实影响面**） |"
  % "；".join("%s %d" % (k, v) for k, v in qc["by_urgency"].items()))
A("| 提报人 | %s |" % "；".join("%s %d" % (k, v) for k, v in list(qc["by_creator"].items()) if k))
A("")
A("### 3.2 按提报人的客诉归属")
A("")
A("| 提报人 | Q3客诉 |")
A("|---|---|")
for k, v in qc["by_creator"].items():
    if k:
        A("| %s | %d |" % (k, v))
A("")

A("### 3.3 ⚠️ 未闭环客诉清单（P0：大客户区域）")
A("")
A("| 日期 | 客诉 | 客户 | 提报 | 状态 | 挂起天数 | 链接 |")
A("|---|---|---|---|---|---|---|")
for c in qc["items"]:
    if c["status"] != "结束" and c["area"] == "大客户":
        A("| %s | %s | %s | %s | %s | %s | [打开](%s) |" % (
            c["created"], c["name"], c["customer"] or "", c["creator"] or "",
            c["status"], c.get("days"), c["url"]))
A("")
A("### 3.4 ⚠️ 未闭环客诉清单（P1：其他区域）")
A("")
A("| 日期 | 客诉 | 客户 | 提报 | 区域 | 状态 | 挂起天数 | 链接 |")
A("|---|---|---|---|---|---|---|---|")
for c in qc["items"]:
    if c["status"] != "结束" and c["area"] != "大客户":
        A("| %s | %s | %s | %s | %s | %s | %s | [打开](%s) |" % (
            c["created"], c["name"], c["customer"] or "", c["creator"] or "",
            c["area"], c["status"], c.get("days"), c["url"]))
A("")
A("### 3.5 已闭环客诉（Q3）")
A("")
A("| 日期 | 客诉 | 客户 | 提报 | 链接 |")
A("|---|---|---|---|---|")
for c in qc["items"]:
    if c["status"] == "结束":
        A("| %s | %s | %s | %s | [打开](%s) |" % (
            c["created"], c["name"], c["customer"] or "", c["creator"] or "", c["url"]))
A("")

A("### 3.6 🔴 高风险账款 / 客户风险（源自半年度汇报原文）")
A("")
A("| 风险等级 | 客户 | 金额 | 逾期/账龄 | 说明与措施 | 来源 |")
A("|---|---|---|---|---|---|")
risks = [
    ("🔴 极高", "郑州中道生物", "38,980.8 元", "账龄 365 天以上（逾期 734–895 天）",
     "「财务比较难沟通，需线下沟通跟进」——全公司最老账款", "赵云浩"),
    ("🔴 极高", "北京隆格基因", "10,000 元", "逾期 172 天",
     "占总逾期 41%，客户经营稳定性不好；出具催款函 + 面谈 + 暂停供货", "冯贤平"),
    ("🔴 极高", "深圳市芯思微生物", "128,000 元", "逾期",
     "采购需预付款且需支付同等金额历史账款", "林潇"),
    ("🔴 极高", "李江辉 名下合计", "477,785 元", "60天以上 318,980 元（66.76%）",
     "7 月回款计划 267,230 元，**实际累计回款 0**；90% 集中在湖南冠牧", "李江辉"),
    ("🔴 极高", "湖南冠牧生物", "429,400 元", "12 笔，多为 91–180 天",
     "「季度回款周期」；7 月计划含 3 万元", "李江辉"),
    ("🔴 极高", "圣湘体系", "约 517,500 元", "0–30 至 181–365 天",
     "含单笔 28 万（逾期 34 天）；「采购比较难沟通，需线下沟通跟进」", "赵云浩"),
    ("🟠 高", "武汉明德生物", "156,811.6 元", "14 笔，91–180 天为主",
     "「客户财务会卡付款，需跟进财务沟通」", "赵云浩"),
    ("🟠 高", "杭州逸检", "233,528 元", "约 140 天",
     "终端多为机构、审批繁琐（单张发票不超 1 万）；风险低但客户现金流不足", "杨天雄"),
    ("🟠 高", "睿丰康", "144,600 元", "约 60 天",
     "**因 M8254 客诉直接压制回款**；需换货后才能谈回款", "杨天雄"),
    ("🟠 高", "深圳澳东检验检测", "39,000 元", "逾期",
     "已发律师函；客户被瀚海低价抢走，实际性能不如我方", "林潇"),
    ("🟠 高", "聚致", "84,004.2 元", "约 70 天",
     "领导拉长账期，风险不高但需逐一安排", "杨天雄"),
    ("🟡 中", "武汉尚睿生物", "15,520 元", "136/131/123/96 天",
     "「回款拖拉」风险中；原动保研发团队已解散（-72%）", "李江辉"),
]
for r in risks:
    A("| %s | %s | %s | %s | %s | %s |" % r)
A("")
A("> **一句话结论**：Q3 的客诉与回款是两个互相咬合的问题——"
  "客诉不闭环 → 客户压款 → 回款计划落空（李江辉 7 月回款计划 26.7 万、实收 0）。")
A("")

# ============ ④ ============
A("---")
A("")
A("## ④ ERP 同比（2026 截止 9/30 vs 2025 同期 / 2025 全年 / 2024 全年）")
A("")
A("口径：**标准销售订单 + 已审核 + 非赠品 + 剔除宝锐系**；金额 = 价税合计。")
A("数据源：`%s`、`%s`、`%s`" % (YY["source_2026"], YY["source_2025"], YY["source_2024"]))
A("明细：`_汇总/erp_yoy.json`　|　复算脚本：`脚本/q3_yoy_compare.py`")
A("")
A("### 4.1 总量对照")
A("")
A("| 期间 | 金额(万) | 订单行数 | 说明 |")
A("|---|---|---|---|")
A("| **2026 年 1–9 月（YTD）** | **%s** | %d | 本次汇报口径 |" % (w(y26["total"]), y26["rows"]))
A("| 2025 年 1–9 月（同期） | %s | %d | 同比 **+%.1f%%（+%s 万）** |"
  % (w(y25s["total"]), y25s["rows"], (y26["total"]/y25s["total"]-1)*100, w(y26["total"]-y25s["total"])))
A("| 2025 年全年 | %s | %d | 2026 YTD 已达其 **%.1f%%** |"
  % (w(y25f["total"]), y25f["rows"], y26["total"]/y25f["total"]*100))
A("| 2024 年全年 | %s | %d | 2025 全年同比 **+%.1f%%** |"
  % (w(y24["total"]), y24["rows"], (y25f["total"]/y24["total"]-1)*100))
A("| 2024 年 1–9 月 | %s | — | 三年 YTD 链：2024 → 2025 **+%.1f%%** → 2026 **+%.1f%%** |"
  % (w(ytd24), (y25s["total"]/ytd24-1)*100, (y26["total"]/y25s["total"]-1)*100))
A("")
A("> ✅ **口径自校验通过**：本脚本算出的 2025 上半年 1,586.6 万 ≈ 管理版半年报 PPT 的 1,587 万"
  "（1-6 月实数），误差 <0.1%，说明提取口径与管理层一致。")
A("")

A("### 4.2 部门对照（万元 ｜ 部门归属按各年度各自名册）")
A("")
A("| 部门 | 2026 YTD | 2025 同期 | 同比 | 2025 全年 | 2024 全年 |")
A("|---|---|---|---|---|---|")
keys = ["大客户部", "销售拓展部", "生命科学部"]
for k in keys:
    a = y26["by_dept"].get(k, 0); b = y25s["by_dept"].get(k, 0)
    c = y25f["by_dept"].get(k, 0); dd = y24["by_dept"].get(k, 0)
    yoy = "**+%.1f%%**" % ((a/b-1)*100) if b else "—"
    A("| %s | %s | %s | %s | %s | %s |" % (
        k, w(a) if a else "—", w(b) if b else "—", yoy,
        w(c) if c else "—", w(dd) if dd else "—"))
A("| 合计（已归属） | %s | %s | — | %s | %s |" % (
    w(sum(y26["by_dept"].values())), w(sum(y25s["by_dept"].values())),
    w(sum(y25f["by_dept"].values())), w(sum(y24["by_dept"].values()))))
A("")
A("> ⚠️ **两点必须说明**：① 2024 年名册无「生命科学部」（当年挂在销售拓展体系内），"
  "故 2024 生命科学为空；② 2025 年名册用**岗位**（大客户1/大客户2）而非姓名，"
  "因此跨年**个人**同比只在实名制人员间可比。")
A("")

A("### 4.3 2026 月度与季度")
A("")
A("| 月 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 合计 |")
A("|---|---|---|---|---|---|---|---|---|---|---|")
A("| 金额(万) | %s |" % " | ".join(w(v) for v in y26["by_month"].values()))
q = {}
for m, v in y26["by_month"].items():
    qq = "Q1" if m[5:7] in ("01", "02", "03") else "Q2" if m[5:7] in ("04", "05", "06") else "Q3"
    q[qq] = q.get(qq, 0) + v
A("")
A("**季度**：Q1 **%s** 万 ｜ Q2 **%s** 万 ｜ Q3 **%s** 万（环比 +%.1f%%）"
  % (w(q["Q1"]), w(q["Q2"]), w(q["Q3"]), (q["Q3"]/q["Q2"]-1)*100))
A("")
A("### 4.4 2026 YTD 客户端 TOP 20（万）")
A("")
A("| # | 客户 | 2026 YTD |")
A("|---|---|---|")
for i, (k, v) in enumerate(list(y26["top_cust"].items())[:20], 1):
    A("| %d | %s | %s |" % (i, k, w(v)))
A("")
A("### 4.5 2026 YTD 销售员 TOP 15（万）")
A("")
A("| # | 销售 | 2026 YTD | 2025 同期 |")
A("|---|---|---|---|")
sp25 = y25s["by_sp"]
for i, (k, v) in enumerate(list(y26["by_sp"].items())[:15], 1):
    A("| %d | %s | %s | %s |" % (i, k, w(v), w(sp25[k]) if k in sp25 else "—（2025无实名）"))
A("")
A("> ⚠️ 2025 同期口径下，「大客户1/大客户2」合计 %s 万是**岗位制**，无法拆到实名。"
  "跨年个人同比建议只用于：陈溪子、黄文才、刘虹晶、宋学伟、林潇、杨天雄、李江辉、路要峰、冯贤平。"
  % w(sp25.get("大客户1", 0) + sp25.get("大客户2", 0)))
A("")

A("### 4.6 年度目标进度")
A("")
A("| 部门 | 年度目标(万) | 2026 YTD | 达成率 |")
A("|---|---|---|---|")
for k, tgt in [("大客户部", 2650), ("销售拓展部", 3400), ("生命科学部", 900)]:
    a = y26["by_dept"].get(k, 0)
    A("| %s | %d | %s | **%.2f%%** |" % (k, tgt, w(a), a/W/tgt*100))
A("| **合计** | **6950** | **%s** | **%.2f%%** |" % (w(y26["total"]), y26["total"]/W/6950*100))
A("")
ytd_w = y26["total"] / W
gap_w = 6950 - ytd_w
run_rate = ytd_w / 9
A("> **进度推演**：按 1–9 月进度线性外推，全年约 **%.1f 万**；"
  "距 6,950 万年度目标缺口 **%.1f 万**，即 Q4 需完成 **%.1f 万**"
  "（月均 **%.1f 万**，是 1–9 月月均 %.1f 万的 **%.2f 倍**）。"
  % (run_rate * 12, gap_w, gap_w, gap_w / 3, run_rate, (gap_w / 3) / run_rate))
A("")

# ============ ⑤ ============
A("---")
A("")
A("## ⑤ 主要竞争对手品牌及其优势（附飞书活动原文链接）")
A("")
A("数据源：① Q3 飞书活动正文 `field_b99055` 关键词命中；② 半年度汇报竞品板块。")
A("台账：`_汇总/Q3竞品情报台账.json`　|　脚本：`脚本/q3_competitor_intel.py`")
A("")
A("> ⚠️ 命中为关键词匹配（含少量同义/误匹配），所有引用均为**原文，未改写**；"
  "每条证据的 `url` 可直接点回飞书活动原文。")
A("")

A("### 5.1 竞品提及热度榜（Q3 活动命中次数）")
A("")
A("| 品牌 | Q3 提及 | 半年报记录 | 主要提及人 |")
A("|---|---|---|---|")
for b, v in CI["merged_index"].items():
    if v["q3_mentions"] == 0:
        continue
    readers = CI["q3_activity_ledger"].get(b, {}).get("sp_readers", {})
    A("| %s | %d | %d | %s |" % (
        b, v["q3_mentions"], v["h1_records"],
        "、".join("%s(%d)" % (k, n) for k, n in list(readers.items())[:4]) or "—"))
A("")
A("> **诺唯赞以 %d 次提及（占全部命中 %.0f%%）形成断层**——这不是「竞争激烈」，"
  "而是「我方每一次客户对话都绕不开它」。"
  % (CI["merged_index"]["诺唯赞"]["q3_mentions"],
     CI["merged_index"]["诺唯赞"]["q3_mentions"] /
     sum(v["q3_mentions"] for v in CI["merged_index"].values()) * 100))
A("")

A("### 5.2 各品牌优势证据（Q3 活动原文 + 链接）")
A("")
for b, v in CI["q3_activity_ledger"].items():
    if v["mentions"] < 10:
        continue
    A("#### %s　（Q3 提及 %d 次）" % (b, v["mentions"]))
    A("")
    for e in v["evidence"]:
        txt = re.sub(r"!\[\]\([^)]*\)", "" , e["text"])
        txt = re.sub(r"<!--.*?-->", "", txt)
        txt = re.sub(r"!\[[^\]]*\]\([^)]*\)", "", txt)
        txt = " ".join(txt.split())
        if len(txt) > 300:
            txt = txt[:300] + "…"
        A("- **[%s] %s**（%s）" % (e["date"], e["sp"], e["customer"] or "未填客户"))
        A("  > %s" % txt)
        A("  > [飞书活动原文](%s)" % e["url"])
    A("")

A("### 5.3 半年报竞品板块汇总（结构化）")
A("")
for b, recs in CI["h1_report_competitors"].items():
    if len(recs) < 2:
        continue
    A("#### %s（%d 条记录）" % (b, len(recs)))
    A("")
    A("| 来源 | 产品 | 价格 | 要点 |")
    A("|---|---|---|---|")
    for r in recs[:14]:
        A("| %s | %s | %s | %s |" % (
            r["from"], (r["product"] or "—").replace("|", "/"),
            (r["price"] or "—").replace("|", "/"),
            (r["note"] or "—").replace("|", "/")[:180]))
    A("")

A("### 5.4 竞争态势小结（可溯源·每条注明出处）")
A("")
A("**① 诺唯赞：已从「原料供应商」升级为「体系锁定者」**")
A("")
A("- 产业链一体化：原料 + 终端试剂 + 仪器；工业端直销为主、早入局参与报证深度绑定；"
  "终端以**仪器免费投放 + 试剂绑定**提高复购，上游自研酶控成本。（杨天雄报告「竞对市场活动」）")
A("- 战略合作密集：26/1/28 与金域医学（神经/AD 检测）、4/25 与东方基因（AD）、"
  "与贝纳基因（lncRNA 测序）联合开发——直接锁定大批量稳定原料订单。（陈溪子/冯贤平/林潇报告）")
A("- 终端黏性打法：高校空瓶回收兑换、全国巡回高校技术沙龙、季度阶梯返利（满额延长账期、"
  "赠送仪器样机试用）。（叶信福/侯海瑜报告「竞对市场活动 2026.1-6 持续全年」）")
A("- 现场证据：武汉贝纳医学与其**深度合作**（投放自动化提取仪 + 自动化建库仪 + 建库试剂模块，"
  "年合作量 100 万以上/年，目前我方基本无需求）；"
  "[飞书原文](https://project.feishu.cn/baoyu/workitem/7128403219)")
A("- 现场证据：武汉菲思特焦磷酸测序原料「老板亲自去南京诺唯赞谈战略合作」，客户研发抵触我方；"
  "[飞书原文](https://project.feishu.cn/baoyu/workitem/7128171445)")
A("- 浙江反制：重点客户「无论宝锐报价多少都按 9 折给」，并向客户泄露我方在其他组的负面反馈、"
  "暗中破坏对照测试。（吴云报告「竞争状态与市场机会分析」）")
A("")
A("**② 翌圣：人海战术 + 全流程研发外包**")
A("")
A("- 直销为主，技术型销售 + 客户经理 + 应用科学家提供"
  "「原料选型 / 配方调试 / 小试中试 / 产品定型」全流程研发外包；辅以区域经销覆盖下沉市场。"
  "（杨天雄报告）")
A("- 上海采用**人海战术**大规模占领科研市场（3.1–6.30），上海分区域设置科研销售。（徐卓凡报告）")
A("- 4/25 与深圳艾斯基因战略合作，围绕 NGS 多组学上游核心原料。（陈溪子/林潇报告）")
A("- 弱点：产品质量不稳定、无特别优势产品、无定制开发服务。（刘欣报告）")
A("")
A("**③ 瀚海新酶：低价 + 冻干/大片段差异化，正在蚕食我方存量**")
A("")
A("- 超低价策略蚕食相对低端市场；Bst 大片段热稳定性提升 40%、散装公斤级供货、"
  "纯酶成本优势极大（但无配套预混液成品）。（刘新元/刘虹晶报告）")
A("- **实地失单**：上海微创惟微呼吸道 POCT 一体机——我方 M5144 在客户快速仪器平台"
  "「不起线」被替换，客户现选瀚海新酶；"
  "[飞书原文](https://project.feishu.cn/baoyu/workitem/7128779194)")
A("- **低价抢单**：深圳澳东被瀚海低价抢走（「实际上瀚海的性能不如我们产品」）。（林潇报告）")
A("- **加价单失守**：伯杰因人源客诉，1 月底上呼六转采备选供应商瀚海 20 万 T。（路要峰报告）")
A("")
A("**④ 康为世纪 / 艾科瑞 / 迈迪安：细分场景的专业替代者**")
A("")
A("- 康为：EGFR 耐药位点检测（ARMS 分型）「灵敏度和我们差不多，但起线率比较稳定」"
  "（徐卓凡报告 透景反馈）；非瘟 DNA 预混「性能一般但价格比较低」（赵云浩报告）。")
A("- 艾科瑞：抗抑制性适配熔取酶「性能表现和日本 Takara 一模一样，价格便宜一半」"
  "（徐卓凡报告 芯超/HP 耐药熔曲）——性价比型替代。")
A("- 迈迪安：可全组分冻干、项目兼容性强、冻干品稳定；劣势是价格较贵"
  "（路要峰报告 产品竞争页）。")
A("")
A("**⑤ 赛默飞 / Takara / NEB：进口基本盘仍稳**")
A("")
A("- 赛默飞：Trizol 全球通用标准、稳定；单价高、有毒性、国内现货库存少。")
A("- Takara：PrimeSTAR HS 行业标杆、超高保真；单价高、供货周期长、技术支持响应慢。")
A("- 内部替代空间明确：客户对进口的反应集中在**价格 + 供货 + 响应速度**三点。")
A("")

A("---")
A("")
A("## 附录 · 数据源与口径")
A("")
A("| 数据 | 来源 | 口径/说明 |")
A("|---|---|---|")
A("| 半年度汇报 | `2026年3季度汇报/2026半年度汇报/`（34 份） | 原件全文转写 `_汇总/h1报告原文/`；提炼 `人员提炼_H1.json` |")
A("| Q3 活动 | `数据/daily_activities_mcp.json`（5,584 条，`updated %s`） | 按 `start_time` 过滤 2026-07-01~09-30；链接用 `work_item_id` |" % QC["q3_activities"].get("updated", ""))
A("| Q3 客诉 | `数据/mcp_complaints.json`（全库 362 条） | 按 `created` 过滤 Q3；链接用 `id` |")
A("| 2026 ERP | `销售订单_20260101-20260930.xlsx`（25,027 行） | 标准销售订单 + 已审核 + 非赠品 + 剔宝锐系 |")
A("| 2025/2024 ERP | `2025全年订单.xlsx[Sheet1]`、`2024全年订单.xlsx[Sheet1]` | 历史件**无「单据状态」列**，故不做状态过滤 |")
A("")
A("### 附录 A · 随件附带的资料件（非人员汇报）")
A("")
for p_ in H1["people"]:
    if p_["name"] in SDOC:
        A("#### %s" % p_["name"])
        A("")
        for q in p_.get("quotes", []) or []:
            A("- %s" % q)
        A("")

A("**已知局限（如实标注，未做估算）**：")
A("")
A("1. 各人 PPT 月度金额单位不统一，已在数据结构化的 `_unit` 字段逐条标注；")
A("2. 部分人员（刘斌、袁殿果、侯海瑜）原表年度目标/完成率留空，记 `null`；")
A("3. 2025 名册为岗位制（大客户1/大客户2），跨年**个人**同比仅在实名人员间可比；")
A("4. 2024 名册无「生命科学部」，该年部门口径缺此项；")
A("5. 客诉 `urgency` 字段在 Q3 记录中多为默认值，**不可**作为影响面排序依据；")
A("6. 竞品命中的词表匹配存在少量同义/误匹配，证据均保留原文链接以便复核。")
A("")

md = "\n".join(L)
p = os.path.join(OUTD, "Q3汇报数据汇总.md")
open(p, "w").write(md)
print("WROTE", p, len(md), "chars,", len(L), "lines")
