#!/usr/bin/env python3
from __future__ import annotations

import csv
import html
import shutil
import zipfile
from datetime import datetime
from pathlib import Path

from docx import Document
from docx.enum.section import WD_SECTION
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_CELL_VERTICAL_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


REPO_ROOT = Path("/Users/jack/code/010-cpt/008-zhct/zhctprompt")
PROJECT_DIR = REPO_ROOT / "modules/presales-bidding/customer-projects/rehab-aids-weighing-system-20260614"
WORK_DIR = REPO_ROOT / "work/2026-06-14-rehab-aids-weighing-bid-chatgpt-pack"
DESKTOP_PACK = Path("/Users/jack/Desktop/rehab-aids-weighing-system-bid-chatgpt-pack-20260614")

DELIVERABLE_DIR = PROJECT_DIR / "deliverables"
REVIEW_DIR = PROJECT_DIR / "review"
MATRIX_DIR = PROJECT_DIR / "response-matrix"
SOURCE_DIR = PROJECT_DIR / "source-docs"
ARCHIVE_DIR = PROJECT_DIR / "archive"

TITLE = "国家康复辅具研究中心智慧食堂项目\n智慧餐厅称重系统改造\n投标响应文件（草案）"
PROJECT_NAME = "智慧餐厅称重系统改造"
PURCHASER = "北京蓝色港湾科技有限责任公司"
SUPPLIER = "北京康比特运动营养科技有限公司（待最终投标主体确认）"
DOC_DATE = "2026年6月"


def read_csv_dict(path: Path) -> list[dict[str, str]]:
    with path.open(encoding="utf-8-sig", newline="") as f:
        return list(csv.DictReader(f))


def ensure_dirs() -> None:
    for d in [DELIVERABLE_DIR, REVIEW_DIR, MATRIX_DIR, SOURCE_DIR, ARCHIVE_DIR, WORK_DIR]:
        d.mkdir(parents=True, exist_ok=True)


def copy_inputs() -> None:
    for rel in ["requirement-response-matrix.csv", "evidence-gap-list.csv"]:
        shutil.copy2(DESKTOP_PACK / "02-response-matrix" / rel, MATRIX_DIR / rel)
    shutil.copy2(DESKTOP_PACK / "06-indexes" / "selected-history-rag-index.csv", SOURCE_DIR / "selected-history-rag-index.csv")
    shutil.copy2(DESKTOP_PACK / "06-indexes" / "project-internal-material-index.csv", SOURCE_DIR / "project-internal-material-index.csv")
    shutil.copy2(DESKTOP_PACK / "01-procurement-file" / "procurement-extracted.md", SOURCE_DIR / "procurement-extracted.md")


def md_table(headers: list[str], rows: list[list[str]]) -> str:
    out = ["| " + " | ".join(headers) + " |", "| " + " | ".join(["---"] * len(headers)) + " |"]
    for row in rows:
        out.append("| " + " | ".join(str(cell).replace("\n", "<br>") for cell in row) + " |")
    return "\n".join(out)


