#!/usr/bin/env python3
"""Build template-style tender detail workbooks for three projects.

The source template supplied by the user is a 2025 Haidian campus food-safety
workbook. This builder follows that workbook's structure: product list,
detailed software parameters, product differentiation, scoring/qualification,
package/equipment list, school scope, and bidder/supplier analysis.
"""

from __future__ import annotations

from copy import copy
from pathlib import Path
from typing import Any

from openpyxl import Workbook, load_workbook
from openpyxl.styles import Alignment, Border, Font, PatternFill, Side
from openpyxl.utils import get_column_letter


ROOT = Path(__file__).resolve().parents[1]
INPUT = Path("/Users/jack/Downloads/北京中小学食堂市场及招投标汇总.xlsx")
TEMPLATE = ROOT / "docs" / "templates" / "tender-detail-template" / "【2025】海淀区校园食安项目.xlsx"
OUTPUT_DIR = ROOT / "docs" / "deliverables" / "20260615-three-project-tender-details"


SOURCES = {
    "input": str(INPUT),
    "template": str(TEMPLATE),
    "tender_intel_ai_yanqing": (
        "/Users/jack/code/099-github/tender-intel-ai/runs/enrichment/"
        "2026-05-24-plan-full-run/project_detail_excels_2026/"
        "ledger-00255_延庆区2026年度北京市中小学食堂提升项目招标预告"
        "（原标题：延庆区2026年度北京市中小学食堂提升项目）.xlsx"
    ),
    "tender_intel_ai_haidian": (
        "/Users/jack/code/099-github/tender-intel-ai/runs/enrichment/"
        "2026-05-24-plan-full-run/project_detail_excels_2026/"
        "ledger-01444_中小学第二批智慧食堂项目政府采购合同.xlsx"
    ),
    "agency_agents_dashboard": (
        "/Users/jack/code/099-github/agency-agents/data/canteen-growth/"
        "tender-intelligence/runs/market_intelligence/20260521-160735/"
        "market_project_dashboard.csv"
    ),
    "yanqing_yfb": "https://www.yfbzb.com/procurement-intention/detail/page/466316497154736128.html",
    "changping_ggzy_prequal": "https://ggzyfw.beijing.gov.cn/jyxxggjtbyqs/20260529/5552763.html",
    "changping_ggzy_cancel": "https://ggzyfw.beijing.gov.cn/jyxxgcjszzgg/20260608/5563997.html",
    "haidian_ggzy_tender": "https://ggzyfw.beijing.gov.cn/jyxxcggg/20260130/5420132.html",
    "haidian_award_mirror": "https://m.sohu.com/a/991651455_122434053",
}


COLORS = {
    "navy": "1F4E79",
    "blue": "D9EAF7",
    "light_blue": "EEF6FC",
    "green": "E2F0D9",
    "yellow": "FFF2CC",
    "red": "FCE4D6",
    "gray": "F4F6F8",
    "white": "FFFFFF",
    "black": "1F1F1F",
}
THIN = Side(style="thin", color="B7C9DA")
BORDER = Border(left=THIN, right=THIN, top=THIN, bottom=THIN)
FONT = "Microsoft YaHei"


def normalize_text(value: Any) -> Any:
    if isinstance(value, str):
        return value.replace("\xa0", " ").strip()
    return value


def input_rows() -> list[dict[str, Any]]:
    wb = load_workbook(INPUT, data_only=True)
    ws = wb["招投标项目明细"]
    rows = list(ws.iter_rows(values_only=True))
    headers = [str(v) for v in rows[0]]
    return [{headers[i]: normalize_text(row[i]) for i in range(len(headers))} for row in rows[1:4]]


def copied(cell):
    return copy(cell)


def style_cell(cell, fill: str | None = None, bold: bool = False, color: str = COLORS["black"]) -> None:
    cell.font = Font(name=FONT, size=10, bold=bold, color=color)
    cell.alignment = Alignment(wrap_text=True, vertical="top")
    cell.border = BORDER
    if fill:
        cell.fill = PatternFill("solid", fgColor=fill)


def title_row(ws, row: int, title: str, cols: int) -> None:
    ws.merge_cells(start_row=row, start_column=1, end_row=row, end_column=cols)
    cell = ws.cell(row, 1, title)
    cell.font = Font(name=FONT, size=15, bold=True, color=COLORS["white"])
    cell.fill = PatternFill("solid", fgColor=COLORS["navy"])
    cell.alignment = Alignment(horizontal="center", vertical="center")
    cell.border = BORDER
    ws.row_dimensions[row].height = 32


def write_table(ws, start_row: int, title: str, headers: list[str], rows: list[list[Any]]) -> int:
    title_row(ws, start_row, title, len(headers))
    header_row = start_row + 1
    for col, header in enumerate(headers, 1):
        cell = ws.cell(header_row, col, header)
        style_cell(cell, COLORS["blue"], bold=True, color="14344A")
        cell.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
    row_num = header_row
    for row in rows:
        row_num += 1
        fill = None
        if row and isinstance(row[0], str) and row[0].startswith("小计"):
            fill = COLORS["green"]
        for col, value in enumerate(row, 1):
            cell = ws.cell(row_num, col, value)
            style_cell(cell, fill)
    ws.auto_filter.ref = f"A{header_row}:{get_column_letter(len(headers))}{row_num}"
    return row_num + 2


def set_widths(ws, widths: list[int]) -> None:
    for idx, width in enumerate(widths, 1):
        ws.column_dimensions[get_column_letter(idx)].width = width
    for row in range(1, ws.max_row + 1):
        ws.row_dimensions[row].height = 44


