#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""内部经营版：客户满意度调研 × 业务现状 × 竞争格局（管理层视角 Word）。

数据来源（全部可溯源）：
  数据/survey2026_stats.json        —— 本次问卷实测统计（n=470 主口径 / 590 扩展口径）
  数据/competitor_benchmark.json    —— 99 条竞品公开情报（8 家）
  数据/目标基础数据_2026.json        —— 2026 年度目标口径（内部权威源）
输出：经营分析/宝锐生物客户满意度调研_内部经营版_2026-10.docx
"""
import json
import os
from datetime import datetime

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Cm, Inches, Pt, RGBColor

W = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
STATS = json.load(open(os.path.join(W, '数据/survey2026_stats.json'), encoding='utf-8'))
COMP = json.load(open(os.path.join(W, '数据/competitor_benchmark.json'), encoding='utf-8'))
LOGO = os.path.expanduser('~/work/公司资料/logo_transparent.png')
OUT = os.path.join(W, '经营分析/宝锐生物客户满意度调研_内部经营版_2026-10.docx')
SLOGAN = '守护生命健康，缔造美好生活'


def P(doc, text='', size=10.5, bold=False, align=None, space=5, color=None):
    p = doc.add_paragraph()
    r = p.add_run(text)
    r.font.size = Pt(size)
    r.bold = bold
    if color:
        r.font.color.rgb = color
    if align:
        p.alignment = align
    p.paragraph_format.space_after = Pt(space)
    return p


def T(doc, header, rows, widths=None):
    t = doc.add_table(rows=1, cols=len(header))
    t.style = 'Table Grid'
    for i, h in enumerate(header):
        c = t.rows[0].cells[i]
        c.text = ''
        r = c.paragraphs[0].add_run(h)
        r.bold = True
        r.font.size = Pt(9)
    for row in rows:
        cells = t.add_row().cells
        for i, v in enumerate(row):
            cells[i].text = ''
            rr = cells[i].paragraphs[0].add_run(str(v))
            rr.font.size = Pt(9)
    if widths:
        for r in t.rows:
            for i, w in enumerate(widths):
                if i < len(r.cells):
                    r.cells[i].width = Cm(w)
    return t


def main():
    doc = Document()
    sec = doc.sections[0]
    sec.left_margin = sec.right_margin = Cm(2.2)
    sec.top_margin = sec.bottom_margin = Cm(2.0)

    # 品牌页眉
    hdr = sec.header.paragraphs[0]
    hdr.alignment = WD_ALIGN_PARAGRAPH.CENTER
    if os.path.exists(LOGO):
        hdr.add_run().add_picture(LOGO, height=Inches(0.28))
    hr = hdr.add_run('　宝锐生物 BIORI BIOTECH · 客户满意度调研（内部经营版）')
    hr.font.size = Pt(8.5)
    ftr = sec.footer.paragraphs[0]
    ftr.alignment = WD_ALIGN_PARAGRAPH.CENTER
    fr = ftr.add_run('守护生命健康，缔造美好生活　·　内部资料，请勿外发')
    fr.font.size = Pt(8.5)

    P(doc, '2026 年度客户满意度调研 · 内部经营版', size=20, bold=True,
      align=WD_ALIGN_PARAGRAPH.CENTER, space=4)
    P(doc, 'Customer Satisfaction Survey 2026 ｜ 经营视角解读与改善行动',
      size=11, align=WD_ALIGN_PARAGRAPH.CENTER, space=2)
    P(doc, '配套文件：《2026 年度客户满意度调研报告（ISO 13485 现场审核版）_修订版》',
      size=9, align=WD_ALIGN_PARAGRAPH.CENTER, space=14)

    # 一、摘要
    P(doc, '一、一页看懂', size=14, bold=True)
    P(doc, '数据口径：有效样本 n = 470（质控通过；提交总量 646，另 120 份为超时但有调研意义的自填样本，'
           '用于产品类题目作交叉验证）。样本来自 366 家客户单位，覆盖 44 个城市。')
    st = STATS
    q1, q2, q4 = st['Q1产品质量_主口径'], st['Q2销售服务_主口径'], st['Q4技术支持_主口径']
    T(doc, ['维度', '均分（10 分制）', '10 分占比', '≤6 分占比', '结论'],
      [['产品质量性能', f"{q1['mean']}", f"{q1['pct10']}%", f"{q1['pct_le6']}%", '整体优良，绝对分最低 → 首要提升项'],
       ['销售服务', f"{q2['mean']}", f"{q2['pct10']}%", f"{q2['pct_le6']}%", '相对优势项，可作对外标杆'],
       ['技术支持', f"{q4['mean']}", f"{q4['pct10']}%", f"{q4['pct_le6']}%", '居中；“有效解决问题”是短板']],
      widths=[3.2, 3.0, 2.4, 2.4, 5.4])
    P(doc, '')
    P(doc, '一句话结论：客户对我们“卖得勤、服务快”高度认可（销售 9.53），但“产品绝对水平”与“价格感知”'
           '构成两个结构性压力点；改进需求最集中的是技术资料供给与技术支持解决问题能力。')
    P(doc, '')

    # 二、客户结构
    P(doc, '二、客户结构与业务映射', size=14, bold=True)
    P(doc, '我方在产业链中承担“上游原料供应商”角色，客户以 IVD 试剂生产企业与第三方检验机构为主。'
           '本次样本岗位结构（研发类 77.9%、供应链/采购 18.7%）与这一业务模式高度吻合。')
    T(doc, ['结构维度', '实测结果', '经营含义'],
      [['岗位结构', '研发类 77.9% ｜ 供应链（采购/质量/生产）18.7%', '决策影响者集中在研发与质量，技术资料与验证支持是成交关键'],
       ['地域结构', '广东 26.0% ｜ 长三角 24.3% ｜ 京津 15.1% ｜ 覆盖 44 城', '与主要市场分布一致；华东华南合计过半，服务资源应优先配置'],
       ['单位集中度', '366 家单位；66 家提交 ≥2 份（占 36.2%）', '多部门参与选型验证，单客户内部影响面广，适合“多岗位触达”策略'],
       ['终端覆盖', '医院 / 临床检验科室 0 例', '属取样口径（直接采购客户）造成的模式性盲区，宜补采或经客户侧间接获取']],
      widths=[2.8, 5.6, 7.6])
    P(doc, '')

    # 三、竞争格局
    P(doc, '三、竞争格局（问卷实测 × 竞品公开情报）', size=14, bold=True)
    pen = st['Q13渗透率_主_pct']
    T(doc, ['供应商阵营', '客户在用比例（n=470）', '解读'],
      [['宝锐', f"{pen.get('宝锐', 0)}%", '主力供应商地位稳固（过半客户在用）'],
       ['诺唯赞 / 菲鹏 / 康为世纪', f"{pen.get('诺唯赞、菲鹏、康为世纪', 0)}%", '第一大竞争阵营，与本方客户重叠度最高 → 替换主战场'],
       ['翌圣 / 全式金 / 瀚海新酶', f"{pen.get('翌圣、全式金、瀚海新酶', 0)}%", '第二大阵营，价格与可冻干原料为主要交锋点'],
       ['Roche / Qiagen / Meridian / Thermo', f"{pen.get('Roche、Qiagen、Meridian、Thermo', 0)}%", '进口替代机会，客户对“等效但更便宜”有明确需求'],
       ['TOYOBO / TAKARA / KAPPA / NEB', f"{pen.get('TOYOBO、TAKARA、KAPPA、NEB', 0)}%", '高端酶类替代空间，需参数级对标支撑']],
      widths=[5.2, 4.4, 6.4])
    P(doc, '')
    n_brand = {}
    for e in COMP['items']:
        n_brand[e['品牌']] = n_brand.get(e['品牌'], 0) + 1
    P(doc, '公开竞品情报库现状（截至 2026-10）：' +
      '、'.join('%s %d 条' % (k, v) for k, v in sorted(n_brand.items(), key=lambda x: -x[1])) +
      f"，合计 {len(COMP['items'])} 条，逐条带来源链接。"
      '其中“可冻干 / 无甘油”为最密集的交锋方向（翌圣 14405ES/11893ES、全式金 AQ732/AQ322/LP302、诺唯赞 GO-Lyo U+ 等）。')
    P(doc, '')

    # 四、改进需求
    P(doc, '四、改进需求与责任分工', size=14, bold=True)
    sales = list(st['Q3销售改进_主'].items())
    tech = list(st['Q5技术改进_主'].items())
    dis = list(st['Q12最不满意_主'].items())
    P(doc, '客户明示的改进需求（去除“暂无”项后按勾选率排序）：')
    T(doc, ['优先级', '问题', '实测依据', '建议动作', '主责部门'],
      [['P0', '价格感知偏高', f"最不满意第一项：价格 {dis[0][1]} 人（{round(100*dis[0][1]/470,1)}%）",
        '阶梯定价 / 老客户协议价 / 以“原料替代进口”整体成本论证，而非直接降价', '营销中心 · 大客户部'],
       ['P1', '产品数据与资料更新不及时',
        f"销售改进第 1 位：{sales[1][1]} 人（{round(100*sales[1][1]/470,1)}%）",
        '建立货号级资料库（说明书 / 体系配制 / 程序）并按版本更新，销售侧一键可取', '市场部 · 技术支持部'],
       ['P1', '技术支持“有效解决问题”',
        f"技术改进第 1 位：{tech[1][1]} 人（{round(100*tech[1][1]/470,1)}%）",
        '技术响应 SLA + 疑难问题升级机制 + 案例库沉淀', '技术支持部'],
       ['P1', '产品稳定性 / 批次一致性', '开放意见高频负向主题',
        '批间差趋势监控纳入产品质量回顾，异常批次主动告知客户', '质量部 · 研发部'],
       ['P2', '准确推荐适用产品', f"技术改进第 2 位：{tech[2][1]} 人（{round(100*tech[2][1]/470,1)}%）",
        '按客户项目场景的选型清单（已建“分子诊断原料知识库”，可开放给销售）', '技术支持部 · 销售部'],
       ['P2', '学术宣讲与行业知识', f"销售改进：学术宣讲 {dict(sales)['学术宣讲']} 人、行业知识 {dict(sales)['行业知识积累']} 人",
        '按区域排期小型技术沙龙；用公开行业信息做客户简报', '市场部 · 各销售部'],
       ['P3', '响应效率 / 到货时间',
        '销售环节“到货时间” %d 人（%.1f%%）；技术环节“即时沟通回复效率” %d 人（%.1f%%）' % (
            dict(sales).get('到货时间', 0), 100.0 * dict(sales).get('到货时间', 0) / 470,
            dict(tech).get('即时沟通时回复的效率', 0), 100.0 * dict(tech).get('即时沟通时回复的效率', 0) / 470),
        '纳入销售服务 KPI 与物流时效看板', '销售各部 · 供应链']],
      widths=[1.6, 3.4, 4.2, 6.4, 3.0])
    P(doc, '')

    # 五、机会
    P(doc, '五、业务机会（问卷信号 × 产品线现状）', size=14, bold=True)
    hot = list(st['Q16热点项目_主'].items())[:6]
    mapping = {
        '多重PCR': '多重/全预混系列（含多重探针法与熔解曲线体系）；已有货号级选型清单',
        '分子POCT': 'FM/FMD 冻干体系 + AS 系列冻干保护剂（我方唯一“需求明确且产品已就绪”的交叉点）',
        '液体全预混': '液体全预混稳定体系（常温稳定方向，对应客户“免冻干”诉求）',
        '超多重PCR': '熔解曲线法体系与探针组合支持',
        '20度保存': '常温稳定全预混快速体系（快速程序 ≤15 min 方向）',
        '超快速': '常温稳定全预混快速体系（快速程序 ≤15 min 方向）',
        '释放剂直扩': '耐抑制直扩体系（样本免提取方向）',
    }
    hot_rows = []
    for k, v in hot:
        key = next((m for m in mapping if m in k), None)
        hot_rows.append([k[:24], f'{v} 人（{round(100*v/470,1)}%）',
                         mapping.get(key, '详见《分子诊断原料知识库》按场景选型清单')])
    hot_rows.append(['冻干 / 全预混方向（Q19/Q20 交叉）',
                     '冻干为 POCT 与可冻干建库的关键约束',
                     '我方已有 FM/FMD 冻干体系与冻干保护剂（AS 系列），可直接对接客户冻干项目'])
    T(doc, ['机会方向', '客户兴趣度（n=470）', '与我方产品线的对应'], hot_rows,
      widths=[5.0, 4.6, 6.4])
    P(doc, '')
    P(doc, '说明：冻干相关是我方唯一“客户明确表达需求、且产品线已就绪”的高确定性交叉点，'
           '建议列为 Q4 至次年的重点进攻方向（含样品验证与联合测试）。')
    P(doc, '')

    # 六、业务现状
    P(doc, '六、我方业务现状要点（2026，内部口径）', size=14, bold=True)
    T(doc, ['维度', '现状', '与本次调研的关联'],
      [['业务线', '两条线并行：①诊断原料（分子诊断原料：酶、预混液、恒温扩增、冻干体系、引物探针）；'
                  '②生命科学科研试剂（面向高校与科研院所，含 mRNA 相关方向）',
        '样本客户 100% 来自诊断原料客户群 → 本报告结论主要适用于诊断原料线；科研线感受可另行抽样'],
       ['组织与销售体系', '营销中心下辖大客户部、销售拓展部、生命科学销售部（浙江 / 广东两区），'
                     '销售团队约 30 人',
        '销售服务得分 9.53 印证“人盯人服务”模式有效；改进项须按部门落责（见第五节）'],
       ['客户结构', '以体外诊断试剂生产企业与第三方检验机构为主，地域集中于华东、华南',
        '与样本地域结构（广东 26.0% + 长三角 24.3%）一致'],
       ['市场动作（2026）', '按月发布《产品推荐清单》；开展科研促销与客户答谢活动；'
                       '拜访与项目跟进结构化录入；销售工作台与销售助手上线运行',
        '资料供给（C-2）已有落地载体：货号级知识库可作为“资料更新不及时”的直接对策'],
       ['产品与竞争准备', '已建成分子诊断原料知识库（核心货号含体系配制表 / 反应程序 / 应用场景 / 案例）；'
                    '已建成 8 家竞品公开情报库（99 条，含可冻干 / 无甘油方向）',
        '直接支撑 C-4「准确推荐适用产品」与进口替代论证（价格感知对策）']],
      widths=[2.6, 7.2, 6.4])
    P(doc, '')

    # 七、待跟踪
    P(doc, '七、待跟踪事项（与审核版第 13 章联动）', size=14, bold=True)
    P(doc, '以下事项在《ISO 13485 现场审核版（修订版）》第 13 章以空白表形式交由责任部门填写，'
           '完成情况将作为体系持续监视（7.2.1）与纠正措施（8.5.2）的客观证据：')
    T(doc, ['编号', '事项', '责任部门', '建议时限'],
      [['C-1', '批次一致性与稳定性改善', '质量部 / 研发部', '本季度内完成趋势分析'],
       ['C-2', '产品资料库建设与版本控制', '市场部 / 技术支持部', '本季度内上线试用'],
       ['C-3', '价格策略（阶梯定价 / 老客户协议价）', '营销中心 / 大客户部', '下季度定价评审会'],
       ['C-4', '技术支持响应 SLA 与升级机制', '技术支持部', '本月内发布'],
       ['C-5', '技术支持“准确推荐适用产品”能力建设', '技术支持部 / 销售部', '本季度内出选型清单'],
       ['C-6', '低分客户（≤6 分）逐例闭环回访', '客户质量 / 大客户部', '30 天内完成'],
       ['C-7', '终端医院 / 临床检验科补采计划', '市场部', '下一次调研前完成']],
      widths=[1.8, 7.4, 4.4, 4.4])

    P(doc, '')
    P(doc, '数据可溯源性说明：本报告全部统计量由问卷原始导出表《宝锐生物客户满意度调查问卷-2026'
           '（按选项文本）-全部.xlsx》现算得出（脚本 脚本/build_survey2026_stats.py），'
           '竞品情报取自公开来源（数据/competitor_benchmark.json），可逐条复核。'
           '生成时间：' + datetime.now().strftime('%Y-%m-%d %H:%M'), size=9)

    os.makedirs(os.path.dirname(OUT), exist_ok=True)
    doc.save(OUT)
    d2 = Document(OUT)
    print('✅ 内部经营版已生成:', OUT)
    print('   段落 %d ｜ 表格 %d ｜ 页眉含 Logo %s' % (
        len(d2.paragraphs), len(d2.tables), '是' if os.path.exists(LOGO) else '否'))


if __name__ == '__main__':
    main()
