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.
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.
// 🚫 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
{
"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"
}
// ⚠️ 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
{
"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"
}
// 📋 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
{
"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"
}
// 👷 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
{
"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"
}
// 💨 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
{
"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"
}