def build_markdown() -> str:
    requirement_rows = read_csv_dict(MATRIX_DIR / "requirement-response-matrix.csv")
    gap_rows = read_csv_dict(MATRIX_DIR / "evidence-gap-list.csv")
    history_rows = read_csv_dict(SOURCE_DIR / "selected-history-rag-index.csv")

    business_rows = [
        ["项目名称", PROJECT_NAME, "完全响应", "与采购文件一致"],
        ["采购预算", "15万元（含税）", "完全响应", "投标报价不得超过预算；最终价格待商务确认"],
        ["投标有效期", "投标截止日期后90日历日", "完全响应", "按采购文件要求出具承诺"],
        ["报价范围", "设备费、运输费、包装费、调试费、配套软件、系统及程序对接、持续优化接口、维保费等", "完全响应", "报价应为含税价并覆盖全部费用"],
        ["付款条件", "到货30%、验收20%、使用3个月45%、质保期结束10日内5%", "响应", "最终以合同约定为准"],
        ["质保要求", "产品质保期不低于1年", "完全响应", "质保期自验收合格日起算"],
        ["售后响应", "7*24小时技术咨询，现场维修4小时以内到达", "完全响应（待服务负责人确认资源）", "需确认本地服务和备件库安排"],
        ["联合体", "本项目不接受联合体", "完全响应", "我方不以联合体形式参加"],
        ["负偏离", "商务响应、技术响应偏离说明表不得出现负偏离", "完全响应", "本草案按无负偏离组织"],
    ]

    quote_rows = [
        ["1", "智慧食堂管理系统（PC端、手机端）", "软件平台", "1套", "待商务确认", "待商务确认", "含人员、卡务、补贴、订单、报表、营养分析、权限、人脸、设备联动等"],
        ["2", "智能称重设备接入与结算能力", "软硬件/接口", "1批", "待商务确认", "待商务确认", "覆盖称重、营养展示、断网同步、异常报警、压秤/防逃费策略"],
        ["3", "智能绑盘机与托盘绑定能力", "硬件/软件", "1批", "待商务确认", "待商务确认", "支持人脸、卡、二维码/条码与托盘绑定"],
        ["4", "档口消费设备、小卖部消费能力", "硬件/软件", "1批", "待商务确认", "待商务确认", "支持刷卡、人脸、二维码、断网收银、订单查询"],
        ["5", "现有设备利旧与系统对接", "服务", "1项", "待商务确认", "待商务确认", "现有7台称重称、100个扫码盘需现场确认协议和兼容性"],
        ["6", "安装调试、培训、测试验收与售后服务", "服务", "1项", "待商务确认", "待商务确认", "含项目实施、培训、试运行、质保期服务"],
        ["合计", "含税总价", "", "", "", "不超过150000元（待商务确认）", "不得超过采购预算"],
    ]

    tech_response_rows = [
        ["智慧食堂PC系统", "人员、卡务、部门、身份、充值补贴、补贴审核、订单、退款、报表、菜品营养、个体/团体膳食监控、消费策略、菜谱菜品、食物成分、设备联动、账号角色、人脸管理等", "完全响应", "以智慧食堂管理系统统一承载，支持多角色、多门店、多企业和数据导出"],
        ["手机端系统", "扫码/小程序进入、双账户、消费码、健康档案、饮食采集、营养日报/周报、体重管理、订餐、订单评价", "完全响应", "提供员工移动端服务，支持营养健康可视化和就餐服务闭环"],
        ["智能称重设备", "快速识别托盘与用餐者、读取菜品营养、5g-30kg、断网同步、压秤报警、防逃费、离线模式", "完全响应", "通过称重结算设备、托盘识别、离线缓存和异常报警策略实现"],
        ["智能绑盘机", "人脸/卡/条形码/二维码身份识别，托盘绑定，15.6寸屏，摄像头、读卡、扫码、服务配置", "完全响应", "支持多绑定方式、人员和人脸同步、绑定/解绑提示和设备配置维护"],
        ["双屏消费机", "刷卡、人脸、二维码消费，断网收银、语音播报、订单查询、报表、促销", "完全响应", "适配档口消费、小卖部消费和多支付身份认证场景"],
        ["称重消费机", "刷卡、人脸、二维码消费，双屏触控，电子秤参数，称重结算", "完全响应", "用于称重售卖、档口消费及订单数据汇总"],
        ["托盘及利旧", "白色PP平托盘带码，现有称重称7台、扫码盘100个与新系统对接或原价收回", "响应", "需现场确认原设备品牌、协议、接口、回收口径和兼容测试结果"],
        ["接口开放", "对接医院HIS、营养管理系统、门禁、停车管理等", "响应", "在对方开放接口、提供文档、联调环境和授权前提下实施标准接口对接；非标准开发范围需双方确认"],
    ]

    implementation_rows = [
        ["1", "项目启动与现场勘查", "确认餐厅点位、网络、电源、现有称重称和扫码盘、人员数据、卡/脸/码认证方式", "现场勘查记录、实施计划"],
        ["2", "方案确认与数据准备", "确认设备清单、软件模块、接口范围、用户/部门/身份/账户/菜品基础数据", "配置清单、数据模板"],
        ["3", "软硬件部署", "部署智慧食堂管理系统，安装称重、绑盘、消费设备，完成网络、电源、设备编号和基础参数配置", "安装记录、设备台账"],
        ["4", "接口与利旧联调", "完成现有设备兼容验证，联调HIS/营养管理/门禁/停车等约定接口", "联调记录、问题闭环表"],
        ["5", "功能测试与试运行", "验证称重、绑盘、消费、订单、补贴、报表、营养分析、断网同步、异常报警等流程", "测试报告、试运行记录"],
        ["6", "培训与验收", "面向管理员、财务/后勤、档口人员、运维人员开展培训，提交验收材料", "培训签到、验收单"],
    ]

    attachment_rows = [
        ["A-01", "营业执照复印件", "资格审查", "待补最新盖章件"],
        ["A-02", "法定代表人身份证明、授权委托书", "投标文件格式", "待填写并签章"],
        ["A-03", "信用中国、中国执行信息公开网、中国政府采购网、国家企业信用信息公示系统截图", "资格审查", "待补最新截图并盖章"],
        ["A-04", "重大风险、无利益冲突、不联合体等承诺函", "资格审查", "本草案已提供文本模板"],
        ["A-05", "产品测试检测报告或检验报告", "PC/手机端多项功能要求", "需按功能项映射报告"],
        ["A-06", "公众号/小程序、人脸安全、营养膳食管理系统相关软著", "手机端评分/资格支撑", "待补证书复印件并盖章"],
        ["A-07", "硬件品牌型号、厂家授权、设备参数证明", "称重设备、绑盘机、消费机、托盘", "待商务/硬件负责人确认"],
        ["A-08", "近三年类似业绩证明", "商务评分8分", "建议准备4个以上智慧食堂类似项目合同/验收证明"],
        ["A-09", "售后服务人员、备件库和4小时到场能力证明", "售后要求", "待服务负责人确认"],
    ]

    case_rows = [
        ["1", "新奥数智工坊项目智能餐线采购及安装项目", "智能餐线、称重结算、绑盘、托盘、接口对接", "历史RAG高相关", "待授权/待证明"],
        ["2", "中国人民大学通州校区西区食堂智慧餐饮系统购置项目", "智慧食堂、营养、门禁/利旧类需求", "历史RAG高相关", "待授权/待证明"],
        ["3", "重庆环卫智慧食堂项目", "称重、绑盘、消费、售后方案", "历史RAG相关", "待授权/待证明"],
        ["4", "上好佳（中国）有限公司智慧食堂项目", "企业智慧食堂、营养与实施服务", "历史RAG相关", "待授权/待证明"],
        ["5", "济南轨道交通运营消费系统采购项目", "消费系统、订单、账户和设备联动", "历史RAG相关", "待授权/待证明"],
        ["6", "保康中学智慧食堂项目", "智慧食堂技术方案、质量售后培训", "项目内资料相关", "待授权/待证明"],
    ]

    selected_refs = []
    for row in history_rows[:12]:
        selected_refs.append([row["rank"], row["history_relative_path"], row["usage_hint"]])

    gap_table_rows = [[r["id"], r["gap"], r["why_needed"], r["owner_action"], r["priority"]] for r in gap_rows]

    lines = [
        f"# {TITLE.replace(chr(10), ' ')}",
        "",
        "> 版本说明：本文件为内部草案，已按采购文件和历史资料组织正文。正式递交前必须补齐报价、证照、授权、检测报告、软著、类似业绩证明、盖章和送达信息。",
        "",
        "## 封面信息",
        "",
        f"- 项目名称：{PROJECT_NAME}",
        f"- 采购人：{PURCHASER}",
        f"- 供应商：{SUPPLIER}",
        "- 投标报价：人民币【待商务确认】元（含税，且不超过150000元）",
        "- 投标有效期：投标截止日期后90日历日",
        f"- 日期：{DOC_DATE}",
        "",
        "## 目录",
        "",
        "1. 投标函",
        "2. 报价一览表与分项报价表",
        "3. 法定代表人身份证明与授权委托书",
        "4. 供应商基本情况与资格证明文件",
        "5. 商务响应及偏离说明",
        "6. 技术响应及偏离说明",
        "7. 技术方案",
        "8. 项目实施方案",
        "9. 质量、安全、测试与培训方案",
        "10. 售后服务及质保承诺",
        "11. 类似业绩",
        "12. 附件清单、补证清单与人工审核清单",
        "",
        "## 一、投标函",
        "",
        f"致：{PURCHASER}",
        "",
        f"我方已认真阅读并充分理解《国家康复辅具研究中心智慧食堂项目采购文件》全部内容，愿意按照采购文件要求参与“{PROJECT_NAME}”采购活动，并承诺所提交的响应文件、资格证明文件、技术资料和商务资料真实、准确、完整。",
        "",
        "我方承诺：",
        "",
        "1. 投标报价为含税总价，覆盖设备费、运输费、包装费、安装调试费、配套软件、系统及程序对接、持续优化接口、软硬件维保费等与本项目相关的全部费用，采购人不承担报价外费用。",
        "2. 投标有效期为投标截止日期后90日历日。",
        "3. 我方不以联合体形式参加本项目，与采购人不存在利益冲突，不存在损害采购人合法利益和声誉的情形。",
        "4. 我方如成交，将按采购文件、响应文件和合同约定完成供货、安装、调试、测试、培训、试运行、验收和质保服务。",
        "5. 我方接受采购文件约定的付款方式、验收要求、售后服务要求和违约责任。",
        "",
        "供应商名称：（公章）",
        "",
        "法定代表人或法人授权代表：（签字或签章）",
        "",
        "日期：    年    月    日",
        "",
        "## 二、报价一览表与分项报价表",
        "",
        "### 2.1 报价一览表",
        "",
        md_table(["项目", "内容"], [["项目名称", PROJECT_NAME], ["投标总价", "人民币【待商务确认】元（含税，不超过150000元）"], ["税率", "【待商务确认】"], ["交付地点", "北京市经济技术开发区荣华中路1号或采购人指定地点"], ["备注", "最终报价需由商务负责人确认；本草案不构成最终报价承诺。"]]),
        "",
        "### 2.2 分项报价表（草案）",
        "",
        md_table(["序号", "项目", "类别", "数量", "含税单价", "含税合价", "说明"], quote_rows),
        "",
        "## 三、法定代表人身份证明与授权委托书",
        "",
        "### 3.1 法定代表人身份证明",
        "",
        "供应商名称：【待填写】\n\n单位性质：【待填写】\n\n地址：【待填写】\n\n成立时间：【待填写】\n\n经营期限：【待填写】\n\n姓名：【待填写】  性别：【待填写】  年龄：【待填写】  职务：【待填写】\n\n系【供应商名称】的法定代表人。\n\n特此证明。\n\n附：法定代表人身份证复印件。\n\n供应商名称：（公章）\n\n日期：    年    月    日",
        "",
        "### 3.2 法定代表人授权委托书",
        "",
        f"兹委派我单位【被授权人姓名】参加贵单位组织的“{PROJECT_NAME}”采购活动，被授权人全权代表单位处理本次采购中的有关事务，并签署全部有关文件、协议及合同。我单位对被授权人签署内容负全部责任。\n\n本授权书于签字盖章后生效，在贵单位收到撤销授权的书面通知以前，本授权书一直有效。被授权人签署的所有文件不因授权的撤销而失效。委托代理人无权转委托。\n\n特此委托。\n\n附：委托代理人身份证复印件。\n\n供应商：（公章）\n\n法定代表人：（签字或签章）\n\n日期：    年    月    日",
        "",
        "## 四、供应商基本情况与资格证明文件",
        "",
        "### 4.1 供应商基本情况表",
        "",
        md_table(["项目", "内容"], [["供应商名称", "【待填写】"], ["注册地址", "【待填写】"], ["法定代表人", "【待填写】"], ["注册资本", "【待填写】"], ["成立时间", "【待填写】"], ["统一社会信用代码", "【待填写】"], ["联系人及电话", "【待填写】"], ["主营业务", "智慧食堂、营养健康管理、智能餐线与相关软硬件服务（以营业执照为准）"]]),
        "",
        "### 4.2 资格承诺",
        "",
        "我方承诺：",
        "",
        "1. 我方为中华人民共和国境内合法注册的独立法人，具有独立承担民事责任的能力，遵守国家有关法律、法规，具有良好的商业信誉。",
        "2. 我方当前未处于限制开展生产经营活动、责令停产停业、责令关闭、限制从业等重大行政处罚期内。",
        "3. 我方当前未被“信用中国”网站列入税收违法黑名单，未被“中国执行信息公开网”列入失信被执行人名单，未被“中国政府采购网”列入政府采购严重违法失信行为记录名单，未被“国家企业信用信息公示系统”网站列入严重违法失信名单。",
        "4. 法定代表人（负责人）为同一人或存在控股、管理关系的不同供应商，不同时参加本项目。",
        "5. 我方在法律和财务上独立、合法运作并独立于采购人。",
        "6. 我方不以联合体形式参加本项目。",
        "7. 我方与采购人不存在利益冲突，不存在损害采购人合法利益和声誉的情形，不存在针对采购人的重大诚信问题。",
        "8. 如履约过程中需要使用关联企业资源，我方将按采购文件要求取得关联企业授权；如未提供授权，则视为不使用关联企业资源。",
        "",
        "## 五、商务响应及偏离说明",
        "",
        md_table(["商务条款", "采购文件要求", "响应情况", "说明"], business_rows),
        "",
        "商务偏离说明：本草案按“无负偏离”组织。正式投标前应由商务负责人复核报价、付款、税率、质保、售后响应和合同条款，确认无负偏离后盖章提交。",
        "",
        "## 六、技术响应及偏离说明",
        "",
        md_table(["类别", "采购需求摘要", "响应情况", "响应说明"], tech_response_rows),
        "",
        "技术偏离说明：本草案按“无负偏离”组织。涉及检测报告、检验报告、软著证书、硬件型号、厂家授权和接口免费开发范围的内容，须在正式文件中补充附件或限定边界。",
        "",
        "## 七、技术方案",
        "",
        "### 7.1 项目理解",
        "",
        "本项目面向国家康复辅具研究中心食堂智慧化改造，采购范围覆盖智能称重设备、档口消费设备、智能绑盘机、小卖部消费设备以及配套智慧食堂管理软件。项目目标不是单一设备替换，而是围绕“减少浪费、提升职工体验、运营管理更便捷、营养健康管理看得见”建立软硬件一体化的智慧餐厅运行体系。",
        "",
        "本方案以“称重结算 + 托盘绑定 + 多身份消费 + 营养分析 + 运营报表 + 接口开放”为主线，兼顾现有7台称重称和100个扫码盘的利旧对接诉求，并为医院HIS、营养管理系统、门禁系统、停车系统等外部系统预留标准接口对接能力。",
        "",
        "### 7.2 总体架构",
        "",
        "系统采用“管理后台、移动端、智能终端、接口集成、数据分析”五层架构：",
        "",
        "1. 管理后台层：提供机构人员、部门、身份、卡务、账户充值、补贴充值、订单、退款、报表、菜品、菜谱、营养、设备、权限、人脸等管理能力。",
        "2. 移动服务层：提供扫码/小程序访问、账户余额、消费码、账单查询、健康档案、营养日报/周报、体重管理、线上订餐和订单评价。",
        "3. 智能终端层：接入智能称重设备、智能绑盘机、双屏消费机、称重消费机、小卖部消费设备、托盘及利旧设备。",
        "4. 接口集成层：提供人员、账户、订单、菜品、营养、设备状态等标准接口，按约定与HIS、营养管理、门禁、停车等系统联调。",
        "5. 数据分析层：沉淀消费订单、菜品销量、营收汇总、营养摄入、就餐效率、设备状态和异常记录，为后勤运营和营养健康管理提供依据。",
        "",
        "### 7.3 智慧食堂管理系统（PC端）",
        "",
        "PC端围绕食堂运营全流程建设，覆盖人员、账户、交易、营养、菜品、设备和权限七类核心能力。人员与组织方面，系统支持人员新增、编辑、批量导入导出、多维度筛选，支持多级部门架构、身份类别配置、卡务全生命周期管理和人脸库管理。账户与交易方面，系统支持现金充值、补贴充值、补贴审核、消费订单、充值订单、提现订单、退款订单查询、审核、追溯和导出。经营分析方面，系统支持餐厅收入汇总、消费汇总、菜品销量、菜品营养统计、就餐效率分析、订单明细统计等报表能力。",
        "",
        "营养健康方面，系统支持菜品营养统计、个体膳食监控、团体膳食监控、餐厅分析、菜谱管理、菜品管理、食物成分管理和营养数据可视化。管理员可按人员、部门、项目、日期等维度查看膳食营养分析，并根据采购文件要求在正式投标附件中补充产品测试检测报告或检验报告。",
        "",
        "策略与设备方面，系统支持消费策略、消费限制、餐别和就餐时段设置，可管理远程菜品推送、电子价签、电子菜牌、档口设备、称重终端、消费设备及人脸设备。系统支持设置不同餐别、消费次数、最高/最低消费金额、称重上限、低金额禁止绑盘、自动结算和手动解绑等能力。",
        "",
        "### 7.4 手机端系统",
        "",
        "手机端面向职工和就餐用户，支持微信扫码、支付宝、小程序等入口，提供账号密码和手机号验证码等登录方式。用户可在手机端查看现金账户和补贴账户余额、充值、提现、账单明细和动态消费二维码，并在线完成订餐、订单查看、订单评价等操作。",
        "",
        "健康管理方面，手机端支持用户基础身体信息、疾病史、运动习惯、食物过敏史、忌口和口味偏好录入；支持手动录入和智能设备同步饮食、体重、体脂等数据；支持营养日报、阶段营养报告、目标体重、体重管理计划和饮食建议展示。涉及营养日报、阶段报告、体重管理、人脸安全、营养膳食管理系统软著等要求，正式投标时需配套提供检测报告、检验报告和软著证书复印件。",
        "",
        "### 7.5 智能称重设备方案",
        "",
        "智能称重设备用于自助式取餐计重和营养数据采集。设备应支持快速识别餐盘及用餐者信息，读取菜品、重量、价格和营养信息，并将消费数据、营养数据同步至智慧食堂管理系统。系统支持菜品营养数据显示，包含能量、蛋白质、脂肪、碳水化合物等核心营养素，并可结合人员基本信息展示摄入建议。",
        "",
        "设备侧支持断网离线模式，在网络异常时保留本地基础数据和订单记录，网络恢复后自动同步。异常处理方面，支持余额不足、托盘未绑定、未放置托盘、压秤等异常场景的声光报警和界面提示，支持防逃费策略、首次重量变化策略和压秤报警时长配置。正式投标前需确认最终设备品牌型号、称重范围、精度、屏幕、CPU、系统版本、接口和功能截图。",
        "",
        "### 7.6 智能绑盘机方案",
        "",
        "智能绑盘机用于建立用户身份与托盘身份之间的临时绑定关系，支持人脸、卡、条形码、二维码等多种识别方式。设备应支持人员名单、人脸照片、卡片数据同步，支持托盘绑定方式配置、托盘录入、读卡器和扫码器参数维护，以及服务器配置、设备配置、服务启停等运维功能。",
        "",
        "在业务流程上，用户通过人脸、卡或二维码完成身份识别后，将托盘放置在识别区域，系统读取托盘身份并与用户身份绑定。绑定成功后，用户可在称重区按菜品取餐，称重设备自动识别托盘、菜品、重量和营养数据，形成可结算订单。用餐结束或到达自动解绑条件后，系统完成订单结算和托盘释放，提高托盘周转效率。",
        "",
        "### 7.7 档口消费、小卖部消费与称重消费",
        "",
        "档口消费设备和小卖部消费设备用于补充称重场景外的固定金额消费、商品消费、订餐取餐和小卖部售卖场景。设备支持刷卡、人脸、二维码消费，支持断网收银、语音播报、订单查询、退款管理、商品分类、促销、报表查询等能力。称重消费机用于需要电子秤计量的商品售卖和称重结算场景，支持人脸、卡、二维码认证及电子秤数据采集。",
        "",
        "上述终端交易数据统一汇入后台订单中心，形成支付用户、就餐餐别、订单商品、消费重量、原价、优惠价、实收金额、门店、餐别类型等明细数据，支撑采购文件要求的订单明细统计和实时钱包查询。",
        "",
        "### 7.8 利旧设备对接方案",
        "",
        "采购文件明确提出现有称重称7台、扫码盘子100个需与新系统对接或原价收回。针对该要求，我方建议采用“先核验、再联调、后确认”的利旧策略：",
        "",
        "1. 现场核验现有称重称品牌、型号、通讯协议、接口方式、称重精度、设备状态和维保情况。",
        "2. 核验扫码盘编码规则、材质、码制、可读性、耐用性和与新系统托盘身份体系的兼容性。",
        "3. 如设备协议开放且满足稳定性要求，优先纳入新系统联调；如协议不开放或稳定性不足，则提出替换或回收建议。",
        "4. 利旧设备纳入试运行验证，重点测试识别速度、称重精度、断网同步、订单一致性和异常恢复。",
        "5. 对无法利旧的设备，按采购人确认的回收或替换方案执行。",
        "",
        "### 7.9 接口开放与系统集成方案",
        "",
        "系统预留标准接口能力，可按采购人要求与医院HIS系统、营养管理系统、院内门禁管理系统、院内停车管理系统等进行对接。接口对接遵循“边界清晰、数据授权、联调验证、验收留痕”的原则。",
        "",
        "接口对接前置条件包括：采购人或第三方系统提供接口文档、测试环境、测试账号、字段字典、数据权限、网络访问策略、联调联系人和验收标准。标准接口范围可覆盖人员信息、身份权限、账户余额、消费订单、菜品菜谱、营养数据、设备状态和就餐权限等。超出标准接口范围的非标开发、深度改造或第三方系统配合事项，应由双方另行确认范围、周期和责任。",
        "",
        "### 7.10 数据安全与权限管理",
        "",
        "系统采用账号、角色、权限和操作留痕机制，支持按岗位配置不同功能权限。后台管理采用细粒度RBAC权限模型，区分系统管理员、后勤运营、财务审核、档口人员、营养管理人员、只读查看人员等角色。涉及人脸、健康信息、消费记录和营养数据的功能，应遵循最小必要、授权使用、分级可见和审计留痕原则。",
        "",
        "## 八、项目实施方案",
        "",
        md_table(["阶段", "工作内容", "关键动作", "交付物"], implementation_rows),
        "",
        "实施计划说明：本项目具体实施周期应结合设备到货、现场条件、网络环境、数据准备和接口开放情况由双方确认。建议在合同签订并具备现场条件后，按项目启动、现场勘查、软硬件部署、接口联调、试运行、培训验收的顺序推进。",
        "",
        "## 九、质量、安全、测试与培训方案",
        "",
        "### 9.1 质量保障",
        "",
        "我方将建立项目负责人统一协调机制，按采购文件要求对设备到货、安装调试、系统配置、接口联调、功能测试、试运行和验收资料进行全过程管理。对设备品牌、型号、配置、数量、外观、安装质量、称重精度、识别速度、订单准确性、营养数据展示和后台报表进行逐项核验。",
        "",
        "### 9.2 安全保障",
        "",
        "现场施工过程中遵守采购人现场管理要求，做好用电、布线、设备搬运、人员进出、施工区域保护和数据安全管理。系统上线前对账号权限、默认密码、测试账号、接口权限、日志留存和数据备份进行检查，防止未授权访问和敏感数据泄露。",
        "",
        "### 9.3 测试验收",
        "",
        "测试内容包括：人员导入、卡务、人脸、二维码、托盘绑定、称重取餐、档口消费、小卖部消费、订单同步、退款、补贴、报表、营养日报、团体膳食分析、设备离线同步、压秤报警、防逃费、自动结算、手动解绑、接口联调和权限控制。测试发现问题形成问题清单，明确责任人、修复措施和复测结果。",
        "",
        "### 9.4 培训方案",
        "",
        "培训对象包括系统管理员、财务/后勤人员、档口人员、运维人员和必要的一线服务人员。培训内容包括后台基础数据维护、卡务和账户管理、补贴发放和审核、订单查询和退款、报表导出、菜品和营养维护、设备日常操作、异常处理、售后报修流程和常见问题处理。",
        "",
        "## 十、售后服务及质保承诺",
        "",
        "我方承诺本项目产品质保期不低于1年，自产品验收合格之日起计算。质保期内出现非人为破坏或不可抗力造成的质量问题，由我方负责免费维修或更换。质保期满后，如出现设备故障，我方将及时、优惠提供所需备品备件和技术服务。",
        "",
        "我方提供7*24小时技术咨询服务。电话支持不能排除故障时，将按采购文件要求派工程师携带有关备件提供现场维修，现场响应时间按采购文件要求执行。实际维修中如出现现场维修困难，将提供不低于所购设备同档次的新设备或模块进行替换，直至系统恢复正常运行。",
        "",
        "售后服务内容包括：系统问题咨询、设备故障处理、软件升级、数据备份建议、日常巡检建议、操作培训补充、重大问题应急响应、备品备件协调和质保期内维护记录归档。",
        "",
        "## 十一、类似业绩",
        "",
        "为响应采购文件“近3年已完成智慧食堂类似项目业绩”评分要求，建议从以下历史项目中筛选可外发且证据完整的项目作为正式附件。正式投标前必须补合同、验收证明或客户授权材料。",
        "",
        md_table(["序号", "候选项目", "相关性", "资料来源", "外发状态"], case_rows),
        "",
        "## 十二、附件清单、补证清单与人工审核清单",
        "",
        "### 12.1 附件清单",
        "",
        md_table(["编号", "附件名称", "用途", "当前状态"], attachment_rows),
        "",
        "### 12.2 补证清单",
        "",
        md_table(["编号", "缺口", "原因", "处理动作", "优先级"], gap_table_rows),
        "",
        "### 12.3 人工审核清单",
        "",
        "正式递交前，建议按以下清单逐项审核：",
        "",
        "1. 报价总价是否不超过15万元含税预算，大小写金额是否一致。",
        "2. 分项报价是否包含设备费、运输费、包装费、调试费、配套软件、系统及程序对接、持续优化接口、维保费等全部费用。",
        "3. 营业执照、信用截图、承诺函、法定代表人身份证明、授权委托书是否齐全并盖章。",
        "4. 检测报告、检验报告、软著证书是否与采购文件要求的功能项逐项对应。",
        "5. 硬件品牌型号、厂家授权、参数截图或说明是否与技术响应表一致。",
        "6. 类似业绩是否在2023年9月1日至今范围内，且证明材料可外发。",
        "7. 接口开放和免费二次开发范围是否限定清楚，避免无限承诺。",
        "8. 4小时到场、7*24响应、备品备件库是否有服务资源支撑。",
        "9. 商务响应和技术响应偏离说明表是否无负偏离。",
        "10. 全文是否无内部路径、RAG、历史标书、待确认等不应外发字样。",
        "",
        "## 十三、主要参考资料",
        "",
        md_table(["排名", "参考资料", "用途"], selected_refs),
        "",
        "## 版本备注",
        "",
        f"- 生成时间：{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}",
        "- 技能路由：find-skills -> docx -> output-format-preferences -> team-document-review-learning-loop",
        "- 证据来源：采购文件、桌面 ChatGPT 资料包、历史标书 RAG 筛选索引、项目内智慧食堂控标参数和方案材料。",
    ]
    return "\n".join(lines) + "\n"


