企业做 EHS(健康·安全·环境)系统,风险管控板块不是“多一张表/几条流程”,而是承接识别—评估—巡检—治理—验证这一闭环,并把数据变成可视化、可落地的行动指引。下面这篇文章会从为什么要做、什么是风险管控板块、系统该怎么搭、详细功能、业务流程、开发技巧、代码参考到实现效果与常见问答,全方位覆盖。目标是能让技术团队和EHS负责人在看完后:知道要做什么、怎么做、代码怎么接入、效果怎么评估。
本文你将了解
许多企业有事故隐患、违规操作的痛点:日常巡检记录成表格堆在盘上、风险评分靠人工经验、整改闭环不及时、看板信息滞后。风险管控板块的核心价值就在于把“隐患和风险”转成可量化、可追溯、能驱动动作的业务对象(risk),并通过巡检、告警、任务驱动整改,最终通过数据证明风险下降。对企业来说直接收益有:事故率下降、合规通过率上升、保险/赔付成本下降、管理审计效率提升。
风险管控板块专注于以下能力:
简而言之,风险管控是“把隐患从发现到最终验证消除”的闭环管理系统。
下面给出一个典型的三层架构(文本版架构图):
rust
[移动端/巡检App] <---> [API 网关] <---> [后端服务群]
| 上传图片/视频 | 认证/限流 | Risk Service (Node)
| 离线缓存/同步 | 路由 | Inspection Service (Python)
| 短息/推送 | 日志/审计 | Auth Service (JWT)
<--> 数据库(Postgres)
<--> 时序DB(Prometheus/Influx)用于监控传感器
<--> 文件存储(S3)
<--> BI/ELK(ES)用于报表/全文检索LEC 是一种常用的风险评估方法,三个维度:
风险得分 = L × E × C(或可采用加权和),常映射为风险等级:
示例:电缆裸露(L=3, E=4, C=4) => 分数 48 => 中风险,需要整改并跟踪。


巡检任务的数据流(文本版流程图):
arduino
触发来源(定期计划 / 上报 / 传感器)
↓
系统生成巡检任务(Task)
↓
下发到巡检人员手机(含表单、拍照、定位)
↓
巡检人员现场采集(图/视频/语音/勾选)
↓
若发现隐患 => 生成风险记录(Risk),并关联现场证据
↓
自动或人工 LEC 评估 => 风险等级确定
↓
系统根据策略生成整改任务并分派责任人
↓
责任人整改并上传证据
↓
安全主管复核并关闭或再次评估数据要点:
看板最核心的 6 个视图:
视觉提示:

