#!/usr/bin/env python3
"""Generate the delivery-department operating model, data dictionaries and review artifacts."""

from __future__ import annotations

import csv
import html
import json
import subprocess
import sys
from pathlib import Path

from docx import Document
from docx.enum.section import WD_SECTION
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT, WD_TABLE_ALIGNMENT
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Cm, Pt, RGBColor


ROOT = Path(__file__).resolve().parent
STARTER = ROOT / "tmp" / "delivery-operating-system-starter.docx"
FINAL_DOCX = ROOT / "交付实施部经营与项目管控体系_V1.0.docx"
ONLINE_META = ROOT / "wecom-workbook-metadata.json"
PROJECT_ROOT = ROOT.parents[1]
KANGBITE_TEMPLATE = PROJECT_ROOT / "standards-stack" / "agent-skills" / "skills" / "kangbite-word-template" / "assets" / "kangbite-digital-sports-word-template.docx"
PREPARE_TEMPLATE = PROJECT_ROOT / "standards-stack" / "agent-skills" / "skills" / "kangbite-word-template" / "scripts" / "prepare_working_copy.py"


def f(name, kind, definition, owner, timing, required="是", trigger="", source="人工填报", quality="非空且可追溯", dashboard="否"):
    return {
        "name": name,
        "type": kind,
        "definition": definition,
        "owner": owner,
        "timing": timing,
        "required": required,
        "trigger": trigger or timing,
        "source": source,
        "quality": quality,
        "dashboard": dashboard,
    }


