#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""把 2027 客户商机演示 V1 的页面逻辑导出为 XMind（旧版 XML，兼容 XMind 8/2022+）。"""
import os
import zipfile
from xml.etree import ElementTree as ET

BASE = os.path.expanduser('~/Desktop/Hermes输出-工作类')
OUT = os.path.join(BASE, '工具', '客户商机演示_2027_v1_页面逻辑.xmind')

ET.register_namespace('', 'urn:xmind:xmap:xmlns:content:2.0')
_n = [0]


def T(title, *children):
    _n[0] += 1
    el = ET.Element('topic', {'id': 't%04d' % _n[0]})
    ET.SubElement(el, 'title').text = title
    if children:
        if len(children) == 1 and isinstance(children[0], list):
            children = children[0]
        topics = ET.SubElement(el, 'children')
        attached = ET.SubElement(topics, 'topics', {'type': 'attached'})
        for c in children:
            attached.append(c)
    return el


root = T('2027 诊断原料 · 客户商机演示 V1',
    T('00 运行边界',
        T('本地自包含 HTML'),
        T('不接飞书 / 无外部请求'),
        T('受众：公司领导、IT'),
        T('客户数据不脱敏（按用户授权）'),
        T('数据截至 2026-11-09'),
        T('源表不改；导入 Excel 只在浏览器内解析'),
    ),
    T('01 目标与核心口径',
        T('2026 预计达成', T('5,000 万元（用户给定）')),
        T('2027 原报目标', T('9,892 万元'), T('精确值 9,891.75 万元'), T('公式：4,828.24 ÷ 48.81%'), T('相对 2026 预计 +97.8%')),
        T('加权目标', T('6,500 万元')),
        T('当前原报', T('4,828.24 万元'), T('341 条有效商机')),
        T('当前加权', T('3,172.70 万元'), T('存量 90% / 突破 30% / 探索 10%')),
        T('加权覆盖率', T('48.81%'), T('当前加权 ÷ 6,500')),
        T('原报缺口', T('5,063.76 万元'), T('9,892 − 当前原报')),
        T('加权缺口', T('3,327.30 万元'), T('6,500 − 当前加权')),
        T('人员/区域目标与缺口', T('目标：留空'), T('增长：留空'), T('缺口：留空'), T('待 2026-11-30 第二版预测')),
    ),
    T('02 五个页面',
        T('01 总览', T('KPI 6 卡'), T('目标折算公式'), T('部门结构'), T('商机类型'), T('区域结构（目标/增长/缺口留空）'), T('集团 TOP 12')),
        T('02 部门与人', T('部门汇总'), T('类型结构'), T('销售员明细（13 人）'), T('目标/增长/缺口留空')),
        T('03 客户与商机', T('集团汇总', T('搜索'), T('类型筛选'), T('区域筛选')), T('商机明细', T('搜索'), T('类型/部门筛选'), T('50 条/页')), T('按集团归集')),
        T('04 客户详情', T('集团选择器'), T('集团 KPI：原报/加权/商机/活动'), T('客户主体'), T('集团商机'), T('近 6 个月活动时间线（最近 30 条）')),
        T('05 数据与导入', T('数据质量卡'), T('已知缺口'), T('Excel 导入'), T('下载 JSON / CSV'), T('客户别名与集团归口表'), T('口径与来源')),
    ),
    T('03 数据层',
        T('2027 V02 预测', T('13 名销售'), T('341 条有效商机'), T('230 家客户'), T('来源：V02 概率加权版 Excel')),
        T('客户别名与集团归口', T('230 家客户'), T('214 已确认/独立'), T('16 家待确认'), T('224 个归口'), T('来源：官方客户清单 + 客户360 + 人工别名表')),
        T('近 6 个月客户活动', T('10,532 条'), T('200 / 230 家有活动'), T('30 家无活动'), T('来源：daily MCP + activities_feishu + 客户360')),
        T('区域', T('按 2026 订单收货地址推断'), T('45 条商机未识别区域'), T('区域目标/增长/缺口待 V2')),
        T('数据质量', T('样例行 2'), T('数据行剔除 10'), T('汇总行 13'), T('无关联货号 51 条 / 175.84 万'), T('无商机 ID 17 条 / 67.50 万'), T('无商机名称 8 条'), T('重复商机 ID 6 个'), T('K ≠ Q1–Q4 10 条')),
    ),
    T('04 计算与交互逻辑',
        T('加权金额', T('原报 × 类型概率'), T('存量 90%'), T('突破 30%'), T('探索 10%')),
        T('加权覆盖率', T('当前加权 ÷ 6,500')),
        T('2027 原报目标', T('当前原报 ÷ 加权覆盖率'), T('当前结构不变时的理论原报')),
        T('原报缺口', T('9,892 − 当前原报')),
        T('加权缺口', T('6,500 − 当前加权')),
        T('集团聚合', T('按客户标准名归入集团'), T('集团原报/加权 = 成员求和'), T('独立客户保留自身归口')),
        T('明细交互', T('搜索'), T('类型/部门/区域筛选'), T('排序'), T('分页')),
        T('导入 Excel', T('识别 V02 表头'), T('只取“计入汇总=是”'), T('重算原报/加权'), T('保留原归口与活动'), T('新客户先标待确认')),
        T('导出', T('当前数据 JSON'), T('归口表 CSV')),
    ),
    T('05 数据字段',
        T('商机', T('客户 / 商机名称'), T('关联货号 / 商机 ID'), T('商机类型 / 销售 / 部门'), T('Q1–Q4 / 原报 / 加权'), T('区域 / 归口状态')),
        T('集团', T('客户数 / 商机数'), T('原报 / 加权'), T('类型结构 / 区域'), T('活动数 / 最近活动')),
        T('客户', T('标准名 / 别名 / 集团'), T('销售 / 部门 / 区域'), T('原报 / 加权 / 活动数')),
        T('活动', T('日期 / 客户 / 集团'), T('销售 / 部门 / 类型'), T('文本 / 来源')),
    ),
    T('06 待确认与风险',
        T('16 家客户归口待确认'),
        T('45 条商机区域未识别'),
        T('30 家预测客户无活动'),
        T('V02 缺货号/缺 ID/重复 ID'),
        T('混合类型按突破性 30%'),
        T('区域口径待业务确认'),
        T('人员/区域目标、增长、缺口待 V2'),
    ),
    T('07 修改入口',
        T('页面', T('工具/客户商机演示_2027_v1.html')),
        T('数据', T('数据/客户商机演示_2027_v1.json'), T('数据/客户别名集团归口表_2027_v1.xlsx')),
        T('模板', T('脚本/customer_opportunity_demo_template.html')),
        T('构建', T('脚本/build_customer_opportunity_demo_2027.py'), T('脚本/build_customer_opportunity_html_2027.py')),
        T('源表', T('2027 诊断原料销售拓展部 / 大客户部预估 V02')),
        T('下一版', T('2026-11-30 第二版预测'), T('补人员/区域目标、增长、缺口')),
        T('可调整项', T('屏幕顺序/合并'), T('KPI 指标增减'), T('归口规则'), T('区域口径'), T('导入模板兼容'), T('视觉风格')),
    ),
)

