🏗️ USE CASE #05 - RISQUES CRITIQUES

Levage & Rigging

Détection Proactive des Non-Conformités Lifting Operations
Crane & Lifting Safety Compliance Detection
📋 Contexte Opérationnel / Operational Context

🇫🇷 Français

Les opérations de levage et de gréage comptent parmi les activités les plus dangereuses en milieu industriel. La surveillance en temps réel des zones d'exclusion, des interférences spatiales, des plans de levage critiques, des certifications d'opérateurs et des conditions météorologiques (vent) est essentielle pour prévenir les incidents catastrophiques.

🇬🇧 English

Lifting and rigging operations are among the most hazardous activities in industrial environments. Real-time monitoring of exclusion zones, spatial interferences, critical lift plans, operator certifications, and weather conditions (wind) is critical to prevent catastrophic incidents.

⚠️ Question Métier / Business Question: Comment identifier en temps réel les opérations de levage non conformes et prévenir les accidents graves? / How to identify non-compliant lifting operations in real-time and prevent serious accidents?
🕸️ Schéma de Graphe Neo4j / Neo4j Graph Schema
🏗️ Architecture SafetyGraph - Levage & Rigging / Lifting Operations
:Task
🏗️
Lift
:Asset
🏗️
Crane
:Zone
🚫
Exclusion
:Document
📋
Rigging Plan
:Worker
👷
Operator
:Reading
💨
Wind Speed
:Asset
🏢
Envelope
OPERATES
HAS
FOR
CERTIFIED_FOR
AT
OPERATES_IN
Task:Lift - Opération de levage
Asset:Crane - Grue / Appareil de levage
Zone:Exclusion - Zone interdite
Document:RiggingPlan - Plan de levage
Worker:Operator - Opérateur grue
Reading:WindSpeed - Vitesse du vent
Asset:Envelope - Enveloppe / Structure
🚫 Requête #1 - Levage sans Zone d'Exclusion
🇫🇷 Objectif: Identifier les opérations de levage actives dans des zones qui n'ont pas de zone d'exclusion établie.
🇬🇧 Objective: Identify active lifting operations in areas without an established exclusion zone.
💻 Requête Cypher Neo4j
// 🚫 Détection: Opérations de levage sans zone d'exclusion
// Detection: Lifting operations without exclusion zone

MATCH (t:Task {type: 'Lift'})-[:LOCATED_IN]->(z)-[:PART_OF]->(p {id: $projectId})
WHERE NOT (z)-[:HAS]->(:Zone {type: 'Exclusion'})
RETURN 
    t.id AS taskId,
    t.description AS description,
    t.load AS loadTonnes,
    t.liftHeight AS heightMeters,
    t.startDate AS startDate,
    z.name AS zoneName,
    z.id AS zoneId,
    'MISSING_EXCLUSION_ZONE' AS violation,
    CASE
        WHEN t.load > 50 THEN 'CRITICAL'
        WHEN t.load > 20 THEN 'HIGH'
        ELSE 'MEDIUM'
    END AS riskLevel
ORDER BY t.load DESC
📊 Exemple de Résultat / Result Example
{
  "taskId": "LIFT-2024-3847",
  "description": "Levage transformateur électrique / Electrical transformer lift",
  "loadTonnes": 75.5,  // Charge lourde!
  "heightMeters": 18.2,
  "startDate": "2024-11-04T08:00:00Z",
  "zoneName": "Cour extérieure B",
  "zoneId": "ZONE-EXT-B-14",
  "violation": "MISSING_EXCLUSION_ZONE",
  "riskLevel": "CRITICAL",
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL",
  "requiredAction": "Établir zone d'exclusion immédiate / Establish immediate exclusion zone"
}
⚠️ Requête #2 - Interférences Grue/Enveloppe
🇫🇷 Objectif: Détecter les grues opérant trop près de structures/enveloppes (risque de collision avec la flèche ou charge).
🇬🇧 Objective: Detect cranes operating too close to structures/envelopes (risk of collision with boom or load).
💻 Requête Cypher Neo4j
// ⚠️ Détection: Interférences grue avec enveloppes (structures)
// Detection: Crane interferences with envelopes (structures)