SHEETS = [
    {
        "title": "00-使用说明",
        "object": "管理规则",
        "purpose": "说明唯一事实源、角色边界、更新节奏和人工门禁。",
        "fields": [
            f("规则ID", "FIELD_TYPE_TEXT", "规则唯一编号", "PMO", "规则发布时", source="PMO规则库"),
            f("主题", "FIELD_TYPE_TEXT", "规则所属主题", "PMO", "规则发布时"),
            f("规则内容", "FIELD_TYPE_TEXT", "必须执行的具体规则", "PMO", "规则发布或变更时"),
            f("主责角色", "FIELD_TYPE_TEXT", "负责执行或维护该规则的角色", "部门负责人", "规则发布时"),
            f("执行频率", "FIELD_TYPE_TEXT", "每日、每周、事件触发或月度", "PMO", "规则发布时"),
            f("完成门禁", "FIELD_TYPE_TEXT", "什么条件下才可视为执行完成", "PMO", "规则发布时"),
            f("证据要求", "FIELD_TYPE_TEXT", "必须保留的链接、截图、验收或记录", "PMO", "规则发布时"),
        ],
    },
    {
        "title": "01-领导指标字典",
        "object": "经营指标",
        "purpose": "定义领导大屏上的指标、来源、口径和触发动作，不直接重复填报经营数据。",
        "fields": [
            f("指标ID", "FIELD_TYPE_TEXT", "指标唯一编号", "PMO", "指标建立时", source="指标字典"),
            f("指标名称", "FIELD_TYPE_TEXT", "领导大屏展示名称", "部门负责人", "指标建立或调整时"),
            f("指标维度", "FIELD_TYPE_SINGLE_SELECT", "兑现、进度、风险、质量、成本、容量或复用", "PMO", "指标建立时"),
            f("领导问题", "FIELD_TYPE_TEXT", "该指标帮助领导回答的问题", "部门负责人", "指标建立时"),
            f("指标定义", "FIELD_TYPE_TEXT", "业务口径和统计边界", "PMO", "指标建立时"),
            f("计算公式", "FIELD_TYPE_TEXT", "由底层字段计算的公式", "PMO", "指标建立或调整时"),
            f("来源子表", "FIELD_TYPE_TEXT", "数据来源表", "PMO", "指标建立时"),
            f("来源字段", "FIELD_TYPE_TEXT", "用于计算的字段", "PMO", "指标建立时"),
            f("口径责任人", "FIELD_TYPE_TEXT", "对指标解释和质量负责的角色", "部门负责人", "指标建立时"),
            f("刷新频率", "FIELD_TYPE_TEXT", "大屏刷新节奏", "PMO", "指标建立时"),
            f("展示形式", "FIELD_TYPE_TEXT", "指标卡、趋势、矩阵、清单或热力图", "PMO", "大屏设计时"),
            f("红灯规则", "FIELD_TYPE_TEXT", "触发红色预警的规则", "部门负责人", "试运行基线确认后", required="否"),
            f("黄灯规则", "FIELD_TYPE_TEXT", "触发黄色预警的规则", "部门负责人", "试运行基线确认后", required="否"),
            f("触发动作", "FIELD_TYPE_TEXT", "异常后需要谁做什么", "部门负责人", "指标建立时"),
            f("证据等级", "FIELD_TYPE_SINGLE_SELECT", "A/B/C/D证据等级", "PMO", "指标建立时"),
        ],
    },
    {
        "title": "02-项目组合总表",
        "object": "项目",
        "purpose": "一项目一行，作为部门项目组合的唯一主数据。",
        "fields": [
            f("项目ID", "FIELD_TYPE_TEXT", "跨表关联的唯一编号", "PMO", "售前转交付通过当天", quality="唯一、不可复用", dashboard="是"),
            f("项目名称", "FIELD_TYPE_TEXT", "客户可识别的正式项目名称", "项目负责人", "项目建立当天", dashboard="是"),
            f("客户/单位", "FIELD_TYPE_TEXT", "合同或立项对应客户", "销售负责人", "售前转交付前", dashboard="是"),
            f("项目类型", "FIELD_TYPE_SINGLE_SELECT", "企业/机关/学校/食安硬件等交付类型", "PMO", "项目建立当天", dashboard="是"),
            f("产品包", "FIELD_TYPE_SINGLE_SELECT", "对应的标准产品包", "产品负责人", "启动会前", dashboard="是"),
            f("项目难度", "FIELD_TYPE_SINGLE_SELECT", "S/A/B/C难度，用于资源和绩效校准", "部门负责人", "资源分配前", dashboard="是"),
            f("来源部门", "FIELD_TYPE_TEXT", "商机或项目来源部门", "销售负责人", "售前转交付前"),
            f("销售负责人", "FIELD_TYPE_TEXT", "合同、商务承诺和回款主责", "销售负责人", "售前转交付前"),
            f("交付负责人", "FIELD_TYPE_TEXT", "项目结果单一责任人", "部门负责人", "资源分配时", dashboard="是"),
            f("技术负责人", "FIELD_TYPE_TEXT", "技术方案和重大技术风险主责", "部门负责人", "启动会前"),
            f("当前阶段", "FIELD_TYPE_SINGLE_SELECT", "七阶段中的当前阶段", "项目负责人", "阶段变化当天", dashboard="是"),
            f("项目状态", "FIELD_TYPE_SINGLE_SELECT", "未启动/进行中/待客户/待内部/待验收/已完成/暂停", "项目负责人", "状态变化当天", dashboard="是"),
            f("健康灯", "FIELD_TYPE_SINGLE_SELECT", "绿/黄/红，按偏差和阻塞判定", "项目负责人", "每天有变化时；周五必更", dashboard="是"),
            f("合同/立项日期", "FIELD_TYPE_DATE_TIME", "合同生效或内部立项日期", "销售负责人", "售前转交付前"),
            f("计划上线日", "FIELD_TYPE_DATE_TIME", "经启动会确认的基准上线日期", "项目负责人", "启动会后1个工作日", dashboard="是"),
            f("预测上线日", "FIELD_TYPE_DATE_TIME", "基于当前事实滚动预测的上线日期", "项目负责人", "每周一；发生偏差当天", dashboard="是"),
            f("实际上线日", "FIELD_TYPE_DATE_TIME", "生产上线完成日期", "项目负责人", "上线当天", required="否", quality="必须有上线证据", dashboard="是"),
            f("计划验收日", "FIELD_TYPE_DATE_TIME", "经确认的基准验收日期", "项目负责人", "启动会后1个工作日", dashboard="是"),
            f("预测验收日", "FIELD_TYPE_DATE_TIME", "滚动预测的验收日期", "项目负责人", "每周一；发生偏差当天", dashboard="是"),
            f("实际验收日", "FIELD_TYPE_DATE_TIME", "验收文件生效日期", "项目负责人", "验收当天", required="否", quality="必须关联验收证据", dashboard="是"),
            f("当前进度", "FIELD_TYPE_PROGRESS", "按完成里程碑权重计算的进度，不允许拍脑袋", "PMO", "每日自动汇总；周五复核", source="03-里程碑任务", dashboard="是"),
            f("范围基线版本", "FIELD_TYPE_TEXT", "当前有效交付范围版本号", "项目负责人", "启动会后；变更批准后"),
            f("验收标准摘要", "FIELD_TYPE_TEXT", "客户认可的核心验收条件", "项目负责人", "启动会后1个工作日"),
            f("预算人天", "FIELD_TYPE_NUMBER", "批准的交付预算人天", "部门负责人", "资源分配时", dashboard="是"),
            f("实际人天", "FIELD_TYPE_NUMBER", "已发生交付人天合计", "PMO", "每周五汇总", source="03-里程碑任务", dashboard="是"),
            f("定制化比例", "FIELD_TYPE_PERCENTAGE", "定制工作量占总交付工作量比例", "产品负责人", "范围冻结后；变更后", dashboard="是"),
            f("下一里程碑", "FIELD_TYPE_TEXT", "未来最近一个必须兑现的节点", "项目负责人", "每周一；节点完成后", dashboard="是"),
            f("下一动作", "FIELD_TYPE_TEXT", "当前最重要的下一步结果", "项目负责人", "每个工作日有变化时", dashboard="是"),
            f("客户配合项", "FIELD_TYPE_TEXT", "客户需提供的数据、人员、环境或确认", "项目负责人", "识别当天", required="否", dashboard="是"),
            f("领导决策项", "FIELD_TYPE_TEXT", "需要事业部领导拍板或协调的事项", "部门负责人", "形成红灯或跨部门阻塞当天", required="否", dashboard="是"),
            f("证据链接", "FIELD_TYPE_URL", "项目计划、验收、截图或文件入口", "项目负责人", "项目建立及关键节点后"),
            f("最后更新时间", "FIELD_TYPE_DATE_TIME", "项目事实最后刷新时间", "系统/PMO", "每次更新时", source="系统生成", dashboard="是"),
        ],
    },
    {
        "title": "03-里程碑任务",
        "object": "里程碑/任务",
        "purpose": "承载七阶段任务，确保每个人知道下一步、截止时间和完成标准。",
        "fields": [
            f("任务ID", "FIELD_TYPE_TEXT", "任务唯一编号", "PMO", "任务创建时", quality="唯一"),
            f("项目ID", "FIELD_TYPE_TEXT", "关联项目", "项目负责人", "任务创建时", dashboard="是"),
            f("阶段", "FIELD_TYPE_SINGLE_SELECT", "七阶段之一", "项目负责人", "任务创建时", dashboard="是"),
            f("任务名称", "FIELD_TYPE_TEXT", "动词开头的可交付任务", "项目负责人", "任务创建时", dashboard="是"),
            f("任务类别", "FIELD_TYPE_SINGLE_SELECT", "计划/软件/数据/接口/硬件/培训/验收/售后", "项目负责人", "任务创建时"),
            f("任务级别", "FIELD_TYPE_SINGLE_SELECT", "P0/P1/P2/P3", "项目负责人", "任务创建时", dashboard="是"),
            f("主责人", "FIELD_TYPE_TEXT", "对任务结果负责的唯一人员", "项目负责人", "任务分派时", dashboard="是"),
            f("协作人", "FIELD_TYPE_TEXT", "提供配合的人员或角色", "项目负责人", "任务分派时", required="否"),
            f("计划开始", "FIELD_TYPE_DATE_TIME", "任务基准开始日期", "项目负责人", "计划发布时"),
            f("计划完成", "FIELD_TYPE_DATE_TIME", "任务基准截止日期", "项目负责人", "计划发布时", dashboard="是"),
            f("预测完成", "FIELD_TYPE_DATE_TIME", "任务当前预测完成日期", "任务主责人", "每周一；发现偏差当天", dashboard="是"),
            f("实际完成", "FIELD_TYPE_DATE_TIME", "任务通过完成标准的日期", "任务主责人", "完成当天", required="否"),
            f("状态", "FIELD_TYPE_SINGLE_SELECT", "未开始/进行中/受阻/待确认/已完成/取消", "任务主责人", "每天工作结束前；状态变化立即", dashboard="是"),
            f("进度", "FIELD_TYPE_PROGRESS", "基于已完成子结果的百分比", "任务主责人", "每天工作结束前", dashboard="是"),
            f("工作量点数", "FIELD_TYPE_NUMBER", "结合难度、工时和责任的工作量点", "项目负责人", "任务分派时", dashboard="是"),
            f("预计工时", "FIELD_TYPE_NUMBER", "任务预计投入小时", "任务主责人", "接单当天"),
            f("实际工时", "FIELD_TYPE_NUMBER", "任务实际投入小时", "任务主责人", "完成当天；周五补齐"),
            f("交付物", "FIELD_TYPE_TEXT", "任务应产生的文件、配置、系统状态或客户结果", "项目负责人", "任务创建时"),
            f("完成标准", "FIELD_TYPE_TEXT", "可验证的Done定义", "项目负责人", "任务创建时", quality="无完成标准不得开工"),
            f("证据链接", "FIELD_TYPE_URL", "截图、日志、文件、验收或系统链接", "任务主责人", "完成当天", quality="无证据不得标完成"),
            f("阻塞类型", "FIELD_TYPE_SINGLE_SELECT", "客户/内部/技术/设备/数据/资源/决策", "任务主责人", "阻塞识别当天", required="否", dashboard="是"),
            f("阻塞说明", "FIELD_TYPE_TEXT", "阻塞事实、影响和已采取动作", "任务主责人", "阻塞识别当天", required="否", dashboard="是"),
            f("下一动作", "FIELD_TYPE_TEXT", "解除阻塞或推进任务的下一步", "任务主责人", "每天工作结束前", dashboard="是"),
            f("客户配合", "FIELD_TYPE_TEXT", "客户需完成的动作及期限", "项目负责人", "识别当天", required="否"),
            f("最后更新时间", "FIELD_TYPE_DATE_TIME", "任务最后更新时间", "系统/PMO", "每次更新时", source="系统生成"),
        ],
    },
    {
        "title": "04-风险问题变更",
        "object": "风险/问题/变更/决策",
        "purpose": "统一管理不确定性、已发生问题、范围变更和待决策事项。",
        "fields": [
            f("记录ID", "FIELD_TYPE_TEXT", "事项唯一编号", "PMO", "事项登记时", quality="唯一"),
            f("项目ID", "FIELD_TYPE_TEXT", "关联项目", "登记人", "事项登记时", dashboard="是"),
            f("类型", "FIELD_TYPE_SINGLE_SELECT", "风险/问题/变更/决策", "登记人", "事项登记时", dashboard="是"),
            f("标题", "FIELD_TYPE_TEXT", "一句话描述事实", "登记人", "事项登记时", dashboard="是"),
            f("严重度", "FIELD_TYPE_SINGLE_SELECT", "重大/高/中/低", "项目负责人", "登记当天", dashboard="是"),
            f("健康灯", "FIELD_TYPE_SINGLE_SELECT", "绿/黄/红", "项目负责人", "登记当天；变化时", dashboard="是"),
            f("发现日期", "FIELD_TYPE_DATE_TIME", "首次识别日期", "登记人", "发现当天"),
            f("影响范围", "FIELD_TYPE_TEXT", "进度、质量、范围、成本、客户或回款影响", "项目负责人", "登记当天", dashboard="是"),
            f("进度影响天数", "FIELD_TYPE_NUMBER", "预计造成的工期偏差", "项目负责人", "评估后1个工作日", required="否", dashboard="是"),
            f("成本影响人天", "FIELD_TYPE_NUMBER", "预计新增交付人天", "项目负责人", "评估后1个工作日", required="否", dashboard="是"),
            f("主责人", "FIELD_TYPE_TEXT", "关闭该事项的唯一责任人", "项目负责人", "登记当天", dashboard="是"),
            f("协同角色", "FIELD_TYPE_TEXT", "需要配合的部门或角色", "项目负责人", "登记当天", required="否"),
            f("计划关闭", "FIELD_TYPE_DATE_TIME", "预计关闭日期", "主责人", "接单当天", dashboard="是"),
            f("状态", "FIELD_TYPE_SINGLE_SELECT", "已识别/处理中/待决策/待客户/已关闭/接受", "主责人", "状态变化当天", dashboard="是"),
            f("处理方案", "FIELD_TYPE_TEXT", "规避、缓解、转移、接受或纠正方案", "主责人", "登记后1个工作日"),
            f("领导决策项", "FIELD_TYPE_TEXT", "需要领导选择的选项及建议", "部门负责人", "需要决策当天", required="否", dashboard="是"),
            f("决策截止", "FIELD_TYPE_DATE_TIME", "最晚决策时间", "部门负责人", "提交决策时", required="否", dashboard="是"),
            f("变更前基线", "FIELD_TYPE_TEXT", "原范围、时间或成本基线", "项目负责人", "变更申请时", required="否"),
            f("变更后基线", "FIELD_TYPE_TEXT", "批准后的新基线", "项目负责人", "变更批准当天", required="否"),
            f("客户确认状态", "FIELD_TYPE_SINGLE_SELECT", "不涉及/待确认/已确认/已拒绝", "项目负责人", "客户确认当天"),
            f("关闭证据", "FIELD_TYPE_URL", "决定、邮件、验收、截图或修复证据", "主责人", "关闭当天", required="否", quality="无证据不得关闭"),
            f("来源", "FIELD_TYPE_TEXT", "会议、客户、任务、日志或巡检来源", "登记人", "事项登记时"),
            f("最后更新时间", "FIELD_TYPE_DATE_TIME", "事项最后更新时间", "系统/PMO", "每次更新时", source="系统生成"),
        ],
    },
    {
        "title": "05-人员容量",
        "object": "人员/周容量",
        "purpose": "按周管理人员负荷、能力标签和可接单容量，支持自动派单。",
        "fields": [
            f("人员", "FIELD_TYPE_TEXT", "交付人员姓名", "部门负责人", "人员加入或变化时", dashboard="是"),
            f("周起始日", "FIELD_TYPE_DATE_TIME", "容量统计周周一", "PMO", "每周五建立下周记录", dashboard="是"),
            f("主角色", "FIELD_TYPE_SINGLE_SELECT", "项目负责人/实施/技术/售后/PMO", "部门负责人", "人员加入或角色变化时"),
            f("能力标签", "FIELD_TYPE_SELECT", "软件、数据、接口、硬件、培训、验收等", "部门负责人", "月度能力盘点时", dashboard="是"),
            f("标准工时", "FIELD_TYPE_NUMBER", "本周可用于工作的标准小时", "PMO", "每周五"),
            f("可用工时", "FIELD_TYPE_NUMBER", "扣除假期和固定事务后的可用小时", "人员本人", "每周五；请假变化时", dashboard="是"),
            f("已承诺工时", "FIELD_TYPE_NUMBER", "已分配任务预计工时合计", "PMO", "每日自动汇总；周一锁定", source="03-里程碑任务", dashboard="是"),
            f("负荷率", "FIELD_TYPE_PERCENTAGE", "已承诺工时/可用工时", "系统/PMO", "每日自动计算", source="系统计算", dashboard="是"),
            f("在手项目数", "FIELD_TYPE_NUMBER", "本周参与的有效项目数", "系统/PMO", "每日自动计算", source="02-项目组合总表", dashboard="是"),
            f("P0/P1任务数", "FIELD_TYPE_NUMBER", "未完成高优任务数量", "系统/PMO", "每日自动计算", source="03-里程碑任务", dashboard="是"),
            f("可接新任务点数", "FIELD_TYPE_NUMBER", "按容量和技能估算的剩余工作量点", "PMO", "每日自动计算", dashboard="是"),
            f("容量风险", "FIELD_TYPE_SINGLE_SELECT", "正常/偏高/超载/不可用", "PMO", "每日自动计算；人工复核", dashboard="是"),
            f("管理动作", "FIELD_TYPE_TEXT", "调配、延期、拆分、增援或停止接单", "部门负责人", "发现容量风险当天", required="否", dashboard="是"),
            f("证据/说明", "FIELD_TYPE_TEXT", "请假、驻场、专项任务或能力限制说明", "人员本人", "发生变化当天", required="否"),
            f("最后更新时间", "FIELD_TYPE_DATE_TIME", "容量最后更新时间", "系统/PMO", "每次更新时", source="系统生成"),
        ],
    },
    {
        "title": "06-验收回款",
        "object": "验收/回款条件",
        "purpose": "管理上线后的验收闭环和回款条件，区分交付责任与财务责任。",
        "fields": [
            f("验收记录ID", "FIELD_TYPE_TEXT", "验收节点唯一编号", "PMO", "验收计划建立时"),
            f("项目ID", "FIELD_TYPE_TEXT", "关联项目", "项目负责人", "验收计划建立时", dashboard="是"),
            f("验收类型", "FIELD_TYPE_SINGLE_SELECT", "阶段/上线/初验/终验", "项目负责人", "验收计划建立时"),
            f("验收范围", "FIELD_TYPE_TEXT", "本次验收覆盖的系统、设备和服务", "项目负责人", "验收计划建立时"),
            f("计划验收", "FIELD_TYPE_DATE_TIME", "基准验收日期", "项目负责人", "启动会或变更批准后", dashboard="是"),
            f("预测验收", "FIELD_TYPE_DATE_TIME", "当前预计验收日期", "项目负责人", "每周一；偏差当天", dashboard="是"),
            f("实际验收", "FIELD_TYPE_DATE_TIME", "客户签署或系统确认日期", "项目负责人", "验收当天", required="否", dashboard="是"),
            f("验收状态", "FIELD_TYPE_SINGLE_SELECT", "未准备/准备中/已就绪/待客户/已验收/驳回", "项目负责人", "状态变化当天", dashboard="是"),
            f("一次通过", "FIELD_TYPE_CHECKBOX", "首次正式验收是否通过", "项目负责人", "验收当天", required="否", dashboard="是"),
            f("未完成项", "FIELD_TYPE_TEXT", "影响验收的剩余事项", "项目负责人", "每次验收准备复核时", required="否", dashboard="是"),
            f("交付负责人", "FIELD_TYPE_TEXT", "达成验收条件的主责人", "部门负责人", "验收计划建立时"),
            f("客户确认人/角色", "FIELD_TYPE_TEXT", "客户侧确认角色，不记录敏感个人信息", "项目负责人", "验收前"),
            f("验收证据", "FIELD_TYPE_URL", "验收单、会议纪要或系统证据", "项目负责人", "验收当天", required="否", quality="已验收必须有证据"),
            f("回款条件状态", "FIELD_TYPE_SINGLE_SELECT", "未满足/部分满足/已满足/不涉及", "销售负责人", "验收节点后1个工作日", dashboard="是"),
            f("回款触发金额", "FIELD_TYPE_CURRENCY", "该节点可触发的合同金额", "销售/财务", "合同拆解或验收后", required="否", quality="以合同和财务口径为准", dashboard="是"),
            f("应回日期", "FIELD_TYPE_DATE_TIME", "合同约定应回款日期", "销售/财务", "合同拆解时", required="否", dashboard="是"),
            f("实际回款金额", "FIELD_TYPE_CURRENCY", "财务确认的实际回款", "财务", "到账后1个工作日", required="否", quality="仅财务确认", dashboard="是"),
            f("回款确认人", "FIELD_TYPE_TEXT", "确认财务事实的角色", "财务", "到账后1个工作日", required="否"),
            f("移交状态", "FIELD_TYPE_SINGLE_SELECT", "未移交/移交中/已移交售后", "项目负责人", "验收或运维接管当天", dashboard="是"),
            f("售后起始日", "FIELD_TYPE_DATE_TIME", "售后责任起始日期", "售后责任人", "移交当天", required="否"),
            f("最后更新时间", "FIELD_TYPE_DATE_TIME", "验收回款记录最后更新时间", "系统/PMO", "每次更新时", source="系统生成"),
        ],
    },
    {
        "title": "07-产品复用售后",
        "object": "产品反馈/售后问题/复用资产",
        "purpose": "把项目需求和售后问题转化为标准产品、配置能力和可复用交付资产。",
        "fields": [
            f("反馈ID", "FIELD_TYPE_TEXT", "反馈或资产唯一编号", "PMO", "登记时"),
            f("项目ID", "FIELD_TYPE_TEXT", "来源项目", "登记人", "登记时", dashboard="是"),
            f("来源类型", "FIELD_TYPE_SINGLE_SELECT", "需求/缺陷/售后/复盘/客户建议", "登记人", "登记时"),
            f("需求/问题", "FIELD_TYPE_TEXT", "真实问题或共性需求", "登记人", "发现当天", dashboard="是"),
            f("使用场景", "FIELD_TYPE_TEXT", "谁在什么场景遇到什么问题", "登记人", "登记当天"),
            f("分类", "FIELD_TYPE_SINGLE_SELECT", "标准/配置/定制/拒绝/缺陷", "产品负责人", "评审后1个工作日", dashboard="是"),
            f("发生次数", "FIELD_TYPE_NUMBER", "跨项目或重复发生次数", "PMO", "发现重复时", dashboard="是"),
            f("影响等级", "FIELD_TYPE_SINGLE_SELECT", "高/中/低", "产品负责人", "评审时", dashboard="是"),
            f("临时方案", "FIELD_TYPE_TEXT", "当前项目如何解决", "项目负责人", "处理当天", required="否"),
            f("产品负责人", "FIELD_TYPE_TEXT", "产品判断和长期方案主责", "产品部门负责人", "评审分派时"),
            f("处理结论", "FIELD_TYPE_TEXT", "产品化、配置化、一次性处理或拒绝原因", "产品负责人", "评审完成时", dashboard="是"),
            f("计划版本", "FIELD_TYPE_TEXT", "如进入产品，预计版本或时间", "产品负责人", "排期确认时", required="否"),
            f("标准资产类型", "FIELD_TYPE_SINGLE_SELECT", "模板/配置/接口/脚本/手册/视频/检查表/案例", "项目负责人", "复盘时", required="否", dashboard="是"),
            f("资产链接", "FIELD_TYPE_URL", "已沉淀资产入口", "项目负责人", "资产完成当天", required="否", dashboard="是"),
            f("售后SLA", "FIELD_TYPE_TEXT", "响应和解决时限", "售后责任人", "售后问题登记时", required="否"),
            f("状态", "FIELD_TYPE_SINGLE_SELECT", "待评审/处理中/待版本/已关闭/不处理", "产品/售后负责人", "状态变化当天", dashboard="是"),
            f("是否复发", "FIELD_TYPE_CHECKBOX", "关闭后是否再次发生", "售后责任人", "复发当天", dashboard="是"),
            f("复盘日期", "FIELD_TYPE_DATE_TIME", "完成复盘的日期", "项目负责人", "项目关闭后5个工作日内", required="否"),
            f("证据", "FIELD_TYPE_URL", "工单、截图、版本或资产证据", "登记人", "关闭或沉淀时", required="否"),
            f("最后更新时间", "FIELD_TYPE_DATE_TIME", "记录最后更新时间", "系统/PMO", "每次更新时", source="系统生成"),
        ],
    },
]


