# 冲压二车间 · 安全生产看板

> 活页公开模板 `sample-safety-board` · 场景: 数据看板 · 战报 · 行业: 制造供应链 / 企业内部
> 任何人、任何 Agent 都可以读、照着改，不需要账号。示例内容均为虚构。
> 真页面: https://space.24haowan.com/s/zMPBMvRXQZ1a · 详情: https://space.24haowan.com/examples/sample-safety-board

## 这是什么

安全生产看板 · 车间电视投屏、班组群里手机随时看

## 什么时候用

工厂车间、仓库、工地这类班组现场，要一块挂在电视上、同时发到班组群里的安全看板时选它：翻牌的「安全生产第 N 天」按起算日每天自己走，作业天气按真实预报给出高温 / 大风 / 降雨的作业禁令，隐患按发现 → 整改中 → 已验收闭环、超期标红，班前会在页里签到、读回已到 / 应到。月度经营数字的复盘大屏选 sample-ops-screen；每天要交办到部门、回收处置进度的监测日报选 sample-monitor-daily；只是给员工讲一遍操作步骤、收「已读」的选 sample-handbook。

## 用户对助手说的原话

帮我给车间做一块安全生产看板网页，挂在车间电视上，也发到班组群里用手机看：页头是公司和车间名、看板标题、今天日期和班次、当班安全员，右上角一个大时钟；第一块是翻牌式的大数字「安全生产第 N 天」，按无损工事故的起算日每天自动算，打开时像车站翻牌那样一格格翻到今天，下面写离下一个里程碑（每 100 天或满周年）还有几天、哪天到，一条进度条，再列上次事故、车间纪录、本月隐患数；第二块是今日作业天气，接真实天气预报，按规则给出一条醒目的作业禁令条：最高温 ≥35°C 按高温作业、风速 ≥10.8 m/s 停止高处作业、降雨概率 ≥70% 室外吊装注意，三条各一行，画出今天的数值和红色规定线，再列今明后三天，接近线的标琥珀色，写明数据来源和更新时间；然后一条本周安全主题；接着隐患整改闭环看板，分发现、整改中、已验收三列，每条写编号、隐患、责任人和期限，超期的标红并写超期几天；最后是班前会签到表单（班组、姓名、岗位、身体状况良好勾选），存到一张数据表，旁边一个环形图读回已到 / 应到人数。深色、像工厂现场的黄黑安全色，电视上 1440 宽一屏铺满不滚动，手机上改成竖排卡片。

如果你还没有活页连接器（MCP），先读 https://space.24haowan.com/for-agents.md ，照里面的说明接入，或不登录直接发布。

## 照着做一份

1. 读入口文件 https://space.24haowan.com/examples/sample-safety-board/source/index.html（它引用的其他文件见下方列表）。
2. 保留结构、版式和交互，把内容**全部**换成用户自己的；模板里的公司、人名、数字都是虚构的，一样都别留。
3. 交付一个自包含的单文件 HTML：样式写在页面里，不引外部字体 / 脚本 / CDN；手机 375 宽和电脑 1440 宽都要好看，模板有暗色就保留暗色。
4. 要发成微信里能打开、改了链接不变的网页：接入活页（https://space.24haowan.com/for-agents.md）后发布；没有账号也可以让用户在 https://space.24haowan.com/quick 上传这个文件。
5. 没有活页工具、但能发 HTTPS 请求：把做好的 HTML 以 Content-Type: text/html POST 到 https://space.24haowan.com/api/quick?client=template-sample-safety-board ，返回预览链接、7 天分享与认领链接（登录后保留、链接不变）。

## 页面结构

- 安全生产天数
- 今日作业天气
- 本周安全主题
- 隐患整改闭环
- 今日班前会签到

## 文件（公开，纯文本）

- https://space.24haowan.com/examples/sample-safety-board/source/index.html（入口）

## 发成活页之后还能做的

- 安全天数按起算日现算、零点自动翻牌 +1：链接不变，不用天天重发
- 作业天气接 Open-Meteo 真实预报，两层加载（页内快照先画、再取实时），按三条规则出作业禁令条
- 班前会签到：原生表单 POST ./_data/signin 写回数据表，页面读回算已到 / 应到、身体不适人数
- 车间电视一屏铺满不滚动（1440 / 1920 宽），手机上改竖排卡片；阅读回执（谁看了）