def add_overview_sheet(wb: Workbook, spec: dict[str, Any]) -> None:
    ws = wb.create_sheet("项目概览")
    write_table(
        ws,
        1,
        "项目基本信息",
        ["字段", "值", "信息状态", "来源"],
        spec["overview"],
    )
    write_table(
        ws,
        ws.max_row + 2,
        "本次按模板补充口径",
        ["事项", "处理方式", "说明", "来源"],
        [
            ["产品清单", "按模板列出软件、硬件、实施/集成项", "正式清单未披露时，分为“已确认范围”和“同类模板参考”。", SOURCES["template"]],
            ["软件功能", "按模板拆到模块级功能要求", "凡非本项目公开文件确认的功能，均标注为同类模板参考或销售切入建议。", SOURCES["template"]],
            ["3家投标公司", "不编造未披露公司", "公开资料未披露时保留 3 行位置，并说明需要开标记录、候选人公示或评标报告。", "公开公告/本机爬虫"],
        ],
    )
    set_widths(ws, [24, 62, 22, 60])
    ws.freeze_panes = "A3"


COMMON_SOFTWARE = [
    ["一、学校管理应用", "", "", "", ""],
    [1, "工作台/消息中心", "基础业务数据统计；当日晨检、食材验收、留样、设备在线、异常预警概览；支持待办消息、通知消息、已读/未读状态。", "同类模板详细功能", "学校端"],
    [2, "菜谱管理", "支持按周创建菜单，维护菜品、套餐和餐次；可根据带量菜谱生成人份用量和采购建议，支撑采购单生成。", "同类模板详细功能", "学校端"],
    [3, "库房管理", "支持入库、出库、盘点、退货、盘盈盘亏、库存预警、保质期预警、出入库明细、成本核算、月结/反月结和月结报表。", "同类模板详细功能", "学校端/教委端"],
    [4, "供应商管理", "维护供应商主数据、证照、准入状态、配送记录；建议增加证照到期预警、黑名单、食材溯源平台对接。", "同类模板+销售建议", "学校端/区级端"],
    [5, "智慧后厨", "从业人员健康证、晨检、培训、餐具消毒、紫外线灯、中心温度、留样、陪餐、食安自查等台账自动形成。", "同类模板详细功能", "学校端"],
    [6, "AI行为分析", "通过视频识别未戴工帽/口罩/工服、玩手机、吸烟、垃圾桶未加盖/满溢、鼠患、水龙头未关闭、砧板混用等风险。", "同类模板详细功能", "学校端/监管端"],
    [7, "物联智控", "接入温湿度、冷柜/冷库、消毒柜、紫外线、留样、中心温度计、验收秤、智能开关、AI终端等设备，展示实时状态和历史曲线。", "同类模板详细功能", "学校端"],
    [8, "预警智治", "支持预警规则配置、分级响应、责任人派单、整改闭环、超时升级和统计分析。", "同类模板+销售建议", "学校端/教委端"],
    [9, "线上巡检", "支持监管人员线上巡查、问题下发、整改取证、复核和统计报表。", "同类模板详细功能", "监管端"],
    [10, "家校互动", "支持家长查看阳光厨房、留样/验收/资质公示、意见反馈和满意度收集。", "同类模板详细功能", "移动端 H5"],
    ["二、教委/监管应用", "", "", "", ""],
    [11, "教委工作台", "区级查看晨检、验收、健康证、消费、食材使用、设备接入、行为分析、预警闭环等跨校数据。", "同类模板详细功能", "教委端"],
    [12, "区级主数据", "商品库、菜谱库、供应商库、学校组织、监管项、陪餐项、晨检项、监督检查项等可配置下发。", "同类模板详细功能", "教委端"],
    [13, "留样/阳光厨房/行为分析统计", "按学校、时间、食堂、设备、违规类型进行汇总和下钻；支持导出检查台账。", "同类模板详细功能", "监管端"],
    [14, "财务与成本报表", "统计食材入库、出库、库存、成本、月结数据，支撑区校两级成本核算和经营分析。", "同类模板详细功能", "教委端"],
    ["三、平台与接口", "", "", "", ""],
    [15, "视频管理平台", "支持 NVR/通道配置、实时预览、录像回放、轮巡、录像下载、标签锁定、国标/Onvif/SDK 等接入方式。", "同类模板详细功能", "平台端"],
    [16, "AI行为分析汇聚", "支持多算法终端接入、任务调度、审核放行、违规订阅、语音播报和统一告警汇聚。", "同类模板详细功能", "平台端"],
    [17, "标准数据前置库", "沉淀大宗采购、消费、财务、食安四类标准字段，支持第三方平台数据交换和审计。", "同类模板详细功能", "平台端"],
    [18, "智能设备接口开发", "对接验收机、手持机、留样柜、中心温度计、紫外线、冷链、洗碗机、视频、AI盒子等设备。", "同类模板详细功能", "平台端"],
]


def project_software_rows(spec: dict[str, Any]) -> list[list[Any]]:
    rows = [["序号", "功能模块", "功能要求", "本项目适用判断", "来源/证据"]]
    idx = 0
    for item in COMMON_SOFTWARE:
        if isinstance(item[0], str):
            rows.append(item)
            continue
        idx += 1
        module = item[1]
        status = spec["software_status"].get(module, spec["software_default_status"])
        source = spec["software_source"].get(module, spec["software_default_source"])
        rows.append([idx, module, item[2], status, source])
    return rows


