현장에 고정하는 구역 비콘, 안전모와 안전대에 부착하는 착용 비콘이 BLE 광고 신호를 끊임없이 보냅니다. 착용 비콘은 SOS 버튼과 낙상 여부, 배터리 잔량도 함께 실어 보냅니다.
비콘이 짧은 간격으로 광고 패킷을 보내면 작업자 폰은 백그라운드 스캔으로 이를 받아 RSSI로 거리를 추정합니다. 서버에 닿지 못한 안전 이벤트는 기기 안 대기열(최대 200건 · 48시간)에 보관됐다가 연결이 돌아오면 다시 전송됩니다.
Kotlin 네이티브 앱이 백그라운드에서 BLE 스캔과 헬스 데이터 수집을 동시에 수행합니다. Wear OS 워치가 페어링되어 있으면 1초 단위 심박수가 폰에 함께 들어오고, 카카오·네이버·구글 소셜 로그인과 생체 인증으로 진입이 보호됩니다.
외부 접속은 서울 입구 서버가 TLS로 받아 사설망으로 사내(온프렘) 서버에 전달합니다. 사내 서버에서는 Nginx와 PM2가 NestJS를 운영하고, REST와 WebSocket이 같은 게이트웨이로 들어와 같은 서버의 PostgreSQL 16에 닿습니다. 푸시 알림·문서 저장·예약 작업·비전 AI가 옆에서 함께 돌아갑니다.
PostgreSQL 16 위에 비콘·사용자·구역·근태·급여·이벤트·ESG·건강이 단일 스키마로 묶여 있습니다. 관리자와 근로자는 users 한 테이블로 관리하고, 회사별 데이터 격리는 API가 로그인 정보의 회사 기준으로 걸러 냅니다. 100개가 넘는 TypeORM 마이그레이션이 스키마 변경 이력을 그대로 보존합니다.
가능성과 심각도를 각각 1에서 5로 점수화한 뒤 곱한 값이 그 위험의 점수입니다. 허용 · 관리 · 개선 · 작업중지 네 단계 임계값이 자동으로 분류되고, 4M (Man · Machine · Method · Material) 분석과 TBM 세션, 출석 기록까지 산업안전보건법 정식 양식 흐름으로 이어집니다.
사진 · 비콘 · 작업정보로 위험요인을 평가하고, 작업 전 근로자 확인 · 조치 · 보고서까지 자동 기록합니다.
폭염은 기상청·KOSHA와 같은 Steadman 공식, 한파는 풍속냉각 공식으로 체감온도를 계산합니다. 서버가 10분마다 오늘 출역 중인 현장·구역의 좌표로 날씨를 평가하고, 단계에 도달하면 그 구역 출근자에게 경보를 보냅니다. 폭염 31·33℃는 법정 의무 기준, 35·38℃와 한파 단계는 권고 기준입니다.
안전모 비콘과 안전대 비콘이 작업자 폰과 얼마나 가까이 있는지로 착용 상태를 추정합니다. 미착용이 감지되면 즉시 위반 기록이 생성되고, 대시보드의 use-workers 훅이 실시간으로 작업자 카드 색상을 갱신합니다.
건강 위험 · 이상 징후 예측 · 환경 위험 · SOS · 낙상 · PPE 미착용 여섯 사건이 같은 코어로 모입니다. 알림 라우터 한 곳을 거쳐 events 테이블에 한 번 기록되고(같은 event_id는 중복 저장하지 않음), FCM 푸시와 WebSocket 룸 브로드캐스트, 앱 배너가 동시에 작동합니다. 확인·해결 처리 상태도 같은 이벤트에 남습니다.
비콘 출퇴근이 attendance_daily에 자동 기록되어 기본·연장·야간·휴일 4분할 수당이 즉시 계산됩니다. 4대보험과 소득세 세액표를 공제한 월별 PDF 명세서가 자동 발행되고, 전자근로계약 서명과 SAP·더존 ERP 매핑까지 한 흐름으로 이어집니다.
출근 중인 작업자를 5분마다, 최근 60분의 행동 신호와 생체 정보를 6개 위험 축으로 합산해 위험을 예측합니다. 건강 상태가 주의·위험이 되면 자동 정밀 분석이 작동하고, 주기적인 재평가가 위험 등급을 갱신합니다. 영양 · 수분 · 생활 · 즉시 조치 권고가 함께 발행됩니다.
평가 문항은 예 / 부분적 / 아니오 세 단계로 응답합니다. 각각 3·2·1점이 누적되어 100점 만점으로 환산되고, 90·80·70·60·50 경계선을 기준으로 A에서 F까지의 등급이 자동 부여됩니다. 환경·사회·지배구조·작업안전·건강 다섯 카테고리가 함께 분해됩니다.