다크모드
시설 자산 점검 프론트엔드 메인테이너 매뉴얼
소비 화면
/facility/asset/equipment/generalsrc/components/facility/asset/equipment/general/MainOrg.vuesrc/components/facility/asset/equipment/general/blocks/DynamicTableOrg.vue
라우터와 i18n은 이번 슬라이스에서 변경하지 않았습니다. 기존 설비 일반 목록을 최소 수직 슬라이스의 조회 진입점으로 사용합니다.
컴포넌트 흐름
text
MainOrg
-> useFacilityInspectionAssets()
-> resolveFacilityInspectionAssetRepo()
-> Supabase adapter 또는 local mock adapter
-> asset + inspection 조인
-> DynamicTableOrg
-> SheetFacilityAssetArt (read/create/edit 단일 mode 시트)
-> SheetCreateFacilityInspectionArt (하위 리소스 create 전용)
-> SheetFacilityInspectionArt (read/start/cancel/complete/correct 단일 상세)
-> 실패 완료: 기존 작업 연결 또는 새 corrective 작업 원자 생성
-> corrective link title -> read-only SheetWorkOrderDetailArt drilldown화면은 Supabase client를 직접 호출하지 않습니다. useAccountContext()의 Company/Office scope가 바뀌면 선택·실행 컨텍스트·pending을 즉시 초기화하고 목록을 다시 읽습니다. 이전 scope의 목록·실행 컨텍스트·mutation 응답은 scope sequence로 폐기합니다.
주요 파일
src/composables/facilityInspectionAssetRepo.js- row 정규화와 오류 메시지
- 자산·점검 범위 query
- 자산 등록·상태 변경·점검 계획·시작·시작취소·완료·정정 RPC adapter
- local mock과 feature gate
src/composables/useFacilityInspectionAssets.js- Company/Office 변경 감시
- 자산별 최근 완료 점검과 다음 예정/진행 점검 조인
- 선택 자산·점검, 실행 컨텍스트, pending/error 상태
- mutation 결과 upsert와 revision conflict 시 최신 목록 reload
DynamicTableOrg.vue- 설비명, 설비 등록코드, 대상 참조, 자산 상태, 최근 결과, 다음 점검 표시
overlays/SheetFacilityAssetArt.vue- 생성 시 관리코드·등록코드·대상 입력, 생성 후 immutable 표시
- read/create/edit 단일 mode와 설비명 profile 수정·상태 변경
- 연결 점검 이력과 하위 시트 진입
overlays/SheetCreateFacilityInspectionArt.vue- 검사자 필수 선택 없이 checklist snapshot 점검 계획 생성
overlays/SheetFacilityInspectionArt.vue- planned 시작, in-progress 시작취소·항목별 완료, completed 결과 정정
- 항목 enum
pass|fail|not_applicable, 실패 note·작업지시 gate, evidence reference metadata - 실패 시 existing/new 시정 방식 선택, 새 작업명·우선순위 입력
- 완료된 결과 차수와 실패 항목 snapshot별 exact 작업 상세 진입
backend 선택
Supabase 연결값이 있으면 실제 repo를 사용합니다. 연결값이 없으면 운영·개발 환경은 backend='unavailable' empty adapter를 사용하고 샘플 자산·점검을 노출하지 않습니다. local mock은 MODE=test 또는 명시적으로 repo를 주입한 단위 테스트에서만 허용합니다. 화면은 unavailable일 때 연결 안내를 표시하고 생성 도구를 숨깁니다.
load()는 자산과 점검을 독립적으로 처리합니다. 자산 조회가 성공하고 점검 조회만 실패하면 자산 행은 유지하며 inspectionLedgerState='error'를 노출합니다. repo resolver 자체가 실패하면 두 ledger state를 모두 error로 바꿉니다.
repository 계약
listAssets({ companyId, officeId, subjectKind })와 listInspections({ companyId, officeId })는 Company·Office scope를 query에 명시합니다. getExecutionContext는 실패 완료용 같은 대상의 미검증 작업지시와 correctiveLinks를 가져오며 inspectorMode=auth_actor_or_unassigned를 반환합니다.
쓰기 adapter는 다음 동시성 값을 보존합니다.
- 자산 profile·상태 변경: 화면이 읽은
expectedRevision - 점검 시작: 화면이 읽은 점검
expectedRevision - 점검 시작 취소: 점검
expectedRevision과 사유 - 점검 완료: 점검
expectedInspectionRevision과 자산expectedAssetRevision - 실패+신규 작업 완료: 위 revision과 corrective title/description/priority/registrationCode를 결합 RPC에 전송
- 결과 정정: 완료 점검·자산 revision, 모든 항목 결과, 정정 사유
- 일반 쓰기: 사용자 동작마다 새
requestKey - 점검 완료:
inspectionId + inspection/asset revision + canonical payloadfingerprint별 pending envelope를 유지합니다. 응답 유실·일시 오류 뒤 동일 입력 재시도는 같은requestKey, 입력이나 revision이 바뀌면 새 키를 사용하고 성공·대상/Office 변경 때 envelope를 폐기합니다.
actor user ID는 클라이언트 입력에 포함하지 않습니다.
자산 생성·점검 계획·점검 완료 폼은 dirty 상태에서 취소·닫기 요청을 확인합니다. 시트는 closedby="closerequest"와 cancel 이벤트를 사용하며 light-dismiss로 draft를 버리지 않습니다.
성공 뒤 composable은 자산·점검 projection을 upsert하고 execution context를 다시 읽습니다. 새 작업이 생기면 현황판은 work-order lane도 재조회합니다. 두 재조회 모두 캡처한 Company·Office/asset scope와 다르면 결과를 폐기합니다.
corrective link의 sourceResultRevision=null은 숫자 0으로 바꾸지 않고 기존 연결 · 결과 차수 미기록으로 표시합니다. 같은 작업지시가 여러 결과 차수에 연결될 수 있으므로 UI key에는 작업지시 ID와 nullable revision을 함께 사용합니다.
의도적으로 미룬 범위
- 파일 업로드 UI는 연결하지 않았고 현재는 증빙 파일 ID 또는 외부 참조 metadata를 입력합니다.
- 결과 revision 전체 비교 화면은 후속이며 현재 상세에는 최신 projection과 정정 차수를 표시합니다.
- 사용자가 확인하지 않은 센서·백그라운드 자동 작업지시 생성은 제공하지 않습니다.
테스트
src/composables/__tests__/facilityInspectionAssetRepo.spec.js: 정규화, 범위 query, 완료 RPC revision·작업지시 payload, actor 위조 방지src/composables/__tests__/facilityInspectionAssetMigration.spec.js: 기존 도메인 재정의 금지, schema/RLS/RPC/공간 별칭/검사자/작업지시/감사 정적 계약src/composables/__tests__/useFacilityInspectionAssets.spec.js: mutation upsert, revision conflict reload, partial ledger, resolver 실패와 Office race guardsrc/components/facility/asset/equipment/general/overlays/__tests__/FacilityExecutionSheets.spec.js: mode 시트 불변 필드와 fail 작업지시 gatesupabase/tests/facility_inspection_assets_smoke.sql: disposable DB 실행형 lifecycle 계약supabase/tests/facility_inspection_checklist_results_smoke.sql: HR 독립·항목 결과·취소·정정·entitlement 계약src/composables/__tests__/facilityClosureLoopMigration.spec.js: exact target/link/RPC 권한 정적 계약supabase/tests/facility_inspection_work_order_closure_loop_smoke.sql: failed result→exact work order→verified rollback smoke