FIELD_MATRIX_FIELDS = [
    f("子表", "FIELD_TYPE_TEXT", "字段所在子表", "PMO", "模型发布时"),
    f("管理对象", "FIELD_TYPE_TEXT", "项目、任务、风险、容量等对象", "PMO", "模型发布时"),
    f("字段", "FIELD_TYPE_TEXT", "字段名称", "PMO", "模型发布时"),
    f("字段类型", "FIELD_TYPE_TEXT", "企微智能表格字段类型", "PMO", "模型发布时"),
    f("定义", "FIELD_TYPE_TEXT", "字段业务定义", "PMO", "模型发布时"),
    f("填写责任人", "FIELD_TYPE_TEXT", "对字段真实性负责的角色", "部门负责人", "模型发布时"),
    f("填写时间", "FIELD_TYPE_TEXT", "固定节奏或事件触发点", "PMO", "模型发布时"),
    f("必填", "FIELD_TYPE_SINGLE_SELECT", "是否必填", "PMO", "模型发布时"),
    f("更新触发", "FIELD_TYPE_TEXT", "什么情况必须更新", "PMO", "模型发布时"),
    f("数据来源", "FIELD_TYPE_TEXT", "人工、系统或其他子表", "PMO", "模型发布时"),
    f("质量规则", "FIELD_TYPE_TEXT", "字段质量门禁", "PMO", "模型发布时"),
    f("领导大屏", "FIELD_TYPE_SINGLE_SELECT", "是否进入领导大屏或其计算", "PMO", "模型发布时"),
]

STATE_FIELDS = [
    f("字典类型", "FIELD_TYPE_TEXT", "阶段、状态、分类或健康灯", "PMO", "字典建立时"),
    f("编码", "FIELD_TYPE_TEXT", "稳定编码", "PMO", "字典建立时"),
    f("名称", "FIELD_TYPE_TEXT", "界面展示名称", "PMO", "字典建立时"),
    f("定义", "FIELD_TYPE_TEXT", "何时使用该值", "PMO", "字典建立时"),
    f("进入条件", "FIELD_TYPE_TEXT", "进入该状态的前提", "PMO", "字典建立时"),
    f("退出条件", "FIELD_TYPE_TEXT", "退出该状态的完成门禁", "PMO", "字典建立时"),
    f("责任角色", "FIELD_TYPE_TEXT", "确认状态的角色", "部门负责人", "字典建立时"),
    f("大屏颜色", "FIELD_TYPE_TEXT", "建议显示颜色", "PMO", "大屏设计时"),
]

