#!/usr/bin/env python3
"""Build the first human-review daily monitoring package (HTML + XLSX)."""
from pathlib import Path
from openpyxl import Workbook
from openpyxl.styles import Alignment, Font, PatternFill
from openpyxl.utils import get_column_letter

ROOT = Path(__file__).resolve().parents[1]
OUT = ROOT / "docs/final-results/20260727-smart-canteen-monitoring-daily"
XLSX = OUT / "2026-07-27-智慧食堂公开商机监控日报.xlsx"
FONT = "Microsoft YaHei"
rows = [
 ["OPP-20260727-001","强相关 / S01","2026年中国联通枣庄市分公司智慧食堂采购项目","中国联通枣庄市分公司","2026-07-17","待人工确认","预算待人工确认","C","乙方宝公开索引","待人工研判","公开摘要列有智能点餐、人脸识别支付、菜品溯源、营养分析、后台数据管理；未回源。","待分配","1个工作日内回源官方公开采购页，核验范围、截止、预算、资格。"],
 ["OPP-20260727-002","观察 / OBS-学校-食安","学生食堂明厨亮灶改造工程","烟台文化旅游职业学院","2026-07-24","2026-08-05 14:30","预算37.23万元","A","中国政府采购网","观察","学校且工程属性，不满足 S01/S02 主范围；除非出现独立软件采购包。","待分配","仅作观察样本。"],
 ["OPP-20260727-003","剔除 / 非食堂一卡通","东莞市社保卡一卡通智能在线辅助系统开发采购项目","中信银行广州分行","2026-07-21","待人工确认","控制价200万元","A","中信金控采购共享平台","剔除","社保卡居民服务一卡通信创开发，未见食堂/餐饮消费业务边界。","待分配","无需行动；留作排除规则审计样本。"],
]
headers=["机会ID","相关度/场景","项目名称","采购人","公告时间","截止时间","金额口径","证据等级","来源","人工状态","判断理由","负责人","下一步"]
html = '''<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>智慧食堂公开商机监控日报｜2026-07-27</title><style>:root{--ink:#102a43;--muted:#5d7083;--paper:#f4f7f9;--card:#fff;--line:#dce5ea;--teal:#007c75;--amber:#c66a08;--red:#b43b3b;--soft:#e9f5f3}*{box-sizing:border-box}body{margin:0;background:var(--paper);color:var(--ink);font:15px/1.65 "Microsoft YaHei",Arial,sans-serif}main{max-width:1280px;margin:auto;padding:36px 24px 64px}.hero{background:linear-gradient(125deg,#102a43,#17676c);color:white;padding:34px;border-radius:20px;display:grid;grid-template-columns:1.4fr .8fr;gap:24px}.hero h1{font-size:34px;line-height:1.22;margin:4px 0 10px}.hero p{margin:0;max-width:680px;color:#d8eff0}.kicker{color:#a3ebe0;letter-spacing:.1em;font-size:12px;font-weight:700}.run{align-self:center;border-left:1px solid #8dcac7;padding-left:24px;color:#e6f9f7}.statgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:18px 0}.stat{background:var(--card);border:1px solid var(--line);padding:16px;border-radius:14px}.stat b{display:block;font-size:28px;color:var(--teal)}.stat span{color:var(--muted);font-size:13px}section{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:24px;margin-top:18px}h2{font-size:21px;margin:0 0 8px}h3{font-size:16px;margin:18px 0 6px}p{margin:7px 0}.notice{padding:13px 15px;background:#fff5df;border-left:4px solid var(--amber);border-radius:7px}.good{background:var(--soft);border-left-color:var(--teal)}.table-wrap{overflow:auto}table{width:100%;min-width:1030px;border-collapse:collapse;font-size:13px}th{text-align:left;color:var(--muted);font-weight:700;background:#f5f8fa}th,td{padding:11px 10px;border-bottom:1px solid var(--line);vertical-align:top}.tag{font-weight:700}.strong{color:var(--teal)}.observe{color:var(--amber)}.exclude{color:var(--red)}a{color:#006b88}ol{padding-left:20px;margin:8px 0}li{margin:5px 0}@media(max-width:760px){main{padding:18px 12px}.hero{grid-template-columns:1fr;padding:26px}.hero h1{font-size:28px}.run{border-left:0;border-top:1px solid #8dcac7;padding:16px 0 0}.statgrid{grid-template-columns:repeat(2,1fr)}section{padding:18px}}</style></head><body><main><header class="hero"><div><div class="kicker">SC-TENDER-20260727-001 · RULE V1.0</div><h1>智慧食堂公开商机监控日报</h1><p>首轮只读、可回溯、人工决策。S01/S02 主范围与观察池严格分开。</p></div><div class="run"><b>2026-07-27 · Asia/Shanghai</b><br>3 个公开来源实际复跑<br>不登录 · 不付费 · 不执行外部动作</div></header><div class="statgrid"><div class="stat"><b>3</b><span>去重候选</span></div><div class="stat"><b>1</b><span>强相关（待回源）</span></div><div class="stat"><b>1</b><span>观察池</span></div><div class="stat"><b>1</b><span>剔除样本</span></div></div><section><h2>今日判断</h2><p class="notice">未自动进入 Go、投标、报价或客户联系流程。唯一 S01 候选来自公开索引，关键字段尚未回源，当前只能作为人工研判队列。</p><p class="notice good">S02 正向命中为 0；“信创 + 一卡通”出现非食堂社保卡项目，已按硬排除规则剔除。</p></section><section><h2>机会卡与审计字段</h2><div class="table-wrap"><table><thead><tr><th>ID</th><th>相关度/场景</th><th>项目与采购人</th><th>时间/金额</th><th>证据</th><th>判断理由</th><th>负责人和下一步</th></tr></thead><tbody><tr><td>OPP-20260727-001</td><td class="tag strong">强相关 / S01<br>待人工研判</td><td><b>2026年中国联通枣庄市分公司智慧食堂采购项目</b><br>中国联通枣庄市分公司</td><td>公告：2026-07-17<br>截止/预算：待人工确认</td><td>C · <a href="https://www.yfbzb.com/inviteBid/detail/20260717_614948307.html">公开索引</a></td><td>摘要明示智能点餐、人脸识别支付、菜品溯源、营养分析和后台数据管理；原始公告、资格、接口、预算未核。</td><td>待分配<br>1 个工作日内回源中国联通官方公开采购页，核验范围、截止、预算和资格。</td></tr><tr><td>OPP-20260727-002</td><td class="tag observe">观察 / 学校食安</td><td><b>学生食堂明厨亮灶改造工程</b><br>烟台文化旅游职业学院</td><td>公告：2026-07-24<br>截止：2026-08-05 14:30<br>预算：37.23 万元</td><td>A · <a href="https://www.ccgp.gov.cn/cggg/dfgg/jzxcs/202607/t20260724_27007116.htm">官方原公告</a></td><td>学校且工程属性；没有 S01/S02 主范围证据。保留观察，不进入主结论。</td><td>待分配<br>仅在人工确认独立软件采购包时再升级。</td></tr><tr><td>OPP-20260727-003</td><td class="tag exclude">剔除 / 非食堂</td><td><b>东莞市社保卡一卡通智能在线辅助系统开发</b><br>中信银行广州分行</td><td>公告：2026-07-21<br>控制价：200 万元<br>截止：待人工确认</td><td>A · <a href="https://ebid.cfhc.citic/cms/default/webfile/ywgg1/20260721/1264298213368659968.html">官方原公告</a></td><td>社保卡居民服务一卡通信创开发，未显示食堂/餐饮消费业务；防止“信创+一卡通”误判。</td><td>待分配<br>无需行动，作为排除规则审计样本。</td></tr></tbody></table></div></section><section><h2>覆盖、缺口与下轮</h2><div class="statgrid"><div class="stat"><b>3</b><span>实际来源：CCGP、企业公开采购、公开索引</span></div><div class="stat"><b>0</b><span>S02 正向命中</span></div><div class="stat"><b>0</b><span>跨来源重复</span></div><div class="stat"><b>0</b><span>已分配负责人</span></div></div><h3>最大缺口</h3><p>未获批区域/甲方白名单、可复跑的官方企业采购平台清单，以及产品、资质、案例、接口能力台账。因此本日报只做发现与排序，不能形成资格或报价结论。</p><h3>需要 Jack 决策</h3><ol><li>确认唯一决策负责人，并明确公开只读试运行能否作为 ACT-001 的补充证据。</li><li>批准首批区域/甲方白名单及可访问的官方企业采购平台。</li><li>指定销售/售前 Go/No-Go owner 和响应时限，授权其提供可核验能力台账范围。</li></ol></section><section><h2>复核与真源</h2><p>完整字段、关键词、排除词、来源边界、去重、评分和变更记录见项目内 Markdown 真源：<code>docs/projects/smart-canteen-tender-opportunity-agent/monitoring/2026-07-27-rule-v1.md</code> 与 <code>2026-07-27-daily-monitoring.md</code>。</p></section></main></body></html>'''