def create_docx(markdown: str, docx_path: Path) -> None:
    doc = Document()
    section = doc.sections[0]
    section.page_width = Cm(21)
    section.page_height = Cm(29.7)
    section.top_margin = Cm(2.2)
    section.bottom_margin = Cm(2.0)
    section.left_margin = Cm(2.4)
    section.right_margin = Cm(2.2)

    styles = doc.styles
    styles["Normal"].font.name = "微软雅黑"
    styles["Normal"]._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
    styles["Normal"].font.size = Pt(11)
    for name, size in [("Heading 1", 16), ("Heading 2", 14), ("Heading 3", 12)]:
        style = styles[name]
        style.font.name = "微软雅黑"
        style._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
        style.font.size = Pt(size)
        style.font.bold = True

    cover = doc.add_paragraph()
    cover.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = cover.add_run(TITLE)
    run.bold = True
    run.font.name = "微软雅黑"
    run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
    run.font.size = Pt(22)
    doc.add_paragraph("")
    for line in [f"采购人：{PURCHASER}", f"供应商：{SUPPLIER}", f"日期：{DOC_DATE}", "版本：内部草案，正式递交前需人工复核"]:
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        r = p.add_run(line)
        r.font.name = "微软雅黑"
        r._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
        r.font.size = Pt(13)
    doc.add_page_break()

    lines = markdown.splitlines()
    i = 0
    while i < len(lines):
        line = lines[i]
        if not line.strip():
            i += 1
            continue
        if line.startswith("# "):
            i += 1
            continue
        if line.startswith("## "):
            doc.add_heading(line[3:].strip(), level=1)
        elif line.startswith("### "):
            doc.add_heading(line[4:].strip(), level=2)
        elif line.startswith("> "):
            p = doc.add_paragraph(line[2:].strip())
            p.paragraph_format.left_indent = Cm(0.4)
            for run in p.runs:
                run.italic = True
                run.font.color.rgb = RGBColor(100, 100, 100)
        elif line.startswith("| "):
            block = []
            while i < len(lines) and lines[i].startswith("| "):
                block.append(lines[i])
                i += 1
            add_markdown_table(doc, block)
            continue
        elif line[:2].isdigit() and ". " in line[:5]:
            p = doc.add_paragraph(line.strip(), style=None)
            p.paragraph_format.left_indent = Cm(0.4)
        else:
            doc.add_paragraph(line.strip())
        i += 1

    for section in doc.sections:
        footer = section.footer.paragraphs[0]
        footer.alignment = WD_ALIGN_PARAGRAPH.CENTER
        footer.text = "国家康复辅具研究中心智慧餐厅称重系统改造投标响应文件（草案）"

    doc.save(docx_path)