sql
-- users
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(64) UNIQUE NOT NULL,
name VARCHAR(128),
role VARCHAR(32),
phone VARCHAR(32),
created_at TIMESTAMP DEFAULT now()
);
-- risks
CREATE TABLE risks (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
location VARCHAR(255),
source VARCHAR(64), -- inspection/report/sensor
l INT, e INT, c INT,
score INT,
level VARCHAR(16), -- low/medium/high
status VARCHAR(32) DEFAULT 'open', -- open/in-progress/verified/closed
created_by INT REFERENCES users(id),
created_at TIMESTAMP DEFAULT now()
);
-- tasks (for inspections/rectifications)
CREATE TABLE tasks (
id SERIAL PRIMARY KEY,
risk_id INT REFERENCES risks(id),
assignee INT REFERENCES users(id),
type VARCHAR(32), -- inspection/rectify/review
due_date DATE,
status VARCHAR(32) DEFAULT 'pending',
evidence JSONB, -- links to S3
created_at TIMESTAMP DEFAULT now()
);
-- inspections
CREATE TABLE inspections (
id SERIAL PRIMARY KEY,
task_id INT REFERENCES tasks(id),
inspector INT REFERENCES users(id),
result JSONB,
location GEOGRAPHY(Point,4326),
photos JSONB,
created_at TIMESTAMP DEFAULT now()
);js
// app.js (Express)
const express = require('express');
const bodyParser = require('body-parser');
const { pool } = require('./db'); // pg pool
const app = express();
app.use(bodyParser.json());
// 创建风险(来自巡检或上报)
app.post('/api/risks', async (req, res) => {
const { title, description, location, l, e, c, created_by, source } = req.body;
const score = l * e * c;
const level = score >= 61 ? 'high' : (score >= 21 ? 'medium' : 'low');
const result = await pool.query(
`INSERT INTO risks (title, description, location, l, e, c, score, level, created_by, source)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10) RETURNING *`,
[title, description, location, l, e, c, score, level, created_by, source]
);
// 根据level触发任务创建逻辑(省略)
res.json(result.rows[0]);
});
// 根据规则创建整改任务(伪代码)
app.post('/api/tasks/generate', async (req, res) => {
const { risk_id } = req.body;
// 根据 risk.level 查找责任部门与默认时限,生成 task
// ...
res.json({ ok: true });
});
app.listen(3000, ()=>console.log('API listening 3000'));python
def lec_score(l, e, c, weights=(1,1,1)):
# 支持自定义权重与映射
wL, wE, wC = weights
score = int(round((l * wL) * (e * wE) * (c * wC)))
# 映射等级
if score >= 61:
level = 'high'
elif score >= 21:
level = 'medium'
else:
level = 'low'
return score, leveljsx
import React, { useEffect, useState } from 'react';
import axios from 'axios';
import { ResponsiveContainer, BarChart, Bar, XAxis, YAxis, Tooltip } from 'recharts';
export default function RiskLevelChart() {
const [data, setData] = useState([]);
useEffect(()=> {
axios.get('/api/dashboard/risk-levels').then(r=>setData(r.data));
},[]);
return (
<div className="p-4 bg-white rounded shadow">
<h3 className="text-lg font-semibold mb-2">风险等级分布(近30天)</h3>
<ResponsiveContainer width="100%" height={240}>
<BarChart data={data}>
<XAxis dataKey="name" />
<YAxis />
<Tooltip />
<Bar dataKey="count" />
</BarChart>
</ResponsiveContainer>
</div>
);
}落地后可以衡量的关键 KPI:
预期举例:企业若能把高风险隐患平均关闭时长从 15 天降到 5 天,事故率通常有显著下降(具体效果视行业而定)。
以下为整合性的简化实现示例,涵盖创建风险、LEC 评分、自动生成整改任务的核心逻辑(伪生产级,供参考)。
js
// core.js (伪代码)
const { pool } = require('./db');
async function createRisk(payload) {
const { title, desc, location, l, e, c, created_by, source } = payload;
const score = l * e * c;
const level = score >= 61 ? 'high' : (score >= 21 ? 'medium' : 'low');
await pool.query('BEGIN');
try {
const res = await pool.query(
`INSERT INTO risks (title, description, location, l, e, c, score, level, created_by, source)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10) RETURNING *`,
[title, desc, location, l, e, c, score, level, created_by, source]
);
const risk = res.rows[0];
// 自动生成整改任务策略(示例)
let dueDays = level === 'high' ? 3 : (level === 'medium' ? 14 : 30);
// 根据 location / risk type 查找默认责任人(伪)
const assignee = await lookupAssignee(location);
await pool.query(
`INSERT INTO tasks (risk_id, assignee, type, due_date, status, created_at)
VALUES ($1,$2,$3,$4,$5, now())`,
[risk.id, assignee, 'rectify', new Date(Date.now()+dueDays*24*3600*1000), 'pending']
);
await pool.query('COMMIT');
return risk;
} catch(e) {
await pool.query('ROLLBACK');
throw e;
}
}在这里我给大家推荐一个业务人员就能够直接上手的高性价比、零代码平台——简道云EHS 健康安全环境管理系统,简道云背靠国内BI龙头帆软,在数据处理、数据展示上的能力有绝对优势,数据分析支持高度自定义,任何分析需求都可以快速制作仪表盘,简道云EHS 健康安全环境管理系统涵盖了核心 8 大业务模块,高效全面地满足安全管理核心需求
Q1:LEC 风险评分方法是否适合所有行业?如何校准权重?
LEC 是一种通用且直观的评价方式,但不一定适合所有行业的细节需求。不同企业面临的风险场景、人员暴露程度和后果敏感性不一样,因此建议在系统上线前做一次“标定”工作:组织 EHS 专家、生产负责人、工艺专家对若干典型隐患进行评分,收集他们的 L、E、C 原始评分,并计算出在该企业实际场景下的分数分布。基于分布可以决定是否使用乘法(L×E×C)或加权和形式(w1×L + w2×E + w3×C),以及是否调整分级阈值(例如高风险设为 >80)。此外应把权重和阈值做成配置项,方便在法规变化或经验积累后调整。标定后持续观察 3-6 个月,验证评分与实际事故/险情的相关性,必要时再迭代。
Q2:移动端巡检如何保证采集数据的真实性(避免假打卡或伪造图片)?
要保证数据真实性,技术与管理要结合。技术上建议启用定位与时间戳强校验(照片 EXIF + GPS),同时上传多张照片并要求照片包含当前工位的特征(如设备铭牌),或要求拍摄包含操作人员的半身照作为佐证(注意隐私合规)。支持离线采集后同步时,严格验证同步时间和本地操作历史(例如对比本地时间与服务器时间)。可以结合信任链:每条记录生成唯一的不可篡改 ID,并把关键事件摘要写入审计日志或使用不可变的存储(例如 append-only log)。管理上则通过随机抽检、复核和处罚规则来减少造假动力:例如对关键高风险巡检实行专人复核,复核不通过则要求重新整改并记录责任。结合技术(定位、证据)与管理(责任、审计),能大幅提高数据可信度。
Q3:如何把风险管控系统与现有的 ERP / MES / SCADA 等系统对接?
对接要分层次进行:首先识别对接需求(是单向推送报警,还是双向同步任务/状态)。常见做法是通过中间层(API 网关或消息队列)完成数据交换。对于实时性要求高的场景(如 SCADA 传感器触发高 C),建议使用消息总线(Kafka 或 MQTT)把报警事件推给 risk service 进行初评与任务生成。对于 ERP/MES 的工单或责任人信息,可通过 REST API 定期同步组织结构、设备资产清单与责任人映射表,以便自动分派任务。重要的设计原则:保证幂等(重复消息不会生成重复任务)、做好权限与数据字段映射、记录每次对接变更的审计日志。实施时先做小范围试点(单一生产线或单一设备类型),验证端到端流程后再逐步扩大对接范围,减少集成风险。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。