niosh-lifting-calculator niosh-lifting-calculator

NIOSH举重方程计算器,用于手动物料搬运风险评估。

AI应用 0 次安装 0 次浏览 更新于 2/25/2026

以下是内容的中文翻译:


name: niosh-lifting-calculator description: NIOSH 举重方程计算器,用于手动物料搬运风险评估。 allowed-tools: Bash(*) 读写编辑 Grep WebFetch metadata: author: babysitter-sdk version: “1.0.0” category: ergonomics backlog-id: SK-IE-020

niosh-lifting-calculator

你是 niosh-lifting-calculator - 一个专门用于使用 NIOSH 举重方程评估手动举重任务的特殊技能。

概览

这项技能支持 AI 驱动的举重风险评估,包括:

  • 推荐重量限制 (RWL) 计算
  • 举重指数 (LI) 计算
  • 乘数因子分析 (HM, VM, DM, AM, FM, CM)
  • 单任务和多任务分析
  • 风险等级分类
  • 工作重新设计建议
  • 工作修改比较

能力

1. NIOSH 举重方程

from dataclasses import dataclass
from typing import Optional
import math

@dataclass
class LiftingTaskParameters:
    """
    NIOSH 举重方程的输入参数
    """
    # 负载特性
    load_weight_lbs: float  # 实际被举起的重量

    # 起始点参数
    horizontal_origin: float  # H: 从两脚踝中点的水平距离(英寸)
    vertical_origin: float  # V: 起始点的垂直高度(英寸)

    # 目的地参数
    horizontal_dest: float  # 目的地的 H
    vertical_dest: float  # 目的地的 V

    # 任务参数
    vertical_travel: float  # D: 垂直移动距离(英寸)
    asymmetry_angle: float  # A: 不对称角度(度)
    frequency: float  # F: 每分钟举起次数
    duration: float  # 持续时间类别:1 (≤1小时), 2 (1-2小时), 8 (2-8小时)
    coupling: str  # "good", "fair", "poor"

def calculate_rwl(params: LiftingTaskParameters, at_origin: bool = True):
    """
    使用 NIOSH 方程计算推荐重量限制

    RWL = LC x HM x VM x DM x AM x FM x CM

    LC = 负载常数 = 51 磅
    """
    LC = 51  # 磅中的负载常数

    # 选择起始点或目的地以获得位置特定的 RWL
    H = params.horizontal_origin if at_origin else params.horizontal_dest
    V = params.vertical_origin if at_origin else params.vertical_dest

    # 水平乘数 (HM)
    # HM = 10/H, 其中 H 在 10-25 英寸之间
    H = max(10, min(H, 25))  # 限制在有效范围内
    HM = 10 / H

    # 垂直乘数 (VM)
    # VM = 1 - 0.0075|V - 30|
    VM = 1 - 0.0075 * abs(V - 30)
    VM = max(0, VM)  # 不能为负

    # 距离乘数 (DM)
    # DM = 0.82 + 1.8/D
    D = max(10, params.vertical_travel)  # 最小 10 英寸
    DM = 0.82 + (1.8 / D)
    DM = min(1, DM)  # 不能超过 1

    # 不对称乘数 (AM)
    # AM = 1 - 0.0032A
    A = min(135, params.asymmetry_angle)  # 最大 135 度
    AM = 1 - (0.0032 * A)

    # 频率乘数 (FM)
    FM = get_frequency_multiplier(params.frequency, params.duration, V)

    # 耦合乘数 (CM)
    CM = get_coupling_multiplier(params.coupling, V)

    # 计算 RWL
    RWL = LC * HM * VM * DM * AM * FM * CM

    return {
        "RWL": round(RWL, 1),
        "multipliers": {
            "LC": LC,
            "HM": round(HM, 3),
            "VM": round(VM, 3),
            "DM": round(DM, 3),
            "AM": round(AM, 3),
            "FM": round(FM, 3),
            "CM": round(CM, 3)
        },
        "location": "origin" if at_origin else "destination"
    }

def get_frequency_multiplier(frequency, duration, vertical):
    """
    频率乘数查找表
    """
    # 简化的 FM 表
    FM_TABLE = {
        # (frequency, duration, V>=30): FM 值
        (0.2, 1, True): 1.00, (0.2, 1, False): 1.00,
        (0.5, 1, True): 0.97, (0.5, 1, False): 0.97,
        (1, 1, True): 0.94, (1, 1, False): 0.94,
        (2, 1, True): 0.91, (2, 1, False): 0.91,
        (3, 1, True): 0.88, (3, 1, False): 0.88,
        (4, 1, True): 0.84, (4, 1, False): 0.84,
        (5, 1, True): 0.80, (5, 1, False): 0.80,
        # 根据需要添加更多
    }

    # 查找最接近的匹配或插值
    v_category = vertical >= 30
    key = (min(15, frequency), int(duration), v_category)

    # 默认近似
    if frequency <= 0.2:
        return 1.0
    elif frequency >= 15:
        return 0.0
    else:
        # 线性近似
        return max(0, 1 - 0.05 * frequency)

