다크모드
설비 운영 현황 프론트엔드 메인테이너 매뉴얼
라우트와 역할
- 라우트:
/facility/status/equipment/board/general - View:
src/views/facility/status/equipment/board/general/IndexView.vue - Header:
src/components/facility/status/equipment/board/general/HeaderOrg.vue - Main:
src/components/facility/status/equipment/board/general/MainOrg.vue
이 페이지의 한 가지 일은 관리소장·시설 담당자가 현재 Office 설비의 자산 상태와 점검·작업지시 근거를 한 화면에서 스캔하고 정확한 설비 상세로 들어가게 하는 것입니다.
컴포넌트와 데이터 흐름
text
MainOrg
└─ useFacilityEquipmentOperationsBoard
├─ useFacilityInspectionAssets('equipment')
│ ├─ facility_assets
│ └─ facility_inspections
└─ useFacilityWorkOrders('equipment')
└─ facility_work_orders
tile click
→ facility.selectAsset(item.id)
→ SheetFacilityAssetArt.openRead()
→ 기존 점검 생성/상세 overlay 재사용새 현황판 전용 DB나 자산 상세 시트를 만들지 않습니다. 자산 관리 화면의 실제 SheetFacilityAssetArt, SheetCreateFacilityInspectionArt, SheetFacilityInspectionArt를 재사용합니다. 타일 클릭 전에 항상 selectAsset(item.id)를 호출해 선택 행과 상세가 일치하게 합니다.
합성 함수
src/components/facility/status/equipment/board/general/useFacilityEquipmentOperationsBoard.js의 composeFacilityEquipmentOperations(assets, inspections, workOrders, options)는 UI와 분리된 순수 함수입니다. 이 조합기는 시설관리 제품 내부 연결이므로 platform-core 공용 composable로 두지 않습니다.
- 점검은
assetIdexact match - 작업지시는
subjectKind==='equipment' && subjectRef===asset.subjectRefexact match verified작업지시는 미종결 집계에서 제외- 상태 우선 정렬 후 설비명 정렬
- 최근 완료 점검, 다음 예정/진행 점검, planned 일정 지남, 미종결 건수와 최고 우선순위 파생
inspectionLedgerState와 workOrderLedgerState를 각 행에 보존해 선택 원장이 없을 때 이력 없음과 원장 미연결/오류를 구분합니다.
UI와 디자인 시스템
leysys-design status-board 선례의 기존 card, badge, semantic border token과 반응형 grid만 사용합니다. 신규 CSS, scoped override, 디자인 토큰은 없습니다.
- 1차 그룹과 좌측 색 띠: 실제
facility_assets.status - 제목: 설비명
- 보조 식별자: 설비 등록코드
- 근거 행: 최근 점검, 다음 점검, 미종결 작업지시
- 관리코드: 타일에서 숨기고 기존 상세 우측 상단에서만 표시
가짜 건물 그룹, running/stopped/down, dead back/more/search/filter/pagination, 레거시 SheetReadUnitArt|SheetUpdateUnitArt는 렌더하지 않습니다.
backend 선택과 정직한 빈 상태
두 repo resolver의 선택 규칙은 같습니다.
MODE=test: 기존 mock 허용- test가 아니고 Supabase config 없음:
backend='unavailable'empty adapter - Supabase config 있음: 실제 Supabase adapter
운영·개발 환경에서는 기능 플래그가 꺼졌다는 이유로 demo seed를 반환하지 않습니다. unavailable adapter의 list는 빈 배열, command는 안정적인 *_backend_unavailable 오류를 던집니다. 화면은 샘플 대신 연결 안내를 표시하고 생성 도구를 숨깁니다.
독립 원장과 race guard
useFacilityInspectionAssets.load()와 useFacilityWorkOrders.load()는 Promise.allSettled로 선택 원장을 독립 처리합니다. 자산 목록 또는 작업지시 목록이 성공하면 다른 선택 조회 실패 때문에 그 결과를 폐기하지 않습니다.
두 composable은 Company·Office와 sequence를 캡처합니다. Office 전환 시 진행 중 load/command sequence를 폐기하고 배열·선택·오류·pending을 초기화합니다. 늦게 도착한 이전 Office load 성공/실패와 create/transition 응답은 현재 상태를 변경하지 않습니다.
확장 규칙
- 텔레메트리를 도입하려면 별도 원장과 신선도·수집시각 계약을 먼저 백엔드 문서에 정착시킨 뒤 보조 축으로 추가합니다.
- 이름 유사도나 부분 문자열로 원장을 연결하지 않습니다.
- 작업지시 상세를 현황판에 중복 구현하지 말고 시설 작업지시 화면으로 연결합니다.
- 자산 상세를 변경할 때는 mode 기반 read↔edit, 3xl 집중 폭, 관리코드 노출 규칙을 유지합니다.
테스트
facilityEquipmentOperationsBoard.spec.js: exact 합성, terminal 제외, partial ledger, no telemetry·legacy overlay 계약facilityInspectionAssetRepo.spec.js,facilityWorkOrderRepo.spec.js: no-config unavailable adapter와 Supabase 범위 queryuseFacilityInspectionAssets.spec.js: resolver 실패, 선택 점검 원장 실패, Office stale command/contextuseFacilityWorkOrders.spec.js: participant partial failure, Office stale load 성공·오류, create/transition command racefacilityWorkOrderUiContract.spec.js: 기존 작업지시 생성·상세·배정 회귀