def add_markdown_table(doc: Document, block: list[str]) -> None:
    rows = []
    for line in block:
        cells = [c.strip().replace("<br>", "\n") for c in line.strip().strip("|").split("|")]
        if all(c == "---" for c in cells):
            continue
        rows.append(cells)
    if not rows:
        return
    table = doc.add_table(rows=len(rows), cols=len(rows[0]))
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    table.style = "Table Grid"
    for r_idx, row in enumerate(rows):
        for c_idx, cell_text in enumerate(row):
            cell = table.cell(r_idx, c_idx)
            cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
            cell.text = ""
            p = cell.paragraphs[0]
            run = p.add_run(cell_text)
            run.font.name = "微软雅黑"
            run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
            run.font.size = Pt(9)
            if r_idx == 0:
                run.bold = True
                shade_cell(cell, "D9EAF7")
    doc.add_paragraph("")


def shade_cell(cell, fill: str) -> None:
    tc_pr = cell._tc.get_or_add_tcPr()
    shd = OxmlElement("w:shd")
    shd.set(qn("w:fill"), fill)
    tc_pr.append(shd)


def create_review_html(markdown: str, html_path: Path) -> None:
    gap_rows = read_csv_dict(MATRIX_DIR / "evidence-gap-list.csv")
    risk_items = [
        "最终报价和税率未确认，不能直接外发。",
        "检测报告、检验报告、软著证书、厂家授权和信用截图需要补附件。",
        "HIS、营养管理、门禁、停车等接口必须限定对方开放接口、提供文档和联调环境。",
        "4小时到场承诺需要服务负责人确认本地资源。",
        "历史项目案例需确认外发授权和证明材料。",
        "正式递交前必须删除内部草案、RAG、待确认等提示文字。",
    ]
    gap_cards = "\n".join(
        f"<tr><td>{html.escape(r['id'])}</td><td>{html.escape(r['gap'])}</td><td>{html.escape(r['owner_action'])}</td><td>{html.escape(r['priority'])}</td></tr>"
        for r in gap_rows
    )
    risks = "\n".join(f"<li>{html.escape(item)}</li>" for item in risk_items)
    html_text = f"""<!doctype html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <title>投标响应文件草案人审页</title>
  <style>
    body {{ margin: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei", sans-serif; background: #f6f7f9; color: #1f2933; }}
    header {{ background: #12324a; color: white; padding: 32px 48px; }}
    main {{ max-width: 1120px; margin: 0 auto; padding: 28px 32px 56px; }}
    h1 {{ margin: 0 0 10px; font-size: 28px; }}
    h2 {{ margin-top: 28px; font-size: 20px; }}
    .meta {{ color: #d8e4ee; line-height: 1.7; }}
    .grid {{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-top: 18px; }}
    .card {{ background: white; border: 1px solid #d9e1e8; border-radius: 8px; padding: 16px; }}
    .card strong {{ display: block; font-size: 24px; margin-bottom: 4px; color: #12324a; }}
    table {{ width: 100%; border-collapse: collapse; background: white; border: 1px solid #d9e1e8; }}
    th, td {{ padding: 10px 12px; border-bottom: 1px solid #e6edf2; text-align: left; vertical-align: top; }}
    th {{ background: #e8f1f8; }}
    li {{ margin: 8px 0; }}
    .warn {{ border-left: 4px solid #b45309; background: #fff7ed; padding: 14px 16px; }}
    .ok {{ border-left: 4px solid #047857; background: #ecfdf5; padding: 14px 16px; }}
    a {{ color: #0f5f8f; }}
  </style>
</head>
<body>
  <header>
    <h1>国家康复辅具研究中心智慧餐厅称重系统投标响应文件草案</h1>
    <div class="meta">人审页 | 生成时间：{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} | 正式递交前必须补证和商务复核</div>
  </header>
  <main>
    <section class="grid">
      <div class="card"><strong>15万</strong>采购预算含税，报价不得超过</div>
      <div class="card"><strong>90日</strong>投标有效期要求</div>
      <div class="card"><strong>4小时</strong>现场维修到达要求需确认资源</div>
    </section>

    <h2>已生成文件</h2>
    <div class="ok">
      <p>Markdown 真源、Word 草案和本 HTML 人审页已生成。Word 可继续编辑，但正式外发前必须删除“待确认/草案/内部”字样并补附件。</p>
    </div>

    <h2>高风险人工审核项</h2>
    <div class="warn">
      <ul>{risks}</ul>
    </div>

    <h2>补证清单</h2>
    <table>
      <thead><tr><th>编号</th><th>缺口</th><th>处理动作</th><th>优先级</th></tr></thead>
      <tbody>{gap_cards}</tbody>
    </table>

    <h2>建议审核顺序</h2>
    <ol>
      <li>商务先确认总价、税率、付款条件和质保/售后承诺。</li>
      <li>产品/硬件负责人确认设备品牌型号、参数、利旧设备兼容性和厂家授权。</li>
      <li>投标负责人补营业执照、信用截图、软著、检测报告、类似业绩证明。</li>
      <li>研发/交付确认 HIS、营养管理、门禁、停车接口的免费开发边界。</li>
      <li>最后统一检查盖章、签字、页码、目录、封装和送达时间。</li>
    </ol>
  </main>
</body>
</html>
"""
    html_path.write_text(html_text, encoding="utf-8")