def get_coupling_multiplier(coupling, vertical):
    """
    基于手柄质量的耦合乘数
    """
    CM_TABLE = {
        ("good", True): 1.00,
        ("good", False): 1.00,
        ("fair", True): 0.95,
        ("fair", False): 1.00,
        ("poor", True): 0.90,
        ("poor", False): 0.90
    }

    v_category = vertical >= 30
    return CM_TABLE.get((coupling.lower(), v_category), 0.90)

2. 举重指数计算

def calculate_lifting_index(params: LiftingTaskParameters):
    """
    计算举重指数

    LI = 负荷重量 / RWL

    LI 解释:
    - LI ≤ 1.0: 大部分工人可以接受
    - 1.0 < LI ≤ 3.0: 增加风险,一些工人可能面临风险
    - LI > 3.0: 大部分工人不可接受
    """
    # 在起始点和目的地计算 RWL
    rwl_origin = calculate_rwl(params, at_origin=True)
    rwl_dest = calculate_rwl(params, at_origin=False)

    # 使用更严格的(较低)RWL
    rwl = min(rwl_origin['RWL'], rwl_dest['RWL'])
    limiting_location = "origin" if rwl_origin['RWL'] < rwl_dest['RWL'] else "destination"

    # 计算举重指数
    li = params.load_weight_lbs / rwl if rwl > 0 else float('inf')

    # 风险分类
    if li <= 1.0:
        risk_level = "LOW"
        risk_description = "任务对大多数健康工人来说是可以接受的"
    elif li <= 2.0:
        risk_level = "MODERATE"
        risk_description = "增加风险 - 考虑工作修改"
    elif li <= 3.0:
        risk_level = "HIGH"
        risk_description = "高风险 - 建议重新设计工作"
    else:
        risk_level = "VERY HIGH"
        risk_description = "不可接受的风险 - 需要立即重新设计"

    return {
        "lifting_index": round(li, 2),
        "rwl": rwl,
        "rwl_origin": rwl_origin['RWL'],
        "rwl_dest": rwl_dest['RWL'],
        "limiting_location": limiting_location,
        "actual_weight": params.load_weight_lbs,
        "risk_level": risk_level,
        "risk_description": risk_description,
        "multipliers_origin": rwl_origin['multipliers'],
        "multipliers_dest": rwl_dest['multipliers']
    }

3. 多任务分析

def multi_task_lifting_index(tasks: list):
    """
    计算多个任务的复合举重指数

    CLI = LI_max + 剩余任务的 LI_adjusted 总和
    """
    if not tasks:
        return None

    # 计算单个 LI
    task_results = []
    for task in tasks:
        result = calculate_lifting_index(task['params'])
        result['task_name'] = task.get('name', 'Unnamed')
        result['frequency'] = task['params'].frequency
        task_results.append(result)

    # 按 LI 降序排序
    task_results.sort(key=lambda x: x['lifting_index'], reverse=True)

    # 计算 CLI
    cli = task_results[0]['lifting_index']

    for i in range(1, len(task_results)):
        # 频率调整其他任务
        # 简化:添加每个额外 LI 的分数
        freq_factor = sum(t['frequency'] for t in task_results[:i+1]) / \
                     sum(t['frequency'] for t in task_results[:i])
        cli += task_results[i]['lifting_index'] * (freq_factor - 1) / freq_factor

    return {
        "composite_lifting_index": round(cli, 2),
        "individual_tasks": task_results,
        "most_stressful_task": task_results[0]['task_name'],
        "risk_level": get_risk_level(cli)
    }

def get_risk_level(li):
    if li <= 1.0:
        return "LOW"
    elif li <= 2.0:
        return "MODERATE"
    elif li <= 3.0:
        return "HIGH"
    else:
        return "VERY HIGH"

4. 乘数分析和建议

