from __future__ import annotations

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


PERIOD_START = "2026-08-03"
PERIOD_END = "2026-08-07"
PERIOD_LABEL = "20260803-20260807"
ISO_WEEK = "2026-W32"

SYNC_WEEKLY = Path("/Users/jack/同步空间/cpt/08_商务合作_会议培训_市场资讯/011_市场资讯/智慧食堂/weekly")
ZHCT = Path("/Users/jack/code/010-cpt/008-zhct/zhctprompt")
TENDER = Path("/Users/jack/code/099-github/agency-agents/data/canteen-growth/tender-intelligence")
DEMAND = Path("/Users/jack/code/099-github/agency-agents/customer-demand-mining")

TEAM_OUT = ZHCT / "work/weekly-reports/outputs" / ISO_WEEK
BUNDLE = SYNC_WEEKLY / f"smart-canteen-weekly-package-{PERIOD_LABEL}-bundle"


SOURCES = [
    {
        "id": "S01",
        "name": "盐城市财政局",
        "date": "2026-07-17",
        "url": "https://czj.yancheng.gov.cn/art/2026/7/17/art_20174_34611.html",
        "title": "建湖县秀夫初级中学食堂后勤社会化服务采购公告",
        "note": "投标截止为2026-08-07；预算260万元；约4000名师生、至少67名服务人员、营养师1名。",
        "window": "30天补充，本周截止",
    },
    {
        "id": "S02",
        "name": "章贡区人民政府/区市场监督管理局",
        "date": "2026-06-12",
        "url": "https://www.zgq.gov.cn/zgqxxgk/c115065/202606/7a36771a099b4ca3b126dc9844ba7368.shtml",
        "title": "关于加强食品安全“互联网+AI监管”提案答复",
        "note": "3201户主体接入，123家学校食堂100%接入，23家养老机构食堂全覆盖。",
        "window": "30天外背景，标注为背景",
    },
    {
        "id": "S03",
        "name": "首都之窗/北京日报",
        "date": "2026-07-08",
        "url": "https://www.beijing.gov.cn/fuwu/lqfw/gggs/202607/t20260708_4751808.html",
        "title": "西城区全面推进餐饮业“互联网+AI监管”",
        "note": "重点商圈、养老机构食堂及学校食堂接入；规范正在起草。",
        "window": "30天补充",
    },
    {
        "id": "S04",
        "name": "宣城市市场监督管理局",
        "date": "2026-07-08",
        "url": "https://amr.xuancheng.gov.cn/News/show/1720584.html",
        "title": "全市推广“互联网+AI监管”应用座谈会",
        "note": "8366家主体接入，覆盖学校食堂等重点业态，线上风险处置效率同比提升87%。",
        "window": "30天补充",
    },
    {
        "id": "S05",
        "name": "中央纪委国家监委网站",
        "date": "2026-06-03",
        "url": "https://www.ccdi.gov.cn/toutiaon/202606/t20260603_493965_m.html",
        "title": "提升“校园餐”智能化监管水平",
        "note": "强调数字化采购、互联网+明厨亮灶、16个数据监督模型、数字食堂监管平台。",
        "window": "30天外背景，标注为背景",
    },
    {
        "id": "S06",
        "name": "国家公共资源交易平台",
        "date": "2026-02-12",
        "url": "https://www.ggzy.gov.cn/SIC/web/details.po%3Bjsessionid%3DUR2EpmYZ_e4S9awgowIRpn0y?id=bc4cbf97-b782-4c9b-b006-1b864f2c32e1",
        "title": "关于加快招标投标领域人工智能推广应用的实施意见",
        "note": "2026年底部分省市重点场景全覆盖；涉及招标文件检测、智能辅助评标、围串标识别。",
        "window": "政策背景",
    },
    {
        "id": "S07",
        "name": "深圳市南山区教育局",
        "date": "2026-06-18",
        "url": "https://www.szns.gov.cn/xxgk/bmxxgk/qjyj/qtgk_157913/jypx/tzgg/zbzbgg/content/post_12849617.html",
        "title": "2026-2027学年度南山区公办校（园）食堂大宗食材批量集中采购项目调研公告",
        "note": "以政府采购需求管理办法为依据，先做市场主体需求调查再编制采购需求。",
        "window": "30天外背景",
    },
    {
        "id": "S08",
        "name": "千里马招标网聚合页",
        "date": "2026-07-30",
        "url": "https://wap.qianlima.com/gjxx/103387/index_2703_3.html",
        "title": "南山区食堂大宗食材批量集中采购中标结果聚合",
        "note": "非官方聚合，列出A/B/D等包结果，必须人工回到深圳政府采购平台复核。",
        "window": "30天补充，needs_manual_check",
    },
    {
        "id": "S09",
        "name": "Gigi/JR东日本新闻稿",
        "date": "2026-06-29",
        "url": "https://prtimes.jp/main/html/rd/p/000000344.000045433.html",
        "title": "JREこども食堂实证实验",
        "note": "2026-08-03至08-31实施，使用积分捐赠和数字餐券。",
        "window": "本周开始实施，海外消费洞察",
    },
    {
        "id": "S10",
        "name": "Food Dive",
        "date": "2026-04-02",
        "url": "https://www.fooddive.com/news/food-supply-chain-logistic-hurdles-ai/816479/",
        "title": "How AI is changing food supply chains",
        "note": "食品供应链AI用于预测、库存和物流响应；作为技术趋势背景。",
        "window": "背景洞察",
    },
    {
        "id": "S11",
        "name": "智慧食堂网/服务商官网",
        "date": "2026-07-09",
        "url": "https://www.mankebao.cn/",
        "title": "智慧食堂系统打造个性化就餐等行业资讯",
        "note": "企业侧素材，仅作竞品/供给端观察，不作为独立市场事实。",
        "window": "30天补充，needs_manual_check",
    },
    {
        "id": "S12",
        "name": "本地招投标流水线",
        "date": "2026-08-07",
        "url": str(TENDER / "runs/2026-32/run-log.json"),
        "title": "tender-intelligence 2026-W32 run-log",
        "note": "本周导入项目0，高价值深挖项目0，已生成组合工作簿。",
        "window": "本地授权流程",
    },
    {
        "id": "S13",
        "name": "本地客户需求挖掘流水线",
        "date": "2026-08-07",
        "url": str(DEMAND / "outputs/requirement_pool/requirement_pool.xlsx"),
        "title": "customer-demand-mining requirement_pool",
        "note": "3项目、14消息、10信号、6需求；inbox全为mock，报告降级为验证数据。",
        "window": "本地授权流程/mock",
    },
]