## 发之前要备好

- 数据表 signin（列 team / name / post / healthy，append_open=true）：班前会签到表单写进这里，页面读回算已到 / 应到，发布前先用 set_data 建好
- 每天不用重发：安全天数按 index.html 里 .flip 的 data-start 起算日自动算；隐患条目、本周主题有变时更新同一个链接

## 模板说明（README）

模板市场「经营看板」那一组的一份（总览见 `core/space/examples/README.md`，品质标准见 `core/space/examples/QUALITY.md`）。
虚构的「佛山禾川精密五金有限公司 · 冲压二车间」，挂在车间东门的电视上，也发到甲班 / 乙班的班组群里。公司、人名、隐患条目均为虚构；**天气是真的**（Open-Meteo，以佛山天气为例）。

## 演示哪个特色

**一个链接天天自己走：安全天数按起算日现算 + 真实天气驱动的作业禁令 + 班前会签到写回数据表并读回。**

- **记忆点一**是「安全生产第 661 天」那排翻牌：`.flip` 的 `data-start` 是起算日（无损工事故的第一天），脚本按北京时间算出今天是第几天，打开时每一位从 0 一格格翻到目标数（航站楼式，各位错开起步）；挂在电视上过了零点会自己翻一格 +1。下面是离下一个里程碑（每 100 天一档，满周年也算）还有几天、哪天到，和一条进度条。`prefers-reduced-motion` 时直接显示终态；脚本不跑时就是页面里写死的那天。
- **记忆点二**是作业天气的禁令条：三条规则（最高温 ≥ 35°C 高温作业 · 最大风速 ≥ 10.8 m/s 停止高处作业 · 降雨概率 ≥ 70% 室外吊装注意）。今天任何一条到线，整条变成红色斜纹并写明禁令；都在线内是绿色「正常作业」，下面一句提醒明后两天里最该注意的那一条（接近线 = 琥珀色）。每条一行：今天的数值、量表与红色规定线、今明后三天。
- **两层加载**：① `<script type="application/json" id="wx-snap">` 是做页那天用 `curl` 抓的真实快照，首屏先画它（车间网差、微信里都立刻有数）；② 脚本再 `fetch` 实时数据（`AbortSignal.timeout(3000)`，老内核用 `AbortController` 兜），成功就整块替换、来源行变成「实时 · 更新于 HH:MM」（绿点），失败就留快照、写「数据更新于 <快照时间>」。来源署名「天气数据：Open-Meteo.com（CC BY 4.0）」始终在。
- 隐患整改闭环：发现 → 整改中 → 已验收三列，每条编号、隐患、责任人、期限；脚本按今天算超期天数（红线 + 「超期 N 天」）和「今天到期」（琥珀），底下一句汇总超期几条。
- 发出去之后：班前会签到是原生表单 `<form method="post" action="./_data/signin">`，写进数据表 `signin`；脚本在时页内提交、就地回一句「已签到，甲班第 N 位」，并读 `./_data/signin.json` 算今天已到 / 应到（环形图 + 两个班组的小进度条）、身体不适人数和最近签到的几位。「今天」按每行 `_at` 换成北京时间算，同一班组同名只算一次。
- 电脑 / 电视上（1181 宽、820 高以上）五块一屏铺满不滚动：天数牌 | 作业天气，签到 | 隐患三列，底下一条本周主题；中等宽度两栏；手机上竖排卡片流（天数 → 天气 → 主题 → 隐患 → 签到），表单控件 44px 以上。

## 改哪里变成我的