def build_xlsx():
    wb=Workbook(); ws=wb.active; ws.title="机会主表"
    ws.append(headers)
    for row in rows: ws.append(row)
    summary=wb.create_sheet("运行摘要")
    for r in [["项目","智慧食堂公开商机监控日报"],["日期","2026-07-27"],["规则版本","V1.0"],["覆盖来源","3（CCGP、企业公开采购、乙方宝公开索引）"],["强相关/待研判/观察/剔除","1 / 0 / 1 / 1"],["最大缺口","无白名单、能力台账与官方企业采购平台清单"],["外部动作","无；仅公开、只读、人工复核"]]: summary.append(r)
    rules=wb.create_sheet("规则与来源")
    for r in [["类别","内容"],["S01","智慧食堂、智能结算、餐补、消费结算、多食堂；需系统/平台/软件/终端/接口证据"],["S02","信创/国产化迁移须同时有食堂/餐饮消费业务边界"],["排除","食材、配送、劳务、承包、纯装修、修缮；非食堂社保/医保/交通一卡通"],["证据","A官方原公告；C公开索引发现，必须回源"],["来源","CCGP；官方企业采购平台；公开索引页"]]: rules.append(r)
    for sh in wb.worksheets:
        sh.freeze_panes="A2"; sh.auto_filter.ref=sh.dimensions
        for c in sh[1]: c.font=Font(name=FONT,size=12,bold=True,color="FFFFFF"); c.fill=PatternFill("solid",fgColor="17676C"); c.alignment=Alignment(vertical="center",wrap_text=True)
        for row in sh.iter_rows(min_row=2):
            for c in row: c.font=Font(name=FONT,size=12); c.alignment=Alignment(vertical="top",wrap_text=True)
        for i,col in enumerate(sh.columns,1): sh.column_dimensions[get_column_letter(i)].width=min(max(max(len(str(c.value or "")) for c in col)+2,14),42)
        sh.row_dimensions[1].height=32
    wb.save(XLSX)

OUT.mkdir(parents=True,exist_ok=True)
(OUT/"index.html").write_text(html,encoding="utf-8")
build_xlsx()
print(OUT)