SHEETS.extend([
    {"title": "08-字段责任矩阵", "object": "字段治理", "purpose": "逐字段说明谁填、何时填、从哪里来以及质量门禁。", "fields": FIELD_MATRIX_FIELDS},
    {"title": "09-状态字典", "object": "状态治理", "purpose": "统一阶段、状态、健康灯和需求分类口径。", "fields": STATE_FIELDS},
])


USAGE_RULES = [
    ["RULE-01", "唯一事实源", "同一项目事实只在对应主表维护一次；周报、大屏和个人视图均从主表聚合。", "PMO", "持续", "禁止重复抄表", "项目ID和来源链接"],
    ["RULE-02", "项目建立", "售前转交付通过后由PMO创建项目ID，未完成范围、时间、验收和责任确认不得进入正式执行。", "PMO/项目负责人", "事件触发", "启动门禁通过", "启动会纪要/交付启动书"],
    ["RULE-03", "任务契约", "每项任务必须有主责人、截止时间、交付物、完成标准和证据要求。", "项目负责人", "任务创建时", "五要素齐全", "任务记录"],
    ["RULE-04", "每日更新", "任务主责人在工作结束前更新状态、进度、下一动作；发生阻塞时立即更新。", "任务主责人", "每日/事件触发", "状态与事实一致", "证据链接"],
    ["RULE-05", "周预测", "项目负责人每周一更新预测上线、预测验收、下一里程碑和健康灯。", "项目负责人", "每周一", "预测可解释", "项目总表"],
    ["RULE-06", "周收口", "PMO每周五复核进度、人天、容量、风险和数据完整性，生成领导周看板。", "PMO", "每周五", "数据质量检查通过", "领导驾驶舱"],
    ["RULE-07", "红灯升级", "红灯项目、重大问题和跨部门阻塞当天升级；必须写清影响、方案、决策人和截止时间。", "部门负责人", "事件触发", "形成可决策材料", "风险问题变更表"],
    ["RULE-08", "变更控制", "范围、上线日期、验收日期和预算人天变化必须形成变更记录，批准后才能修改项目基线。", "项目负责人", "事件触发", "变更前后基线和确认齐全", "变更记录/客户确认"],
    ["RULE-09", "完成证据", "没有链接、截图、验收、日志或系统状态等证据的任务不得标记为已完成。", "任务主责人", "任务完成时", "证据可回读", "证据链接"],
    ["RULE-10", "验收回款边界", "交付负责达成验收条件；销售负责商务与催收；财务负责到账事实。", "交付/销售/财务", "验收与回款事件", "责任不混淆", "验收与财务证据"],
    ["RULE-11", "产品复用", "项目结束后5个工作日内完成复盘，将需求判定为标准、配置、定制、拒绝或缺陷。", "项目负责人/产品负责人", "项目关闭后", "至少形成结论或资产", "复盘与资产链接"],
    ["RULE-12", "Agent边界", "Agent可整理、计算、提醒和生成周报；合同、金额、客户验收、生产上线、设备和支付相关动作必须人工确认。", "部门负责人", "持续", "人工门禁保留", "操作日志"],
]


METRICS = [
    ["KPI-01", "本月计划验收项目数", "兑现", "本月需要兑现多少项目", "计划验收日在本月且未取消的项目数", "COUNT(计划验收日在本月)", "06-验收回款", "计划验收,验收状态", "PMO", "每日；周五锁定", "指标卡", "—", "—", "校准本月资源和客户沟通", "B"],
    ["KPI-02", "本月预计按期验收项目数", "兑现", "本月承诺能兑现多少", "预测验收不晚于计划验收且本月计划验收的项目数", "COUNT(预测验收<=计划验收)", "06-验收回款", "计划验收,预测验收", "项目负责人/PMO", "每日", "指标卡", "逾期项目进入红灯", "存在偏差进入黄灯", "逐项目制定追回计划", "B"],
    ["KPI-03", "验收准时预测率", "进度", "交付是否可预测", "预计按期验收项目数/本月计划验收项目数", "KPI-02/KPI-01", "06-验收回款", "计划验收,预测验收", "PMO", "每日", "仪表/趋势", "试运行后定阈值", "试运行后定阈值", "调整优先级和资源", "B"],
    ["KPI-04", "本月实际验收项目数", "兑现", "已经真正完成多少", "实际验收日在本月且有验收证据的项目数", "COUNT(实际验收日在本月 AND 验收证据非空)", "06-验收回款", "实际验收,验收证据", "项目负责人/PMO", "每日", "指标卡", "—", "—", "核对计划差距", "A/B"],
    ["KPI-05", "回款条件达成金额", "经营", "交付为回款创造了多少条件", "回款条件状态为已满足的触发金额合计", "SUM(回款触发金额 WHERE 状态=已满足)", "06-验收回款", "回款条件状态,回款触发金额", "销售/财务", "每日", "指标卡", "金额不一致立即红灯", "资料不齐黄灯", "销售和财务确认", "A"],
    ["KPI-06", "红色项目数", "风险", "当前最危险的项目有多少", "项目健康灯为红的在手项目数", "COUNT(健康灯=红)", "02-项目组合总表", "健康灯,项目状态", "部门负责人", "实时", "指标卡+清单", "红色项目即触发", "—", "当天形成领导决策项", "B"],
    ["KPI-07", "逾期关键里程碑数", "进度", "哪些关键节点已经失守", "P0/P1且计划完成已过、未完成的任务数", "COUNT(P0/P1 AND 计划完成<TODAY AND 状态!=已完成)", "03-里程碑任务", "任务级别,计划完成,状态", "PMO", "每日", "柱状图+明细", "存在P0逾期", "存在P1逾期", "项目负责人提交追回计划", "B"],
    ["KPI-08", "待领导决策事项数", "决策", "有哪些事情必须由领导拍板", "状态为待决策且未超过决策截止的事项数", "COUNT(状态=待决策)", "04-风险问题变更", "状态,领导决策项,决策截止", "部门负责人", "实时", "决策清单", "超过决策截止", "临近截止", "会议只讨论此清单", "B"],
    ["KPI-09", "一次验收通过率", "质量", "交付质量是否稳定", "首次正式验收通过的记录数/已完成正式验收记录数", "SUM(一次通过)/COUNT(已验收)", "06-验收回款", "一次通过,验收状态", "项目负责人/PMO", "月度", "趋势图", "试运行后定阈值", "试运行后定阈值", "分析驳回原因", "A/B"],
    ["KPI-10", "重大未关闭问题数", "质量", "是否存在客户生产风险", "严重度为重大或高且未关闭的问题数", "COUNT(严重度 IN 重大/高 AND 状态!=已关闭)", "04-风险问题变更", "严重度,状态", "技术负责人", "实时", "指标卡+清单", "重大问题未关闭", "高严重问题未关闭", "启动专项处置", "B"],
    ["KPI-11", "项目人天偏差率", "成本", "交付成本是否失控", "在手项目实际人天相对预算人天的偏差", "(实际人天-预算人天)/预算人天", "02-项目组合总表", "预算人天,实际人天", "部门负责人/PMO", "周度", "散点/柱状图", "试运行后定阈值", "试运行后定阈值", "复核范围与资源", "B/D"],
    ["KPI-12", "标准模块复用率", "复用", "项目是否正在变成产品能力", "标准与配置工作量/总交付工作量", "(标准点数+配置点数)/总点数", "07-产品复用售后", "分类,发生次数", "产品负责人", "月度", "趋势+堆叠", "试运行后定阈值", "试运行后定阈值", "提升标准包覆盖", "B/D"],
    ["KPI-13", "定制化比例", "范围", "项目是否被定制拖累", "定制工作量/总交付工作量", "定制点数/总点数", "02-项目组合总表", "定制化比例", "产品负责人", "周度", "项目对比条", "试运行后定阈值", "试运行后定阈值", "变更评审或商业确认", "B/D"],
    ["KPI-14", "未来两周超负荷人数", "容量", "团队是否还能接新项目", "未来两周容量风险为超载的人数", "COUNT(容量风险=超载)", "05-人员容量", "负荷率,容量风险", "部门负责人/PMO", "每日", "热力图+指标卡", "存在超载人员", "存在偏高人员", "调配、拆分或延期", "B"],
    ["KPI-15", "重复问题数", "复用", "交付是否在重复踩坑", "发生次数大于1或是否复发为真的未关闭记录数", "COUNT(发生次数>1 OR 是否复发=true)", "07-产品复用售后", "发生次数,是否复发,状态", "产品/售后负责人", "周度", "问题Top榜", "重大问题复发", "一般问题重复", "形成产品或标准资产", "B"],
]