MATCH (cr:Asset {class: 'Crane'})-[:OPERATES_IN]->(z1)-[:PART_OF]->(p {id: $projectId})
MATCH (env:Asset {class: 'Envelope'})-[:LOCATED_IN]->(z2)
WITH cr, z1, env, z2,
     point.distance(point(z1), point(z2)) AS distanceMeters
WHERE distanceMeters < $swingClearance  // Clearance minimale (ex: 3m + rayon de flèche)
RETURN 
    cr.id AS craneId,
    cr.type AS craneType,
    cr.boomRadius AS boomRadiusMeters,
    z1.name AS craneZone,
    env.id AS envelopeId,
    env.type AS envelopeType,
    z2.name AS envelopeZone,
    round(distanceMeters, 2) AS distanceMeters,
    ($swingClearance - distanceMeters) AS clearanceDeficit,
    'CRANE_ENVELOPE_INTERFERENCE' AS violation
ORDER BY distanceMeters ASC
📊 Exemple de Résultat / Result Example
{
  "craneId": "CRANE-2024-HC47",
  "craneType": "Tower Crane / Grue à tour",
  "boomRadiusMeters": 45.0,
  "craneZone": "Site Construction Zone C",
  "envelopeId": "ENV-BUILDING-A",
  "envelopeType": "Building / Bâtiment adjacent",
  "envelopeZone": "Bâtiment A - 12 étages",
  "distanceMeters": 8.7,  // Distance critique!
  "clearanceDeficit": 11.3,  // Manque 11.3m de dégagement (min requis: 20m)
  "violation": "CRANE_ENVELOPE_INTERFERENCE",
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL",
  "requiredAction": "Restriction rayon de giration / Restrict swing radius"
}
📋 Requête #3 - Lourds Levages sans Plan Signé
🇫🇷 Objectif: Identifier les levages critiques (charge ≥ seuil) sans plan de levage (rigging plan) approuvé et signé.
🇬🇧 Objective: Identify critical lifts (load ≥ threshold) without approved and signed rigging plan.
💻 Requête Cypher Neo4j
// 📋 Détection: Levages lourds sans plan de levage signé
// Detection: Heavy lifts without signed rigging plan

MATCH (t:Task {type: 'Lift'})-[:PART_OF]->(p {id: $projectId})
WHERE t.load >= $tonnage  // Seuil levage critique (ex: 20 tonnes)
  AND NOT (:Document {type: 'RiggingPlan', status: 'Signed'})-[:FOR]->(t)
RETURN 
    t.id AS taskId,
    t.description AS description,
    t.load AS loadTonnes,
    t.liftHeight AS heightMeters,
    t.startDate AS startDate,
    t.complexity AS liftComplexity,
    'MISSING_SIGNED_RIGGING_PLAN' AS violation,
    CASE
        WHEN t.load >= 100 THEN 'CRITICAL'
        WHEN t.load >= 50 THEN 'HIGH'
        ELSE 'MEDIUM'
    END AS riskLevel,
    EXISTS {
        MATCH (:Document {type: 'RiggingPlan'})-[:FOR]->(t)
    } AS hasDraft
ORDER BY t.load DESC
📊 Exemple de Résultat / Result Example
{
  "taskId": "LIFT-2024-4112",
  "description": "Levage module préfabriqué / Prefab module lift",
  "loadTonnes": 127.0,  // Levage ultra-lourd!
  "heightMeters": 32.5,
  "startDate": "2024-11-05T06:00:00Z",  // Prévu demain!
  "liftComplexity": "High / Élevée",
  "violation": "MISSING_SIGNED_RIGGING_PLAN",
  "riskLevel": "CRITICAL",
  "hasDraft": true,  // Brouillon existe mais pas signé!
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL",
  "requiredAction": "Approbation urgente plan de levage / Urgent rigging plan approval"
}
👷 Requête #4 - Compétence Opérateur Grue Manquante
🇫🇷 Objectif: Détecter les opérateurs de grue sans certification valide pour le type d'équipement qu'ils opèrent.
🇬🇧 Objective: Detect crane operators without valid certification for the equipment type they are operating.
💻 Requête Cypher Neo4j
// 👷 Détection: Opérateurs de grue sans certification valide
// Detection: Crane operators without valid certification

