import { Domain } from '@things-factory/shell'; import { TwinInstance } from '../twin-instance/twin-instance.js'; import { TwinLocation } from './twin-location.js'; import { TwinArea } from '../twin-space/twin-area.js'; export declare class TwinEquipment { readonly id: string; domain?: Domain; domainId?: string; instance?: TwinInstance; instanceRowId?: string; /** 커널 계약의 `TwinModelDef.equipment[].id` 그대로. */ equipmentId: string; /** * **사람이 부르는 이름** — 프레임워크 엔티티 규약의 `name`/`description`. * * ── 왜 이것이 빠져 있었고, 무엇이 망가졌나 ──────────────────────────────────── * 투영이 마스터의 `name` 을 버리고 있었다. 그래서 행에는 id 만 남고, 화면은 이름을 만들 재료가 * 없어 `cut-station` 을 그대로 찍었다 — 그 결함이 목록·표·관계 그림마다 따로 나타나서 표면을 * 하나씩 고치게 만들었다. 표면의 문제가 아니라 **행에 이름이 없던 문제**다. * * 원본이 이름을 말하지 않으면 비운다(id 를 이름으로 베끼지 않는다 — 그러면 "이름이 있다" 는 * 거짓이 되고, 화면이 이름 없음을 알아볼 수 없게 된다). */ name?: string; description?: string; /** 커널 카탈로그의 설비 종류 키(`forklift`·`welder`…). FK 아님 — 카탈로그는 커널 SSOT. */ kind: string; /** * 자원 속성 — **ISA-95 `Property`**(값·데이터형·단위·하위 속성). * * 모델에는 있는데 행에 자리가 없어 투영이 흘리고 있었다. 그러면 조회 화면은 "원본이 말한 값" 이라 * 적고도 속성을 보이지 못한다 — 이름이 같은 식으로 사라졌던 것과 같은 부류다(2026-08-11). * * 소비처가 실제로 읽는 사실이다: 주행 추정기가 `speed` 로 이동 시간을 만든다. 단위가 값 옆에 붙어 * 있어야 뜻이 서므로 **모양 그대로** 담는다(문자열 값 + `uom` + `dataType`). */ properties?: any; /** * 이 설비의 적격을 검증한 **시험 명세들** — 표준 `TestSpecificationID`(`maxOccurs="unbounded"`). * * 참조만 담는다(대상은 `testSpecifications` 축). 속성과 **같은 부류의 결손**이었다: 모델에는 있는데 * 행에 자리가 없어 투영이 흘렸고, 그래서 명세 쪽에서 "누가 나를 가리키나" 를 물으면 설비가 빠졌다. */ testSpecificationIds?: string[]; /** * 그 시험들의 **결과** — 자격이 성립하는지는 이것이 말한다. * * 참조만 있으면 "무엇으로 검증한다" 까지다. 오늘 이 저장소에서 네 번 나온 결손과 같은 부류이므로 * 행에 자리를 함께 만든다 — 모델에는 있는데 행에 없으면 화면이 알리지 않고 잃는다. */ testResults?: any; /** * 기준 자리 — **실제 FK**. 예전에는 `homeLocation` 문자열이라 끊어진 참조를 화면이 경고했고 * (`brokenHomeRefs`), 다른 경로로 들어오는 데이터는 아무도 안 봤다. 이제 DB 가 막는다. */ homeLocation?: TwinLocation; homeLocationRowId?: string; /** * 기준 **구역** — 설비가 자리가 아니라 구역에 서 있을 때. * * ── 왜 칸이 둘인가 (2026-09-06) ──────────────────────────────────────────── * 계약이 `homeLocationKind = 'location' | 'area'` 로 그 갈림을 말한다. 실물이 있다 — * `EQ-CAM-SHOWER-01`(에어샤워)이 `LINE-CAM` 이라는 **구역**에 딸려 있고, 그것이 정상이다. * 라인 전체에 붙는 설비는 자리 하나를 고를 수 없다. * * 그동안 이 칸이 없어서 인제스트가 그 참조를 **「끊어졌다」고 경고**했다. 자리 목록에서 못 찾으면 * 없는 것으로 봤기 때문이다. * * 한 칸에 두 대상을 담지 않는다 — FK 가 서로 다른 표를 가리키고, 합치면 DB 가 못 막는다. * **둘 다 차는 일은 없다**(마스터의 `role` 이 하나를 정한다). */ homeArea?: TwinArea; homeAreaRowId?: string; mtbfMs?: number; mttrMs?: number; identity?: string; sourceRef: string; ingestedAt: Date; createdAt?: Date; updatedAt?: Date; }