MARKET_PAGES = [
    ("封面", "《2026年第32周智慧食堂市场资讯简报》\n\n覆盖周期：2026-08-03 至 2026-08-07\n\n汇报部门：市场中心\n\n本期说明：本周公开信息不足以支撑全部栏目均为7天内事实，已按规则向前补到最近30天；更早政策与方法类材料仅作背景，不写成当周发生。"),
    ("目录", "1 宏观要闻：政策监管与行业标准\n\n2 行业趋势：项目动态与竞品信息\n\n3 消费洞察：用户需求与运营趋势\n\n4 来源与待确认边界"),
    ("PART 01 宏观要闻｜政策监管与行业标准", "本周的监管主线不是单点设备采购，而是“食堂关键场所接入、AI识别、线上巡查、整改闭环、供应链透明”五件事正在被政府采购和市场监管共同推动。"),
    ("学校食堂后勤服务采购继续细化人员与营养岗位要求", "盐城市财政局7月17日发布建湖县秀夫初级中学食堂后勤社会化服务采购公告，投标截止落在本周五2026年8月7日。项目预算260万元，服务对象约4000名在校就餐师生，采购需求明确不少于67名食堂日常工作人员，并要求管理人员中设置营养师岗位。\n\n这类采购并不直接采购智慧食堂系统，但它反映出学校食堂外包服务正在从“有人做饭”走向“人员配比、岗位职责、社保合规、服务量化考核”并重。对智慧食堂服务商而言，劳务外包项目会天然需要考勤、岗位排班、食品安全台账、菜谱营养、用餐人数变化和服务质量评价数据。\n\n该项目释放出校园食堂管理采购从单纯劳务转向“运营服务+数字证据+营养管理”的趋势。来源：盐城市财政局，发布时间：2026-07-17，本周截止。"),
    ("区县级AI监管进入学校、养老与社区食堂全覆盖阶段", "章贡区市场监督管理局在6月12日公开答复政协提案时披露，区内已有3201户食品经营主体接入“互联网+AI监管”平台，占在产在营经营主体的46.9%；123家学校食堂已全部接入，23家养老机构食堂实现全覆盖，13家社区幸福食堂完成接入。\n\n这说明“互联网+AI监管”已从示范点建设进入区县级铺开阶段。监管对象不再只覆盖社会餐饮，也把学校、养老、社区幸福食堂等公共后勤场景纳入优先接入范围。后续建设重点会从装摄像头转向点位质量、识别准确率、处置闭环、运营商协同和主体培训。\n\n该政策释放出重点食堂场景优先接入AI食安监管平台的趋势。来源：章贡区人民政府，生成日期：2026-06-12；因超出30天，作为背景使用。"),
    ("北京西城推动“互联网+AI监管”制度化", "首都之窗7月8日转载报道显示，西城区市场监管局通过餐饮后厨摄像头接入“互联网+AI监管”平台，实现食材存储、加工、清洗消毒、后厨卫生、有害生物防治等环节的可视化和非接触监管。学校食堂、养老机构食堂已接入平台，西城区还在起草工作规范。\n\n这一动态的重点是制度化。AI识别未戴工帽、抽烟、鼠患活动等问题只是入口，真正的产品要求是预警、推送、处置、反馈、核查的证据链能够被监管方复查。智慧食堂厂商如果只提供视频接入，难以满足下一阶段非现场执法和常态巡查需求。\n\n该政策释放出AI食安监管从“技术试点”转向“工作规范”的趋势。来源：首都之窗/北京日报，发布时间：2026-07-08。"),
    ("宣城用运营商协同推进AI监管规模接入", "宣城市市场监管局7月8日召开全市推广“互联网+AI监管”应用工作座谈会，参会方包含各县市区局以及电信、移动、联通等通信运营商。官方披露，截至2026年7月6日，全市已接入各类食品生产经营主体8366家，覆盖学校食堂、餐饮连锁等重点业态，线上风险处置效率同比提升87%。\n\n这说明平台建设不只是软件项目，还依赖运营商网络、视频接入、设备运维和线下宣贯。对智慧食堂服务商而言，项目能力要覆盖“装得上、看得清、识别准、推得动、改得完、查得到”，并能配合监管部门按区域调度。\n\n该政策释放出AI监管项目正在形成“监管部门+运营商+经营主体”协同交付模式的趋势。来源：宣城市市场监督管理局，发布时间：2026-07-08。"),
    ("招投标领域AI政策将影响食堂项目售前方式", "国家公共资源交易平台2月12日发布发改法规〔2026〕195号，提出加快招标投标领域人工智能推广应用，围绕招标策划、文件检测、智能辅助评标、围串标识别等场景推进。虽然该文件不是食堂专项政策，但会影响食堂、后勤、食安监管类采购文件的形成和评审过程。\n\n对智慧食堂服务商而言，后续投标竞争不只看方案写作，还要看参数是否客观可验证、案例证据是否结构化、产品边界是否能被AI辅助审查系统识别。控标参数、硬件型号、软件功能响应、合规承诺和证据附件都需要可追溯台账。\n\n该政策释放出招投标售前资产必须结构化、证据化、机器可读的趋势。来源：全国公共资源交易平台，发布时间：2026-02-12；作为政策背景使用。"),
    ("PART 02 行业趋势｜项目动态与竞品信息", "本周项目侧信号集中在三类：校园食堂服务和食材集中采购继续放量，AI监管平台从接入数转向处置效率，供给端把个性化就餐、成本精细化和后厨管理作为卖点。"),
    ("校园食堂劳务外包要求带出数字运营需求", "建湖县秀夫初级中学采购文件要求食堂服务人数按就餐学生变化同比增减，并对项目负责人、厨师、核算内勤、营养师等岗位提出配置要求。这类条款会让学校更关注“每日就餐人数、岗位排班、营养师履职、服务质量考核”是否有证据。\n\n这背后反映出校园客户的真实需求正在从硬件采购转向运营可控。智慧食堂产品需要把结算、订餐、出勤、菜谱、留样、培训、整改和满意度打通，才能支撑劳务外包质量评价。销售上不能只卖收银机或刷脸设备，而要提供食堂运营管理的数据底座。\n\n来源：盐城市财政局，发布时间：2026-07-17；投标截止：2026-08-07。"),
    ("南山区食材集采从需求调查进入批量采购节奏", "深圳市南山区教育局6月18日发布2026-2027学年度公办校（园）食堂大宗食材批量集中采购项目调研公告，说明采购前先面向市场主体征集意见。千里马聚合页7月30日显示该项目已有多个包的中标结果信息，但该聚合页不是官方结果页，需要回到深圳政府采购平台复核。\n\n这类大宗食材批量采购对智慧食堂的启示在于：校园餐监管正在把采购需求、供应商、折扣、配送、验收和家长监督前置。系统服务商如果能把采购、验收、出入库、留样、菜谱和成本核算接到同一证据链，将更容易进入教育局级监管项目。\n\n来源：深圳市南山区教育局，发布时间：2026-06-18；聚合结果来源：千里马，抓取日期：2026-08-03至08-07，标记needs_manual_check。"),
    ("AI监管从识别违规转向整改闭环效率", "北京西城和宣城的公开材料都把“AI识别”之后的整改闭环作为重点。西城强调监管人员推送整改通知、经营者上传整改结果、执法人员线上核查；宣城披露线上风险处置效率同比提升87%。\n\n这说明智慧监管的采购评价指标会向闭环时效、问题复发率、线上核查留痕、平台使用率、经营主体配合度转移。对产品中心而言，算法模型不是唯一能力，工单、整改、证据、责任人、复查和统计看板同样重要。\n\n来源：首都之窗/北京日报，发布时间：2026-07-08；宣城市市场监督管理局，发布时间：2026-07-08。"),
    ("学校食堂、养老机构与社区食堂形成同平台覆盖场景", "章贡区披露学校食堂、养老机构食堂和社区幸福食堂都在同一食品安全“互联网+AI监管”推进体系内。对厂商而言，这意味着一个区县项目可能跨教育、民政、社区和市场监管多条线，不能只按校园食堂单场景设计。\n\n产品上需要支持多主体、多部门、多角色权限：学校看自查与家长监督，养老机构看照护安全和用餐适配，社区幸福食堂看普惠服务和运营透明，监管部门看风险闭环和覆盖率。解决方案要把行业场景配置化，而不是为每类食堂重做一套。\n\n来源：章贡区人民政府，生成日期：2026-06-12；背景使用。"),
    ("服务商供给端持续包装多场景智慧食堂能力", "满客宝官网近期内容将政企、医院、中学、高校、社区等业态放在同一智慧食堂解决方案框架下，并突出线上预订、自选AI视觉结算、芯片识别、智能称重、自助取餐等前厅能力。该来源属于企业官网，不能当作行业客观统计，但可作为供给端话术观察。\n\n供给端的变化是“硬件点位”被包装为“场景组合”。客户实际购买时更关注旧食堂改造、排队效率、成本精细化、个性化就餐和后厨管理。康比特销售材料应避免只列功能，而要按客户类型解释为什么这些能力能降低运营成本和交付风险。\n\n来源：满客宝官网，抓取日期：2026-08-07；企业侧来源，标记为竞品/供给端观察。"),
    ("数字餐券让儿童食堂从公益活动变为可运营模型", "Gigi与JR东日本相关方6月29日发布新闻稿，宣布在2026年8月3日至8月31日期间开展“JREこども食堂”实证实验，使用JRE POINT积分捐赠并通过“こどもごちめし”机制发放数字食事券。\n\n虽然这是日本场景，但对社区食堂和老年助餐有借鉴意义：补贴、公益、企业积分和线下餐饮门店可以通过数字券形成可核销、可追踪、可复盘的运营模型。智慧食堂系统如果进入社区和普惠助餐，需要具备补贴账户、核销、门店结算、用餐资格、使用频次和资金流向管理能力。\n\n来源：PR TIMES/Gigi，发布时间：2026-06-29；实施开始：2026-08-03。"),
    ("食品供应链AI从预测销售扩展到反馈驱动供应", "Food Dive 4月2日报道提到，食品企业使用AI预测销售、库存和物流异常，CookUnity将预测准确率从约50%-60%提升到80%-90%，并用AI扫描用户反馈反哺供应链决策。该材料不是团餐本土新闻，但代表餐饮供应链AI应用方向。\n\n智慧食堂采购和库存管理可以借鉴这一逻辑：用历史订单、菜品销量、天气、菜单、节假日、满意度和库存数据预测采购量，减少浪费和缺货。客户需求会从“能出库存报表”升级为“能给采购建议、能解释异常、能复盘浪费”。\n\n来源：Food Dive，发布时间：2026-04-02；作为技术趋势背景。"),
    ("校园餐监管从食安扩展到资金和采购透明", "中央纪委国家监委网站6月3日文章强调，校园餐治理正在用数字化采购、食材管理、财务管理、互联网+明厨亮灶等子平台强化监管，还提到部分地区建立数据监督模型识别异常。该来源虽超出30天，但可作为政策延续背景。\n\n这对智慧食堂产品提出了更高要求：仅有食品安全视频监管不够，采购价格、供应商评价、出入库、消费、补贴、财务和家长公开也要形成数据闭合。校园场景的核心购买理由可能不是“更智能”，而是“资金、食材、过程可监督”。\n\n来源：中央纪委国家监委网站，发布时间：2026-06-03；背景使用。"),
    ("AI招投标政策倒逼售前证据资产标准化", "发改法规〔2026〕195号提出AI辅助招标策划、需求生成、文件检测和评标等方向。对智慧食堂行业而言，这会影响采购文件如何写、评分点如何设、技术偏离如何判断、案例和证书如何被查验。\n\n招投标团队下一步需要把产品BOM、软件需求、项目案例、公司资质、合规承诺、价格策略和证据路径拆成独立维度工作簿。否则即使销售机会增加，也会因为材料不可追溯、参数不可证明、承诺边界不清而降低赢单质量。\n\n来源：全国公共资源交易平台，发布时间：2026-02-12；政策背景。"),
    ("PART 03 消费洞察｜用户需求与运营趋势", "消费与运营侧本周最稳定的信号是：管理方要求透明、家长和员工要求可感知，运营方要求降本和少浪费，监管方要求证据闭环。"),
    ("校园餐用户关心点从“吃饱”转向“透明、营养、可追溯”", "校园餐相关政策和案例共同显示，家长和监管方关注菜单、食材来源、采购价格、食品加工过程、留样、学生消费记录与营养摄入。文县等公开报道中出现“带价带量公开”“家长手机查看消费记录和营养摄入分析”等做法，说明用户可感知数据正在成为校园餐信任基础。\n\n对智慧食堂产品而言，家长端不应只是展示菜谱，还要能解释餐费怎么花、食材从哪里来、孩子吃了什么、是否符合营养建议。销售方案应把“家长信任”和“监管省心”作为校园版买点，而不是只讲前端支付效率。\n\n来源：公开校园餐治理报道与本期政策背景；涉及具体地方报道需回到原始政务源复核。"),
    ("食堂运营方更需要预测与成本精细化", "食品供应链AI报道与国内服务商供给端内容都指向同一类需求：食堂运营方希望减少采购浪费、库存积压和高峰期供需错配。随着食材价格、人工和配送成本变化，单纯记账型系统难以支撑管理决策。\n\n下一阶段的智慧食堂产品应把订单、菜品销量、库存、采购、损耗、满意度和预算放在同一经营分析模型里，先给出可解释的异常和建议，再进入自动化采购。内部产品机会是把本周“经营分析demo线”与食堂真实数据看板打通，形成对销售和QBR有用的标准资产。\n\n来源：Food Dive，发布时间：2026-04-02；满客宝官网，抓取日期：2026-08-07。"),
    ("AI监管的用户体验关键在少打扰、快整改", "西城区报道中，经营者反馈线上巡查能在用餐高峰发现问题并电话提醒，既不干扰日常经营，又可避免风险扩大。这个表述说明监管数字化的接受度取决于是否帮助经营主体降低处罚风险，而不是单向增加监控压力。\n\n智慧食堂食安模块要把“提醒可操作、整改可上传、复查可留痕、严重问题可升级”设计为体验闭环。对学校、医院、养老机构等高敏感场景，系统还需要区分轻微问题、重大隐患和违法线索，避免把所有预警都变成噪音。\n\n来源：首都之窗/北京日报，发布时间：2026-07-08。"),
    ("社区与普惠助餐需要补贴核销和资金透明", "JRE儿童食堂实证实验说明，公益食堂和社区助餐可以通过积分捐赠、数字食事券和线下门店核销形成可追踪机制。国内社区幸福食堂和老年助餐同样会面临补贴发放、资格核验、就餐核销、商户结算和资金审计问题。\n\n这类场景不一定先买智能结算硬件，但会需要一套低门槛、可审计、可复用的“补贴餐/公益餐数字券”能力。它可跨智慧食堂、社区食堂和员工福利餐使用，是一个可进入存量客户增购/QBR的话题。\n\n来源：PR TIMES/Gigi，发布时间：2026-06-29；实施开始：2026-08-03。"),
    ("THANKS", "本期简报坚持事实可追溯：周内信息不足部分已按规则向前补充，并在来源表中标记日期、来源属性和待复核边界。\n\n下一步建议：销售侧优先验证学校食堂劳务外包与食材集采项目中的数字化附加需求；产品侧优先沉淀AI监管整改闭环、校园监管报表和经营分析QBR demo。"),
]