MATCH (op:Worker)-[:OPERATES]->(:Asset {class: 'Crane'})-[:PART_OF]->(p {id: $projectId})
WHERE NOT (op)-[:CERTIFIED_FOR]->(:Certification {type: 'CraneOperator'})
WITH op,
     COLLECT {
         MATCH (op)-[:CERTIFIED_FOR]->(c:Certification)
         RETURN c.type
     } AS existingCerts
RETURN 
    op.id AS operatorId,
    op.name AS operatorName,
    op.employeeNumber AS employeeNumber,
    op.hireDate AS hireDate,
    existingCerts,
    'MISSING_CRANE_CERTIFICATION' AS violation,
    'CraneOperator' AS requiredCertification,
    CASE
        WHEN SIZE(existingCerts) = 0 THEN 'CRITICAL'
        ELSE 'HIGH'
    END AS riskLevel
ORDER BY riskLevel DESC, op.name
📊 Exemple de Résultat / Result Example
{
  "operatorId": "OP-2024-8374",
  "operatorName": "Martin Leblanc",
  "employeeNumber": "EMP-47823",
  "hireDate": "2024-08-15",  // Embauché il y a 3 mois
  "existingCerts": [
    "Forklift",  // A seulement certif chariot élévateur
    "ScissorLift"
  ],
  "violation": "MISSING_CRANE_CERTIFICATION",
  "requiredCertification": "CraneOperator",
  "riskLevel": "HIGH",
  "criticalityLevel": "🟠 ÉLEVÉ / HIGH",
  "requiredAction": "Retrait immédiat + formation obligatoire / Immediate removal + mandatory training"
}
💨 Requête #5 - Verrou Vent pour Levages
🇫🇷 Objectif: Identifier les levages effectués alors que la vitesse du vent dépasse la limite sécuritaire réglementaire.
🇬🇧 Objective: Identify lifts performed when wind speed exceeds regulatory safety limits.
💻 Requête Cypher Neo4j
// 💨 Détection: Levages avec vitesse de vent excessive (verrou vent)
// Detection: Lifts with excessive wind speed (wind lock)

MATCH (t:Task {type: 'Lift'})-[:LOCATED_IN]->(z)-[:PART_OF]->(p {id: $projectId})
MATCH (r:Reading {type: 'WindSpeed'})-[:AT]->(z)
WHERE r.timestamp BETWEEN t.startDate AND t.endDate
  AND r.value > $limit  // Limite vent (ex: 40 km/h / 25 mph)
WITH t, z, 
     MAX(r.value) AS maxWindSpeed,
     AVG(r.value) AS avgWindSpeed,
     COUNT(r) AS violationReadings
RETURN DISTINCT
    t.id AS taskId,
    t.description AS description,
    t.load AS loadTonnes,
    t.liftHeight AS heightMeters,
    t.startDate AS startDate,
    t.endDate AS endDate,
    z.name AS zoneName,
    round(maxWindSpeed, 1) AS maxWindSpeedKmh,
    round(avgWindSpeed, 1) AS avgWindSpeedKmh,
    violationReadings,
    'WIND_SPEED_EXCEEDED' AS violation,
    CASE
        WHEN maxWindSpeed > ($limit * 1.5) THEN 'CRITICAL'
        WHEN maxWindSpeed > ($limit * 1.2) THEN 'HIGH'
        ELSE 'MEDIUM'
    END AS riskLevel
