Skip to content

설비 운영 현황 프론트엔드 메인테이너 매뉴얼

라우트와 역할

  • 라우트: /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.jscomposeFacilityEquipmentOperations(assets, inspections, workOrders, options)는 UI와 분리된 순수 함수입니다. 이 조합기는 시설관리 제품 내부 연결이므로 platform-core 공용 composable로 두지 않습니다.

  • 점검은 assetId exact match
  • 작업지시는 subjectKind==='equipment' && subjectRef===asset.subjectRef exact match
  • verified 작업지시는 미종결 집계에서 제외
  • 상태 우선 정렬 후 설비명 정렬
  • 최근 완료 점검, 다음 예정/진행 점검, planned 일정 지남, 미종결 건수와 최고 우선순위 파생

inspectionLedgerStateworkOrderLedgerState를 각 행에 보존해 선택 원장이 없을 때 이력 없음원장 미연결/오류를 구분합니다.

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의 선택 규칙은 같습니다.

  1. MODE=test: 기존 mock 허용
  2. test가 아니고 Supabase config 없음: backend='unavailable' empty adapter
  3. 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 범위 query
  • useFacilityInspectionAssets.spec.js: resolver 실패, 선택 점검 원장 실패, Office stale command/context
  • useFacilityWorkOrders.spec.js: participant partial failure, Office stale load 성공·오류, create/transition command race
  • facilityWorkOrderUiContract.spec.js: 기존 작업지시 생성·상세·배정 회귀