STATES = [
    ["项目阶段", "S1", "项目准备", "完成售前转交付与项目启动", "合同/立项及负责人已明确", "范围、时间、验收、责任基线完成", "项目负责人", "蓝"],
    ["项目阶段", "S2", "方案与部署准备", "完成技术方案、环境和资源准备", "启动门禁通过", "部署条件和方案评审通过", "技术负责人", "蓝"],
    ["项目阶段", "S3", "数据与接口准备", "完成人员、账户、组织、接口等准备", "数据模板和接口清单确定", "数据校验与接口准备完成", "项目负责人", "蓝"],
    ["项目阶段", "S4", "设备安装联调", "完成设备到货、安装和通讯联调", "设备清单和现场条件确认", "设备联调证据完成", "实施/技术负责人", "蓝"],
    ["项目阶段", "S5", "系统联调与培训", "完成端到端测试、培训和上线准备", "软件、数据、接口、设备可用", "上线检查表通过", "项目负责人", "蓝"],
    ["项目阶段", "S6", "上线试运行", "真实场景运行并关闭上线问题", "上线审批和回退方案确认", "试运行门禁通过", "项目负责人", "橙"],
    ["项目阶段", "S7", "验收与移交", "完成验收、资料和售后移交", "验收条件就绪", "验收证据和移交记录齐全", "项目负责人", "绿"],
    ["健康灯", "G", "绿", "按计划推进，无重大阻塞", "预测日期不晚于基线", "出现偏差或风险则转黄/红", "项目负责人", "绿"],
    ["健康灯", "Y", "黄", "已出现偏差但有明确追回方案", "存在可控偏差", "偏差解除转绿；失控转红", "项目负责人", "黄"],
    ["健康灯", "R", "红", "里程碑、客户、质量、范围或资源已严重影响兑现", "重大阻塞或关键节点失守", "领导决策和关闭证据完成", "部门负责人", "红"],
    ["任务状态", "T0", "未开始", "尚未开始执行", "任务契约齐全", "开始工作转进行中", "任务主责人", "灰"],
    ["任务状态", "T1", "进行中", "任务正在执行", "已开始且无不可控阻塞", "完成、受阻或待确认", "任务主责人", "蓝"],
    ["任务状态", "T2", "受阻", "无法继续，需要外部动作", "阻塞说明和下一动作已填", "阻塞解除", "任务主责人", "红"],
    ["任务状态", "T3", "待确认", "交付物已提交，等待确认", "证据和完成标准已满足", "确认后完成或退回", "项目负责人", "黄"],
    ["任务状态", "T4", "已完成", "完成标准已验证", "实际完成日和证据非空", "无需退出；变更需重开", "项目负责人", "绿"],
    ["反馈分类", "P1", "标准", "标准产品直接支持", "无需定制开发", "纳入复用统计", "产品负责人", "绿"],
    ["反馈分类", "P2", "配置", "通过参数和配置满足", "无需改核心代码", "沉淀配置模板", "产品负责人", "蓝"],
    ["反馈分类", "P3", "定制", "仅针对特定客户开发", "完成商业与变更审批", "交付后评估是否产品化", "产品负责人", "橙"],
    ["反馈分类", "P4", "拒绝", "不符合产品或合同边界", "给出拒绝理由和替代方案", "客户/销售确认", "产品负责人", "灰"],
    ["反馈分类", "P5", "缺陷", "标准能力未按设计工作", "复现和影响确认", "修复验证并关闭", "技术/产品负责人", "红"],
]


ROLE_ROWS = [
    ["部门负责人", "项目组合结果、资源、重大风险和部门经营", "项目优先级、难度、资源分配、红灯升级、绩效校准", "部门准时兑现、成本、质量和复用", "不代替项目负责人逐项填任务"],
    ["PMO/交付运营", "统一事实源和管理节奏", "项目建档、字段质量、周预测、容量汇总、大屏发布", "数据真实、口径一致、报告准时", "不替业务负责人编造状态"],
    ["项目负责人", "单项目最终结果", "范围、计划、客户协同、预测、风险、验收和复盘", "按范围、时间、质量、成本交付", "不能把责任拆散给多人"],
    ["任务主责人/实施工程师", "被分配任务结果", "执行、更新、证据、阻塞、工时和下一动作", "任务按完成标准关闭", "不能只报百分比不留证据"],
    ["技术负责人", "技术可行性和重大技术风险", "方案、接口、部署、设备、生产门禁、疑难问题", "技术方案可落地且风险提前暴露", "生产和高风险动作必须人审"],
    ["产品负责人", "标准产品边界和复用", "需求分类、定制判断、版本结论、标准资产", "复用率提升、重复定制下降", "不以单一客户要求替代产品判断"],
    ["销售负责人", "商务承诺、客户关系和催收", "转交付资料、合同节点、客户商务协调、回款推进", "承诺可交付、回款推进", "不单方面改变交付范围和日期"],
    ["财务", "金额和到账事实", "回款触发金额、应回日期和实际到账确认", "经营数据准确", "不负责项目交付判断"],
    ["售后责任人", "上线后的服务闭环", "问题受理、SLA、复发识别和移交反馈", "问题按时关闭、复发下降", "不把产品缺陷长期当人工服务"],
]


def matrix_rows():
    rows = []
    for sheet in SHEETS[:8]:
        for field in sheet["fields"]:
            rows.append([
                sheet["title"], sheet["object"], field["name"], field["type"], field["definition"],
                field["owner"], field["timing"], field["required"], field["trigger"], field["source"],
                field["quality"], field["dashboard"],
            ])
    return rows


def write_csv(name, headers, rows):
    with (ROOT / name).open("w", newline="", encoding="utf-8-sig") as handle:
        writer = csv.writer(handle)
        writer.writerow(headers)
        writer.writerows(rows)


def text_value(value):
    return [{"type": "text", "text": str(value)}]


def to_record(fields, row):
    values = {}
    for field, value in zip(fields, row):
        kind = field["type"]
        if value in (None, ""):
            continue
        if kind == "FIELD_TYPE_SINGLE_SELECT":
            values[field["name"]] = [{"text": str(value)}]
        elif kind in {"FIELD_TYPE_NUMBER", "FIELD_TYPE_CURRENCY", "FIELD_TYPE_PERCENTAGE", "FIELD_TYPE_PROGRESS"}:
            values[field["name"]] = float(value)
        elif kind == "FIELD_TYPE_CHECKBOX":
            values[field["name"]] = bool(value)
        elif kind == "FIELD_TYPE_DATE_TIME":
            values[field["name"]] = str(value)
        elif kind == "FIELD_TYPE_URL":
            values[field["name"]] = [{"type": "url", "text": "打开", "link": str(value)}]
        else:
            values[field["name"]] = text_value(value)
    return {"values": values}


def build_schema():
    field_rows = matrix_rows()
    schema = {"title": "交付实施部-经营与项目管控体系-Agent模板-20260806", "sheets": []}
    records_by_title = {
        "00-使用说明": USAGE_RULES,
        "01-领导指标字典": METRICS,
        "08-字段责任矩阵": field_rows,
        "09-状态字典": STATES,
    }
    for sheet in SHEETS:
        rows = records_by_title.get(sheet["title"], [])
        schema["sheets"].append({
            "title": sheet["title"],
            "purpose": sheet["purpose"],
            "fields": [{"field_title": x["name"], "field_type": x["type"]} for x in sheet["fields"]],
            "records": [to_record(sheet["fields"], row) for row in rows],
        })
    (ROOT / "wecom-workbook-schema.json").write_text(json.dumps(schema, ensure_ascii=False, indent=2), encoding="utf-8")


def online_url():
    if not ONLINE_META.exists():
        return "待企微 Agent 创建"
    try:
        return json.loads(ONLINE_META.read_text(encoding="utf-8")).get("url", "待企微 Agent 创建")
    except Exception:
        return "待企微 Agent 创建"


