# dsh-ehs-platform **Repository Path**: cljr/dsh-ehs-platform ## Basic Information - **Project Name**: dsh-ehs-platform - **Description**: EHS 管理平台:隐患台账与整改闭环(派单三要素、未改完不许销号、每次流转留痕)。零依赖,可作 DSH 插件也可独立运行。MIT。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-05 - **Last Updated**: 2026-10-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # EHS 管理平台(dsh-ehs-platform) > **把隐患排查做成闭环。** 一个面向 EHS 专员与安全员的隐患台账与整改闭环平台: > **派单三要素**、**未改完不许销号**、**每次流转留痕**、**逾期自动凸显**。 > > 零依赖、零构建(只用 Node 内置模块)、数据存 SQLite 单文件、可私有化部署。 > 既是 **DSH 插件**(挂进宿主右栏),也能**独立运行**(`node bin/standalone.js`)。 MIT 许可,可自由使用与二次开发。 --- ## 它区别于「Excel 台账」的地方 Excel 管的是**记录**,这里管的是**闭环**。下面四条不是文案,是代码里会拒绝你的规则 (见 [`server/domain.js`](server/domain.js),每条都有单测钉住): | 规则 | 不遵守时会发生什么 | 平台怎么做 | |---|---|---| | **派单三要素**:责任人 / 完成期限 / 验收标准 | 台账上写着"已通知车间"——检查时问"谁负责、什么时候改完、改成什么样算改到位",答不上来 | 缺任一项,`assign` 直接被拒并说明缺什么 | | **未改完不许销号** | 从「整改中」直接点完成,是台账失真最常见的入口 | 只有「待复查」能销号,且必须留**复查人**;从整改中销号报错 | | **复查不通过要退回,不另开新记录** | 同一条隐患分裂成两三条,隐患总数与闭环率立刻失真 | `review-fail` 把原记录退回「整改中」并留痕 | | **逾期是推导的,不是存储的** | 靠人定时刷新状态,迟早和事实不一致 | 每次读取时按"未闭环 + 期限已过"算出来 | 另外两条工程上的取舍: - **已闭环的记录不能删除**,只能**作废**(作废必须写原因)。台账要被检查,历史不能凭空消失。 - **状态不能通过编辑接口直接改**,只能走动作接口(`assign` / `submit` / `review` / `void`)—— 到过什么状态必须有一条记录。 ## 跑起来(独立运行,不需要 DSH) ```bash node bin/standalone.js --seed # 默认 http://127.0.0.1:8090/,--seed 灌 3 条示例隐患 ``` 数据默认在 `$DSH_HOME/ehs-platform/ehs.db`(`--data ./data` 可改)。Node ≥ 22.5,**不需要 npm install**。 ```bash node tests/self-check.mjs # 28 项自检:领域规则 + 真实 HTTP + 客户端产物 + 可嵌套性 ``` ## 装进 DSH(宿主右栏一个原生标签) ```bash dsh plugin --profile web add link:<本目录绝对路径> # 然后重启宿主(服务端源码不会被热加载) ``` 装好后:右栏指南页会出现「EHS 管理平台」卡片,点开是一个原生标签,内容 iframe 指向 `/ehs-platform/?embed=1`(`embed=1` 会隐藏平台自己的头部,避免两层标题栏)。 挂载路径、数据目录在 [`cordis.patch.yml`](cordis.patch.yml) 里配置。 ## 嵌套:能不能放进别的插件(比如公司工作台)里? **能,而且推荐用「同源 iframe 嵌套」,而不是把代码塞进对方的模块体系。** 三种做法的取舍: | 做法 | 结论 | |---|---| | **① 同源 iframe 嵌套**(对方页面里放 `