def add_product_sheet(wb: Workbook, spec: dict[str, Any]) -> None:
    ws = wb.create_sheet("产品清单-模板")
    write_table(
        ws,
        1,
        "产品清单（按 2025 海淀模板口径展开）",
        ["序号", "分项名称", "技术参数（软硬件，软件部分详细）", "制造商/供应商", "产地/国别", "制造商统一信用代码", "制造商规模", "品牌", "规格、型号", "单价/预算", "数量/范围", "金额/备注"],
        spec["products"],
    )
    set_widths(ws, [8, 26, 76, 24, 16, 24, 14, 16, 28, 18, 18, 34])
    ws.freeze_panes = "A2"


def add_software_sheet(wb: Workbook, spec: dict[str, Any]) -> None:
    ws = wb.create_sheet("软件端详细技术参数表")
    rows = project_software_rows(spec)
    title_row(ws, 1, "软件端详细技术参数表（模板颗粒度；含本项目适用判断）", 5)
    for r, row in enumerate(rows, 2):
        if isinstance(row[0], str) and row[0].startswith(("序号", "一、", "二、", "三、")):
            fill = COLORS["blue"] if row[0] == "序号" else COLORS["green"]
            bold = True
        else:
            fill = None
            bold = False
        for c, value in enumerate(row, 1):
            cell = ws.cell(r, c, value)
            style_cell(cell, fill, bold)
    set_widths(ws, [8, 26, 90, 30, 58])
    ws.freeze_panes = "A3"


def add_diff_sheet(wb: Workbook, spec: dict[str, Any]) -> None:
    ws = wb.create_sheet("我方产品差异性")
    write_table(
        ws,
        1,
        "我方产品差异性/销售切入建议（按模板模块域）",
        ["模块域", "关键能力点（投标/建设基线）", "本项目披露程度", "差异点评价", "落地建议", "优先级"],
        spec["diff_rows"],
    )
    set_widths(ws, [24, 48, 18, 48, 62, 12])
    ws.freeze_panes = "A2"


def add_scoring_sheet(wb: Workbook, spec: dict[str, Any]) -> None:
    ws = wb.create_sheet("评分标准")
    row = write_table(
        ws,
        1,
        "评分/资质标准（本项目公开披露 + 同类模板参考）",
        ["序号", "评分/资质因素", "分值/状态", "评分标准或资格要求", "说明/来源"],
        spec["score_rows"],
    )
    write_table(
        ws,
        row,
        "供应商资格要求",
        ["序号", "资格/条件", "披露状态", "详细要求", "来源"],
        spec["qualification_rows"],
    )
    set_widths(ws, [8, 28, 18, 82, 52])
    ws.freeze_panes = "A2"


def add_package_sheet(wb: Workbook, spec: dict[str, Any]) -> None:
    ws = wb.create_sheet("分包与设备清单")
    write_table(
        ws,
        1,
        "分包/设备清单（对齐模板“三包-2000万元”口径）",
        ["序号", "货物/范围名称", "数量", "单位", "备注", "设备名称", "厂商/型号", "单价（万元）", "数量", "总价（万元）", "核心技术参数/响应情况", "证据状态"],
        spec["package_rows"],
    )
    set_widths(ws, [8, 28, 12, 10, 24, 28, 28, 16, 12, 16, 82, 22])
    ws.freeze_panes = "A2"


def add_bidder_sheet(wb: Workbook, spec: dict[str, Any]) -> None:
    ws = wb.create_sheet("3家投标公司分析")
    row = write_table(
        ws,
        1,
        "3家投标公司/供应商分析",
        ["维度", "公司1", "公司2", "公司3"],
        spec["bidder_matrix"],
    )
    write_table(
        ws,
        row,
        "投标/中标评分情况",
        ["序号", "公司名称", "角色", "披露状态", "评分", "金额", "判断"],
        spec["bidder_score_rows"],
    )
    set_widths(ws, [26, 42, 42, 42, 18, 20, 50])
    ws.freeze_panes = "A2"


def add_scope_sheet(wb: Workbook, spec: dict[str, Any]) -> None:
    ws = wb.create_sheet("建设范围")
    write_table(
        ws,
        1,
        "建设范围（按模板“学校名称/分校址/地址/范围”口径）",
        ["序号", "学校/范围", "分校址/区域", "地址/覆盖", "建设内容", "信息状态", "来源"],
        spec["scope_rows"],
    )
    set_widths(ws, [8, 34, 22, 34, 62, 18, 52])
    ws.freeze_panes = "A2"


def add_sources_sheet(wb: Workbook, spec: dict[str, Any]) -> None:
    ws = wb.create_sheet("来源与缺口")
    write_table(
        ws,
        1,
        "来源与缺口",
        ["类型", "内容", "路径/链接", "可信度", "已用于哪些字段", "仍需补抓"],
        spec["evidence_rows"],
    )
    set_widths(ws, [18, 52, 70, 12, 42, 56])
    ws.freeze_panes = "A2"