TEAM_ITEMS = [
    ("产品蓝图", "康比特数字产品蓝图与版本迭代规划完成内部评审稿和外发版，核心判断是先冻结标准产品、行业/客户配置、专项定制三层边界。", "work/2026-08-07-product-blueprint-version-roadmap/product-blueprint-version-roadmap.md", "B"),
    ("交付目标管理", "交付实施部目标落地管理体系V2.0完成4张表、44个字段、5项领导指标和企微在线空表，下一步4个真实项目试运行。", "work/2026-08-07-delivery-department-operating-system-v2/summary.md", "B"),
    ("国康发布治理", "远端新增国康医院导出目录修复和近期变更发布收敛记录，纳入本周部署治理证据。", "work_guokang_hospital/deployment-records/guokang-recent-changes-release-consolidation-20260807.md", "B"),
    ("项目证据图册", "28项目证据化一项目一图案例图册完成，A/B/C/D证据等级已清理，完整1:1项目仍为0。", "modules/product/products/smart-canteen/product-solutions/2026-08-06-28-project-3d-case-atlas/validation-report.md", "B"),
    ("交付经营体系", "交付实施部经营与项目管控体系完成V1，企微10张子表、178字段回读，业务事实表保持空白。", "work/2026-08-06-delivery-department-operating-system/summary.md", "B"),
    ("营销信息图", "AI营养智慧食堂两版营销信息图升级，5项能力和5+2能力版完成OSS外链验证。", "work/2026-08-06-smart-canteen-marketing-infographics/visual-review-learning.md", "B"),
    ("硬件仓库", "智能硬件Android Codeup 15仓库统一纳管，路径、分支、上游关系和工作树清洁度完成验证。", "work_android/hardware-systemization/2026-08-06-codeup-repository-consolidation/summary.md", "B"),
    ("源码路径收敛", "zhctproject正式根目录收敛完成，历史旧路径退出活动源码范围，3个本地ahead仓库待人工审查。", "work/2026-08-06-zhctproject-path-consolidation/summary.md", "B"),
    ("QC售前工作台", "QC售前决策与采集工作台PRD完成，尚需拍板产品定位、权威源码和MVP边界。", "modules/product/products/smart-canteen/product-solutions/2026-08-06-qc-sales-decision-workbench/summary.md", "B"),
    ("四项目产品证明", "机场、金斯瑞、赛迪、西康四项目产品能力总结完成，12张微盘现场图只作内部评审。", "modules/product/products/smart-canteen/product-solutions/2026-08-06-four-project-product-proof/four-project-product-proof.md", "B"),
    ("金斯瑞财务问题", "消费订单导出实付金额多算根因确认，生产未修改，需产品/财务确认退款中口径后研发修复。", "work_store/customer-issues/2026-08-06-jsr-consume-order-export-pay-amount-mismatch/issue.md", "B"),
    ("AI PM原型", "智慧食堂5项问题完成AI产品经理需求包与上线评审原型，127本地验收通过，业务生产未上线。", "modules/product/products/smart-canteen/requirements/2026-08-06-issue-to-launch-workbench/validation.md", "B"),
    ("交付PMO", "交付实施部多项目PMO数据驾驶舱和售前转交付启动会确认单完成，仍为演示结构，待真实项目数据接入。", "work/2026-08-05-delivery-pmo-multi-project-management/delivery-pmo-management-blueprint.md", "B"),
    ("经营咨询Brief", "交付成本、招聘困境与AI战略咨询Brief V2完成，分为3个外部咨询和6个内部解决问题。", "work/2026-08-05-delivery-cost-hiring-ai-strategy-consultation/consultation-problem-brief.md", "B"),
    ("项目使用分析", "28项目候选与功能使用分析、五维能力与运营基表、赛迪机场功能使用分析形成多张经营证据基表。", "work/2026-08-04-smart-canteen-five-dimension-base/summary.md", "B"),
    ("登录能力", "QC企微/微信/短信统一登录分支已推送但未合并部署，真实企微/微信/短信联调仍待管理员配置。", "work_qc/qa/2026-08-03-wecom-wechat-sms-login-implementation.md", "B"),
]


