#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""生成《2026年10月「实验加速季」朋友圈集赞送礼 · 内部执行通知》自包含 HTML。

输入依据：用户提供的《朋友圈文案_v2.txt》+ 技能 baoyu-social-like-campaign
输出：营销活动/2026-10实验加速季/活动内部通知_实验加速季.html
"""
import io
import os
import re
import subprocess
import sys
import tempfile

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
sys.path.insert(0, os.path.join(ROOT, '脚本'))
import brand_kit as BK                                    # noqa: E402

OUTDIR = os.path.join(ROOT, '营销活动', '2026-10实验加速季')
os.makedirs(OUTDIR, exist_ok=True)
OUT = os.path.join(OUTDIR, '活动内部通知_实验加速季.html')

SEQ = []
n = 1
while len(SEQ) < 40:
    if n % 8 == 0 or '8' in str(n):
        SEQ.append(n)
    n += 1

CSS = """
*{box-sizing:border-box}
body{margin:0;background:#f5f7fa;color:#1f2328;font:14px/1.7 -apple-system,"PingFang SC","Microsoft YaHei",sans-serif}
.wrap{max-width:1180px;margin:0 auto;padding:18px}
h1{font-size:24px;font-weight:900;color:#0F3A8A;margin:8px 0 4px}
.sub{color:#5f6368;font-size:13px;margin-bottom:16px}
.sec{background:#fff;border-radius:12px;padding:16px 18px;margin-bottom:14px;box-shadow:0 1px 3px rgba(16,24,40,.08)}
.sec>h2{font-size:16.5px;font-weight:900;color:#0F3A8A;margin:0 0 12px;display:flex;align-items:center;gap:9px;
  border-left:4px solid #1852B6;padding-left:10px}
.sec>h2 .n{background:#E8F0FE;color:#1852B6;font-size:12px;border-radius:6px;padding:1px 8px;font-weight:800}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
@media(max-width:820px){.grid2{grid-template-columns:1fr}}
.act{border:1px solid #E3E9F2;border-radius:11px;padding:14px;background:linear-gradient(180deg,#FAFCFF,#fff)}
.act .tag{display:inline-block;background:#1852B6;color:#fff;font-size:11.5px;border-radius:6px;padding:2px 9px;font-weight:700}
.act .tag.b{background:#0E7490}
.act h3{font-size:15.5px;margin:9px 0 6px;color:#0F3A8A}
.act .st{color:#5f6368;font-size:12.5px;margin:2px 0}
.sku{display:flex;gap:9px;align-items:flex-start;margin-top:9px;padding:9px 11px;background:#F4F8FF;border-radius:9px}
.sku b{color:#1852B6;font-family:ui-monospace,Menlo,monospace;font-size:13.5px;white-space:nowrap}
.sku span{font-size:12.5px;color:#39445A}
table{width:100%;border-collapse:collapse;font-size:13.5px}
th,td{padding:8px 10px;border-bottom:1px solid #EEF1F5;text-align:left;vertical-align:top}
th{background:#F0F4FB;color:#0F3A8A;font-weight:700}
tbody tr:hover{background:#F7FAFF}
.chips{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0 4px}
.chip{background:#E8F0FE;color:#1852B6;font-weight:800;border-radius:8px;padding:4px 11px;font-size:14px}
.chip.hot{background:#1852B6;color:#fff}
.steps{counter-reset:s;list-style:none;padding:0;margin:0}
.steps li{counter-increment:s;position:relative;padding:9px 0 9px 40px;border-bottom:1px dashed #E9EEF5;font-size:13.5px}
.steps li:before{content:counter(s);position:absolute;left:0;top:9px;width:26px;height:26px;border-radius:50%;
  background:#E8F0FE;color:#1852B6;font-weight:900;display:flex;align-items:center;justify-content:center;font-size:13px}
.steps li.key{background:#FFF8E6;border-radius:8px;padding-left:40px}
.steps li.key:before{background:#E9A800;color:#fff}
.steps li b{color:#8A6100}
.warn{background:#FFF8E6;border-left:4px solid #E9A800;border-radius:9px;padding:12px 14px;font-size:13px;margin-bottom:12px}
.warn b{color:#8A6100}
.dan{background:#FDECEC;border-left:4px solid #C0392B;border-radius:9px;padding:12px 14px;font-size:13px;margin-bottom:12px}
.dan b{color:#922B21}
.qa{border-left:3px solid #D6E2F5;padding:2px 0 2px 12px;margin-bottom:11px}
.qa .q{font-weight:800;color:#1852B6;font-size:13.5px}
.qa .a{font-size:13px;color:#39445A}
.qa .a em{font-style:normal;background:#F1F6FF;border-radius:4px;padding:0 4px}
.tip{font-size:12px;color:#98A2B3;margin-top:5px}
.foot{background:#fff;border-radius:12px;padding:16px 18px;font-size:12.5px;color:#475467;line-height:1.9}
.foot h3{font-size:15px;color:#0F3A8A;margin:0 0 8px}
.badge{display:inline-block;background:#E8F0FE;color:#1852B6;border-radius:6px;padding:2px 8px;font-size:12px;font-weight:700;margin-right:6px}
"""

seq_chips = ''.join('<span class="chip%s">%d</span>' % (' hot' if i < 6 else '', s) for i, s in enumerate(SEQ))

html = f"""<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>2026年10月「实验加速季」朋友圈集赞送礼 · 内部执行通知</title>
<style>{CSS}</style></head><body><div class="wrap">

<h1>2026 年 10 月「实验加速季」朋友圈集赞送礼 · 内部执行通知</h1>
<div class="sub"><span class="badge">营销中心 · 销售管理</span>面向全体销售 ｜ 依据《朋友圈文案 v2》｜ <b>内部资料，不得对外发送</b></div>

<div class="warn" style="font-size:13.5px"><b>一句话说清：</b>销售发朋友圈 → 客户点赞 → <b>点赞序号「含 8 或 8 的倍数」即中奖</b>（约 28%）→ 奖品二选一 → <b>11 月 10 日前统一寄出</b>。
奖励只跟<b>点赞位次</b>挂钩，<b>不与采购量、订单金额挂钩</b>。</div>

<div class="sec"><h2><span class="n">01</span>关键时间表（按此执行）</h2>
<div class="tw" style="overflow-x:auto"><table>
<thead><tr><th style="width:150px">时间</th><th style="width:110px">节点</th><th>动作</th><th style="width:120px">责任人</th></tr></thead>
<tbody>
<tr><td><b>10.12（周一）20:00</b></td><td>发布</td><td>子活动① 发圈（全员统一文案 + 主图）→ <b>立刻截「0 赞」底图</b>留证</td><td>各销售</td></tr>
<tr><td><b>10.13（周二）20:00</b></td><td>结算①</td><td>满 24 小时，锁定中奖序号截图 → 评论区公示中奖名单</td><td>各销售</td></tr>
<tr><td><b>10.19（周一）20:00</b></td><td>发布</td><td>子活动② 发圈 → 同样先截「0 赞」底图</td><td>各销售</td></tr>
<tr><td><b>10.20（周二）20:00</b></td><td>结算②</td><td>锁号 + 评论区公示</td><td>各销售</td></tr>
<tr><td><b>结算后 3 日内</b></td><td>登记</td><td>中奖信息录入《集赞中奖登记表》，附中奖截图文件名</td><td>各销售</td></tr>
<tr><td><b>10.25 前</b></td><td>汇总</td><td>区域经理汇总本区登记表 + 点赞凭证，报销售管理</td><td>区域经理</td></tr>
<tr><td><b>11.10（周二）前</b></td><td>寄出</td><td>礼品统一寄送，回填快递单号与寄出日期</td><td>销售管理</td></tr>
</tbody></table></div>
<div class="tip">活动期内的微信消息<b>不要清理</b>；结算以「发布后满 24 小时」为准，不提前也不延后。</div></div>

<div class="sec"><h2><span class="n">02</span>两个子活动 · 主推与卖点</h2>
<div class="grid2">
  <div class="act"><span class="tag">子活动① · 第一季</span>
    <h3>从 RNA 到结果，最快 5+30 min 搞定</h3>
    <div class="st">发布 10.12 20:00 ｜ 结算 10.13 20:00 ｜ 赛季 10.5–10.18</div>
    <div class="sku"><b>BR1D303</b><span>一管式 cDNA —— gDNA 清除 + 逆转录同管完成，最快 5 min 出 cDNA</span></div>
    <div class="sku"><b>BR1E102</b><span>快速 qPCR —— 30 min 跑完 40 循环，通用 ROX 免调浓度</span></div>
    <div class="tip">官方推荐搭配，一套流程直接跑通：RNA → cDNA → 结果。两款均可申请试用装。</div>
  </div>
  <div class="act"><span class="tag b">子活动② · 第二季</span>
    <h3>载体构建，不用再守冰盒</h3>
    <div class="st">发布 10.19 20:00 ｜ 结算 10.20 20:00 ｜ 赛季 10.19–10.31</div>
    <div class="sku"><b>BR1C103</b><span>VellixClon™ 室温无缝克隆 —— 不用冰盒、不用冰上配制，桌面配完直接上机；单片段、多片段构建均适用</span></div>
    <div class="tip">可申请试用装，先测再决定。</div>
  </div>
</div></div>

<div class="sec"><h2><span class="n">03</span>中奖规则与序号表</h2>
<div class="dan" style="margin-bottom:10px"><b>口径已确认（2026-10-08）：</b>点赞序号<b>「含数字 8」或「8 的倍数」满足其一即中奖</b> ——
即 81–89 这一整段（81/82/83/84/85/86/87/88/89）<b>都算中奖</b>，下方序号表已按此口径重列。
<span style="color:#922B21"><b>注意：中奖率由约 20% 升到约 28%</b>，礼品份数预算需相应上调。</span></div>
<div>奖品<b>二选一</b>：① 瑞幸咖啡券（可换同档奶茶券：霸王茶姬 / 古茗 / 茶百道）② <b>等值</b>宝锐伴手礼（实验记录本 / 定制笔记本 / 实验室冰箱贴 / 三合一数据线 / 遮阳伞）</div>
<div class="chips">{seq_chips}</div>
<div class="tip">中奖率约 <b>28%</b>（每 3–4 位点赞者约 1 位中奖）。一条朋友圈可能几小时冲到几十赞 —— 盯「到 8 / 到 16」的瞬间。</div></div>

<div class="sec"><h2><span class="n">04</span>⚠️ 开奖取证（这一步做不好就开不了奖）</h2>
<div class="warn"><b>微信点赞列表看不到序号，且排序会随客户端版本变化 —— 必须靠截图留痕。</b></div>
<ol class="steps">
<li><b>发布即留底：</b>发圈后立刻截 1 张「0 赞」原始图（记录发布时间与初始状态）。</li>
<li class="key"><b>主通道（最可靠）：</b>微信「消息」里的「XXX 赞了你的朋友圈」是<b>逐条、带时间</b>的通知。按时间顺序数第 8/16/18/24/28… 条，<b>当场截图该条通知</b>。逐条无歧义，首选凭证。</li>
<li><b>辅助通道：</b>发布后每小时截 1 张点赞列表，存成时间序列。</li>
<li><b>差值法（精确锁定）：</b>点赞数 N-1 时截一张、到 N 时再截一张，两张图的<b>新增头像</b>就是第 N 位点赞者 —— 不受列表排序方向影响。</li>
<li><b>公示开奖：</b>中奖通知截图（<b>昵称中间字打码</b>）发在评论区，@中奖客户告知领奖。</li>
<li><b>登记归档：</b>填《集赞中奖登记表》，做到「一次活动、一份礼品、一张签收」。</li>
</ol>
<div class="dan" style="margin-top:11px"><b>两个必须做到的动作：</b>① 活动期内<b>不要清理微信消息</b>，否则开奖无凭证；② 盯「到 8 / 到 16」的客户头像，事后补图远不如当场截。</div></div>

<div class="sec"><h2><span class="n">05</span>销售执行清单</h2>
<table>
<thead><tr><th style="width:46px">#</th><th style="width:210px">事项</th><th>要点</th><th style="width:110px">截止</th></tr></thead>
<tbody>
<tr><td>1</td><td>统一文案 + 主图发圈</td><td>用《朋友圈文案 v2》对应子活动版本；私聊/群发用短版；课题组用 PI 版</td><td>10.12 / 10.19 20:00</td></tr>
<tr><td>2</td><td>发圈后立即截图留底</td><td>「0 赞」底图，含发布时间</td><td>发布后 5 min 内</td></tr>
<tr><td>3</td><td>盯中奖位次并截图</td><td>主通道：逐条点赞通知截图（第 8/16/18/24/28… 条）</td><td>满 24h 时点</td></tr>
<tr><td>4</td><td>评论区公示中奖名单</td><td>昵称中间字打码，@中奖客户</td><td>结算后当天</td></tr>
<tr><td>5</td><td>登记中奖信息</td><td>填《集赞中奖登记表》，附截图文件名</td><td>结算后 3 日内</td></tr>
<tr><td>6</td><td>引导领奖 + 选品</td><td>优先引导<b>实物伴手礼</b>；单位采购口径另走样品与资料</td><td>登记时</td></tr>
</tbody></table></div>

<div class="sec"><h2><span class="n">06</span>客户问答话术（可直接复制）</h2>
<div class="qa"><div class="q">Q：点赞怎么算？怎么领？</div><div class="a">A：您点赞后我会在评论区公示中奖名单。规则是点赞排在第 8、16、18、24、28… 位的朋友中奖。中了您把截图发我，我登记一下就行。奖品您选瑞幸咖啡券，还是换等值的伴手礼？</div></div>
<div class="qa"><div class="q">Q：我能选什么奖品？</div><div class="a">A：两种都行：一是瑞幸咖啡券（也能换同档奶茶券，霸王茶姬/古茗/茶百道都能用）；二是等值伴手礼，比如科研实验记录本、定制笔记本、实验室冰箱贴、三合一数据线、遮阳伞这些。</div></div>
<div class="qa"><div class="q">Q：什么时候能收到？</div><div class="a">A：礼品我们 <em>11 月 10 日前</em>统一送出。</div></div>
<div class="qa"><div class="q">Q：产品能先测吗？</div><div class="a">A：可以，三款都开放试用装。第一阶段推荐 BR1D303 + BR1E102（一套流程跑通），第二阶段推荐 BR1C103（室温无缝克隆）。您说个方向我直接安排寄样。</div></div>
<div class="qa"><div class="q">Q：我们是单位采购，能收个人礼品吗？</div><div class="a">A：理解。那这次集赞奖品我们按「活动互动回馈」登记，实物礼品（实验记录本这类）也更方便。需要走单位口径的话，我另外给您准备样品和资料。</div></div></div>

<div class="sec"><h2><span class="n">07</span>合规红线（发布前确认）</h2>
<table>
<thead><tr><th style="width:46px">#</th><th>要求</th></tr></thead>
<tbody>
<tr><td>1</td><td>高校 / 科研院所走单位采购，<b>赠品落个人名下有「回扣」嫌疑</b> → 优先引导选<b>实物礼品</b>。</td></tr>
<tr><td>2</td><td>保留<b>点赞截图 + 中奖登记表</b>，做到「一次活动、一份礼品、一张签收」可追溯。</td></tr>
<tr><td>3</td><td>券类奖励以「<b>朋友圈集赞互动回馈</b>」名义发放，<b>不与采购量、订单金额挂钩</b>。</td></tr>
<tr><td>4</td><td>本方案含成本与采购价口径 → <b>仅内部使用，不得对外发送</b>。</td></tr>
</tbody></table></div>

<div class="sec"><h2><span class="n">08</span>口径确认记录</h2>
<div class="warn" style="margin-bottom:10px"><b>① 中奖序号口径 —— 已确认（2026-10-08）：</b>
按「<b>含数字 8 或 8 的倍数，都中</b>」执行，序号表与登记表均已更新。
<span style="color:#922B21"><b>中奖率由约 20% → 约 28%</b>（100 位点赞者中约 27–28 位中奖），
礼品份数按此上浮约 40%，请据此核预算。</span></div>
<div class="warn" style="margin-bottom:0"><b>② 待确认 —— 子活动②的周次标注：</b>文案标「(W4)」，但按赛季 10.5 起算 <b>10.19 属第 3 周（W3）</b>。
本通知已只用<b>日期 + 星期</b>表述（10.19 周一），未使用 W2/W4 字样，避免执行歧义。</div></div>

<div class="foot">
<h3>归档与交付物</h3>
① 中奖口径 = 「含数字 8 或 8 的倍数」（2026-10-08 确认，中奖率约 28%）；<br>
② 本通知为<b>内部执行版</b>，发给全体销售与区域经理；<br>
② 配套《<b>集赞中奖登记表.xlsx</b>》：14 个字段（日期 / 子活动 / 客户-课题组 / 联系人 / 电话 / 销售 / <b>点赞序号</b> / <b>中奖截图文件名</b> / 奖品品类 / 具体礼品名 / 寄送地址 / 快递单号 / 寄出日期 / 备注），
内置<b>子活动、奖品品类下拉校验</b>，第 2 页附口径说明、开奖取证 SOP、合规红线与<b>前 120 个中奖序号</b>；<br>
③ 对外物料（朋友圈主图 / 规则卡 / 伴手礼合集）另行产出，<b>规则必须落到图里</b>；<br>
④ 货号已核：BR1D303（订单 328 行）、BR1E102（403 行）、BR1C103（28 行）三款在 ERP 中<b>均真实存在</b>。
</div>
</div></body></html>
"""

html = BK.inject(html, theme='light', tag='营销中心 · 销售管理',
                 footer_extra='2026年10月「实验加速季」朋友圈集赞送礼 · 内部执行通知')
io.open(OUT, 'w', encoding='utf-8').write(html)

print('=== 质检 ===')
vr = BK.verify(html)
bad = [k for k, v in vr.items() if not v]
print(('✅' if not bad else '❌'), '品牌套件', '全 True' if not bad else bad)
ext = re.findall(r'(?:src|href)\s*=\s*["\'](?:https?:)?//', html)
print(('✅' if not ext else '❌'), '外链数 %d（应为 0）' % len(ext))
ph = re.findall(r'\{\{[A-Z_]+\}\}', html)
print(('✅' if not ph else '❌'), '遗留占位符 %d' % len(ph))
blocks = re.findall(r'<script[^>]*>(.*?)</script>', html, re.S)
print('✅ 无脚本块（纯静态）' if not blocks else '⚠️ 有 %d 个 script 块' % len(blocks))
for kw in ['BR1D303', 'BR1E102', 'BR1C103', '逐条', '0 赞', '打码', '不得对外发送', '11 月 10 日']:
    assert kw in html, kw
print('✅ 关键要素齐全（3 货号 / 取证 SOP / 合规 / 寄出日）')
print('\n输出 %s（%.0f KB）' % (OUT, os.path.getsize(OUT) / 1024.0))