def common_diff_rows(project_status: str) -> list[list[Any]]:
    return [
        ["智能监管", "晨检、验收、留样、消毒、中心温度、行为识别、冷链温湿度统一监管", project_status, "与智慧食堂项目高度相关，是销售/方案主线。", "把“设备更新”翻译成区校两级监管闭环：采集-告警-整改-复核-统计。", "P1"],
        ["膳食营养", "周菜单、带量菜谱、菜品/套餐、营养分析、采购单联动", project_status, "昌平项目明确提到膳食营养；延庆/海淀需看正式文件。", "补“按人份/年龄段/餐次”的带量规则、营养报表和采购联动。", "P1"],
        ["安全供应", "供应商资质、食材验收、票证 OCR、溯源秤、库存和保质期预警", project_status, "校园食安提升的核心能力，硬件和软件必须联动。", "主推验货机/溯源秤/手持机与供应商证照到期预警。", "P1"],
        ["智慧后厨物联", "留样柜、温湿度、中心温度、紫外线、智能开关、AI盒子", project_status, "模板项目给出了详细设备参数，可作为参数库参考。", "做设备适配矩阵：品牌、型号、接口协议、检测报告、安装点位。", "P1"],
        ["视频与AI", "防油污摄像机、NVR、视频平台、行为算法终端", project_status, "若项目包含明厨亮灶/AI监管，评分通常重视参数和检测报告。", "准备 CMA 检测报告、算法清单、样例截图、误报/漏报说明。", "P1"],
        ["实施交付", "多校部署、安装调试、培训、试运行、售后响应", project_status, "学校数量多，项目管理和本地化团队会影响评分。", "输出分校点位勘察表、批量部署计划、培训计划和售后 SLA。", "P1"],
    ]