def write(path: Path, text: str) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    path.write_text(text, encoding="utf-8")


def html_page(title: str, body: str) -> str:
    return f"""<!doctype html><html lang=\"zh-CN\"><head><meta charset=\"utf-8\"><title>{html.escape(title)}</title>
<style>body{{font-family:-apple-system,BlinkMacSystemFont,'Microsoft YaHei',Arial,sans-serif;margin:0;background:#f6f7f9;color:#111827}}main{{max-width:1180px;margin:0 auto;padding:36px}}section{{background:white;border:1px solid #e5e7eb;border-radius:8px;margin:0 0 18px;padding:24px}}h1{{font-size:30px}}h2{{font-size:22px;color:#ff5011}}p,li{{line-height:1.72}}table{{border-collapse:collapse;width:100%;background:white}}td,th{{border:1px solid #e5e7eb;padding:8px;vertical-align:top}}th{{background:#f3f4f6}}code{{background:#f3f4f6;padding:2px 4px}}</style></head><body><main>{body}</main></body></html>"""


def market_markdown() -> str:
    chunks = []
    for idx, (title, body) in enumerate(MARKET_PAGES, 1):
        chunks.append(f"# 第{idx}页\n【{title}】\n\n{body}\n\n【配图建议】\n- 建议图片1：食堂监管/运营/设备相关真实场景图\n- 建议图片2：监管平台、采购流程或经营分析界面示意\n")
    return "\n---\n\n".join(chunks)