def build_markdown():
    url = online_url()
    lines = [
        "# 交付实施部经营与项目管控体系 V1.0",
        "",
        "- 文档状态：内部管理设计稿，可直接进入试运行",
        "- 适用范围：交付实施部、售前转交付、实施、验收、售后与产品复用",
        "- 证据边界：本体系是管理设计（D级假设），指标目标值需运行一个月后基于基线确认",
        f"- 企业微信在线工作簿：{url}",
        "",
        "> 部门使命：把销售和售前形成的客户承诺，转化为按范围、按时间、按质量、按成本完成上线、验收和移交的客户结果，并把项目经验沉淀为可复用的产品和交付能力。",
        "",
        "## 1. 部门结果与成功标准",
        "",
        "交付实施部不是工作量统计部门，而是承诺兑现中心、项目风险控制中心、验收与回款支撑中心、产品验证与复用中心。领导评价部门时，应优先看兑现、进度、质量、范围、成本、容量和复用，不以项目总数、记录数或人员饼图代替结果。",
        "",
        "### 1.1 四类部门结果",
        "",
        "1. 客户结果：系统和设备可用，客户知道何时完成、需要配合什么，问题有人负责并按时闭环。",
        "2. 项目结果：范围、里程碑、责任、风险、成本和验收证据可预测、可追溯。",
        "3. 经营结果：已签项目尽快转化为验收和回款条件，减少延期、返工和无限定制。",
        "4. 组织结果：每个项目沉淀标准配置、接口、脚本、手册、视频、检查表或产品改进。",
        "",
        "### 1.2 成功判断",
        "",
        "部门成功意味着：客户知道什么时候能完成；员工知道下一步做什么；领导知道哪些承诺能兑现、哪些需要决策；事业部知道交付成本是否可控、能力是否可复制。目标值不在首版拍脑袋设定，先运行一个月形成基线。",
        "",
        "## 2. 角色与责任",
        "",
        "| 角色 | 核心定位 | 必须完成的工作 | 对什么结果负责 | 边界 |",
        "|---|---|---|---|---|",
    ]
    for row in ROLE_ROWS:
        lines.append("| " + " | ".join(row) + " |")
    lines += [
        "",
        "## 3. 七阶段交付闭环",
        "",
        "1. 项目准备：完成售前转交付、项目ID、范围、时间、验收、责任和客户配合基线。",
        "2. 方案与部署准备：完成技术方案、部署环境、网络、电源和资源确认。",
        "3. 数据与接口准备：完成人员、组织、账户、余额、菜品、接口和迁移校验。",
        "4. 设备安装联调：完成到货、安装、网络通讯、设备联动和现场证据。",
        "5. 系统联调与培训：完成端到端测试、客户培训和上线检查。",
        "6. 上线试运行：真实业务运行，关闭阻断问题，保留回退和运行证据。",
        "7. 验收与移交：完成验收、资料、售后移交、回款条件确认和项目复盘。",
        "",
        "## 4. 统一在线工作簿",
        "",
        "原则：员工只维护底层事实一次；个人视图、周报和领导大屏均从同一工作簿聚合。",
        "",
        "| 子表 | 管理对象 | 用途 | 主要填写人 | 填写节奏 |",
        "|---|---|---|---|---|",
    ]
    for sheet in SHEETS:
        owners = "、".join(dict.fromkeys(x["owner"] for x in sheet["fields"]))
        timings = "；".join(dict.fromkeys(x["timing"] for x in sheet["fields"]))
        if len(timings) > 90:
            timings = timings[:88] + "…"
        lines.append(f"| {sheet['title']} | {sheet['object']} | {sheet['purpose']} | {owners} | {timings} |")
    lines += [
        "",
        "## 5. 填报节奏",
        "",
        "- 售前转交付当天：PMO建立项目ID；销售补合同/立项、客户、承诺和商务节点；部门负责人分配交付及技术负责人。",
        "- 启动会后1个工作日：项目负责人冻结范围、计划上线、计划验收、验收标准和客户配合项。",
        "- 任务创建时：项目负责人补齐主责人、截止时间、交付物、完成标准和证据要求；五项缺一不得开工。",
        "- 每个工作日结束前：任务主责人更新状态、进度、工时、阻塞和下一动作；红灯或重大阻塞立即升级。",
        "- 每周一：项目负责人更新预测上线、预测验收、下一里程碑和健康灯。",
        "- 每周五：PMO复核项目、人天、容量、风险、验收和数据完整性，发布领导周看板。",
        "- 验收/回款事件后1个工作日：项目负责人更新验收证据，销售和财务分别确认回款条件与到账事实。",
        "- 项目关闭后5个工作日：项目负责人和产品负责人完成复盘、需求分类和标准资产沉淀。",
        "",
        "## 6. 领导大屏",
        "",
        "领导首页只展示能够触发决策的数据，不展示没有行动意义的录入条数。",
        "",
        "### 6.1 首屏六项",
        "",
        "1. 本月计划验收项目数。",
        "2. 本月预计按期验收项目数和验收准时预测率。",
        "3. 回款条件达成金额。",
        "4. 红色项目数和逾期关键里程碑数。",
        "5. 未来两周超负荷人数。",
        "6. 标准模块复用率与定制化比例。",
        "",
        "### 6.2 主体区域",
        "",
        "- 项目健康矩阵：项目、阶段、计划验收、预测验收、偏差、健康灯、下一动作。",
        "- 领导决策清单：事项、影响、建议方案、决策人、最晚决策时间。",
        "- 进度与质量：逾期关键里程碑、一次验收通过率、重大未关闭问题。",
        "- 成本与容量：项目人天偏差、人员负荷热力图、未来两周可接单能力。",
        "- 产品与复用：标准/配置/定制分布、重复问题Top、标准资产沉淀。",
        "",
        "## 7. 数据质量与人工门禁",
        "",
        "- 无项目ID不允许跨表流转；无主责人、截止时间、交付物、完成标准和证据要求的任务不得进入执行。",
        "- 无证据不得标记已完成；已验收必须关联验收证据；金额只以合同和财务确认数据为准。",
        "- Agent可以整理、汇总、计算、提醒和生成周报；合同承诺、金额、客户验收、生产上线、支付、设备控制和食安相关动作必须人工确认。",
        "- 大屏每个指标必须能够回钻到项目、任务、风险或验收记录。",
        "",
        "## 8. 四周试运行",
        "",
        "1. 第1周：选4个在手项目，建立项目主数据、七阶段里程碑和风险台账。",
        "2. 第2周：启用每日任务更新、周一预测和周五数据复核。",
        "3. 第3周：启用人员容量、验收回款条件和产品复用分类。",
        "4. 第4周：用实际数据校准红黄灯、人天偏差、复用率和部门绩效目标。",
        "",
        "## 附录",
        "",
        "完整逐字段责任矩阵见 `field-responsibility-matrix.csv` 和企微在线工作簿 `08-字段责任矩阵`；领导指标完整口径见 `leadership-dashboard-metrics.csv` 和 `01-领导指标字典`。",
    ]
    (ROOT / "delivery-implementation-department-operating-system.md").write_text("\n".join(lines) + "\n", encoding="utf-8")


def esc(value):
    return html.escape(str(value))


def build_html():
    url = online_url()
    field_rows = matrix_rows()
    kpi_cards = METRICS[:6]
    role_cards = "".join(f"<article><h3>{esc(r[0])}</h3><p>{esc(r[1])}</p><small>{esc(r[3])}</small></article>" for r in ROLE_ROWS)
    sheet_rows = "".join(f"<tr><td>{esc(s['title'])}</td><td>{esc(s['object'])}</td><td>{esc(s['purpose'])}</td><td>{len(s['fields'])}</td></tr>" for s in SHEETS)
    metric_rows = "".join(f"<tr><td>{esc(r[0])}</td><td>{esc(r[1])}</td><td>{esc(r[3])}</td><td>{esc(r[4])}</td><td>{esc(r[8])}</td><td>{esc(r[9])}</td><td>{esc(r[10])}</td></tr>" for r in METRICS)
    matrix_html = "".join(
        f"<tr><td>{esc(r[0])}</td><td>{esc(r[2])}</td><td>{esc(r[4])}</td><td>{esc(r[5])}</td><td>{esc(r[6])}</td><td>{esc(r[10])}</td><td><span class='pill {'yes' if r[11]=='是' else ''}'>{esc(r[11])}</span></td></tr>"
        for r in field_rows
    )
    cards = "".join(f"<div class='kpi'><span>{esc(r[2])}</span><strong>—</strong><b>{esc(r[1])}</b><small>来源：{esc(r[6])}</small></div>" for r in kpi_cards)
    html_doc = f"""<!doctype html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>交付实施部经营与项目管控体系 V1.0</title>
<style>
:root{{--ink:#102a2d;--muted:#647579;--line:#dfe8e7;--paper:#f5f8f7;--card:#fff;--accent:#147d76;--accent2:#0d5f69;--warn:#d89b2b;--bad:#bf4f4f;--soft:#e8f3f1}}
*{{box-sizing:border-box}}body{{margin:0;background:var(--paper);color:var(--ink);font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;line-height:1.65}}
.wrap{{max-width:1440px;margin:auto;padding:28px}}header{{background:linear-gradient(135deg,#103d43,#176f70);color:#fff;border-radius:24px;padding:48px;box-shadow:0 18px 50px rgba(16,61,67,.16)}}
header .eyebrow{{letter-spacing:.14em;font-size:13px;opacity:.76}}h1{{font-size:42px;line-height:1.18;margin:12px 0}}header p{{max-width:900px;font-size:18px;margin:0;opacity:.9}}header a{{display:inline-block;margin-top:22px;color:#fff;text-decoration:none;border:1px solid rgba(255,255,255,.35);padding:10px 16px;border-radius:10px}}
section{{margin-top:28px;background:var(--card);border:1px solid var(--line);border-radius:20px;padding:30px}}h2{{margin:0 0 18px;font-size:25px}}h3{{margin:0 0 8px}}.lead{{font-size:24px;line-height:1.5;max-width:1100px}}.note{{padding:16px 18px;background:var(--soft);border-left:4px solid var(--accent);border-radius:12px}}
.grid4{{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}}.grid3{{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}}article{{border:1px solid var(--line);border-radius:16px;padding:18px;background:#fff}}article small,.muted{{color:var(--muted)}}
.dashboard{{background:#0c262b;color:#f5fbfa;padding:26px;border-radius:18px}}.dashboard-head{{display:flex;justify-content:space-between;gap:20px;align-items:end}}.dashboard-head small{{color:#a9c4c3}}.kpis{{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-top:20px}}.kpi{{background:#14383d;border:1px solid #285157;padding:15px;border-radius:14px;min-height:150px}}.kpi span,.kpi small{{display:block;color:#9ebcba;font-size:12px}}.kpi strong{{display:block;font-size:32px;color:#dff6f1;margin:8px 0}}.kpi b{{display:block;font-size:14px}}.dashboard-body{{display:grid;grid-template-columns:2fr 1fr;gap:12px;margin-top:12px}}.panel{{background:#12343a;border:1px solid #285157;border-radius:14px;padding:16px}}.rows div{{display:grid;grid-template-columns:1.4fr .8fr .8fr .7fr .7fr;gap:8px;padding:10px 0;border-bottom:1px solid #274b50;color:#c8dcda;font-size:13px}}.decision li{{margin:10px 0;color:#d8e7e5}}
table{{width:100%;border-collapse:separate;border-spacing:0;font-size:13px}}th{{background:#eef4f3;color:#2c4a4c;text-align:left;position:sticky;top:0}}th,td{{padding:11px 12px;border-bottom:1px solid var(--line);vertical-align:top}}tbody tr:hover{{background:#f7fbfa}}.tablebox{{max-height:620px;overflow:auto;border:1px solid var(--line);border-radius:14px}}.pill{{padding:3px 7px;border-radius:99px;background:#edf1f1}}.pill.yes{{background:#dff3ed;color:#176d63}}
.toolbar{{display:flex;gap:10px;margin-bottom:12px}}input{{width:100%;padding:12px 14px;border:1px solid var(--line);border-radius:10px;font-size:14px}}footer{{padding:34px;color:var(--muted);text-align:center}}
@media(max-width:1000px){{.grid4,.grid3,.kpis{{grid-template-columns:repeat(2,1fr)}}.dashboard-body{{grid-template-columns:1fr}}h1{{font-size:32px}}}}@media(max-width:640px){{.wrap{{padding:14px}}header,section{{padding:22px}}.grid4,.grid3,.kpis{{grid-template-columns:1fr}}}}
</style></head><body><div class="wrap">
<header><div class="eyebrow">DELIVERY OPERATING SYSTEM · V1.0</div><h1>交付实施部经营与项目管控体系</h1><p>把销售承诺转化为按范围、按时间、按质量、按成本完成上线、验收和移交的客户结果，并把项目经验沉淀为可复用的产品和交付能力。</p><a href="{esc(url)}">打开企业微信在线工作簿</a></header>
<section><h2>部门真正交付什么</h2><p class="lead">看得清、交得成、收得回、能复用。</p><div class="grid4"><article><h3>客户结果</h3><p>系统设备可用，时间透明，问题闭环。</p></article><article><h3>项目结果</h3><p>范围、里程碑、责任、成本和证据可预测。</p></article><article><h3>经营结果</h3><p>项目转化为验收与回款条件，减少返工。</p></article><article><h3>组织结果</h3><p>形成标准配置、接口、脚本、手册和产品改进。</p></article></div></section>
<section><h2>角色责任卡</h2><div class="grid3">{role_cards}</div></section>
<section><h2>统一工作簿结构</h2><div class="note">只填一次：项目、任务、风险、容量、验收和复用是事实对象；周报与大屏从这些对象聚合。</div><div class="tablebox" style="margin-top:16px;max-height:none"><table><thead><tr><th>子表</th><th>对象</th><th>用途</th><th>字段数</th></tr></thead><tbody>{sheet_rows}</tbody></table></div></section>
<section><h2>领导驾驶舱蓝图</h2><div class="dashboard"><div class="dashboard-head"><div><b>交付实施部经营驾驶舱</b><small>结构演示，不含真实经营数据</small></div><small>周五锁定 · 重大变化实时刷新</small></div><div class="kpis">{cards}</div><div class="dashboard-body"><div class="panel"><b>项目健康矩阵</b><div class="rows"><div><span>项目</span><span>阶段</span><span>计划验收</span><span>预测偏差</span><span>健康灯</span></div><div><span>从项目组合总表读取</span><span>七阶段</span><span>日期</span><span>天数</span><span>绿/黄/红</span></div><div><span>点击后回钻任务与风险</span><span>—</span><span>—</span><span>—</span><span>—</span></div></div></div><div class="panel decision"><b>待领导决策</b><ol><li>只显示明确选项、建议和截止时间</li><li>红灯项目必须关联负责人和处理方案</li><li>会议只讨论需要判断和资源取舍的事项</li></ol></div></div></div></section>
<section><h2>领导指标口径</h2><div class="tablebox"><table><thead><tr><th>ID</th><th>指标</th><th>领导问题</th><th>定义</th><th>责任人</th><th>刷新</th><th>展示</th></tr></thead><tbody>{metric_rows}</tbody></table></div></section>
<section><h2>逐字段责任矩阵</h2><p class="muted">共 {len(field_rows)} 个业务字段。输入字段名、责任人或子表可筛选。</p><div class="toolbar"><input id="q" placeholder="例如：预测验收、项目负责人、风险"></div><div class="tablebox"><table id="matrix"><thead><tr><th>子表</th><th>字段</th><th>定义</th><th>谁填</th><th>什么时候填</th><th>质量规则</th><th>进大屏</th></tr></thead><tbody>{matrix_html}</tbody></table></div></section>
<section><h2>执行节奏</h2><div class="grid4"><article><h3>每天</h3><p>任务状态、进度、阻塞、工时和下一动作。</p></article><article><h3>每周一</h3><p>项目预测上线、预测验收、下一里程碑和健康灯。</p></article><article><h3>每周五</h3><p>PMO复核人天、容量、风险、验收和大屏。</p></article><article><h3>事件触发</h3><p>红灯、变更、验收、回款和复盘当天更新。</p></article></div></section>
<section><h2>Agent 与人工门禁</h2><p>Agent负责整理、汇总、计算、提醒和生成周报；合同、金额、客户验收、生产上线、支付、设备控制和食安相关动作必须由对应责任人确认。无证据不得自动标记完成。</p></section>
<footer>交付实施部经营与项目管控体系 V1.0 · 内部管理设计稿 · 2026-08-06</footer></div>
<script>const q=document.getElementById('q'),rows=[...document.querySelectorAll('#matrix tbody tr')];q.addEventListener('input',()=>{{const v=q.value.trim().toLowerCase();rows.forEach(r=>r.style.display=r.innerText.toLowerCase().includes(v)?'':'none')}});</script>
</body></html>"""
    (ROOT / "delivery-department-operating-system.html").write_text(html_doc, encoding="utf-8")