def build_specs(rows: list[dict[str, Any]]) -> list[dict[str, Any]]:
    yanqing, changping, haidian = rows
    undisclosed_matrix = [
        ["披露状态", "公开资料未披露", "公开资料未披露", "公开资料未披露"],
        ["角色", "待开标/待候选披露", "待开标/待候选披露", "待开标/待候选披露"],
        ["中标/投标金额", "未披露", "未披露", "未披露"],
        ["技术能力", "需招标文件、开标记录或投标文件确认", "需招标文件、开标记录或投标文件确认", "需招标文件、开标记录或投标文件确认"],
        ["风险判断", "不可用同类项目公司替代本项目投标人", "不可用同类项目公司替代本项目投标人", "不可用同类项目公司替代本项目投标人"],
        ["同类模板参考", "2025 海淀模板出现北京金丽厨等厨具商，但不等于本项目投标人", "2025 海淀模板出现北京龙华顺成等厨具商，但不等于本项目投标人", "2025 海淀模板出现北京中天白云等厨具商，但不等于本项目投标人"],
    ]

    return [
        {
            "filename": "01-延庆区2026年度北京市中小学食堂提升项目.xlsx",
            "overview": [
                ["区域", yanqing["区域"], "输入表确认", SOURCES["input"]],
                ["项目名称", yanqing["项目名称"], "输入表确认", SOURCES["input"]],
                ["项目状态", yanqing["项目状态"], "输入表确认", SOURCES["input"]],
                ["关键日期", yanqing["关键日期"], "输入表确认", SOURCES["input"]],
                ["用户表预算/金额", yanqing["预算/中标金额"], "输入表口径", SOURCES["input"]],
                ["公开页预采金额", "1557.1562 万元（乙方宝页面显示；与用户表金额口径不同）", "公开页确认/口径冲突", SOURCES["yanqing_yfb"]],
                ["采购单位", "北京市延庆区教育技术装备中心", "本机爬虫/公开页确认", SOURCES["tender_intel_ai_yanqing"]],
                ["项目编号/招标编号", "S110000P001031268", "本机 tender-intel-ai 底稿", SOURCES["tender_intel_ai_yanqing"]],
                ["核心需求", "为延庆区中小学食堂进行设备更新提升、智慧食堂建设，项目完成后全面提升中小学食堂硬件条件，确保质量提升项目有序高效落实。", "公开页 meta 描述确认", SOURCES["yanqing_yfb"]],
            ],
            "products": [
                [1, "智慧食堂食安管理系统（软件）", "建议按模板覆盖学校端、教委端、监管端、移动端 H5、运维管理、视频管理、AI行为分析、标准数据前置库、智能设备接口；正式文件目前只确认“智慧食堂建设”，未披露功能清单。", "未披露", "中国", "未披露", "未披露", "未披露", "按需定制", "未拆分", "延庆区中小学", "同类模板参考；正式参数待采购文件"],
                [2, "食堂设备更新提升", "采购目标为设备更新提升；按同类模板可关注验收机、手持机、留样柜、温湿度、中心温度计、紫外线/智能开关、视频/NVR、AI算法终端、网络设备。", "未披露", "中国", "未披露", "未披露", "未披露", "待正式清单", "未拆分", "用户表为 37 所学校", "采购意向确认范围，不确认具体型号"],
                [3, "食堂硬件条件提升/修缮配套", "用户表显示 37 所学校设备更新及智慧食堂建设；本机线索显示招标预告阶段，仍需正式招标文件披露学校清单和点位。", "未披露", "中国", "未披露", "未披露", "未披露", "待正式清单", "未拆分", "37 所学校（用户表口径）", "金额口径待官方正式公告统一"],
                ["小计/预算", "项目预算口径", "用户表约 3631.54 万元；乙方宝公开页预采金额 1557.1562 万元。", "", "", "", "", "", "", "", "", "口径冲突，需以官方采购公告/预算批复为准"],
            ],
            "software_status": {"智慧后厨": "公开目标确认方向；功能明细为模板参考", "物联智控": "公开目标确认方向；功能明细为模板参考", "AI行为分析": "正式文件未披露", "视频管理平台": "正式文件未披露"},
            "software_source": {},
            "software_default_status": "正式采购文件未披露；按同类模板列为应补抓/方案参考",
            "software_default_source": "延庆采购意向 + 2025 海淀模板",
            "diff_rows": common_diff_rows("采购意向阶段，项目方向已确认但参数未披露"),
            "score_rows": [
                [1, "正式评分办法", "未披露", "采购意向阶段未公开评分标准。", SOURCES["yanqing_yfb"]],
                [2, "同类模板-企业资质", "5 分参考", "ISO9001、ISO45001、ISO14001、软件著作权等在 2025 海淀模板中作为企业资质评分项。", SOURCES["template"]],
                [3, "同类模板-技术参数响应", "30 分参考", "技术参数全部满足得满分，带▲的重要参数负偏离扣分更重。", SOURCES["template"]],
                [4, "同类模板-技术/实施/培训/售后", "51 分参考", "技术方案、实施方案、培训方案、售后服务合计为软件/系统类项目核心得分区。", SOURCES["template"]],
            ],
            "qualification_rows": [
                [1, "正式供应商资格", "未披露", "采购意向阶段未公开正式资格条款。", SOURCES["yanqing_yfb"]],
                [2, "设备标准", "已披露", "采购要求为采购设备符合相关标准。", SOURCES["yanqing_yfb"]],
                [3, "软件/设备证明材料", "同类模板参考", "建议准备软件功能截图、CMA 检测报告、软件著作权、ISO 体系证书、设备接口证明。", SOURCES["template"]],
            ],
            "package_rows": [
                [1, "智慧食堂建设", 1, "项", "采购意向确认", "食安管理系统/监管平台", "未披露", "", "", "", "学校端、教委端、监管端、移动端、数据前置库和设备接口需正式文件确认。", "范围确认，参数未披露"],
                [2, "食堂设备更新提升", "37", "所学校", "用户表口径", "智能硬件/厨房设备", "未披露", "", "", "", "可按模板重点跟踪管理一体机、验货机、手持机、留样仪、温湿度、中心温度计、视频和AI终端。", "范围确认，清单未披露"],
                [3, "硬件条件提升", "延庆区中小学", "批", "采购目标", "修缮/设施提升/安装调试", "未披露", "", "", "", "需正式采购文件确认学校清单、点位、施工/安装边界。", "待补抓"],
            ],
            "scope_rows": [
                [1, "延庆区中小学食堂", "延庆区", "未披露逐校地址", "设备更新提升、智慧食堂建设、硬件条件提升。", "公开页确认总体范围", SOURCES["yanqing_yfb"]],
                [2, "37 所学校", "延庆区", "未披露逐校地址", "用户表备注为 37 所学校设备更新及智慧食堂建设。", "用户表口径", SOURCES["input"]],
            ],
            "bidder_matrix": undisclosed_matrix,
            "bidder_score_rows": [
                [1, "公开资料未披露（第1家）", "待开标/候选", "未披露", "", "", "采购意向阶段无投标人名单。"],
                [2, "公开资料未披露（第2家）", "待开标/候选", "未披露", "", "", "需开标记录/候选人公示。"],
                [3, "公开资料未披露（第3家）", "待开标/候选", "未披露", "", "", "不能用同类模板公司替代本项目投标人。"],
            ],
            "evidence_rows": [
                ["输入表", "延庆项目条目、金额和 37 所学校备注。", SOURCES["input"], "高", "概览/建设范围", "需官方正式公告统一金额口径。"],
                ["公开页", "乙方宝页面 meta 披露采购目标和采购要求。", SOURCES["yanqing_yfb"], "中", "产品清单/软件方向/资质", "需源头财政/政府采购公告。"],
                ["本机爬虫", "tender-intel-ai 单项目底稿，状态为 missing_structured_content。", SOURCES["tender_intel_ai_yanqing"], "中", "项目编号/阶段", "补附件和采购文件。"],
            ],
        },
        {
            "filename": "02-昌平区中小学校园食堂质量提升智慧食堂设备购置项目.xlsx",
            "overview": [
                ["区域", changping["区域"], "输入表确认", SOURCES["input"]],
                ["项目名称", changping["项目名称"], "输入表确认", SOURCES["input"]],
                ["项目状态", changping["项目状态"], "输入表确认", SOURCES["input"]],
                ["关键日期", changping["关键日期"], "输入表确认", SOURCES["input"]],
                ["用户表预算/金额", changping["预算/中标金额"], "输入表口径", SOURCES["input"]],
                ["核心需求", "67 所学校；搭建“智能监管+膳食营养+安全供应”体系。", "输入表确认", SOURCES["input"]],
                ["关联公开工程项目", "2026年昌平区中小学校园食堂质量提升改造项目（四标段）", "官方公告确认", SOURCES["changping_ggzy_prequal"]],
                ["关联工程规模", "建设规模 3623.9 平方米，合同估算价 682.504784 万元，计划工期 60 日历天。", "官方公告确认", SOURCES["changping_ggzy_prequal"]],
                ["最新状态", "2026-06-08 终止资格预审，后期另行组织招标；终止前尚未进行资格预审评审。", "官方公告确认", SOURCES["changping_ggzy_cancel"]],
            ],
            "products": [
                [1, "智慧食堂设备购置", "面向 67 所学校，服务现有自营食堂、计划转为新型自营食堂、新建食堂及新建微厨房；正式设备清单未公开。", "未披露", "中国", "未披露", "未披露", "未披露", "待正式清单", "约 1809 万元（用户表）", "67 所学校", "输入表确认，公开清单待补"],
                [2, "智能监管系统（软件）", "应覆盖晨检、验收、留样、消毒、中心温度、冷链温湿度、行为分析、预警闭环、巡检整改和区校两级监管。", "未披露", "中国", "未披露", "未披露", "未披露", "按需定制", "未拆分", "67 所学校", "用户表确认方向，功能明细按模板补齐"],
                [3, "膳食营养系统（软件）", "应覆盖周菜单、带量菜谱、菜品/套餐、营养分析、人份用量、采购单联动和营养报表。", "未披露", "中国", "未披露", "未披露", "未披露", "按需定制", "未拆分", "67 所学校", "用户表确认方向，功能明细按模板补齐"],
                [4, "安全供应系统（软件+硬件）", "建议包含供应商资质、票证识别、食材验收、溯源称重、库存/保质期预警、出入库和成本核算。", "未披露", "中国", "未披露", "未披露", "未披露", "按需定制", "未拆分", "67 所学校", "用户表确认方向，功能明细按模板补齐"],
                [5, "食堂质量提升改造工程", "关联四标段范围含拆除工程、装饰装修工程、给排水和采暖工程、电气工程、智能建筑工程、通风工程等。", "施工单位未披露", "中国", "未披露", "未披露", "未披露", "四标段", "682.504784 万元", "3623.9 平方米", "官方工程公告确认；非完全同名设备购置包"],
            ],
            "software_status": {"膳食营养": "用户表明确提到；详细功能按模板展开", "供应商管理": "安全供应体系需要；正式参数未披露", "区级主数据": "67校统筹场景高度适用；正式参数未披露"},
            "software_source": {"膳食营养": SOURCES["input"], "供应商管理": SOURCES["input"], "区级主数据": SOURCES["input"]},
            "software_default_status": "用户表确认建设方向；正式软件参数待公告/招标文件",
            "software_default_source": "用户总表 + 2025 海淀模板",
            "diff_rows": common_diff_rows("用户表明确智能监管、膳食营养、安全供应；正式参数未披露"),
            "score_rows": [
                [1, "正式设备购置评分", "未披露", "同名设备购置项目未找到正式评分办法。", SOURCES["input"]],
                [2, "关联工程资格预审办法", "有限数量制", "四标段资格预审采用有限数量制；但 2026-06-08 已终止。", SOURCES["changping_ggzy_prequal"]],
                [3, "同类模板-报价", "10-30 分参考", "模板项目中报价通常按最低有效报价为评标基准价计分。", SOURCES["template"]],
                [4, "同类模板-技术参数", "30 分参考", "技术参数全部满足得满分，带▲参数负偏离扣分。", SOURCES["template"]],
                [5, "同类模板-技术/实施/培训/售后", "核心分参考", "智能监管、营养、安全供应项目应准备完整技术方案、实施方案、培训和售后。", SOURCES["template"]],
            ],
            "qualification_rows": [
                [1, "建筑工程施工总承包", "关联工程已披露", "申请人须具备建筑工程施工总承包三级[新]及以上资质。", SOURCES["changping_ggzy_prequal"]],
                [2, "项目经理", "关联工程已披露", "项目经理须具备建筑工程专业注册建造师二级及以上，并具备有效安全生产考核合格证书（B本）。", SOURCES["changping_ggzy_prequal"]],
                [3, "联合体", "关联工程已披露", "四标段不接受联合体资格预审申请。", SOURCES["changping_ggzy_prequal"]],
                [4, "软件/设备供应商资质", "未披露", "同名智慧食堂设备购置包正式资质未公开；建议准备 ISO、软著、检测报告、案例和本地服务团队证明。", SOURCES["template"]],
            ],
            "package_rows": [
                [1, "智能监管体系", "67", "所学校", "用户表确认", "监管平台+物联+视频AI", "未披露", "", "", "", "晨检、验收、留样、消毒、中心温度、冷链、行为识别、预警闭环。", "方向确认，清单未披露"],
                [2, "膳食营养体系", "67", "所学校", "用户表确认", "营养/菜谱/带量系统", "未披露", "", "", "", "周菜单、带量菜谱、人份用量、营养报表、采购单联动。", "方向确认，清单未披露"],
                [3, "安全供应体系", "67", "所学校", "用户表确认", "供应商/验收/溯源/库存", "未披露", "", "", "", "供应商资质、票证 OCR、验收称重、库存预警、保质期预警、成本核算。", "方向确认，清单未披露"],
                [4, "工程改造四标段", "3623.9", "平方米", "官方公告", "拆除/装修/给排水/电气/智能建筑/通风", "未披露", "", "", "682.504784", "计划工期 60 日历天；资格预审已终止，后续另行组织招标。", "关联工程确认"],
            ],
            "scope_rows": [
                [1, "67 所学校", "昌平区", "未披露逐校地址", "智能监管、膳食营养、安全供应体系。", "输入表确认", SOURCES["input"]],
                [2, "现有自营食堂", "昌平区", "未披露", "智慧食堂设备购置适用场景。", "输入表/公开线索", SOURCES["input"]],
                [3, "计划转为新型自营食堂、新建食堂、微厨房", "昌平区", "未披露", "智慧食堂设备购置适用场景。", "输入表/公开线索", SOURCES["input"]],
                [4, "工程改造四标段", "昌平区", "未披露逐校地址", "拆除、装饰装修、给排水采暖、电气、智能建筑、通风等。", "官方公告确认", SOURCES["changping_ggzy_prequal"]],
            ],
            "bidder_matrix": undisclosed_matrix,
            "bidder_score_rows": [
                [1, "公开资料未披露（第1家）", "资格预审已终止/待重新招标", "未披露", "", "", "官方终止公告称尚未进行资格预审评审。"],
                [2, "公开资料未披露（第2家）", "资格预审已终止/待重新招标", "未披露", "", "", "无开标记录、候选人或中标公告。"],
                [3, "公开资料未披露（第3家）", "资格预审已终止/待重新招标", "未披露", "", "", "需重新招标后的公告链。"],
            ],
            "evidence_rows": [
                ["输入表", "昌平项目预算约 1809 万元，67 所学校，智能监管+膳食营养+安全供应。", SOURCES["input"], "高", "概览/产品/软件/范围", "正式采购公告和清单。"],
                ["官方公告", "关联工程四标段资格预审公告披露工程范围、资质和工期。", SOURCES["changping_ggzy_prequal"], "中", "资质/工程范围", "确认与设备购置包关系。"],
                ["官方公告", "终止公告披露后期另行组织招标且尚未评审。", SOURCES["changping_ggzy_cancel"], "高", "投标公司披露状态", "跟踪重招公告。"],
            ],
        },
        {
            "filename": "03-海淀区中小学第二批智慧食堂项目.xlsx",
            "overview": [
                ["区域", haidian["区域"], "输入表确认", SOURCES["input"]],
                ["项目名称", haidian["项目名称"], "输入表确认", SOURCES["input"]],
                ["项目状态", haidian["项目状态"], "输入表确认", SOURCES["input"]],
                ["关键日期", haidian["关键日期"], "输入表确认", SOURCES["input"]],
                ["用户表预算/金额", haidian["预算/中标金额"], "输入表口径", SOURCES["input"]],
                ["项目编号", "11010825210200051872-XM001", "中标公告/本机底稿确认", SOURCES["haidian_award_mirror"]],
                ["交易项目编号", "S110000C005104078001", "官方招标公告确认", SOURCES["haidian_ggzy_tender"]],
                ["采购单位", "北京市海淀区教育装备资产和财务核算中心", "官方公告确认", SOURCES["haidian_ggzy_tender"]],
                ["采购需求", "拟招一家投标人为中小学食堂采购设备。", "官方公告确认", SOURCES["haidian_ggzy_tender"]],
                ["中标供应商", "北京天邦伟业厨房设备有限公司", "中标公告确认", SOURCES["haidian_award_mirror"]],
                ["中标金额/评分", "655.8 万元；综合评分 88.14 分", "中标公告确认", SOURCES["haidian_award_mirror"]],
            ],
            "products": [
                [1, "万能蒸烤箱（10层）电加热", "规格型号 SV-SC-SO-E-10-1/1；中标主要标的信息披露数量 2 台、单价 10.68 万元、合计 21.36 万元。", "未披露/供应商为北京天邦伟业厨房设备有限公司", "中国", "911101137433226252（中标供应商）", "未披露", "未披露", "SV-SC-SO-E-10-1/1", "10.68 万元", 2, "21.36 万元"],
                [2, "万能蒸烤箱（20层）电加热", "规格型号 SV-SC-SO-E-20-1/1；中标主要标的信息披露数量 34 台、单价 18.66 万元、合计 634.44 万元。", "未披露/供应商为北京天邦伟业厨房设备有限公司", "中国", "911101137433226252（中标供应商）", "未披露", "未披露", "SV-SC-SO-E-20-1/1", "18.66 万元", 34, "634.44 万元"],
                [3, "供货、检测、安装/交付服务", "招标公告要求接到采购人通知后，中标人组织检测，25 日历天内完成供货。", "北京天邦伟业厨房设备有限公司", "北京/中国", "911101137433226252", "未披露", "天邦伟业", "服务", "计入总价", 1, "交付周期 25 日历天"],
                ["小计/中标金额", "设备采购", "公开中标金额 655.8 万元。", "", "", "", "", "", "", "", "", "两项硬件合计 655.8 万元"],
            ],
            "software_status": {"视频管理平台": "本项目公开采购清单未披露软件；仅作为智慧食堂环境关联项", "AI行为分析汇聚": "本项目公开采购清单未披露软件；仅作为智慧食堂环境关联项"},
            "software_source": {"视频管理平台": SOURCES["haidian_ggzy_tender"], "AI行为分析汇聚": SOURCES["haidian_ggzy_tender"]},
            "software_default_status": "公开公告口径为设备采购，未披露独立软件功能；按模板列为关联能力参考",
            "software_default_source": "海淀招标公告 + 2025 海淀模板",
            "diff_rows": common_diff_rows("本项目以硬件设备采购为主，软件功能未作为公开清单披露"),
            "score_rows": [
                [1, "中标综合评分", "88.14 分", "北京天邦伟业厨房设备有限公司综合评分 88.14 分。", SOURCES["haidian_award_mirror"]],
                [2, "评审专家", "已披露", "路小北、刘丽珍、徐明、林秋红、杨祖清、张景怡、刘欣宇。", SOURCES["haidian_award_mirror"]],
                [3, "正式评分细则", "未披露", "公开招标公告/中标公告未披露完整评分细则。", SOURCES["haidian_ggzy_tender"]],
                [4, "同类模板-投标报价", "30 分参考", "模板的 3 包评分表中，满足要求且价格最低为评标基准价，报价得分=评标基准价/投标报价×30。", SOURCES["template"]],
                [5, "同类模板-商务部分", "6 分参考", "业绩 2 分，项目团队 4 分。", SOURCES["template"]],
                [6, "同类模板-技术服务部分", "64 分参考", "技术参数 30 分、技术方案 15 分、实施方案 10 分、培训方案 5 分、售后服务 4 分。", SOURCES["template"]],
            ],
            "qualification_rows": [
                [1, "政府采购法第二十二条", "已披露", "满足《中华人民共和国政府采购法》第二十二条规定。", SOURCES["haidian_ggzy_tender"]],
                [2, "专门面向中小企业采购", "已披露", "本项目专门面向中小企业采购。", SOURCES["haidian_ggzy_tender"]],
                [3, "联合体", "已披露", "本项目不接受联合体投标。", SOURCES["haidian_ggzy_tender"]],
                [4, "政府购买服务", "已披露", "本项目不属于政府购买服务。", SOURCES["haidian_ggzy_tender"]],
                [5, "特殊资格要求", "未见额外披露", "招标公告未披露除上述以外的特定资质。", SOURCES["haidian_ggzy_tender"]],
            ],
            "package_rows": [
                [1, "万能蒸烤箱（10层）电加热", 2, "台", "中标主要标的信息", "万能蒸烤箱（10层）电加热", "SV-SC-SO-E-10-1/1", 10.68, 2, 21.36, "公开中标公告披露型号、数量、单价、总价；未披露更细技术参数。", "已披露核心商务参数"],
                [2, "万能蒸烤箱（20层）电加热", 34, "台", "中标主要标的信息", "万能蒸烤箱（20层）电加热", "SV-SC-SO-E-20-1/1", 18.66, 34, 634.44, "公开中标公告披露型号、数量、单价、总价；未披露更细技术参数。", "已披露核心商务参数"],
                [3, "检测/供货服务", 1, "项", "招标公告", "组织检测并供货", "服务", "", "", "", "接到采购人通知后，中标人组织检测，25 日历天内完成供货。", "已披露交付要求"],
            ],
            "scope_rows": [
                [1, "中小学食堂", "海淀区", "未披露逐校清单", "为中小学食堂采购万能蒸烤箱等设备。", "官方公告确认", SOURCES["haidian_ggzy_tender"]],
                [2, "采购设备", "海淀区", "未披露点位", "万能蒸烤箱（10层）2 台；万能蒸烤箱（20层）34 台。", "中标公告确认", SOURCES["haidian_award_mirror"]],
                [3, "交付范围", "海淀区采购人指定", "未披露逐校地址", "接采购人通知后组织检测，25 日历天内完成供货。", "官方公告确认", SOURCES["haidian_ggzy_tender"]],
            ],
            "bidder_matrix": [
                ["披露状态", "已披露", "公开资料未披露", "公开资料未披露"],
                ["公司名称", "北京天邦伟业厨房设备有限公司", "未披露（第2家）", "未披露（第3家）"],
                ["角色", "中标供应商", "其他投标人/未中标候选", "其他投标人/未中标候选"],
                ["中标/投标金额", "655.8 万元", "未披露", "未披露"],
                ["综合评分", "88.14 分", "未披露", "未披露"],
                ["地址/信用代码", "北京市顺义区北务镇杨燕路2号；911101137433226252", "未披露", "未披露"],
                ["核心优势判断", "价格和设备供货响应通过综合评分法胜出；具体中标原因需评标报告确认。", "未披露", "未披露"],
                ["风险/缺口", "未取得完整中标文件和评标报告，不能还原全部得分构成。", "需开标记录/评标报告确认", "需开标记录/评标报告确认"],
            ],
            "bidder_score_rows": [
                [1, "北京天邦伟业厨房设备有限公司", "中标供应商", "已披露", "88.14 分", "655.8 万元", "公开中标公告确认。"],
                [2, "公开资料未披露（第2家）", "其他投标人/未中标候选", "未披露", "", "", "公开中标公告未列完整投标人名单。"],
                [3, "公开资料未披露（第3家）", "其他投标人/未中标候选", "未披露", "", "", "需开标记录、评标报告或中标文件确认。"],
            ],
            "evidence_rows": [
                ["官方公告", "公开招标公告披露预算、交易编号、采购需求、投标截止、资格要求和供货周期。", SOURCES["haidian_ggzy_tender"], "高", "概览/资质/交付", "完整采购文件和评分细则。"],
                ["中标公告镜像", "披露中标供应商、金额、综合评分、主要标的信息和专家名单。", SOURCES["haidian_award_mirror"], "中", "产品清单/评分/供应商", "北京市政府采购网原始中标公告或中标文件。"],
                ["本机爬虫", "tender-intel-ai 海淀合同公告底稿，金额 6558000，供应商为北京天邦伟业。", SOURCES["tender_intel_ai_haidian"], "中", "项目存在性/供应商", "补原始附件。"],
            ],
        },
    ]


def write_workbook(spec: dict[str, Any]) -> Path:
    wb = Workbook()
    wb.remove(wb.active)
    add_overview_sheet(wb, spec)
    add_product_sheet(wb, spec)
    add_software_sheet(wb, spec)
    add_diff_sheet(wb, spec)
    add_scoring_sheet(wb, spec)
    add_package_sheet(wb, spec)
    add_scope_sheet(wb, spec)
    add_bidder_sheet(wb, spec)
    add_sources_sheet(wb, spec)
    output = OUTPUT_DIR / spec["filename"]
    wb.save(output)
    return output


def main() -> None:
    OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
    specs = build_specs(input_rows())
    for spec in specs:
        print(write_workbook(spec))


if __name__ == "__main__":
    main()