def sources_markdown() -> str:
    lines = [f"# 智慧食堂市场资讯周报来源表_{PERIOD_LABEL}", "", "| ID | 来源 | 日期 | 标题 | URL/证据路径 | 使用边界 |", "| --- | --- | --- | --- | --- | --- |"]
    for s in SOURCES:
        lines.append(f"| {s['id']} | {s['name']} | {s['date']} | {s['title']} | {s['url']} | {s['window']}；{s['note']} |")
    return "\n".join(lines) + "\n"


def team_outputs() -> None:
    TEAM_OUT.mkdir(parents=True, exist_ok=True)
    md_lines = [
        f"# 智慧食堂团队周汇总（{ISO_WEEK}）",
        "",
        f"覆盖周期：{PERIOD_START} 至 {PERIOD_END}",
        "",
        "## 管理层结论",
        "",
        "1. 本周主线从单点项目推进转为标准产品边界、交付经营体系和真实项目证据三条线并行收敛。",
        "2. 产品资产侧形成外发蓝图、营销信息图、四项目证明、28项目证据地图，但仍必须区分内部评审、上线、验收和公开授权。",
        "3. 交付与经营侧已经建立V1/V2管理体系和PMO驾驶舱，下一步关键不是再做模板，而是用城市副中心、国康、滨州、玉溪体校等真实项目连续试运行。",
        "",
        "## 本周事项",
    ]
    for i, (topic, summary, evidence, level) in enumerate(TEAM_ITEMS, 1):
        md_lines.append(f"{i}. **{topic}**：{summary} 证据：`{evidence}`；证据等级：{level}。")
    md_lines += [
        "",
        "## 风险与下周动作",
        "",
        "- 公开传播风险：四项目证明和现场图片当前只适合内部评审，外发前必须完成人脸、工牌、客户授权和屏幕信息复核。",
        "- 标准产品风险：450-LITE、410称重台等硬件型号不得仅凭交付进度写成标准产品承诺，需补SN、BOM、兼容和验收证据。",
        "- 经营试点风险：PMO、交付目标管理和经营分析页面仍是结构化模板，必须接入真实项目连续四周验证。",
        "- 研发闭环风险：金斯瑞财务口径、QC登录联调、QC售前工作台仍有人工拍板或外部配置依赖，不得写成上线完成。",
    ]
    write(TEAM_OUT / "team-weekly-summary.md", "\n".join(md_lines) + "\n")
    body = "<h1>智慧食堂团队周汇总</h1><p>覆盖周期：2026-08-03 至 2026-08-07</p>"
    body += "<section><h2>管理层结论</h2><ol><li>标准产品边界、交付经营体系和真实项目证据并行收敛。</li><li>多个产品资产完成，但公开授权和验收证据仍需分级。</li><li>下周重点是把模板接入真实项目试运行。</li></ol></section>"
    body += "<section><h2>事项清单</h2><table><tr><th>#</th><th>主题</th><th>摘要</th><th>证据</th></tr>"
    for i, (topic, summary, evidence, level) in enumerate(TEAM_ITEMS, 1):
        body += f"<tr><td>{i}</td><td>{html.escape(topic)}</td><td>{html.escape(summary)}</td><td><code>{html.escape(evidence)}</code></td></tr>"
    body += "</table></section>"
    write(TEAM_OUT / "team-weekly-summary.html", html_page("智慧食堂团队周汇总", body))
    with (TEAM_OUT / "team-weekly-items.csv").open("w", newline="", encoding="utf-8-sig") as f:
        w = csv.writer(f)
        w.writerow(["topic", "summary", "evidence_path", "evidence_level", "period"])
        for row in TEAM_ITEMS:
            w.writerow([row[0], row[1], row[2], row[3], f"{PERIOD_START}/{PERIOD_END}"])
    with (TEAM_OUT / "source-index.csv").open("w", newline="", encoding="utf-8-sig") as f:
        w = csv.writer(f)
        w.writerow(["source_id", "source_name", "path", "used_for", "period"])
        for i, row in enumerate(TEAM_ITEMS, 1):
            w.writerow([f"T{i:02d}", row[0], row[2], row[1], f"{PERIOD_START}/{PERIOD_END}"])