def set_cell_shading(cell, fill):
    tc_pr = cell._tc.get_or_add_tcPr()
    shd = tc_pr.find(qn("w:shd"))
    if shd is None:
        shd = OxmlElement("w:shd")
        tc_pr.append(shd)
    shd.set(qn("w:fill"), fill)


def set_cell_margins(cell, top=90, start=100, bottom=90, end=100):
    tc = cell._tc
    tc_pr = tc.get_or_add_tcPr()
    tc_mar = tc_pr.first_child_found_in("w:tcMar")
    if tc_mar is None:
        tc_mar = OxmlElement("w:tcMar")
        tc_pr.append(tc_mar)
    for margin, value in (("top", top), ("start", start), ("bottom", bottom), ("end", end)):
        node = tc_mar.find(qn(f"w:{margin}"))
        if node is None:
            node = OxmlElement(f"w:{margin}")
            tc_mar.append(node)
        node.set(qn("w:w"), str(value))
        node.set(qn("w:type"), "dxa")


def set_repeat_table_header(row):
    tr_pr = row._tr.get_or_add_trPr()
    tbl_header = OxmlElement("w:tblHeader")
    tbl_header.set(qn("w:val"), "true")
    tr_pr.append(tbl_header)


def set_font(run, size=10.5, bold=False, color="243B3D"):
    run.font.name = "Microsoft YaHei"
    run._element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
    run.font.size = Pt(size)
    run.bold = bold
    run.font.color.rgb = RGBColor.from_string(color)


def add_table(doc, headers, rows, widths=None, font_size=8.5):
    table = doc.add_table(rows=1, cols=len(headers))
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    table.autofit = False
    hdr = table.rows[0]
    set_repeat_table_header(hdr)
    for idx, name in enumerate(headers):
        cell = hdr.cells[idx]
        set_cell_shading(cell, "DCEBE8")
        set_cell_margins(cell)
        cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
        p = cell.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        set_font(p.add_run(str(name)), size=9, bold=True, color="164F50")
    for row_data in rows:
        row = table.add_row()
        for idx, value in enumerate(row_data):
            cell = row.cells[idx]
            set_cell_margins(cell)
            cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
            p = cell.paragraphs[0]
            p.paragraph_format.space_after = Pt(0)
            p.paragraph_format.line_spacing = 1.05
            if idx == 0 and len(headers) <= 5:
                p.alignment = WD_ALIGN_PARAGRAPH.CENTER
            set_font(p.add_run(str(value)), size=font_size, color="2A3C3E")
    if widths:
        for row in table.rows:
            for idx, width in enumerate(widths):
                row.cells[idx].width = Cm(width)
    doc.add_paragraph().paragraph_format.space_after = Pt(2)
    return table


def add_heading(doc, text, level=1):
    p = doc.add_heading(level=level)
    p.paragraph_format.space_before = Pt(10 if level == 1 else 6)
    p.paragraph_format.space_after = Pt(5)
    run = p.add_run(text)
    set_font(run, size=16 if level == 1 else 12, bold=True, color="176D69" if level == 1 else "234B4B")
    return p


def add_para(doc, text, bold_lead=None):
    p = doc.add_paragraph()
    p.paragraph_format.space_after = Pt(5)
    p.paragraph_format.line_spacing = 1.25
    if bold_lead and text.startswith(bold_lead):
        set_font(p.add_run(bold_lead), size=10.5, bold=True, color="176D69")
        set_font(p.add_run(text[len(bold_lead):]), size=10.5)
    else:
        set_font(p.add_run(text), size=10.5)
    return p


def add_bullet(doc, text):
    p = doc.add_paragraph(style="List Paragraph")
    p_pr = p._p.get_or_add_pPr()
    num_pr = p_pr.get_or_add_numPr()
    ilvl = OxmlElement("w:ilvl")
    ilvl.set(qn("w:val"), "0")
    num_id = OxmlElement("w:numId")
    num_id.set(qn("w:val"), "18")
    num_pr.append(ilvl)
    num_pr.append(num_id)
    p.paragraph_format.space_after = Pt(3)
    set_font(p.add_run(text), size=10.2)