sheet = ET.Element('sheet', {'id': 'sheet1', 'title': '页面逻辑 V1'})
sheet.append(root)
content = ET.Element('xmap-content', {'xmlns': 'urn:xmind:xmap:xmlns:content:2.0'})
content.append(sheet)
xml_str = ET.tostring(content, encoding='utf-8', xml_declaration=True)

meta = ET.Element('meta', {'xmlns': 'urn:xmind:xmap:xmlns:meta:2.0'})
ET.SubElement(ET.SubElement(meta, 'Author'), 'Name').text = '宝锐生物 营销中心'
meta_str = ET.tostring(meta, encoding='utf-8', xml_declaration=True)

manifest = '''<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns="urn:xmind:xmap:xmlns:manifest:1.0">
  <file-entry full-path="content.xml" media-type="text/xml"/>
  <file-entry full-path="meta.xml" media-type="text/xml"/>
  <file-entry full-path="META-INF/" media-type=""/>
  <file-entry full-path="META-INF/manifest.xml" media-type="text/xml"/>
</manifest>'''

os.makedirs(os.path.dirname(OUT), exist_ok=True)
with zipfile.ZipFile(OUT, 'w', zipfile.ZIP_DEFLATED) as zf:
    zf.writestr('content.xml', xml_str)
    zf.writestr('meta.xml', meta_str)
    zf.writestr('META-INF/manifest.xml', manifest.encode('utf-8'))
print('wrote', OUT, os.path.getsize(OUT))
print('topics', _n[0])