def opportunity_ledger(path: Path) -> None:
    rows = [
        ["现金流业务机会", "智慧食堂ToB现金流", "学校食堂后勤服务+营养岗位+量化考核标准包", "S01/2026-07-17/260万元/4000人/67人", "B", "把劳务外包项目拆成运营看板、营养师履职、服务质量考核和食安台账四个可销售模块", "校园食堂运营QBR模板、人员排班和营养报表demo", "需要真实学校项目验证采购方是否愿意为系统单独付费"],
        ["能力杠杆机会", "内部经营复盘/经营分析demo", "AI监管整改闭环+经营分析QBR demo", "S03,S04/2026-07-08/整改闭环+效率提升87%", "B", "用现有项目数据做一个从预警到整改、从订单到采购建议的经营分析样板", "经营分析HTML、QBR话术、监管整改工单模型", "没有客户真实授权前不能对外展示敏感数据"],
        ["现金流业务机会", "存量客户增长/QBR/续约增购", "社区/福利餐数字券和补贴核销能力", "S09/2026-08-03启动/数字餐券实验", "C", "选一个现有客户福利餐或补贴餐场景做轻量核销原型", "补贴餐数字券SKU、核销报表、资金透明话术", "国内支付与补贴资金监管规则需人工确认"],
        ["能力杠杆机会", "售前投标自动化", "招投标证据资产标准化", "S06/2026-02-12/AI招投标政策", "B", "继续强化L0-L7分维工作簿和证据治理，不做混合大表", "投标证据库、BOM/软件需求/评分规则分维模板", "本周本地流水线项目数为0，需补官方来源采集"],
        ["停止/忽略", "线上赚钱业务线", "抖音/微信卖AI token或轻软件", "本任务未发现有效流量/成交/履约证据", "D", "本周只归档，不升级为业务动作", "无", "无买家、SKU、支付和售后证据"],
        ["停止/忽略", "招投标线索", "把聚合页中标信息直接写成项目机会", "S08/聚合来源/needs_manual_check", "D", "必须回到官方采购平台后才能进入项目池", "来源复核清单", "聚合页可能缺公告原文、金额、包号和供应商完整信息"],
    ]
    with path.open("w", newline="", encoding="utf-8-sig") as f:
        w = csv.writer(f)
        w.writerow(["category", "opportunity_line", "opportunity", "evidence_pointer", "reliability", "next_validation", "reusable_asset_candidate", "gap_or_risk"])
        w.writerows(rows)