def analyze_multipliers(result: dict):
    """
    确定哪些因素限制并提供建议
    """
    multipliers = result.get('multipliers_origin', {})
    limiting_factors = []

    # 确定低于阈值的因素
    thresholds = {
        "HM": 0.7,  # 水平距离问题
        "VM": 0.8,  # 垂直高度问题
        "DM": 0.8,  # 行程距离问题
        "AM": 0.8,  # 不对称问题
        "FM": 0.7,  # 频率问题
        "CM": 0.9   # 耦合问题
    }

    recommendations = []

    for factor, threshold in thresholds.items():
        if factor in multipliers and multipliers[factor] < threshold:
            limiting_factors.append(factor)

            if factor == "HM":
                recommendations.append({
                    "factor": "水平距离",
                    "issue": f"HM = {multipliers[factor]:.2f} - 负载离身体太远",
                    "recommendations": [
                        "将负载移近工人",
                        "使用传送带或滑道",
                        "消除工人和负载之间的障碍",
                        "减少容器宽度"
                    ]
                })
            elif factor == "VM":
                recommendations.append({
                    "factor": "垂直位置",
                    "issue": f"VM = {multipliers[factor]:.2f} - 提升高度不优",
                    "recommendations": [
                        "提高或降低起始点/目的地",
                        "使用升降台或平台",
                        "消除地面水平或头顶举起"
                    ]
                })
            elif factor == "DM":
                recommendations.append({
                    "factor": "行程距离",
                    "issue": f"DM = {multipliers[factor]:.2f} - 过多的垂直行程",
                    "recommendations": [
                        "减少垂直行程距离",
                        "使用机械辅助进行长距离举起",
                        "重新定位起始点和目的地"
                    ]
                })
            elif factor == "AM":
                recommendations.append({
                    "factor": "不对称",
                    "issue": f"AM = {multipliers[factor]:.2f} - 需要扭曲",
                    "recommendations": [
                        "重新定位负载或目的地以消除扭曲",
                        "使用转盘",
                        "改善工作站布局"
                    ]
                })
            elif factor == "FM":
                recommendations.append({
                    "factor": "频率",
                    "issue": f"FM = {multipliers[factor]:.2f} - 高举频率",
                    "recommendations": [
                        "减少举起频率",
                        "增加工作轮换",
                        "使用机械辅助",
                        "增加休息时间"
                    ]
                })
            elif factor == "CM":
                recommendations.append({
                    "factor": "耦合",
                    "issue": f"CM = {multipliers[factor]:.2f} - 握把/手柄差",
                    "recommendations": [
                        "在容器上添加手柄",
                        "使用有手把的容器",
                        "改善握把表面"
                    ]
                })

    return {
        "limiting_factors": limiting_factors,
        "recommendations": recommendations,
        "priority": limiting_factors[0] if limiting_factors else None
    }

5. 工作修改比较

def compare_modifications(baseline: LiftingTaskParameters, modifications: list):
    """
    比较基线和提议的修改
    """
    baseline_result = calculate_lifting_index(baseline)

    comparisons = [{
        "scenario": "基线",
        "changes": None,
        "lifting_index": baseline_result['lifting_index'],
        "rwl": baseline_result['rwl'],
        "risk_level": baseline_result['risk_level'],
        "improvement": 0
    }]

    for mod in modifications:
        mod_result = calculate_lifting_index(mod['params'])
        improvement = (baseline_result['lifting_index'] - mod_result['lifting_index']) / \
                     baseline_result['lifting_index'] * 100

        comparisons.append({
            "scenario": mod['name'],
            "changes": mod.get('description', ''),
            "lifting_index": mod_result['lifting_index'],
            "rwl": mod_result['rwl'],
            "risk_level": mod_result['risk_level'],
            "improvement": round(improvement, 1)
        })

    # 按改善排序
    comparisons.sort(key=lambda x: x['lifting_index'])

    return {
        "comparisons": comparisons,
        "best_scenario": comparisons[0]['scenario'],
        "best_improvement": comparisons[0]['improvement']
    }

流程集成

这项技能与以下流程集成:

  • ergonomic-risk-assessment.js
  • workstation-design-optimization.js

输出格式

{
  "lifting_index": 1.8,
  "rwl": 28.3,
  "actual_weight": 51,
  "risk_level": "MODERATE",
  "limiting_factors": ["HM", "AM"],
  "recommendations": [
    {
      "factor": "水平距离",
      "recommendations": ["将负载移近工人"]
    }
  ],
  "improvement_options": [
    {
      "scenario": "增加升降台",
      "improvement": 45
    }
  ]
}

最佳实践

  1. 准确测量 - 使用卷尺,角度测量仪
  2. 最坏情况分析 - 评估最费力的条件
  3. 考虑变化 - 不同工人,负载大小
  4. 多任务工作 - 使用 CLI 进行不同任务
  5. 修改后验证 - 修改后重新评估
  6. 记录一切 - 照片,测量,观察

限制

  • NIOSH 方程有限制(不包括推/拉)
  • 仅适用于双手举起
  • 假设有足够的握力
  • 不考虑环境因素