ORDER BY maxWindSpeed DESC
📊 Exemple de Résultat / Result Example
{
  "taskId": "LIFT-2024-4298",
  "description": "Levage poutre acier 45m / Steel beam lift 45m",
  "loadTonnes": 38.5,
  "heightMeters": 45.0,  // Hauteur élevée + vent = danger!
  "startDate": "2024-11-04T10:30:00Z",
  "endDate": "2024-11-04T12:45:00Z",
  "zoneName": "Chantier extérieur Tour Est",
  "maxWindSpeedKmh": 67.3,  // 67 km/h! Limite: 40 km/h
  "avgWindSpeedKmh": 51.2,
  "violationReadings": 18,  // 18 lectures au-dessus de la limite
  "violation": "WIND_SPEED_EXCEEDED",
  "riskLevel": "CRITICAL",
  "criticalityLevel": "🔴 CRITIQUE / CRITICAL",
  "requiredAction": "Arrêt immédiat levage / Immediate lift shutdown"
}
⚠️ Matrice de Criticité & Actions / Criticality Matrix & Actions
🔴 CRITIQUE / CRITICAL
Violations:
• Zone exclusion absente (charge > 50t)
• Interférence grue < 10m
• Plan levage manquant (> 100t)
• Vent > 60 km/h (1.5x limite)
• Opérateur sans aucune certif

Actions:
• Arrêt immédiat opération
• Évacuation zone / Evacuate area
• Intervention < 2 min
🟠 ÉLEVÉ / HIGH
Violations:
• Zone exclusion absente (20-50t)
• Interférence 10-15m
• Plan levage manquant (50-100t)
• Vent 48-60 km/h (1.2-1.5x)
• Opérateur certif incomplète

Actions:
• Pause opération / Pause operation
• Évaluation risques / Risk assessment
• Correction < 15 min
🟡 MOYEN / MEDIUM
Violations:
• Zone exclusion absente (< 20t)
• Interférence 15-20m
• Plan levage brouillon non signé
• Vent 40-48 km/h (limite)
• Documentation incomplète

Actions:
• Surveillance renforcée
• Compléter procédures / Complete procedures
• Correction < 1h
🟢 FAIBLE / LOW
Conformité:
• Tous contrôles OK / All controls OK
• Zone exclusion établie
• Plan levage signé / Signed rigging plan
• Opérateur certifié / Certified operator
• Conditions météo favorables

Actions:
• Surveillance continue / Continuous monitoring
• Audit qualité / Quality audit
📚 Normes & Références / Standards & References
🏗️ ASME B30.5
⚠️ OSHA 1926.1400
🇨🇦 CSA Z150
🇨🇦 CNESST Art. 346-355
🌍 ISO 4309
🔧 API RP 2D
📋 ANSI/ASME B30
🏗️ EN 13000
💨 ISO 4302 (Wind)
📖 CMAA #70
📖 ASME B30.5 - Mobile and Locomotive Cranes: Zone d'exclusion obligatoire pour tous levages. Limite vent standard: 40 km/h (25 mph). Plan de levage requis pour charges > 75% capacité nominale ou levages critiques. / Mandatory exclusion zone for all lifts. Standard wind limit: 40 km/h (25 mph). Lift plan required for loads > 75% rated capacity or critical lifts.
🤖 Agents AgenticX5 / AI Agents
🏗️
LiftAI
FR: Surveillance temps réel des opérations de levage, calcul de charge dynamique, détection anomalies comportementales des grues.

EN: Real-time lifting operation monitoring, dynamic load calculation, crane behavioral anomaly detection.
🚫
ExclusionAI
FR: Génération automatique de zones d'exclusion basées sur rayon de flèche, hauteur de levage, et risques environnants.

EN: Automatic exclusion zone generation based on boom radius, lift height, and surrounding hazards.
📋
RiggingAI
FR: Validation intelligente des plans de levage, calcul des facteurs de sécurité, recommandations d'élingues et accessoires.

EN: Intelligent rigging plan validation, safety factor calculation, sling and accessory recommendations.
📐
ProximityAI
FR: Détection en temps réel des interférences spatiales grue-structure, cartographie 3D des enveloppes de travail.

EN: Real-time crane-structure spatial interference detection, 3D work envelope mapping.
👷
CompetenceAI
FR: Gestion dynamique des certifications opérateurs, alertes d'expiration, recommandations de formations spécialisées.

EN: Dynamic operator certification management, expiration alerts, specialized training recommendations.
💨
MeteoAI
FR: Analyse prédictive des conditions météorologiques (vent, précipitations, foudre), recommandations de fenêtres de levage sécuritaires.

EN: Predictive weather condition analysis (wind, precipitation, lightning), safe lifting window recommendations.