def update_index_csv() -> None:
    idx = ZHCT / "work/weekly-reports/index.csv"
    idx.parent.mkdir(parents=True, exist_ok=True)
    row = [ISO_WEEK, PERIOD_START, PERIOD_END, "smart-canteen-weekly-business-package", str(TEAM_OUT / "team-weekly-summary.md"), str(TEAM_OUT / "team-weekly-summary.html"), str(TEAM_OUT / "team-weekly-items.csv"), "generated"]
    if idx.exists():
        text = idx.read_text(encoding="utf-8-sig")
        if ISO_WEEK in text:
            return
    else:
        text = "iso_week,start_date,end_date,topic,summary_md,summary_html,items_csv,status\n"
    with idx.open("a", encoding="utf-8") as f:
        if not text.endswith("\n"):
            f.write("\n")
        f.write(",".join(row) + "\n")


def copy_optional(src: Path, dst: Path) -> bool:
    if src.exists():
        dst.parent.mkdir(parents=True, exist_ok=True)
        shutil.copy2(src, dst)
        return True
    return False


def main() -> None:
    SYNC_WEEKLY.mkdir(parents=True, exist_ok=True)
    market_md = SYNC_WEEKLY / f"智慧食堂市场资讯周报_{PERIOD_LABEL}.md"
    market_html = SYNC_WEEKLY / f"智慧食堂市场资讯周报_{PERIOD_LABEL}.html"
    market_sources = SYNC_WEEKLY / f"智慧食堂市场资讯周报_{PERIOD_LABEL}_sources.md"
    write(market_md, market_markdown())
    market_body = "".join(f"<section><h2>第{i}页 {html.escape(t)}</h2>{''.join(f'<p>{html.escape(p)}</p>' for p in b.split(chr(10)+chr(10)))}</section>" for i, (t, b) in enumerate(MARKET_PAGES, 1))
    write(market_html, html_page(f"智慧食堂市场资讯周报_{PERIOD_LABEL}", market_body))
    write(market_sources, sources_markdown())

    team_outputs()
    update_index_csv()

    ledger = SYNC_WEEKLY / f"智慧食堂周度业务包_{PERIOD_LABEL}_opportunity-ledger.csv"
    opportunity_ledger(ledger)

    tender_run = TENDER / "runs/2026-32"
    demand_out = DEMAND / "outputs"
    manifest = {
        "period": {"start": PERIOD_START, "end": PERIOD_END, "iso_week": ISO_WEEK},
        "market": {"pages": len(MARKET_PAGES), "entries": 18, "sources": len(SOURCES), "html_generated": True, "pdf_generated": False},
        "tender": {"project_records": 0, "deep_dive_project_count": 0, "known_budget_yuan": 0, "portfolio": str(tender_run / "00_weekly_portfolio.xlsx")},
        "customer_demand": {"projects": 3, "messages": 14, "signals": 10, "requirements": 6, "high_priority": 1, "acceptance_blockers": 3, "competitor_related": 1, "manual_review": 3, "mock_only": True},
        "team_weekly": {"items": len(TEAM_ITEMS), "sources": len(TEAM_ITEMS), "output_dir": str(TEAM_OUT)},
        "unverified_or_excluded": {"aggregate_tender_leads_not_imported": 1, "mock_requirements_degraded": 6, "background_sources_over_30_days": 4, "total": 11},
    }

    index_md = SYNC_WEEKLY / f"智慧食堂周度业务包_{PERIOD_LABEL}_index.md"
    index_text = f"""# 智慧食堂周度业务包索引_{PERIOD_LABEL}

覆盖周期：{PERIOD_START} 至 {PERIOD_END}（{ISO_WEEK}）

## 输出路径

| Part | 输出 | 路径 | 条目/来源 | 待确认/阻塞 |
| --- | --- | --- | --- | --- |
| A 市场资讯 | Markdown/HTML/sources | `{market_md}` | {len(MARKET_PAGES)}页、18条、{len(SOURCES)}来源 | PDF未生成：本机只有pandoc，缺少xelatex/wkhtmltopdf/weasyprint/typst |
| B 招投标 | L0组合工作簿/公司池/周报 | `{tender_run}` | 0项目、0深挖、0已知预算 | 官方项目未导入，需补来源采集 |
| C 客户需求 | 需求池/周报/backlog/建议 | `{demand_out}` | 3项目、14消息、10信号、6需求 | inbox全为mock，仅验证流水线 |
| D 团队周汇总 | MD/HTML/CSV/source-index | `{TEAM_OUT}` | {len(TEAM_ITEMS)}事项、{len(TEAM_ITEMS)}来源 | 公开授权、硬件验收、真实试运行仍需补证 |
| E 机会总账 | CSV | `{ledger}` | 6条机会/停止项 | 线上赚钱线无有效信号，资金增值线无本任务证据 |

## 下一步建议

1. 销售侧：围绕学校食堂后勤外包、食材集采和AI监管整改闭环做3个可复用话术包。
2. 产品侧：优先沉淀监管报表、整改工单、营养师履职和经营分析QBR demo。
3. 招投标侧：补官方项目采集，不把聚合页或未复核中标信息写入项目池。
4. 团队侧：将交付V2和PMO驾驶舱接入4个真实项目，连续4周记录目标、责任、截止和证据。

## 降级说明

- 市场资讯：周内公开信息不足，按规则向前补到最近30天，超30天来源仅作背景。
- 招投标：本地流程成功但本周项目数为0。
- 客户需求：本周inbox只有mock数据，6条需求均降级为验证输出。
- PDF：未生成。
"""
    write(index_md, index_text)

    if BUNDLE.exists():
        shutil.rmtree(BUNDLE)
    (BUNDLE / "01_market").mkdir(parents=True)
    (BUNDLE / "02_tender_weekly").mkdir(parents=True)
    (BUNDLE / "03_customer_demand").mkdir(parents=True)
    (BUNDLE / "04_team_weekly").mkdir(parents=True)
    for p in [market_md, market_html, market_sources, index_md, ledger]:
        shutil.copy2(p, BUNDLE / p.name)
    for p in [market_md, market_html, market_sources]:
        shutil.copy2(p, BUNDLE / "01_market" / p.name)
    copy_optional(tender_run / "00_weekly_portfolio.xlsx", BUNDLE / "02_tender_weekly/00_weekly_portfolio.xlsx")
    copy_optional(tender_run / "report/weekly-analysis.md", BUNDLE / "02_tender_weekly/weekly-analysis.md")
    copy_optional(tender_run / "report/weekly-analysis.html", BUNDLE / "02_tender_weekly/weekly-analysis.html")
    copy_optional(tender_run / "companies/company-pool-delta.xlsx", BUNDLE / "02_tender_weekly/company-pool-delta.xlsx")
    copy_optional(tender_run / "run-log.json", BUNDLE / "02_tender_weekly/run-log.json")
    for rel in ["requirement_pool/requirement_pool.xlsx", "weekly_reports/weekly_product_report.md", "backlog/product_backlog.csv", "product_suggestions/product_suggestions.csv"]:
        copy_optional(demand_out / rel, BUNDLE / "03_customer_demand" / Path(rel).name)
    for name in ["team-weekly-summary.md", "team-weekly-summary.html", "team-weekly-items.csv", "source-index.csv"]:
        copy_optional(TEAM_OUT / name, BUNDLE / "04_team_weekly" / name)
    write(BUNDLE / "manifest.json", json.dumps(manifest, ensure_ascii=False, indent=2))
    write(BUNDLE / "00_unified_index.md", index_text)
    readme = f"# 先打开这里\n\n- `00_START_HERE.html`：集中包入口\n- `00_unified_index.md`：统一索引\n- `01_market/`：市场资讯\n- `02_tender_weekly/`：招投标\n- `03_customer_demand/`：客户需求\n- `04_team_weekly/`：团队周汇总\n"
    write(BUNDLE / "00_README_START_HERE.md", readme)
    start_body = f"<h1>智慧食堂周度业务包</h1><p>{PERIOD_START} 至 {PERIOD_END}</p><section><h2>核心入口</h2><ul><li>统一索引：00_unified_index.md</li><li>市场资讯：01_market/{market_md.name}</li><li>招投标：02_tender_weekly/00_weekly_portfolio.xlsx</li><li>客户需求：03_customer_demand/requirement_pool.xlsx</li><li>团队周报：04_team_weekly/team-weekly-summary.html</li></ul></section><section><h2>关键统计</h2><p>市场{len(MARKET_PAGES)}页/18条/{len(SOURCES)}来源；招投标0项目；客户需求3项目/14消息/10信号/6需求（mock）；团队{len(TEAM_ITEMS)}事项；PDF未生成。</p></section>"
    write(BUNDLE / "00_START_HERE.html", html_page("智慧食堂周度业务包入口", start_body))
    zip_path = SYNC_WEEKLY / f"smart-canteen-weekly-package-{PERIOD_LABEL}-bundle.zip"
    with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED) as z:
        for p in sorted(BUNDLE.rglob("*")):
            if p.is_file():
                z.write(p, p.relative_to(BUNDLE.parent))

    print(json.dumps({"manifest": manifest, "index": str(index_md), "bundle": str(BUNDLE), "zip": str(zip_path)}, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()