def build_docx():
    if not STARTER.exists():
        STARTER.parent.mkdir(parents=True, exist_ok=True)
        subprocess.run(
            [sys.executable, str(PREPARE_TEMPLATE), str(KANGBITE_TEMPLATE), str(STARTER)],
            check=True,
        )
    doc = Document(STARTER)
    styles = doc.styles
    for style_name in ["Normal", "List Paragraph"]:
        style = styles[style_name]
        style.font.name = "Microsoft YaHei"
        style._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
        style.font.size = Pt(10.5)
    section = doc.sections[0]
    section.top_margin = Cm(2.54)
    section.bottom_margin = Cm(2.54)
    section.left_margin = Cm(3.175)
    section.right_margin = Cm(3.175)

    title = doc.paragraphs[0]
    title.alignment = WD_ALIGN_PARAGRAPH.LEFT
    title.paragraph_format.space_before = Pt(28)
    title.paragraph_format.space_after = Pt(8)
    set_font(title.add_run("交付实施部经营与项目管控体系"), size=24, bold=True, color="164F50")
    subtitle = doc.add_paragraph()
    subtitle.paragraph_format.space_after = Pt(18)
    set_font(subtitle.add_run("统一部门章程 · 字段责任 · 填报节奏 · 领导驾驶舱"), size=12, color="637A7B")
    meta = doc.add_paragraph()
    set_font(meta.add_run("版本 V1.0  |  2026-08-06  |  内部管理设计稿  |  D级管理假设，目标值待试运行校准"), size=9, color="6B7E7F")

    callout = doc.add_table(rows=1, cols=1)
    callout.alignment = WD_TABLE_ALIGNMENT.CENTER
    cell = callout.cell(0, 0)
    set_cell_shading(cell, "E8F3F1")
    set_cell_margins(cell, 180, 180, 180, 180)
    p = cell.paragraphs[0]
    set_font(p.add_run("部门使命："), size=11, bold=True, color="176D69")
    set_font(p.add_run("把销售和售前形成的客户承诺，转化为按范围、按时间、按质量、按成本完成上线、验收和移交的客户结果，并把项目经验沉淀为可复用的产品和交付能力。"), size=11)
    doc.add_paragraph()

    add_heading(doc, "一、部门结果与成功标准")
    add_para(doc, "交付实施部不是工作量统计部门，而是承诺兑现中心、项目风险控制中心、验收与回款支撑中心、产品验证与复用中心。项目总数、工作记录数和人员分布可以作为辅助信息，但不能替代兑现、质量、成本和复用结果。")
    add_table(doc, ["结果", "部门必须交付的结果", "领导判断问题"], [
        ["客户结果", "系统设备可用，时间透明，问题闭环，培训和移交完成", "客户是否能够正常使用并知道何时完成"],
        ["项目结果", "范围、里程碑、责任、风险、成本和证据可预测", "承诺是否能够按计划兑现"],
        ["经营结果", "项目转化为验收和回款条件，延期返工和定制受控", "交付是否支持收入和现金回收"],
        ["组织结果", "形成标准配置、接口、脚本、手册、视频和产品改进", "项目是否让下一次交付更快、更便宜"],
    ], widths=[2.2, 7.0, 4.1], font_size=9)
    add_para(doc, "成功定义：客户知道什么时候能完成；员工知道下一步做什么；领导知道哪些承诺能兑现、哪些需要决策；事业部知道交付成本是否可控、能力是否可复制。首版不拍脑袋设定阈值，先运行一个月形成基线。")

    add_heading(doc, "二、组织角色与责任")
    add_table(doc, ["角色", "核心定位", "必须完成的工作", "结果责任", "边界"], ROLE_ROWS, widths=[2.1, 2.7, 4.2, 3.0, 2.6], font_size=8.2)
    add_para(doc, "小团队可以一人兼多角色，但每个项目必须明确交付负责人、任务主责人、技术负责人和客户/商务接口，不能让责任随聊天和会议漂移。")

    doc.add_section(WD_SECTION.NEW_PAGE)
    add_heading(doc, "三、七阶段交付闭环")
    for row in STATES[:7]:
        add_para(doc, f"{row[1]} {row[2]}：{row[3]}。完成门禁：{row[5]}。", bold_lead=f"{row[1]} {row[2]}：")

    add_heading(doc, "四、统一在线工作簿")
    add_para(doc, "员工只维护底层事实一次；个人视图、项目周报和领导驾驶舱均从同一工作簿聚合。在线工作簿入口：" + online_url())
    add_table(doc, ["子表", "对象", "用途", "字段数"], [[s["title"], s["object"], s["purpose"], str(len(s["fields"]))] for s in SHEETS], widths=[3.1, 2.4, 7.5, 1.3], font_size=8.8)

    add_heading(doc, "五、字段由谁填、什么时候填")
    add_para(doc, "下面给出逐字段责任矩阵。完整可编辑版本同时保存在 CSV 和企微工作簿 08-字段责任矩阵中。")
    matrix = matrix_rows()
    compact = [[r[0], r[2], r[5], r[6], r[10], r[11]] for r in matrix]
    add_table(doc, ["子表", "字段", "填写责任人", "填写时间", "质量规则", "领导大屏"], compact, widths=[2.4, 2.7, 2.4, 3.2, 3.0, 1.2], font_size=7.4)

    doc.add_section(WD_SECTION.NEW_PAGE)
    add_heading(doc, "六、领导驾驶舱")
    add_para(doc, "领导首页只展示能够触发决策的数据。项目总数、人员任务饼图和工作记录数下沉到内部分析，不占据首屏。")
    add_table(doc, ["ID", "指标", "领导问题", "定义", "责任人", "刷新", "展示"], [[r[0], r[1], r[3], r[4], r[8], r[9], r[10]] for r in METRICS], widths=[1.3, 2.5, 3.0, 4.0, 2.0, 1.5, 1.7], font_size=7.8)
    add_para(doc, "首屏六项：本月计划验收、本月预计按期验收、验收准时预测率、回款条件达成金额、红色项目数、未来两周超负荷人数。")
    for item in [
        "项目健康矩阵：项目、阶段、计划验收、预测验收、偏差、健康灯、下一动作。",
        "领导决策清单：事项、影响、建议方案、决策人、最晚决策时间。",
        "进度与质量：逾期关键里程碑、一次验收通过率、重大未关闭问题。",
        "成本与容量：项目人天偏差、人员负荷热力图、未来两周可接单能力。",
        "产品与复用：标准/配置/定制分布、重复问题Top、标准资产沉淀。",
    ]:
        add_bullet(doc, item)

    add_heading(doc, "七、固定填报节奏")
    add_table(doc, ["时间", "谁填", "必须更新", "完成门禁"], [
        ["售前转交付当天", "PMO/销售/部门负责人", "项目ID、客户、负责人、承诺和商务节点", "启动资料齐全"],
        ["启动会后1个工作日", "项目负责人", "范围、上线、验收、验收标准和客户配合", "基线版本形成"],
        ["每天工作结束前", "任务主责人", "状态、进度、工时、阻塞和下一动作", "与证据一致"],
        ["每周一", "项目负责人", "预测上线、预测验收、下一里程碑和健康灯", "预测可解释"],
        ["每周五", "PMO", "人天、容量、风险、验收和数据完整性", "领导周看板发布"],
        ["事件后1个工作日", "项目/销售/财务", "验收证据、回款条件和到账事实", "责任口径一致"],
        ["项目关闭后5个工作日", "项目/产品/售后", "复盘、需求分类、复发和标准资产", "结论或资产有证据"],
    ], widths=[2.5, 3.2, 5.4, 3.0], font_size=8.5)

    add_heading(doc, "八、数据质量与人工门禁")
    for item in [
        "无项目ID不允许跨表流转；无主责人、截止时间、交付物、完成标准和证据要求的任务不得进入执行。",
        "无证据不得标记已完成；已验收必须关联验收证据；金额只以合同和财务确认数据为准。",
        "Agent可以整理、汇总、计算、提醒和生成周报；合同、金额、客户验收、生产上线、支付、设备控制和食安相关动作必须人工确认。",
        "大屏每个指标必须能够回钻到项目、任务、风险或验收记录。",
    ]:
        add_bullet(doc, item)

    add_heading(doc, "九、四周试运行")
    add_table(doc, ["周次", "试运行内容", "通过标准"], [
        ["第1周", "选择4个在手项目，建立主数据、七阶段里程碑和风险台账", "项目ID、负责人、计划和风险齐全"],
        ["第2周", "启用每日任务更新、周一预测和周五复核", "所有在执行任务有下一动作和证据"],
        ["第3周", "启用人员容量、验收回款条件和产品复用分类", "容量、验收和分类可回读"],
        ["第4周", "用实际数据校准红黄灯、人天偏差、复用率和绩效目标", "形成管理基线和调整决策"],
    ], widths=[1.8, 7.5, 5.2], font_size=9)
    add_para(doc, "本体系在试运行前属于D级管理设计；阈值和绩效权重只有在真实项目基线、财务口径和部门评审完成后才能转为正式制度。")

    doc.save(FINAL_DOCX)


def build_summary():
    text = f"""# 交付实施部经营与项目管控体系产出说明

## 目标

建立一套脱离历史表结构、以部门结果为中心的统一管理底座，明确部门结果、成功标准、角色责任、字段责任、填报节奏和领导驾驶舱。

## 产出

- 正式 Word：`交付实施部经营与项目管控体系_V1.0.docx`
- AI 真源：`delivery-implementation-department-operating-system.md`
- 人审页面：`delivery-department-operating-system.html`
- 字段责任：`field-responsibility-matrix.csv`
- 领导指标：`leadership-dashboard-metrics.csv`
- 子表地图：`workbook-sheet-map.csv`
- 角色责任：`role-responsibility.csv`
- 状态字典：`status-dictionary.csv`
- 企微结构：`wecom-workbook-schema.json`
- Agent 操作与回读证据：`agent-operation-evidence.md`
- 完整验证记录：`validation.md`
- 企微在线工作簿：{online_url()}

## 管理边界

- 本体系是D级管理设计，指标目标值需通过四周试运行形成基线后确认。
- 金额由销售和财务确认；交付对验收条件达成负责，不替代财务到账确认。
- Agent可以整理、汇总、计算和提醒；合同、金额、客户验收、生产上线、支付、设备和食安相关动作保留人工门禁。

## 验收

- 在线工作簿须包含10个子表，并能回读子表、字段和模板记录数。
- 回读已确认：10张子表、178个字段、205条规则/字典记录；6张业务事实表保持0条模板业务记录。
- DOCX须使用康比特数字体育科技模板并完成逐页渲染检查。
- HTML须自包含、可筛选字段矩阵，并清楚标注不含真实经营数据。
"""
    (ROOT / "summary.md").write_text(text, encoding="utf-8")


def main():
    field_rows = matrix_rows()
    write_csv("field-responsibility-matrix.csv", ["子表", "管理对象", "字段", "字段类型", "定义", "填写责任人", "填写时间", "必填", "更新触发", "数据来源", "质量规则", "领导大屏"], field_rows)
    write_csv("leadership-dashboard-metrics.csv", ["指标ID", "指标名称", "指标维度", "领导问题", "指标定义", "计算公式", "来源子表", "来源字段", "口径责任人", "刷新频率", "展示形式", "红灯规则", "黄灯规则", "触发动作", "证据等级"], METRICS)
    write_csv("workbook-sheet-map.csv", ["子表", "管理对象", "用途", "字段数"], [[s["title"], s["object"], s["purpose"], len(s["fields"])] for s in SHEETS])
    write_csv("role-responsibility.csv", ["角色", "核心定位", "必须完成的工作", "结果责任", "边界"], ROLE_ROWS)
    write_csv("status-dictionary.csv", ["字典类型", "编码", "名称", "定义", "进入条件", "退出条件", "责任角色", "大屏颜色"], STATES)
    build_schema()
    build_markdown()
    build_html()
    build_docx()
    build_summary()


if __name__ == "__main__":
    main()