| 位置 | 改什么 |
|---|---|
| 页头 `.top` | 公司与车间名、标志（内联 SVG）、班次、安全员、车间主任；时钟下面那句班前会时间地点 |
| 安全天数 `.flip` | `data-start="YYYY-MM-DD"` 起算日；`.stats` 三格（上次事故、车间纪录、本月隐患数）。翻牌位数随天数自动增减；里程碑规则在脚本 `showDays()` 里 |
| 作业天气 | 脚本顶部 `LAT` / `LON` 换成你的城市坐标，`.hint` 与脚本里「以佛山天气为例」一起改（地点是真实城市就删掉「以…为例」）；三条规则的线、接近线和禁令文案在脚本 `RULES` 里，页面里每行 `<p>` 的规则说明同改 |
| 天气快照 `#wx-snap` | 见下一节；`.lanes` 里写死的数字是脚本不跑时的兜底，换城市时按快照改一遍 |
| 本周安全主题 `#theme` | 第几周、主题一句、谁讲 |
| 隐患 `#hazards` | 三列各一个 `<ol>`，每条 `<li class="hz" data-due="YYYY-MM-DD">`：一句隐患、编号、报告人 / 责任人 / 验收人、期限；已验收那列不写 `data-due`。写死的 `late` / `today` 是兜底，脚本按今天重算。`.flowsum` 的本月数字手改 |
| 签到 | 班组与应到人数在脚本 `NEED` / `TOTAL`，页面 `.teams` 两行与表单 `team` 的选项同改；岗位是 `post` 的选项 |
| 页脚 | 平台标志与名称（与 `core/space/src/theme.ts` 的 `MARK_SVG` / `PUBLIC_NAME` 逐字一致，测试咬着）+ 一句适用场景；发自己的看板时整段删掉 |
| `manifest.json` | `title` / `share.title` / `share.desc`（微信卡片上的字）；节增减时 `sections` 与页里的 `id` / `data-track-section` 三处同改 |

预览禁令条：链接后面加 `?wx=heat`（或 `wind` / `rain`），只把页面上今天那一项读数改成到线的值，不写任何东西。

## 天气快照（定时任务刷新它）

快照放在页面里（不放 `_data`），格式就是 Open-Meteo 返回的 `current` + `daily` 两块，外加两个字段：

```json
{ "place": "佛山市区", "fetched": "2026-10-30T13:42",
  "current": { "time": "2026-10-30T13:30", "temperature_2m": 32.5, "weather_code": 2, "wind_speed_10m": 0.67 },
  "daily": { "time": [3 天], "temperature_2m_max": [...], "temperature_2m_min": [...], "weather_code": [...],
             "precipitation_probability_max": [...], "wind_speed_10m_max": [...] } }
```

抓法（与页面脚本里的 `API` 同一条，风速单位 m/s，换坐标即可）：

```bash
curl -s 'https://api.open-meteo.com/v1/forecast?latitude=23.02&longitude=113.12&current=temperature_2m,weather_code,wind_speed_10m&daily=temperature_2m_max,temperature_2m_min,weather_code,precipitation_probability_max,wind_speed_10m_max&wind_speed_unit=ms&timezone=Asia%2FShanghai&forecast_days=3'
```

想每天早上刷新：让助手每天 6:30 抓一次 → 整段替换 `#wx-snap`（`fetched` 写抓取时间）→ 发新版本，链接不变。不刷新也能用：脚本在时总是先取实时数据，快照只是网络不通时的兜底。

## 数据表

班前会签到写进数据表 `signin`（一人一行，`append_open=true`）。发之前先建表：

```
set_data  proposal_id: <id>  table: "signin"  columns: ["team","name","post","healthy"]  rows: []  append_open: true  revision: 0
```

`healthy` 是「是」/「否」（不跑脚本时没勾选就不带这一列，页面按「否」算）。用 `list_data_rows table=signin` 读回。本地 `space-cli serve` 会把提交写进包里的 `_data/signin.json`，试完记得改回 `[]`。

## 怎么发出去

```bash
export SPACE_TOKEN=sk-space-…            # MCP create_cli_token
node core/space/cli/space-cli.mjs push core/space/examples/sample-safety-board \
  --proposal <proposal_id> --manifest core/space/examples/sample-safety-board/manifest.json --hold
```

没有终端时也可以 MCP `publish_file`（`filename: "index.html"`、`content` 为全文、`manifest` 为 manifest.json 去掉 entry、`hold: true`），再按上面建表。
给谁看：默认仅自己可见；车间电视和班组群用 `set_visibility`（`passcode` 口令可看，电视上输一次口令即可）。

## 素材

- 没有位图，标志与图标都是内联 SVG；公司、人名、隐患条目均为虚构，天气为 Open-Meteo 真实预报（以佛山天气为例）。
- `thumb.webp` / `phone.webp`：画廊缩略图，由 `examples/verify-shots.mjs --write-thumb --write-phone` 从成品截出，不进发布包。