def zip_outputs(paths: list[Path], zip_path: Path) -> None:
    if zip_path.exists():
        zip_path.unlink()
    with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED) as zf:
        for p in paths:
            zf.write(p, p.name)


def write_summary(md_path: Path, docx_path: Path, html_path: Path, zip_path: Path) -> None:
    summary = f"""# 国家康复辅具研究中心智慧餐厅称重系统投标材料生成记录

## 输出文件

- Markdown 真源：`{md_path}`
- Word 草案：`{docx_path}`
- HTML 人审页：`{html_path}`
- 桌面交付 ZIP：`{zip_path}`

## 技能路由

按用户要求先通过 `find-skills` 路由，确认本地使用：

- `find-skills`：查找并确认技能组合。
- `docx`：生成 Word 投标响应文件。
- `output-format-preferences`：Markdown 真源、HTML 人审页、DOCX 交付。
- `team-document-review-learning-loop`：保留 AI 可读记录和人审入口。

## 人工门禁

- 报价、税率、付款条件、质保和 4 小时到场需要商务/服务负责人确认。
- 营业执照、信用截图、检测报告、检验报告、软著、厂家授权、类似业绩证明需要补附件。
- HIS、营养管理、门禁、停车接口对接必须限定接口开放、联调环境和验收标准。
- 正式递交前必须删除“草案、待确认、RAG、内部”等字样。
"""
    (WORK_DIR / "bid-response-draft-summary.md").write_text(summary, encoding="utf-8")


def main() -> None:
    ensure_dirs()
    copy_inputs()

    markdown = build_markdown()
    md_path = DELIVERABLE_DIR / "rehab-aids-weighing-system-bid-response-draft.md"
    docx_path = DELIVERABLE_DIR / "rehab-aids-weighing-system-bid-response-draft.docx"
    html_path = REVIEW_DIR / "rehab-aids-weighing-system-bid-review.html"
    zip_path = Path("/Users/jack/Desktop/rehab-aids-weighing-system-bid-response-draft-20260614.zip")

    md_path.write_text(markdown, encoding="utf-8")
    create_docx(markdown, docx_path)
    create_review_html(markdown, html_path)
    zip_outputs([md_path, docx_path, html_path, MATRIX_DIR / "requirement-response-matrix.csv", MATRIX_DIR / "evidence-gap-list.csv"], zip_path)
    shutil.copy2(docx_path, Path("/Users/jack/Desktop/rehab-aids-weighing-system-bid-response-draft.docx"))
    shutil.copy2(html_path, Path("/Users/jack/Desktop/rehab-aids-weighing-system-bid-review.html"))
    write_summary(md_path, docx_path, html_path, zip_path)


if __name__ == "__main__":
    main()
