@things-factory/headless-twin 10.0.12 โ 10.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/engine/canonical-ingest.d.ts +57 -2
- package/dist-server/engine/canonical-ingest.js +43 -2
- package/dist-server/engine/canonical-ingest.js.map +1 -1
- package/dist-server/engine/command-routing.js +1 -1
- package/dist-server/engine/command-routing.js.map +1 -1
- package/dist-server/engine/index.d.ts +3 -0
- package/dist-server/engine/index.js +4 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/ingest-health.d.ts +335 -0
- package/dist-server/engine/ingest-health.js +434 -0
- package/dist-server/engine/ingest-health.js.map +1 -0
- package/dist-server/engine/integration-coverage.d.ts +76 -0
- package/dist-server/engine/integration-coverage.js +73 -0
- package/dist-server/engine/integration-coverage.js.map +1 -0
- package/dist-server/engine/integration-probes.d.ts +65 -0
- package/dist-server/engine/integration-probes.js +100 -0
- package/dist-server/engine/integration-probes.js.map +1 -0
- package/dist-server/engine/integration-runner.d.ts +45 -0
- package/dist-server/engine/integration-runner.js +59 -0
- package/dist-server/engine/integration-runner.js.map +1 -0
- package/dist-server/engine/integration-target-profile.d.ts +57 -0
- package/dist-server/engine/integration-target-profile.js +79 -0
- package/dist-server/engine/integration-target-profile.js.map +1 -0
- package/dist-server/engine/kpi-fold.d.ts +27 -0
- package/dist-server/engine/kpi-fold.js +47 -4
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.js +128 -14
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/live-feed-registry.js +2 -16
- package/dist-server/engine/live-feed-registry.js.map +1 -1
- package/dist-server/engine/load-meter.d.ts +1 -1
- package/dist-server/engine/load-meter.js +12 -3
- package/dist-server/engine/load-meter.js.map +1 -1
- package/dist-server/engine/log.d.ts +18 -0
- package/dist-server/engine/log.js +80 -0
- package/dist-server/engine/log.js.map +1 -0
- package/dist-server/engine/loop-lag.d.ts +54 -0
- package/dist-server/engine/loop-lag.js +87 -0
- package/dist-server/engine/loop-lag.js.map +1 -0
- package/dist-server/engine/model-gap.d.ts +108 -0
- package/dist-server/engine/model-gap.js +95 -0
- package/dist-server/engine/model-gap.js.map +1 -0
- package/dist-server/engine/restart-policy.d.ts +3 -3
- package/dist-server/engine/restart-policy.js +4 -4
- package/dist-server/engine/restart-policy.js.map +1 -1
- package/dist-server/engine/runtime-key.js +1 -1
- package/dist-server/engine/runtime-key.js.map +1 -1
- package/dist-server/engine/stage-path.d.ts +83 -0
- package/dist-server/engine/stage-path.js +118 -0
- package/dist-server/engine/stage-path.js.map +1 -0
- package/dist-server/engine/twin-engine.d.ts +352 -16
- package/dist-server/engine/twin-engine.js +1037 -166
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/index.js +34 -2
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.d.ts +5 -0
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js +58 -0
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js.map +1 -0
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.d.ts +5 -0
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js +55 -0
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js.map +1 -0
- package/dist-server/migrations/index.js +7 -1
- package/dist-server/migrations/index.js.map +1 -1
- package/dist-server/service/index.d.ts +5 -2
- package/dist-server/service/index.js +18 -7
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/discovery-result.d.ts +1 -1
- package/dist-server/service/reference/discovery-result.js +1 -1
- package/dist-server/service/reference/discovery-result.js.map +1 -1
- package/dist-server/service/reference/index.d.ts +4 -1
- package/dist-server/service/reference/index.js +6 -1
- package/dist-server/service/reference/index.js.map +1 -1
- package/dist-server/service/reference/reference-adapter.d.ts +184 -3
- package/dist-server/service/reference/reference-adapter.js +28 -4
- package/dist-server/service/reference/reference-adapter.js.map +1 -1
- package/dist-server/service/reference/reference-assessment.d.ts +68 -0
- package/dist-server/service/reference/reference-assessment.js +136 -0
- package/dist-server/service/reference/reference-assessment.js.map +1 -0
- package/dist-server/service/reference/reference-live.d.ts +12 -1
- package/dist-server/service/reference/reference-live.js +116 -11
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +47 -1
- package/dist-server/service/reference/reference-master.js +34 -4
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-probe.d.ts +92 -0
- package/dist-server/service/reference/reference-probe.js +186 -0
- package/dist-server/service/reference/reference-probe.js.map +1 -0
- package/dist-server/service/reference/reference-progress-subscription.d.ts +17 -0
- package/dist-server/service/reference/reference-progress-subscription.js +94 -0
- package/dist-server/service/reference/reference-progress-subscription.js.map +1 -0
- package/dist-server/service/reference/reference-progress.d.ts +38 -0
- package/dist-server/service/reference/reference-progress.js +71 -0
- package/dist-server/service/reference/reference-progress.js.map +1 -0
- package/dist-server/service/reference/reference-resolver.js +210 -43
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/reference/twin-reference.d.ts +32 -0
- package/dist-server/service/reference/twin-reference.js +10 -0
- package/dist-server/service/reference/twin-reference.js.map +1 -1
- package/dist-server/service/twin-control/twin-control-mutation.js +4 -3
- package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
- package/dist-server/service/twin-event/journal-count.d.ts +21 -0
- package/dist-server/service/twin-event/journal-count.js +26 -0
- package/dist-server/service/twin-event/journal-count.js.map +1 -0
- package/dist-server/service/twin-event/twin-event-keys.d.ts +9 -0
- package/dist-server/service/twin-event/twin-event-keys.js +15 -18
- package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-type.d.ts +3 -1
- package/dist-server/service/twin-event/twin-event-type.js +18 -1
- package/dist-server/service/twin-event/twin-event-type.js.map +1 -1
- package/dist-server/service/twin-event/twin-event.d.ts +1 -0
- package/dist-server/service/twin-event/twin-event.js +9 -1
- package/dist-server/service/twin-event/twin-event.js.map +1 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js +2 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
- package/dist-server/service/twin-ingest-window/index.d.ts +5 -0
- package/dist-server/service/twin-ingest-window/index.js +10 -0
- package/dist-server/service/twin-ingest-window/index.js.map +1 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.d.ts +12 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js +123 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js.map +1 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.d.ts +1 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js +51 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js.map +1 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window.d.ts +16 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window.js +108 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window.js.map +1 -0
- package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
- package/dist-server/service/twin-journal/twin-journal-query.js +58 -5
- package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +14 -0
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +72 -2
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.d.ts +1 -0
- package/dist-server/service/twin-metrics/twin-metrics-query.js +78 -3
- package/dist-server/service/twin-metrics/twin-metrics-query.js.map +1 -1
- package/dist-server/service/twin-model/axis-journal-evidence.d.ts +2 -0
- package/dist-server/service/twin-model/axis-journal-evidence.js +89 -0
- package/dist-server/service/twin-model/axis-journal-evidence.js.map +1 -0
- package/dist-server/service/twin-model/epcis-coverage.d.ts +1 -1
- package/dist-server/service/twin-model/epcis-coverage.js +19 -7
- package/dist-server/service/twin-model/epcis-coverage.js.map +1 -1
- package/dist-server/service/twin-model/iec61850-coverage.d.ts +1 -1
- package/dist-server/service/twin-model/iec61850-coverage.js +18 -7
- package/dist-server/service/twin-model/iec61850-coverage.js.map +1 -1
- package/dist-server/service/twin-model/isa95-coverage.d.ts +14 -0
- package/dist-server/service/twin-model/isa95-coverage.js +23 -9
- package/dist-server/service/twin-model/isa95-coverage.js.map +1 -1
- package/dist-server/service/twin-model/item-ref.d.ts +24 -0
- package/dist-server/service/twin-model/item-ref.js +88 -0
- package/dist-server/service/twin-model/item-ref.js.map +1 -0
- package/dist-server/service/twin-model/name-index.d.ts +36 -0
- package/dist-server/service/twin-model/name-index.js +116 -0
- package/dist-server/service/twin-model/name-index.js.map +1 -0
- package/dist-server/service/twin-model/project-structure.js +1 -1
- package/dist-server/service/twin-model/project-structure.js.map +1 -1
- package/dist-server/service/twin-model/status-tally.d.ts +9 -0
- package/dist-server/service/twin-model/status-tally.js +37 -0
- package/dist-server/service/twin-model/status-tally.js.map +1 -0
- package/dist-server/service/twin-model/twin-lineage-query.js +40 -12
- package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-item-query.js +38 -39
- package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-query.js +156 -4
- package/dist-server/service/twin-model/twin-model-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-tree-query.js +7 -0
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -1
- package/dist-server/service/twin-readiness/index.d.ts +2 -0
- package/dist-server/service/twin-readiness/index.js +6 -0
- package/dist-server/service/twin-readiness/index.js.map +1 -0
- package/dist-server/service/twin-readiness/twin-readiness-query.d.ts +3 -0
- package/dist-server/service/twin-readiness/twin-readiness-query.js +103 -0
- package/dist-server/service/twin-readiness/twin-readiness-query.js.map +1 -0
- package/dist-server/service/twin-space/twin-space-resolver.d.ts +2 -2
- package/dist-server/service/twin-space/twin-space-resolver.js +5 -4
- package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
- package/dist-shared/entity-delta.d.ts +23 -3
- package/dist-shared/entity-delta.js +12 -8
- package/dist-shared/entity-delta.js.map +1 -1
- package/dist-shared/kpi-broadcast.js +1 -1
- package/dist-shared/kpi-broadcast.js.map +1 -1
- package/dist-shared/touched-items.d.ts +7 -0
- package/dist-shared/touched-items.js +80 -0
- package/dist-shared/touched-items.js.map +1 -0
- package/package.json +7 -7
- package/server/engine/canonical-ingest.ts +92 -7
- package/server/engine/command-routing.ts +1 -1
- package/server/engine/index.ts +4 -0
- package/server/engine/ingest-health.ts +704 -0
- package/server/engine/integration-coverage.ts +147 -0
- package/server/engine/integration-probes.ts +144 -0
- package/server/engine/integration-runner.ts +95 -0
- package/server/engine/integration-target-profile.ts +103 -0
- package/server/engine/kpi-fold.ts +72 -4
- package/server/engine/kpi-query.ts +129 -15
- package/server/engine/live-feed-registry.ts +2 -1
- package/server/engine/load-meter.ts +12 -3
- package/server/engine/log.ts +72 -0
- package/server/engine/loop-lag.ts +120 -0
- package/server/engine/model-gap.ts +168 -0
- package/server/engine/restart-policy.ts +4 -4
- package/server/engine/runtime-key.ts +1 -1
- package/server/engine/stage-path.ts +172 -0
- package/server/engine/twin-engine.ts +1135 -162
- package/server/index.ts +35 -2
- package/server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.ts +54 -0
- package/server/migrations/1786200000000-CarryLiveFeedCursor.ts +53 -0
- package/server/migrations/index.ts +7 -1
- package/server/service/index.ts +11 -0
- package/server/service/reference/discovery-result.ts +1 -1
- package/server/service/reference/index.ts +6 -1
- package/server/service/reference/reference-adapter.ts +197 -5
- package/server/service/reference/reference-assessment.ts +215 -0
- package/server/service/reference/reference-live.ts +123 -11
- package/server/service/reference/reference-master.ts +64 -4
- package/server/service/reference/reference-probe.ts +264 -0
- package/server/service/reference/reference-progress-subscription.ts +73 -0
- package/server/service/reference/reference-progress.ts +95 -0
- package/server/service/reference/reference-resolver.ts +200 -12
- package/server/service/reference/twin-reference.ts +39 -1
- package/server/service/twin-control/twin-control-mutation.ts +4 -3
- package/server/service/twin-event/journal-count.ts +53 -0
- package/server/service/twin-event/twin-event-keys.ts +16 -1
- package/server/service/twin-event/twin-event-type.ts +26 -2
- package/server/service/twin-event/twin-event.ts +7 -0
- package/server/service/twin-forecast/twin-forecast-query.ts +2 -1
- package/server/service/twin-ingest-window/index.ts +7 -0
- package/server/service/twin-ingest-window/twin-ingest-window-query.ts +125 -0
- package/server/service/twin-ingest-window/twin-ingest-window-writer.ts +57 -0
- package/server/service/twin-ingest-window/twin-ingest-window.ts +113 -0
- package/server/service/twin-instance/twin-instance.ts +1 -1
- package/server/service/twin-journal/twin-journal-query.ts +59 -5
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +77 -3
- package/server/service/twin-metrics/twin-metrics-query.ts +81 -3
- package/server/service/twin-model/axis-journal-evidence.ts +57 -0
- package/server/service/twin-model/epcis-coverage.ts +2 -8
- package/server/service/twin-model/iec61850-coverage.ts +2 -8
- package/server/service/twin-model/isa95-coverage.ts +22 -9
- package/server/service/twin-model/item-ref.ts +80 -0
- package/server/service/twin-model/name-index.ts +94 -0
- package/server/service/twin-model/project-structure.ts +1 -1
- package/server/service/twin-model/status-tally.ts +37 -0
- package/server/service/twin-model/twin-lineage-query.ts +38 -9
- package/server/service/twin-model/twin-model-item-query.ts +26 -27
- package/server/service/twin-model/twin-model-query.ts +155 -4
- package/server/service/twin-model/twin-model-tree-query.ts +7 -0
- package/server/service/twin-readiness/index.ts +3 -0
- package/server/service/twin-readiness/twin-readiness-query.ts +96 -0
- package/server/service/twin-space/twin-space-resolver.ts +5 -4
- package/shared/entity-delta.ts +31 -7
- package/shared/kpi-broadcast.ts +1 -1
- package/shared/touched-items.ts +73 -0
- package/test/axis-journal-evidence.test.ts +71 -0
- package/test/axis-read.test.ts +101 -1
- package/test/boot-resume.test.ts +92 -26
- package/test/broadcast-cost-baseline.test.ts +200 -0
- package/test/broadcast-period.test.ts +58 -0
- package/test/canonical-ingest-vocabularies.test.ts +36 -1
- package/test/canonical-quantity-door.test.ts +61 -0
- package/test/command-routing.test.ts +1 -1
- package/test/declared-location-types.test.ts +89 -0
- package/test/discovery-result.test.ts +1 -1
- package/test/duration-estimators.test.ts +1 -1
- package/test/entity-delta.test.ts +2 -2
- package/test/ingest-bench.test.ts +3 -3
- package/test/ingest-health-engine.test.ts +248 -0
- package/test/ingest-health-wiring.test.ts +119 -0
- package/test/ingest-health.test.ts +306 -0
- package/test/ingest-history.test.ts +247 -0
- package/test/integration-probes.test.ts +103 -0
- package/test/integration-runner.test.ts +95 -0
- package/test/item-ref.test.ts +78 -0
- package/test/journal-read-discipline.test.ts +177 -0
- package/test/journal-retention.test.ts +133 -0
- package/test/journal-sort-axis.test.ts +142 -0
- package/test/journal-write-door.test.ts +110 -0
- package/test/journal-write-trend.test.ts +115 -0
- package/test/kernel-kind-guard.test.ts +4 -4
- package/test/kpi-fold.test.ts +90 -3
- package/test/kpi-query-bench.test.ts +2 -2
- package/test/lineage-survives-restart.test.ts +17 -1
- package/test/live-cursor-wiring.test.ts +87 -0
- package/test/live-feed-registry.test.ts +9 -1
- package/test/live-kernel-facts.test.ts +7 -7
- package/test/live-mirror-parity.test.ts +6 -0
- package/test/load-meter.test.ts +29 -15
- package/test/local-declarations.test.ts +1 -1
- package/test/log-stamp.test.ts +59 -0
- package/test/loop-lag.test.ts +82 -0
- package/test/model-gap.test.ts +153 -0
- package/test/oee-accumulator.test.ts +4 -0
- package/test/operational-vocabulary.test.ts +4 -4
- package/test/read-failure-visible.test.ts +145 -0
- package/test/reference-grounding.test.ts +70 -0
- package/test/resolve-ts-siblings.mjs +52 -0
- package/test/restart-policy.test.ts +7 -7
- package/test/revision-axis.test.ts +93 -0
- package/test/runtime-key.test.ts +2 -2
- package/test/scale-twin-bench.test.ts +2 -2
- package/test/spec-coverage.test.ts +1 -1
- package/test/stage-path.test.ts +95 -0
- package/test/standard-coverage.test.ts +15 -3
- package/test/status-tally.test.ts +55 -0
- package/test/structure-revision-db.test.ts +4 -0
- package/test/tenant-registry-db.test.ts +1 -1
- package/test/time-range.test.ts +152 -0
- package/test/touched-items.test.ts +61 -0
- package/test/twin-event-keys.test.ts +10 -2
- package/test/twin-model-item-db.test.ts +2 -0
- package/test/warm-start-seam.test.ts +4 -0
- package/test/yield-loop.test.ts +57 -2
- package/tsconfig.shared.tsbuildinfo +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.axisSeenInJournal = axisSeenInJournal;
|
|
37
|
+
/*
|
|
38
|
+
* **์ ๋์ ๊ทธ ์ถ์ ์ฌ์ค์ด ์๋** โ ใ์์ง ์๋คใ์ ใ์๋๋ฐ ์ํ์ ์๋คใ๋ฅผ ๊ฐ๋ฅธ๋ค (2026-08-22).
|
|
39
|
+
*
|
|
40
|
+
* โโ ์ ํ์ํ๋ (์ค์ธก) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
41
|
+
* ํ๋ฉด์ด ใ์์
โ ์์ง ํ๋๋ ์์ต๋๋คใ๋ผ๊ณ ๋งํ๋๋ฐ, ๊ทธ ํธ์์ ์ ๋์๋ `task.status` 5,786๊ฑด์ด
|
|
42
|
+
* ์์๊ณ **๋ง์ง๋ง ์ํ๊ฐ `in-progress`** ์๋ค. ์ฌ์ฉ์๊ฐ ใ์์
์ง์ 835๊ฑด์ธ๋ฐ ์์
์ด 0์ธ ์ด์ ใ๋ฅผ
|
|
43
|
+
* ๋ฌผ์ด ๋ฐ๋์ ์ ์กฐ์ฌํด ์์ธ์ ์ฐพ์๋ค: ๊ด์ธก ๋ชจ๋ ์ปค๋์ด ๊ด์ธก๊ธฐ์ ์์
์ ์ค๋
์ท์ผ๋ก ๋ด๋ณด๋ด์ง ์๋๋ค
|
|
44
|
+
* (์ปค๋ ์๋ฆฌ์ด๊ณ ๊ทธ ๋ ์ธ์ ๋๊ฒผ๋ค).
|
|
45
|
+
*
|
|
46
|
+
* ํ๋ฉด ๋ชซ์ ๋ค๋ฅธ ๊ฒ์ด๋ค. **์นด๋๊ฐ ๋จ์ ํ๋ฉด ์ ๋๋ค.** ใ์์ง ํ๋๋ ์์ต๋๋คใ๋ ใ์ ์ธ์ ์๊ณ ์ฌ์ค์ด
|
|
47
|
+
* ์์ง ์ผ์ด๋์ง ์์๋คใ๋ ๋ป์ธ๋ฐ, ์ค์ ๋ก๋ ใ์ฌ์ค์ด ์ผ์ด๋ฌ๋๋ฐ ์ํ์ ์ค์ง ๋ชปํ๋คใ์๋ค โ ๊ทธ ์ฐจ์ด๊ฐ
|
|
48
|
+
* ์ฌ์ฉ์๋ฅผ ๋ฐ๋์ ์กฐ์ฌ๋ก ๋ณด๋ธ๋ค.
|
|
49
|
+
*
|
|
50
|
+
* ๊ทธ๋์ ์ํ๊ฐ ๋น ์ถ์ ๋ํด **์ ๋์ ํ ๊ฑด๋ง ๋ฌผ์ด๋ณธ๋ค.** ์์ผ๋ฉด ํ๋ฉด์ด ๊ทธ๋ ๊ฒ ๋งํ๋ค.
|
|
51
|
+
*
|
|
52
|
+
* โโ ์ดํ์ ์ง โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
53
|
+
* ์ด๋ ์ฌ๊ฑด์ด ์ด๋ ์ถ์ ์ฑ์ฐ๋์ง๋ **์ปค๋์ด ์ ์ธํ ๋ฑ๋ง**์์ ์จ๋ค(`OP_EVENT`ยท`ENERGY_EVENT`, ๊ทธ๋ฆฌ๊ณ
|
|
54
|
+
* EPCIS ์ ๋์ฌ). ์ฌ๊ธฐ์ ์ด๋ฆ์ ์๋ก ๋ง๋ค์ง ์๋๋ค โ ์ปค๋์ด ๋ฑ๋ง์ ๋๋ฆฌ๋ฉด ์ด ํ์ ํ ์ค์ด ๋๊ณ ,
|
|
55
|
+
* ํ์ ์๋ ์ถ์ **์๋ฌด ๋ง๋ ํ์ง ์๋๋ค**(๋ชจ๋ฅด๋ ๊ฒ์ ์ง์ด๋ด์ง ์๋๋ค).
|
|
56
|
+
*/
|
|
57
|
+
const journal_count_js_1 = require("../twin-event/journal-count.js");
|
|
58
|
+
/**
|
|
59
|
+
* ์ํ ์ถ โ ๊ทธ ์ถ์ ์ฑ์ฐ๋ ์ฌ๊ฑด ๋ฑ๋ง. ํ์ ์์ผ๋ฉด ํ๋จํ์ง ์๋๋ค.
|
|
60
|
+
*
|
|
61
|
+
* ๋ฌผํ์ EPCIS ๋ก ์จ๋ค(์ฌ๊ฑด ์ด๋ฆ์ด ์ฌ๋ฌ ๊ฐ๋ค) โ ๊ทธ๋์ ์ ๋์ฌ๋ก ๋ณธ๋ค.
|
|
62
|
+
*/
|
|
63
|
+
const AXIS_EVENTS = {
|
|
64
|
+
tasks: { types: ['task.status'] },
|
|
65
|
+
orders: { types: ['order.status'] },
|
|
66
|
+
items: { prefix: 'epcis.' },
|
|
67
|
+
demandWindows: { types: ['energy.demand.window'] }
|
|
68
|
+
};
|
|
69
|
+
/** ์ด ์ถ์ ์ฌ์ค์ด ์ ๋์ ํ ๊ฑด์ด๋ผ๋ ์๋. ํ๋จํ ์ ์์ผ๋ฉด `null`(๋ชจ๋ฅธ๋ค). */
|
|
70
|
+
async function axisSeenInJournal(repo, where, axis) {
|
|
71
|
+
const spec = AXIS_EVENTS[axis];
|
|
72
|
+
if (!spec)
|
|
73
|
+
return null;
|
|
74
|
+
if (spec.types) {
|
|
75
|
+
for (const t of spec.types) {
|
|
76
|
+
if (await (0, journal_count_js_1.anyJournalRow)(repo, { ...where, eventType: t }))
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
/*
|
|
82
|
+
* ์ ๋์ฌ๋ก ์ฐพ๋ ์ถ(๋ฌผํ) โ ํ ๊ฑด๋ง ์์ผ๋ฉด ๋๋ค. `Like` ๋ฅผ ์ฐ๋ ๋์ **๋ฑ๋ง ๋ชฉ๋ก**์ ์ฐ์ง ์๋ ์ด์ ๋
|
|
83
|
+
* EPCIS ์ฌ๊ฑด ์ด๋ฆ์ด ์ปค๋์์ ์๋ผ๊ธฐ ๋๋ฌธ์ด๋ค(๊ฐ์ฒดยท์ง์ฝยท๋ณํยท๊ฑฐ๋โฆ). ์ด๋ฆ์ ์ฌ๊ธฐ ๋ฒ ๋ผ๋ฉด ์ปค๋์ด
|
|
84
|
+
* ํ๋ ๋๋ฆด ๋ ์ด ์๋ฆฌ๊ฐ ์กฐ์ฉํ ๋ก๋๋ค.
|
|
85
|
+
*/
|
|
86
|
+
const { Like } = await Promise.resolve().then(() => __importStar(require('typeorm')));
|
|
87
|
+
return (0, journal_count_js_1.anyJournalRow)(repo, { ...where, eventType: Like(`${spec.prefix}%`) });
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=axis-journal-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"axis-journal-evidence.js","sourceRoot":"","sources":["../../../server/service/twin-model/axis-journal-evidence.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,8CAqBC;AAxDD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qEAA8D;AAE9D;;;;GAIG;AACH,MAAM,WAAW,GAA0D;IACzE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE;IACjC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,EAAE;IACnC,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC3B,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,sBAAsB,CAAC,EAAE;CACnD,CAAA;AAED,qDAAqD;AAC9C,KAAK,UAAU,iBAAiB,CACrC,IAAS,EACT,KAA8B,EAC9B,IAAY;IAEZ,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAEtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,MAAM,IAAA,gCAAa,EAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAA;QACxE,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IACD;;;;OAIG;IACH,MAAM,EAAE,IAAI,EAAE,GAAG,wDAAa,SAAS,GAAC,CAAA;IACxC,OAAO,IAAA,gCAAa,EAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAA;AAC9E,CAAC","sourcesContent":["/*\n * **์ ๋์ ๊ทธ ์ถ์ ์ฌ์ค์ด ์๋** โ ใ์์ง ์๋คใ์ ใ์๋๋ฐ ์ํ์ ์๋คใ๋ฅผ ๊ฐ๋ฅธ๋ค (2026-08-22).\n *\n * โโ ์ ํ์ํ๋ (์ค์ธก) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ํ๋ฉด์ด ใ์์
โ ์์ง ํ๋๋ ์์ต๋๋คใ๋ผ๊ณ ๋งํ๋๋ฐ, ๊ทธ ํธ์์ ์ ๋์๋ `task.status` 5,786๊ฑด์ด\n * ์์๊ณ **๋ง์ง๋ง ์ํ๊ฐ `in-progress`** ์๋ค. ์ฌ์ฉ์๊ฐ ใ์์
์ง์ 835๊ฑด์ธ๋ฐ ์์
์ด 0์ธ ์ด์ ใ๋ฅผ\n * ๋ฌผ์ด ๋ฐ๋์ ์ ์กฐ์ฌํด ์์ธ์ ์ฐพ์๋ค: ๊ด์ธก ๋ชจ๋ ์ปค๋์ด ๊ด์ธก๊ธฐ์ ์์
์ ์ค๋
์ท์ผ๋ก ๋ด๋ณด๋ด์ง ์๋๋ค\n * (์ปค๋ ์๋ฆฌ์ด๊ณ ๊ทธ ๋ ์ธ์ ๋๊ฒผ๋ค).\n *\n * ํ๋ฉด ๋ชซ์ ๋ค๋ฅธ ๊ฒ์ด๋ค. **์นด๋๊ฐ ๋จ์ ํ๋ฉด ์ ๋๋ค.** ใ์์ง ํ๋๋ ์์ต๋๋คใ๋ ใ์ ์ธ์ ์๊ณ ์ฌ์ค์ด\n * ์์ง ์ผ์ด๋์ง ์์๋คใ๋ ๋ป์ธ๋ฐ, ์ค์ ๋ก๋ ใ์ฌ์ค์ด ์ผ์ด๋ฌ๋๋ฐ ์ํ์ ์ค์ง ๋ชปํ๋คใ์๋ค โ ๊ทธ ์ฐจ์ด๊ฐ\n * ์ฌ์ฉ์๋ฅผ ๋ฐ๋์ ์กฐ์ฌ๋ก ๋ณด๋ธ๋ค.\n *\n * ๊ทธ๋์ ์ํ๊ฐ ๋น ์ถ์ ๋ํด **์ ๋์ ํ ๊ฑด๋ง ๋ฌผ์ด๋ณธ๋ค.** ์์ผ๋ฉด ํ๋ฉด์ด ๊ทธ๋ ๊ฒ ๋งํ๋ค.\n *\n * โโ ์ดํ์ ์ง โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ด๋ ์ฌ๊ฑด์ด ์ด๋ ์ถ์ ์ฑ์ฐ๋์ง๋ **์ปค๋์ด ์ ์ธํ ๋ฑ๋ง**์์ ์จ๋ค(`OP_EVENT`ยท`ENERGY_EVENT`, ๊ทธ๋ฆฌ๊ณ \n * EPCIS ์ ๋์ฌ). ์ฌ๊ธฐ์ ์ด๋ฆ์ ์๋ก ๋ง๋ค์ง ์๋๋ค โ ์ปค๋์ด ๋ฑ๋ง์ ๋๋ฆฌ๋ฉด ์ด ํ์ ํ ์ค์ด ๋๊ณ ,\n * ํ์ ์๋ ์ถ์ **์๋ฌด ๋ง๋ ํ์ง ์๋๋ค**(๋ชจ๋ฅด๋ ๊ฒ์ ์ง์ด๋ด์ง ์๋๋ค).\n */\nimport { anyJournalRow } from '../twin-event/journal-count.js'\n\n/**\n * ์ํ ์ถ โ ๊ทธ ์ถ์ ์ฑ์ฐ๋ ์ฌ๊ฑด ๋ฑ๋ง. ํ์ ์์ผ๋ฉด ํ๋จํ์ง ์๋๋ค.\n *\n * ๋ฌผํ์ EPCIS ๋ก ์จ๋ค(์ฌ๊ฑด ์ด๋ฆ์ด ์ฌ๋ฌ ๊ฐ๋ค) โ ๊ทธ๋์ ์ ๋์ฌ๋ก ๋ณธ๋ค.\n */\nconst AXIS_EVENTS: Record<string, { types?: string[]; prefix?: string }> = {\n tasks: { types: ['task.status'] },\n orders: { types: ['order.status'] },\n items: { prefix: 'epcis.' },\n demandWindows: { types: ['energy.demand.window'] }\n}\n\n/** ์ด ์ถ์ ์ฌ์ค์ด ์ ๋์ ํ ๊ฑด์ด๋ผ๋ ์๋. ํ๋จํ ์ ์์ผ๋ฉด `null`(๋ชจ๋ฅธ๋ค). */\nexport async function axisSeenInJournal(\n repo: any,\n where: Record<string, unknown>,\n axis: string\n): Promise<boolean | null> {\n const spec = AXIS_EVENTS[axis]\n if (!spec) return null\n\n if (spec.types) {\n for (const t of spec.types) {\n if (await anyJournalRow(repo, { ...where, eventType: t })) return true\n }\n return false\n }\n /*\n * ์ ๋์ฌ๋ก ์ฐพ๋ ์ถ(๋ฌผํ) โ ํ ๊ฑด๋ง ์์ผ๋ฉด ๋๋ค. `Like` ๋ฅผ ์ฐ๋ ๋์ **๋ฑ๋ง ๋ชฉ๋ก**์ ์ฐ์ง ์๋ ์ด์ ๋\n * EPCIS ์ฌ๊ฑด ์ด๋ฆ์ด ์ปค๋์์ ์๋ผ๊ธฐ ๋๋ฌธ์ด๋ค(๊ฐ์ฒดยท์ง์ฝยท๋ณํยท๊ฑฐ๋โฆ). ์ด๋ฆ์ ์ฌ๊ธฐ ๋ฒ ๋ผ๋ฉด ์ปค๋์ด\n * ํ๋ ๋๋ฆด ๋ ์ด ์๋ฆฌ๊ฐ ์กฐ์ฉํ ๋ก๋๋ค.\n */\n const { Like } = await import('typeorm')\n return anyJournalRow(repo, { ...where, eventType: Like(`${spec.prefix}%`) })\n}\n"]}
|
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.EPCIS_CONCEPTS = void 0;
|
|
4
4
|
exports.epcisCoverage = epcisCoverage;
|
|
5
|
+
/*
|
|
6
|
+
* GS1 EPCIS 2.0 ์ ํฉ์ฑ ๊ธฐ์ค โ **๋ฌผ๋ฅยท์ ์กฐ ํธ์์ด ํ์ค์ ์ด๋๋ฅผ ์ฑ์ฐ๊ณ ์๋.**
|
|
7
|
+
*
|
|
8
|
+
* โโ ์ ๋ฐ๋ก ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
9
|
+
* ์ ํฉ์ฑ ํจ๋์ด ISA-95 ํ๋๋ง ๋งํ๊ณ ์์๋ค. ๊ทธ๋ฐ๋ฐ ์ฐฝ๊ณ ยท์ผ๋ยท๊ณต์ฅ ํธ์์์ ใ๋ฌด์จ ์ผ์ด ์์๋ใ์
|
|
10
|
+
* ใ์ด ๋ฒํธ๊ฐ ๋ฌด์์ ๊ฐ๋ฆฌํค๋ใ๋ฅผ ์ ํ๋ ๊ฒ์ EPCIS ๋ค. ISA-95 ํ๋ง ๋ณด์ด๋ฉด ๊ทธ ํธ์์ด ๊ธฐ๋๋ ๊ธฐ์ค์
|
|
11
|
+
* ์ ๋ฐ์ด ํ๋ฉด์ ์๋ค.
|
|
12
|
+
*
|
|
13
|
+
* โโ ์์ค์ ๊ทผ๊ฑฐ๋ฅผ ๋ณด๊ณ ์ ์๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
14
|
+
* ใ์๋ค/์๋คใ๋ฅผ ๊ธฐ์ต์ผ๋ก ์ ์ง ์๋๋ค. ๊ฐ ์ค์ ํ๋จ ๊ทผ๊ฑฐ:
|
|
15
|
+
* ยท ํ์
์ ์ธ โ ์ปค๋ `epcis.ts`(์ด๋ฒคํธยทํ๋์ ๋ชจ์)
|
|
16
|
+
* ยท ์ค์ ์ฌ์ฉ โ ์ปค๋ ๋๋ฉ์ธ(`mes-kernel`ยท`face2-adapter`ยท`observed-reducer`)๊ณผ ํธ์คํธ ์ธ์ ์คํธ
|
|
17
|
+
* ยท ํ๋ฉด ๋
ธ์ถ โ ์ ๋ยท๊ณ๋ณดยท์ํฐํฐ 360
|
|
18
|
+
* ๋ชจ์๋ง ์๊ณ ์๋ฌด๋ ์ฑ์ฐ์ง ์๋ ํ๋๋ **๊ตฌ์กฐ๋ง ์์**์ผ๋ก ์ ๋๋ค(๊ทธ๊ฒ ์ฌ์ค์ด๋ค).
|
|
19
|
+
*
|
|
20
|
+
* ISA-95 ํ์ ๊ฐ์ ๊ท์จ์ด๋ค(`isa95-coverage.ts` ๋จธ๋ฆฌ๋ง): ์ฌ๋์ด ํ๋จํด ์ ๊ณ , ํ๋ฆฌ๋ฉด ์ฌ๊ธฐ๋ฅผ ๊ณ ์น๋ค.
|
|
21
|
+
*/
|
|
22
|
+
const isa95_coverage_js_1 = require("./isa95-coverage.js");
|
|
5
23
|
/* Part: EPCIS 2.0 ์ ์ฌ๊ฑด ์ข
๋ฅ โ ๋ฌด์์ด ์ผ์ด๋ฌ๋๊ฐ. */
|
|
6
24
|
const EVENTS = [
|
|
7
25
|
{
|
|
@@ -157,13 +175,7 @@ const FIELDS = [
|
|
|
157
175
|
];
|
|
158
176
|
exports.EPCIS_CONCEPTS = [...EVENTS, ...FIELDS];
|
|
159
177
|
function epcisCoverage(axes) {
|
|
160
|
-
const
|
|
161
|
-
const concepts = exports.EPCIS_CONCEPTS.map(c => {
|
|
162
|
-
const axisMissing = !!c.axis && !known.has(c.axis);
|
|
163
|
-
const shownOn = c.shownOn?.filter(a => known.has(a));
|
|
164
|
-
const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c;
|
|
165
|
-
return axisMissing ? { ...fixed, structure: 'none', axisMissing } : fixed;
|
|
166
|
-
});
|
|
178
|
+
const concepts = exports.EPCIS_CONCEPTS.map(c => (0, isa95_coverage_js_1.reconcileAxes)(c, new Set(axes)));
|
|
167
179
|
const count = (k) => concepts.filter(c => c[k] === 'full').length;
|
|
168
180
|
return {
|
|
169
181
|
model: 'GS1 EPCIS 2.0',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epcis-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/epcis-coverage.ts"],"names":[],"mappings":";;;AAgLA,
|
|
1
|
+
{"version":3,"file":"epcis-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/epcis-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * GS1 EPCIS 2.0 ์ ํฉ์ฑ ๊ธฐ์ค โ **๋ฌผ๋ฅยท์ ์กฐ ํธ์์ด ํ์ค์ ์ด๋๋ฅผ ์ฑ์ฐ๊ณ ์๋.**\n *\n * โโ ์ ๋ฐ๋ก ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ ํฉ์ฑ ํจ๋์ด ISA-95 ํ๋๋ง ๋งํ๊ณ ์์๋ค. ๊ทธ๋ฐ๋ฐ ์ฐฝ๊ณ ยท์ผ๋ยท๊ณต์ฅ ํธ์์์ ใ๋ฌด์จ ์ผ์ด ์์๋ใ์\n * ใ์ด ๋ฒํธ๊ฐ ๋ฌด์์ ๊ฐ๋ฆฌํค๋ใ๋ฅผ ์ ํ๋ ๊ฒ์ EPCIS ๋ค. ISA-95 ํ๋ง ๋ณด์ด๋ฉด ๊ทธ ํธ์์ด ๊ธฐ๋๋ ๊ธฐ์ค์\n * ์ ๋ฐ์ด ํ๋ฉด์ ์๋ค.\n *\n * โโ ์์ค์ ๊ทผ๊ฑฐ๋ฅผ ๋ณด๊ณ ์ ์๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ใ์๋ค/์๋คใ๋ฅผ ๊ธฐ์ต์ผ๋ก ์ ์ง ์๋๋ค. ๊ฐ ์ค์ ํ๋จ ๊ทผ๊ฑฐ:\n * ยท ํ์
์ ์ธ โ ์ปค๋ `epcis.ts`(์ด๋ฒคํธยทํ๋์ ๋ชจ์)\n * ยท ์ค์ ์ฌ์ฉ โ ์ปค๋ ๋๋ฉ์ธ(`mes-kernel`ยท`face2-adapter`ยท`observed-reducer`)๊ณผ ํธ์คํธ ์ธ์ ์คํธ\n * ยท ํ๋ฉด ๋
ธ์ถ โ ์ ๋ยท๊ณ๋ณดยท์ํฐํฐ 360\n * ๋ชจ์๋ง ์๊ณ ์๋ฌด๋ ์ฑ์ฐ์ง ์๋ ํ๋๋ **๊ตฌ์กฐ๋ง ์์**์ผ๋ก ์ ๋๋ค(๊ทธ๊ฒ ์ฌ์ค์ด๋ค).\n *\n * ISA-95 ํ์ ๊ฐ์ ๊ท์จ์ด๋ค(`isa95-coverage.ts` ๋จธ๋ฆฌ๋ง): ์ฌ๋์ด ํ๋จํด ์ ๊ณ , ํ๋ฆฌ๋ฉด ์ฌ๊ธฐ๋ฅผ ๊ณ ์น๋ค.\n */\nimport { reconcileAxes, type Isa95Concept, type CoverageLevel } from './isa95-coverage.js'\n\n/* Part: EPCIS 2.0 ์ ์ฌ๊ฑด ์ข
๋ฅ โ ๋ฌด์์ด ์ผ์ด๋ฌ๋๊ฐ. */\nconst EVENTS: Isa95Concept[] = [\n {\n std: 'ObjectEvent',\n part: 'events',\n label: 'twin.epcis.ObjectEvent',\n axis: 'items',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.ObjectEvent'\n },\n {\n std: 'AggregationEvent',\n part: 'events',\n label: 'twin.epcis.AggregationEvent',\n axis: null,\n shownOn: ['items'],\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.AggregationEvent'\n },\n {\n std: 'TransactionEvent',\n part: 'events',\n label: 'twin.epcis.TransactionEvent',\n axis: 'orders',\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.TransactionEvent'\n },\n {\n std: 'TransformationEvent',\n part: 'events',\n label: 'twin.epcis.TransformationEvent',\n axis: null,\n shownOn: ['items', 'operations'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.TransformationEvent'\n },\n /* EPCIS 2.0 ์ด ๋ํ ์ฌ๊ฑด โ ์ฐ๋ฆฌ๋ ํ์
์กฐ์ฐจ ๋์ง ์์๋ค. ์๋ ๊ฒ์ ์๋ค๊ณ ์ ๋๋ค. */\n {\n std: 'AssociationEvent',\n part: 'events',\n label: 'twin.epcis.AssociationEvent',\n axis: null,\n structure: 'none',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.AssociationEvent'\n }\n]\n\n/* Part: ์ฌ๊ฑด์ด ๋ตํ๋ ๋ค์ฏ ๊ฐ์ง โ ๋ฌด์์ยท์ด๋์ยท์ธ์ ยท์, ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๊ฑฐ๋๋ก. */\nconst FIELDS: Isa95Concept[] = [\n {\n std: 'epcList / quantityList',\n part: 'fields',\n label: 'twin.epcis.identity',\n axis: 'items',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.identity'\n },\n {\n std: 'bizStep / disposition (CBV)',\n part: 'fields',\n label: 'twin.epcis.cbv',\n axis: null,\n shownOn: ['items', 'tasks'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.cbv'\n },\n {\n std: 'readPoint / bizLocation',\n part: 'fields',\n label: 'twin.epcis.where',\n axis: 'locations',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.where'\n },\n {\n std: 'bizTransactionList',\n part: 'fields',\n label: 'twin.epcis.bizTransaction',\n axis: 'orders',\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.bizTransaction'\n },\n {\n std: 'ilmd',\n part: 'fields',\n label: 'twin.epcis.ilmd',\n axis: null,\n shownOn: ['items'],\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.ilmd'\n },\n {\n std: 'errorDeclaration',\n part: 'fields',\n label: 'twin.epcis.errorDeclaration',\n axis: null,\n shownOn: ['items'],\n structure: 'full',\n behavior: 'partial',\n surface: 'none',\n note: 'twin.epcis.note.errorDeclaration'\n },\n /* ๋ชจ์๋ง ์๊ณ ์๋ฌด๋ ์ฑ์ฐ์ง ์๋ ๊ฒ๋ค โ ๊ตฌ์กฐ๋ง ์์. */\n {\n std: 'sourceList / destinationList',\n part: 'fields',\n label: 'twin.epcis.sourceDestination',\n axis: null,\n structure: 'partial',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.sourceDestination'\n },\n {\n std: 'persistentDisposition',\n part: 'fields',\n label: 'twin.epcis.persistentDisposition',\n axis: null,\n structure: 'partial',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.persistentDisposition'\n },\n {\n std: 'sensorElementList',\n part: 'fields',\n label: 'twin.epcis.sensorElement',\n axis: null,\n structure: 'partial',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.sensorElement'\n }\n]\n\nexport const EPCIS_CONCEPTS: Isa95Concept[] = [...EVENTS, ...FIELDS]\n\nexport function epcisCoverage(axes: string[]): {\n model: string\n concepts: (Isa95Concept & { axisMissing?: boolean })[]\n totals: { concepts: number; structure: number; behavior: number; surface: number }\n} {\n const concepts = EPCIS_CONCEPTS.map(c => reconcileAxes(c, new Set(axes)))\n const count = (k: 'structure' | 'behavior' | 'surface') => concepts.filter(c => c[k] === 'full').length\n return {\n model: 'GS1 EPCIS 2.0',\n concepts,\n totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }\n }\n}\n"]}
|
|
@@ -2,6 +2,23 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.IEC61850_CONCEPTS = void 0;
|
|
4
4
|
exports.iec61850Coverage = iec61850Coverage;
|
|
5
|
+
/*
|
|
6
|
+
* IEC 61850 ์ ํฉ์ฑ ๊ธฐ์ค โ **์๋์ง ํธ์์ด ํ์ค์ ์ด๋๋ฅผ ์ฑ์ฐ๊ณ ์๋.**
|
|
7
|
+
*
|
|
8
|
+
* โโ ์ ๋ฐ๋ก ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
9
|
+
* ์ธ์คํ์
์ ์ ํฉ์ฑ ํจ๋์ ํธ์ ์ข
๋ฅ์ ๋ฌด๊ดํ๊ฒ ISA-95 ํ๋๋ง ๋งํ๊ณ ์์๋ค. ์๋์ง ํธ์์์ ๊ทธ๊ฒ์
|
|
10
|
+
* ๊ฑฐ์ง์ ์๋์ง๋ง(์ค๋นยท๊ณ์ธตยท์์ฑ์ ์๋์ง์์๋ ISA-95 ์์์ด๋ค) **๋ถ์กฑํ๋ค** โ ๊ณ๋๊ธฐยท์ฐจ๋จ๊ธฐยทํ์๊ดยท
|
|
11
|
+
* ์ถ์ ์ง์ ์ดํ๋ฅผ ์ฃผ๋ ๊ฒ์ IEC 61850 ์ด๊ณ , ๋ฌด์์ด ๋น์๋์ง๋ ๊ทธ ๋ชฉ๋ก์ผ๋ก๋ง ์
์ ์๋ค.
|
|
12
|
+
*
|
|
13
|
+
* โโ ์ฃผ์ฅ ์์ค์ ๋ชป ๋ฐ๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
14
|
+
* ์ฌ๊ธฐ์ ์ฌ๋ ๊ฒ์ **์ดํ์ ๋ชจ๋ธ**์ด๋ค. ํ๋กํ ์ฝ(MMSยทGOOSEยท์ํ๋๊ฐ)์ ๊ตฌํํ๋ค๋ ๋ป์ด ์๋๋ฉฐ,
|
|
15
|
+
* ๊ทธ ์ฃผ์ฅ์ ์ ํฉ์ฑ ์ํ์ด ๋ท๋ฐ์นจํด์ผ ํ๋ค. ํ ์ด๋ฆ์ ใIEC 61850 (vocabulary)ใ๋ก ์ฐ๋ ์ด์ ๋ค.
|
|
16
|
+
*
|
|
17
|
+
* โโ ๊ฐ์ ๊ด์ธก์ด ์๋๋ผ ์ ์ธ์ด๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
18
|
+
* ISA-95 ํ์ ๊ฐ์ ๊ท์จ์ด๋ค(`isa95-coverage.ts` ๋จธ๋ฆฌ๋ง): ์ฌ๋์ด ํ๋จํด ์ ๊ณ , ํ๋ฆฌ๋ฉด ์ฌ๊ธฐ๋ฅผ ๊ณ ์น๋ค.
|
|
19
|
+
* ์๋์ผ๋ก ์ ์ ์๋ ๊ฒ ํ๋๋ง ์๋์ผ๋ก ํ๋ค โ ์ถ ์ด๋ฆ์ด ์ปค๋ ์ถ ๋ชฉ๋ก์ ์์ผ๋ฉด ๊ตฌ์กฐ๊ฐ ์๋ ๊ฒ์ด๋ค.
|
|
20
|
+
*/
|
|
21
|
+
const isa95_coverage_js_1 = require("./isa95-coverage.js");
|
|
5
22
|
/*
|
|
6
23
|
* Part 7-4 โ ๋
ผ๋ฆฌ ๋
ธ๋ ํด๋์ค. ์ด ํ๋กํ์ผ์ด ์ฐ๋ ๊ฒ๋ง ์ ๋๋ค(ํ์ค ์ ์ฒด๋ฅผ ์ฎ๊ธฐ์ง ์๋๋ค):
|
|
7
24
|
* ๊ณ๋ยท๊ณ์ธกยท๊ฐํยท๋ฐ์ ยท์ ์ฅ.
|
|
@@ -80,13 +97,7 @@ const LOGICAL_NODES = [
|
|
|
80
97
|
];
|
|
81
98
|
exports.IEC61850_CONCEPTS = [...LOGICAL_NODES]; // vocabulary-guard: allow โ ํ์ค ์ฉ์ด(์ ์ฃผ์)
|
|
82
99
|
function iec61850Coverage(axes) {
|
|
83
|
-
const
|
|
84
|
-
const concepts = exports.IEC61850_CONCEPTS.map(c => {
|
|
85
|
-
const axisMissing = !!c.axis && !known.has(c.axis);
|
|
86
|
-
const shownOn = c.shownOn?.filter(a => known.has(a));
|
|
87
|
-
const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c;
|
|
88
|
-
return axisMissing ? { ...fixed, structure: 'none', axisMissing } : fixed;
|
|
89
|
-
});
|
|
100
|
+
const concepts = exports.IEC61850_CONCEPTS.map(c => (0, isa95_coverage_js_1.reconcileAxes)(c, new Set(axes)));
|
|
90
101
|
const count = (k) => concepts.filter(c => c[k] === 'full').length;
|
|
91
102
|
return {
|
|
92
103
|
/* ์ด๋ฆ์ (vocabulary) ๋ฅผ ๋ฌ์ ๋๋ค โ ํ๋กํ ์ฝ ์ ํฉ์ฑ์ผ๋ก ์ฝํ์ง ์๊ฒ. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iec61850-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/iec61850-coverage.ts"],"names":[],"mappings":";;;AAiGA,
|
|
1
|
+
{"version":3,"file":"iec61850-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/iec61850-coverage.ts"],"names":[],"mappings":";;;AAiGA,4CAaC;AA9GD;;;;;;;;;;;;;;;GAeG;AACH,2DAA0F;AAE1F;;;GAGG;AACH,MAAM,aAAa,GAAmB;IACpC;;;OAGG;IACH;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yBAAyB;KAChC;IACD;;;OAGG;IACH;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,eAAe;QACrB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yBAAyB;KAChC;IACD;;;;;;;;OAQG;IACH;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,CAAC,WAAW,CAAC;QACtB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yBAAyB;KAChC;IACD;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,CAAC,WAAW,CAAC;QACtB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yBAAyB;KAChC;IACD;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,CAAC,WAAW,CAAC;QACtB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yBAAyB;KAChC;CACF,CAAA;AAEY,QAAA,iBAAiB,GAAmB,CAAC,GAAG,aAAa,CAAC,CAAA,CAAC,wCAAwC;AAE5G,SAAgB,gBAAgB,CAAC,IAAc;IAK7C,MAAM,QAAQ,GAAG,yBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,iCAAa,EAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC5E,MAAM,KAAK,GAAG,CAAC,CAAuC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,CAAA;IACvG,OAAO;QACL,mDAAmD;QACnD,KAAK,EAAE,wBAAwB;QAC/B,QAAQ;QACR,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;KAC7H,CAAA;AACH,CAAC","sourcesContent":["/*\n * IEC 61850 ์ ํฉ์ฑ ๊ธฐ์ค โ **์๋์ง ํธ์์ด ํ์ค์ ์ด๋๋ฅผ ์ฑ์ฐ๊ณ ์๋.**\n *\n * โโ ์ ๋ฐ๋ก ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ธ์คํ์
์ ์ ํฉ์ฑ ํจ๋์ ํธ์ ์ข
๋ฅ์ ๋ฌด๊ดํ๊ฒ ISA-95 ํ๋๋ง ๋งํ๊ณ ์์๋ค. ์๋์ง ํธ์์์ ๊ทธ๊ฒ์\n * ๊ฑฐ์ง์ ์๋์ง๋ง(์ค๋นยท๊ณ์ธตยท์์ฑ์ ์๋์ง์์๋ ISA-95 ์์์ด๋ค) **๋ถ์กฑํ๋ค** โ ๊ณ๋๊ธฐยท์ฐจ๋จ๊ธฐยทํ์๊ดยท\n * ์ถ์ ์ง์ ์ดํ๋ฅผ ์ฃผ๋ ๊ฒ์ IEC 61850 ์ด๊ณ , ๋ฌด์์ด ๋น์๋์ง๋ ๊ทธ ๋ชฉ๋ก์ผ๋ก๋ง ์
์ ์๋ค.\n *\n * โโ ์ฃผ์ฅ ์์ค์ ๋ชป ๋ฐ๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฌ๊ธฐ์ ์ฌ๋ ๊ฒ์ **์ดํ์ ๋ชจ๋ธ**์ด๋ค. ํ๋กํ ์ฝ(MMSยทGOOSEยท์ํ๋๊ฐ)์ ๊ตฌํํ๋ค๋ ๋ป์ด ์๋๋ฉฐ,\n * ๊ทธ ์ฃผ์ฅ์ ์ ํฉ์ฑ ์ํ์ด ๋ท๋ฐ์นจํด์ผ ํ๋ค. ํ ์ด๋ฆ์ ใIEC 61850 (vocabulary)ใ๋ก ์ฐ๋ ์ด์ ๋ค.\n *\n * โโ ๊ฐ์ ๊ด์ธก์ด ์๋๋ผ ์ ์ธ์ด๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ISA-95 ํ์ ๊ฐ์ ๊ท์จ์ด๋ค(`isa95-coverage.ts` ๋จธ๋ฆฌ๋ง): ์ฌ๋์ด ํ๋จํด ์ ๊ณ , ํ๋ฆฌ๋ฉด ์ฌ๊ธฐ๋ฅผ ๊ณ ์น๋ค.\n * ์๋์ผ๋ก ์ ์ ์๋ ๊ฒ ํ๋๋ง ์๋์ผ๋ก ํ๋ค โ ์ถ ์ด๋ฆ์ด ์ปค๋ ์ถ ๋ชฉ๋ก์ ์์ผ๋ฉด ๊ตฌ์กฐ๊ฐ ์๋ ๊ฒ์ด๋ค.\n */\nimport { reconcileAxes, type Isa95Concept, type CoverageLevel } from './isa95-coverage.js'\n\n/*\n * Part 7-4 โ ๋
ผ๋ฆฌ ๋
ธ๋ ํด๋์ค. ์ด ํ๋กํ์ผ์ด ์ฐ๋ ๊ฒ๋ง ์ ๋๋ค(ํ์ค ์ ์ฒด๋ฅผ ์ฎ๊ธฐ์ง ์๋๋ค):\n * ๊ณ๋ยท๊ณ์ธกยท๊ฐํยท๋ฐ์ ยท์ ์ฅ.\n */\nconst LOGICAL_NODES: Isa95Concept[] = [ // vocabulary-guard: allow โ IEC 61850 ์ ใ๋
ผ๋ฆฌ ๋
ธ๋(logical node)ใ๋ ํ์ค ์ฉ์ด๋ค(์ฐ๋ฆฌ๊ฐ ์ํด์ํจ node ์ดํ๊ฐ ์๋๋ค)\n /*\n * ๊ณ๋(์ ์ฐ) โ ์ปค๋ฅํฐ๊ฐ ๋์ ์ ๋ ฅ๋์ ์ค์ด ์ค๊ณ ์ํ๊ฐ ์ง์ ๋ณ๋ก ๋ค๊ณ ์๋ค. ํ๋ฉด์ ๊ณ๋ ์ปดํฌ๋ํธ๊ฐ\n * ์ง์ ์ ๊ฐ์ ๋ณด์ธ๋ค.\n */\n {\n std: 'MMTR',\n part: '7-4',\n label: 'twin.iec61850.MMTR',\n axis: 'equipment',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.MMTR'\n },\n /*\n * ๊ณ์ธก(์ ํจ์ ๋ ฅยท์ญ๋ฅ ) โ ํ๋ณธ์ด ์์ ๊ตฌ๊ฐ์ผ๋ก ์ ํ๊ณ , ๊ตฌ๊ฐยทํผํฌยท๊ณ์ฝ ๋๋น๊ฐ ๊ทธ ์์ ์ ๋ค.\n * ์ด ํ๋กํ์ผ์์ ๊ฐ์ฅ ๋๊ป๊ฒ ์ฑ์ด ์๋ฆฌ๋ค.\n */\n {\n std: 'MMXU',\n part: '7-4',\n label: 'twin.iec61850.MMXU',\n axis: 'demandWindows',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.MMXU'\n },\n /*\n * โโ ์
์ด ํจ๊ป ์ฌ๋ผ๊ฐ๋ค (2026-08-15) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๊ฐํยท๋ฐ์ ยท์ ์ฅ์ ์ค๋ ใ๊ตฌ์กฐ๋ง ์์ใ์ด์๋ค. ๋ฅ๋ ฅ์ด ์ํ ํ๋๋ฅผ ์ ์ธํด ๋์๋๋ฐ **๊ฐ์ ๋ฐ๋ ๋ฌธ์ด\n * ์์๊ธฐ ๋๋ฌธ**์ด๋ค. ์ด์ ์
๋ค ์ค์ ๋ก ๋๋ค: ์ค๋น ์ํ๊ฐ ๊ณ์ฝ์ ์๊ณ (`EquipmentState`), ์ปค๋์ด\n * `energy.equipment` ๋ก ๋ฐ์ ๊ทธ ์ค๋น์ ์ ๊ณ , ์ฌ ์ปดํฌ๋ํธ๊ฐ ๊ทธ๋ฆฐ๋ค.\n *\n * ์ธ ์ธต์ ํจ๊ป ์ฌ๋ฆฌ๋ ์ด์ : ๊ฐ์ด ์๋๋ฐ ํ๋ฉด๋ง ๋ง๋ค๋ฉด ์์ํ ใโใ์ธ ์นด๋๊ฐ ๋๊ณ , ํ๋ฉด์ด ์๋๋ฐ\n * ๊ธฐ๋ฅ๋ง ์ฌ๋ฆฌ๋ฉด ์๋ฌด๋ ๊ทธ ๊ฐ์ ๋ณด์ง ๋ชปํ๋ค. ใ๊ฐ์ด ๋จผ์ , ์ปดํฌ๋ํธ๋ ๊ทธ ๋ค์ใ์ ๊ฒฐ๊ณผ๋ค.\n */\n {\n std: 'XCBR',\n part: '7-4',\n label: 'twin.iec61850.XCBR',\n axis: null,\n shownOn: ['equipment'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.XCBR'\n },\n {\n std: 'DPVA',\n part: '7-4',\n label: 'twin.iec61850.DPVA',\n axis: null,\n shownOn: ['equipment'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.DPVA'\n },\n {\n std: 'ZBAT',\n part: '7-4',\n label: 'twin.iec61850.ZBAT',\n axis: null,\n shownOn: ['equipment'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.ZBAT'\n }\n]\n\nexport const IEC61850_CONCEPTS: Isa95Concept[] = [...LOGICAL_NODES] // vocabulary-guard: allow โ ํ์ค ์ฉ์ด(์ ์ฃผ์)\n\nexport function iec61850Coverage(axes: string[]): {\n model: string\n concepts: (Isa95Concept & { axisMissing?: boolean })[]\n totals: { concepts: number; structure: number; behavior: number; surface: number }\n} {\n const concepts = IEC61850_CONCEPTS.map(c => reconcileAxes(c, new Set(axes)))\n const count = (k: 'structure' | 'behavior' | 'surface') => concepts.filter(c => c[k] === 'full').length\n return {\n /* ์ด๋ฆ์ (vocabulary) ๋ฅผ ๋ฌ์ ๋๋ค โ ํ๋กํ ์ฝ ์ ํฉ์ฑ์ผ๋ก ์ฝํ์ง ์๊ฒ. */\n model: 'IEC 61850 (vocabulary)',\n concepts,\n totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }\n }\n}\n"]}
|
|
@@ -34,6 +34,20 @@ export declare const ISA95_CONCEPTS: Isa95Concept[];
|
|
|
34
34
|
* `axis` ๋ฅผ ์ปค๋ ์ถ ๋ชฉ๋ก๊ณผ ๋ง์ถฐ ๋ณธ๋ค: ์ถ์ด ์๋ค๊ณ ์ ํ ์๋๋ฐ ์ปค๋์ ์์ผ๋ฉด ๊ทธ ์ ์ธ์ด ๋ก์ ๊ฒ์ด๋ฏ๋ก
|
|
35
35
|
* **๊ตฌ์กฐ ์์์ผ๋ก ๋ฎ์ถ๊ณ ๊ทธ ์ฌ์ค์ ๋งํ๋ค**(์กฐ์ฉํ ํต๊ณผ์ํค๋ฉด ์ด ํ๊ฐ ๊ฑฐ์ง์ด ๋๋ค).
|
|
36
36
|
*/
|
|
37
|
+
/**
|
|
38
|
+
* ์ ์ธํ ์ถ์ ์ปค๋์ ์ถ ๋ชฉ๋ก๊ณผ ๋ง์ถ๋ค โ **์ด๊ธ๋ ๊ฒ์ ์กฐ์ฉํ ์ง์ฐ์ง ์๋๋ค.**
|
|
39
|
+
*
|
|
40
|
+
* ๋ ์๋ฆฌ๊ฐ ์ด๊ธ๋ ์ ์๋ค.
|
|
41
|
+
* ยท `axis` โ ๊ทธ ๊ฐ๋
์์ ์ ๋ฌธ. ์ปค๋์ ์์ผ๋ฉด ๊ตฌ์กฐ๋ฅผ ใ์์ใ์ผ๋ก ๋ฎ์ถ๊ณ ๊ทธ ์ฌ์ค์ ๋งํ๋ค.
|
|
42
|
+
* ยท `shownOn` โ ๊ทธ ์ฌ์ค์ ๋ค๊ณ ์๋ ๋ค๋ฅธ ์ถ. ์์ ์๋ ์๋ ์ถ์ **๋ง์์ด ๊ฑธ๋ฌ ๋๋ค.** ๊ทธ๋ฌ๋ฉด ๊ทธ ์ค์
|
|
43
|
+
* ใ๊ฐ๋
์ถ์ด ์์ต๋๋คใ๋ก ๋ณด์ด๊ณ , ์ฌ๋์ ๊ทธ๊ฒ์ **์๋ ๊ทธ๋ฐ ๊ฒ**์ผ๋ก ์ฝ๋๋ค. ์ค์ ๋ก ๊ทธ ์ผ์ด ์์๋ค:
|
|
44
|
+
* EPCIS ํ์ ์ผ๊ณฑ ์ค์ด ์ปค๋์ ์๋ ์ถ(`items`)์ ๊ธฐ๋๊ณ ์์๋๋ฐ, ๊ฒฝ๊ณ ๊ฐ ๋ฌ ๊ฒ์ ๋ ์ค๋ฟ์ด์๋ค.
|
|
45
|
+
*
|
|
46
|
+
* ๋ ์ค ํ๋๋ผ๋ ์ด๊ธ๋๋ฉด `axisMissing` ์ด๋ค โ ํ๊ฐ ์ค์ค๋ก ใ์ต์ ์ด ์๋๋คใ๋ผ๊ณ ๋งํ๊ฒ ํ๋ค.
|
|
47
|
+
*/
|
|
48
|
+
export declare function reconcileAxes(c: Isa95Concept, known: Set<string>): Isa95Concept & {
|
|
49
|
+
axisMissing?: boolean;
|
|
50
|
+
};
|
|
37
51
|
export declare function isa95Coverage(axes: string[]): {
|
|
38
52
|
model: string;
|
|
39
53
|
concepts: (Isa95Concept & {
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
*/
|
|
31
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
32
|
exports.ISA95_CONCEPTS = void 0;
|
|
33
|
+
exports.reconcileAxes = reconcileAxes;
|
|
33
34
|
exports.isa95Coverage = isa95Coverage;
|
|
34
35
|
/*
|
|
35
36
|
* ๊ฐ์ฉ ๋ฅ๋ ฅ(2026-08-12, ์ปค๋ 0.6.8) โ **ํ์ ๊ณผ ์ด์ ๊ฐ ์ํ์ ์ค๋ ค ์จ๋ค**(`capability {available, reason}`).
|
|
@@ -134,16 +135,29 @@ exports.ISA95_CONCEPTS = [...PART2, ...PART4];
|
|
|
134
135
|
* `axis` ๋ฅผ ์ปค๋ ์ถ ๋ชฉ๋ก๊ณผ ๋ง์ถฐ ๋ณธ๋ค: ์ถ์ด ์๋ค๊ณ ์ ํ ์๋๋ฐ ์ปค๋์ ์์ผ๋ฉด ๊ทธ ์ ์ธ์ด ๋ก์ ๊ฒ์ด๋ฏ๋ก
|
|
135
136
|
* **๊ตฌ์กฐ ์์์ผ๋ก ๋ฎ์ถ๊ณ ๊ทธ ์ฌ์ค์ ๋งํ๋ค**(์กฐ์ฉํ ํต๊ณผ์ํค๋ฉด ์ด ํ๊ฐ ๊ฑฐ์ง์ด ๋๋ค).
|
|
136
137
|
*/
|
|
138
|
+
/**
|
|
139
|
+
* ์ ์ธํ ์ถ์ ์ปค๋์ ์ถ ๋ชฉ๋ก๊ณผ ๋ง์ถ๋ค โ **์ด๊ธ๋ ๊ฒ์ ์กฐ์ฉํ ์ง์ฐ์ง ์๋๋ค.**
|
|
140
|
+
*
|
|
141
|
+
* ๋ ์๋ฆฌ๊ฐ ์ด๊ธ๋ ์ ์๋ค.
|
|
142
|
+
* ยท `axis` โ ๊ทธ ๊ฐ๋
์์ ์ ๋ฌธ. ์ปค๋์ ์์ผ๋ฉด ๊ตฌ์กฐ๋ฅผ ใ์์ใ์ผ๋ก ๋ฎ์ถ๊ณ ๊ทธ ์ฌ์ค์ ๋งํ๋ค.
|
|
143
|
+
* ยท `shownOn` โ ๊ทธ ์ฌ์ค์ ๋ค๊ณ ์๋ ๋ค๋ฅธ ์ถ. ์์ ์๋ ์๋ ์ถ์ **๋ง์์ด ๊ฑธ๋ฌ ๋๋ค.** ๊ทธ๋ฌ๋ฉด ๊ทธ ์ค์
|
|
144
|
+
* ใ๊ฐ๋
์ถ์ด ์์ต๋๋คใ๋ก ๋ณด์ด๊ณ , ์ฌ๋์ ๊ทธ๊ฒ์ **์๋ ๊ทธ๋ฐ ๊ฒ**์ผ๋ก ์ฝ๋๋ค. ์ค์ ๋ก ๊ทธ ์ผ์ด ์์๋ค:
|
|
145
|
+
* EPCIS ํ์ ์ผ๊ณฑ ์ค์ด ์ปค๋์ ์๋ ์ถ(`items`)์ ๊ธฐ๋๊ณ ์์๋๋ฐ, ๊ฒฝ๊ณ ๊ฐ ๋ฌ ๊ฒ์ ๋ ์ค๋ฟ์ด์๋ค.
|
|
146
|
+
*
|
|
147
|
+
* ๋ ์ค ํ๋๋ผ๋ ์ด๊ธ๋๋ฉด `axisMissing` ์ด๋ค โ ํ๊ฐ ์ค์ค๋ก ใ์ต์ ์ด ์๋๋คใ๋ผ๊ณ ๋งํ๊ฒ ํ๋ค.
|
|
148
|
+
*/
|
|
149
|
+
function reconcileAxes(c, known) {
|
|
150
|
+
const ownMissing = !!c.axis && !known.has(c.axis);
|
|
151
|
+
const shownOn = c.shownOn?.filter(a => known.has(a));
|
|
152
|
+
const lostShown = !!c.shownOn && (shownOn?.length ?? 0) !== c.shownOn.length;
|
|
153
|
+
const fixed = lostShown ? { ...c, shownOn } : c;
|
|
154
|
+
if (!ownMissing && !lostShown)
|
|
155
|
+
return fixed;
|
|
156
|
+
/* ๊ตฌ์กฐ๋ฅผ ๋ฎ์ถ๋ ๊ฒ์ **์๊ธฐ ๋ฌธ์ด ์์ด์ง ๊ฒฝ์ฐ**๋ค โ ๋จ์ ์ถ์์ ๋ณด์ด๋ ๊ฒ์ ๊ตฌ์กฐ๊ฐ ์๋๋ผ ํ์์ ๋ฌธ์ ๋ค. */
|
|
157
|
+
return ownMissing ? { ...fixed, structure: 'none', axisMissing: true } : { ...fixed, axisMissing: true };
|
|
158
|
+
}
|
|
137
159
|
function isa95Coverage(axes) {
|
|
138
|
-
const
|
|
139
|
-
const concepts = exports.ISA95_CONCEPTS.map(c => {
|
|
140
|
-
const axisMissing = !!c.axis && !known.has(c.axis);
|
|
141
|
-
/* ๊ฐ๋ฆฌํค๋ ๊ณณ์ด ์์ด์ง ์ถ์ **๊ฐ๋ฆฌํค์ง ์๋๋ค** โ ์ฃฝ์ ๋ฌธ์ผ๋ก ๋ณด๋ด๋ฉด ํ๋ฉด์ด ๊ฑฐ์ง๋ง์ ํ๋ค.
|
|
142
|
-
`axis` ์ ๊ฐ์ ๊ท์จ์ด๊ณ , ์ฌ๊ธฐ๊ฐ ๋น๋ฉด ๊ทธ ์ค์ ๋ค์ "์ถ์ด ์๋ค" ๋ก ์ ์งํ๊ฒ ๋์๊ฐ๋ค. */
|
|
143
|
-
const shownOn = c.shownOn?.filter(a => known.has(a));
|
|
144
|
-
const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c;
|
|
145
|
-
return axisMissing ? { ...fixed, structure: 'none', axisMissing } : fixed;
|
|
146
|
-
});
|
|
160
|
+
const concepts = exports.ISA95_CONCEPTS.map(c => reconcileAxes(c, new Set(axes)));
|
|
147
161
|
/* ์ฑ์ด ์๋ `full` ๋ง ์ผ๋ค โ ๋ถ๋ถ์ ์ฑ์ด ๊ฒ์ผ๋ก ์ธ๋ฉด ๊ธฐ์ค์ด ์ค์ค๋ก๋ฅผ ์์ธ๋ค. */
|
|
148
162
|
const count = (k) => concepts.filter(c => c[k] === 'full').length;
|
|
149
163
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isa95-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/isa95-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ISA-95 ์ ํฉ์ฑ ๊ธฐ์ค โ **ํ์ค์ด ์๊ตฌํ๋ ๊ฒ์ ๋ชฉ๋ก.**\n *\n * โโ ์ ์ด ํ์ผ์ด ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ง๊ธ๊น์ง ํ๋ฉด์ \"์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ์ถ\" ๋ง ๋ณด์๋ค. ๊ทธ๋ฌ๋ฉด ์ฑ์ด ๊ฒ์ ์ธ์ด์ง์ง๋ง **๋น ์ง ๊ฒ์ ์
์ ์๋ค** โ\n * ์๋ ๊ฒ์ ํ๋ฉด์ ์์ผ๋ฏ๋ก ์๋ฌด๋ ๊ทธ๊ฒ์ ๋ฌป์ง ์๋๋ค. ํ์ค ์ค์๋ \"์ฐ๋ฆฌ ์ถ์ ํ์ค ์ด๋ฆ์ ๋ถ์๋ค\"\n * ๊ฐ ์๋๋ผ **ํ์ค์ ๋ชฉ๋ก์ ๊ธฐ์ค์ผ๋ก ๋น ์ง ๊ฒ์ด ์๋ค**๋ ๋ง์ด์ด์ผ ํ๋ค. ๊ธฐ์ค์ด ์ฝ๋๋ก ์์ด์ผ ๊ทธ\n * ๋ฌธ์ฅ์ ๊ฒ์ฌํ ์ ์๋ค.\n *\n * โโ ์ธ ์ธต์์ ๋ณธ๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ํ์ค ์ค์๋ ํ ์ธต์ ์ผ์ด ์๋๋ค. ๊ฐ๋
๋ง๋ค ์
์ ๋ฐ๋ก ๋ณธ๋ค:\n *\n * ยท `structure` โ **๋ฐ์ดํฐ๊ตฌ์กฐ**๊ฐ ์๋(์ปค๋ ์ถยทํธ์คํธ ํ์ ์ด ๊ฐ๋
์ ์๋ฆฌ๊ฐ ์๋)\n * ยท `behavior` โ **๊ธฐ๋ฅ**์ด ๊ทธ๊ฒ์ ์ฐ๋(์ปค๋์ด ๊ณํยท์งํยท์ง๊ณ์์ ์ค์ ๋ก ๋ค๋ฃจ๋)\n * ยท `surface` โ **UI ๋
ธ์ถ**์ด ์๋(์ฌ์ฉ์๊ฐ ๊ทธ๊ฒ์ ๋ณผ ์ ์๋)\n *\n * ์
์ ํฉ์น๋ฉด \"๊ตฌ์กฐ๋ ์๋๋ฐ ์๋ฌด๋ ์ ์ฐ๋ ์ปฌ๋ผ\" ๊ณผ \"์ปค๋์ ์ฐ๋๋ฐ ํ๋ฉด์ ์๋ ์ฌ์ค\" ์ด ๊ฐ์\n * ๊ฐ์ผ๋ก ๋ณด์ธ๋ค. ์ค์ ๋ก ์ด ํ๋ก์ ํธ์์ ๋ ๋ค ๋์๋ค(์ธ๋ ฅ ๋ช
์ธ๋ ๊ตฌ์กฐยท๊ธฐ๋ฅ์ด ์์์ง๋ง ํ๋ฉด์\n * ์์๊ณ , `properties` ๋ ๊ตฌ์กฐ๋ง ์๋ค).\n *\n * โโ ๊ฐ์ ๊ด์ธก์ด ์๋๋ผ ์ ์ธ์ด๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฌ๊ธฐ ์ ํ ๊ฒ์ **์ฌ๋์ด ํ๋จํด ์ ์ ์ฌ์ค**์ด๋ค(์๋ ํ์ ์ด ์๋๋ค). ๊ทธ๋์ ํ๋ฆด ์ ์๊ณ , ํ๋ฆฌ๋ฉด\n * ์ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์ผ ํ๋ค โ ํ๋ฉด์ ์ด ์ ์ธ์ ๊ทธ๋๋ก ๋ณด์ด๊ณ ์ง์ด๋ด์ง ์๋๋ค. ์๋์ผ๋ก ์ ์ ์๋ ๊ฒ\n * ํ๋๋ ์๋์ผ๋ก ํ๋ค: `axis` ๊ฐ ์ปค๋ ์ถ ๋ชฉ๋ก์ ์์ผ๋ฉด ๊ทธ๊ฒ์ **๊ตฌ์กฐ๊ฐ ์๋ ๊ฒ**์ด๋ค(์คํ ๋ฐฉ์ง).\n *\n * โโ ์ด ํ๊ฐ ์ปค๋์ ์๋ ์ด์ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ปค๋์ **๋ฐํ์ ๋ชจ๋ธ์ SSOT** ๋ค(๋ฌด์์ด ์๋๊ฐ). ์ด ํ๋ **์ฐธ์กฐ ๋ชจ๋ธ์ ๋ชฉ๋ก**์ด๋ค(๋ฌด์์ด ์์ด์ผ\n * ํ๋๊ฐ). ๋์ ๋ค๋ฅธ ์ข
๋ฅ์ ์ฌ์ค์ด๊ณ , ํ์๋ ์ปค๋์ ๋ฐฐํฌํ์ง ์๊ณ ๋ ๋์ด์ผ ํ๋ค.\n */\n\n/** ํ ์ธต์ ์ํ โ ์์ ยท ๋ถ๋ถ ยท ์์. \"๋ถ๋ถ\" ์ ๋๋ ์ด์ : ์ ๋ฐ ์๋ ๊ฒ์ ์๋ค๊ณ ํ๋ฉด ๊ธฐ์ค์ด ์ฃฝ๋๋ค. */\nexport type CoverageLevel = 'full' | 'partial' | 'none'\n\nexport interface Isa95Concept {\n /** ํ์ค์ด ๋ถ๋ฅด๋ ์ด๋ฆ โ ์ด ํ์ ํค๋ค(์ฐ๋ฆฌ ์ดํ๊ฐ ์๋๋ผ ํ์ค ์ดํ). */\n std: string\n /** ํ์ค์ ์ด๋ ๋ถ๋ถ์ธ๊ฐ โ Part 2(์์ ๋ชจ๋ธ) ยท Part 4(์ผ์ ยท์ค์ ) ๋ฑ. */\n part: string\n /** ์ฌ๋์ด ์ฝ๋ ์ด๋ฆ(i18n ํค). ํ๋ฉด์ด ๋ฒ์ญํ๋ค. */\n label: string\n /** ์ฐ๋ฆฌ ์ปค๋ ์ถ โ ์์ผ๋ฉด ๋ฐ์ดํฐ๊ตฌ์กฐ๊ฐ ์๋ ๊ฒ์ด๋ค. ์์ผ๋ฉด `null`. */\n axis: string | null\n /** ์ธ ์ธต์ ์ํ. `structure` ๋ `axis` ๋ก๋ ๊ฒ์ฆ๋๋ค. */\n structure: CoverageLevel\n behavior: CoverageLevel\n surface: CoverageLevel\n /** ์ ๊ทธ ์์ค์ธ์ง โ **๋ชจ๋ฅด๋ ๊ฒ์ ๊ฐ์ถ์ง ์๊ธฐ ์ํด** ํ ์ค๋ก ์ ๋๋ค(i18n ํค). */\n note?: string\n /**\n * ์๊ธฐ ์ถ์ด ์์ ๋ **์ด๋์ ๋ณด์ด๋** โ ๊ทธ ์ฌ์ค์ ๋ค๊ณ ์๋ ์ถ๋ค.\n *\n * ใ์ด๋์ใ์นธ์ด ๋ ๊ฐ์ง๋ฅผ ํฉ์ณ๊ณ ์์๋ค: *์์ง ์ถ์ด ์๋ค(๋ถ์ฑ)* ์ *์ถ์ผ ์ ์๋ค(์ค๊ณ)*. ๊ฐ์ฉ ๋ฅ๋ ฅ์\n * ๊ฐ์ฒด๊ฐ ์๋๋ผ ์์์ ์ง๊ธ ์ํ์ด๋ฏ๋ก ์ถ์ด ๋ ์ ์๋๋ฐ, ์ธ ์ธต์ด ๋ค ์์ ํ ์ค์ด \"๊ฐ๋
์ถ์ด ์์ต๋๋ค\"\n * ๋ผ๊ณ ๋ง ๋งํ๋ฉด **ํ๊ฐ ์ค์ค๋ก ๋ชจ์๋ ๋ง์ ํ๋ค**(๋ค ๋๋ค๋ฉด์ ์๋ค๊ณ ํ๋ค).\n *\n * ๊ทธ๋์ ์ถ์ผ ์ ์๋ ๊ฒ์ ๊ฐ ๊ณณ์ ๊ฐ๋ฆฌํจ๋ค. ์ฌ๊ธฐ๊ฐ ๋น์ด ์๊ณ ์ถ๋ ์์ผ๋ฉด ๊ทธ๊ฒ์ **์ง์ง ๋น์นธ**์ด๋ค.\n */\n shownOn?: string[]\n}\n\n/*\n * ๊ฐ์ฉ ๋ฅ๋ ฅ(2026-08-12, ์ปค๋ 0.6.8) โ **ํ์ ๊ณผ ์ด์ ๊ฐ ์ํ์ ์ค๋ ค ์จ๋ค**(`capability {available, reason}`).\n *\n * ์
๋ค ์์ ์ธ ๊ทผ๊ฑฐ: ์ํ๊ฐ ํ์ ์ ๋ค๊ณ ์ค๊ณ (์๋ฎฌยท๋ฏธ๋ฌ๊ฐ ๊ฐ์ ํจ์๋ก ํ์ํ๋ค), ๋ฐฐ์ ์ด ๊ฐ์ ํ์ ์\n * ์ฐ๊ณ , ๋ ํ๋ฉด์ด ๊ฐ์ ๋ฑ๋ง๋ก ๊ทธ ์ด์ ๋ฅผ ๋ณด์ธ๋ค(์์ ํญ ๋ฐฐ์ง ยท ์ธ์คํ์
๊ด์ธก ์ด).\n *\n * ์ ์ถ์ด ์๋๊ฐ โ ๊ฐ์ฉ ๋ฅ๋ ฅ์ ๊ฐ์ฒด๊ฐ ์๋๋ผ **์์์ ์ง๊ธ ์ํ**๋ค. ๊ฐ๋
์นด๋๋ก ์ธ์ฐ๋ฉด ์ฌ๋ยท์ค๋น์\n * ๋๋ํ ๋์ฌ \"๋ฅ๋ ฅ์ด ๋ช ๊ฐ์ธ๊ฐ\" ๋ฅผ ์ธ๊ฒ ๋๋๋ฐ, ๊ทธ๊ฑด ๋ฌผ์ ์ผ์ด ์๋๋ค.\n */\n\n/*\n * ์์ฐ ๋ฅ๋ ฅ(2026-08-13, ์ปค๋ 0.6.12) โ **๊ตฌ๊ฐ์ ์์ ํ์ค ์ข
๋ฅ๋ก ๊ตฌ๋ถํ๋ค.**\n *\n * `structure` ์์ : ๊ณ์ฝ์ด ๋ณด๊ณ ์๋ฅผ ๋ธ๋ค(`operationsCapabilityOf`) โ ๊ตฌ๊ฐ(StartTimeยทEndTime) ยท ํ์ค\n * ์ด๊ฑฐ๊ฐ(CommittedยทAvailableยทUnattainable) ยท ๊ณต์ ๋ณ ๋ถํด ยท ์ ์ฝํ๋ ์ถ. ๋ฑ๋ง์ B2MML ๋์กฐ ํ ํ์ค ๊ฒ์\n * ๊ทธ๋๋ก ์ด๋ค(์ฐ๋ฆฌ ๋ฑ๋ง์ ๋ง๋ค์ง ์์๋ค).\n * `behavior` ์์ : ์ฝ์ ์ ์ค๋์์, ๋ฌ์ฑ๋ถ๊ฐ๋ ์์ ํ์ (`capabilityOf`)์์ ์จ๋ค โ ๊ทธ๋ฆฌ๊ณ ๊ทธ ํ์ ์\n * ๋ฐฐ์ ์ด ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ํ ๋ฒ์ด๋ค. ํ์ค์ `Unattainable` ์ ์๊ฐ ๊ทธ ํ์ ๊ณผ ๊ฒน์น๋ค.\n * `surface` ์์ : ๋ ์๋ฆฌ์์ ๋ณด์ธ๋ค โ ์ฑ๊ณผ ํ๋ฉด์ด ํ์ฅ ์ ์ฒด์ \"์์ผ๋ก ๋ ๋ฐ์ ์ ์๋ ๋ชซ\" ์, ๊ณต์ \n * ์์ธ๊ฐ ๊ทธ ๊ณต์ ํ๋์ ๋ถํด(์ํยท์ฝ์ ยท๋ฌ์ฑ๋ถ๊ฐยท๊ฐ์ฉ)์ ์ ์ฝํ๋ ์ถ์ ๋ณด์ธ๋ค. ๋ ํ๋ฉด์ **๊ฐ์ ๋ฑ๋ง**์\n * ์ด๋ค(๊ฐ์ i18n ํค) โ ๊ฐ์ ์ฌ์ค์ ๋ค๋ฅด๊ฒ ๋ถ๋ฅด๋ฉด ์ด๋ ์ชฝ์ด ๋ง๋์ง ์๋ฌด๋ ๋ชจ๋ฅธ๋ค.\n *\n * ๋จ์ ๊ฒ โ ํ์ค์ **๊ฒ์๋(์ฝ์๋) ๋ฅ๋ ฅ**๋ ๋ด๋๋ค(๊ณ์ฐ์ด ์๋๋ผ ์ ์ธ). ๊ฐ์ ์ค์ ์์ค๊ฐ ์์ง\n * ์นจ๋ฌตํ๋ฏ๋ก ๋น ์ถ์ ๋จผ์ ๋ง๋ค์ง ์๋๋ค(์ํ ์ชฝ `workCalendar` ๋ฅผ ์ง์ด ์ด์ ์ ๊ฐ๋ค).\n *\n * ๊ณผ๊ฑฐ ๋ถํด(UsedยทUnused)๋ ์ด ๋ณด๊ณ ์์ ์๋ค โ ๊ทธ๊ฒ์ ์ค์ ์ด๊ณ ์ด๋ฏธ ๋ ๊ณณ์ ์๋ค(์ค๋น OEE ์ ๊ฐ๋/์ ํด,\n * ์ฑ๊ณผ ํ๋ฉด์ ๊ตฌ๊ฐ ๊ฐ๋๋ฅ ). ํ์ค์ด ๊ทธ ๋์ ๋ค๋ฅธ ์ข
๋ฅ๋ก ๋ถ๋ฅด๋ฏ๋ก **ํฉ์น์ง ์๋๋ค.**\n */\n\n/*\n * Part 2 โ ์์ ๋ชจ๋ธ. ๋ค ์์ ๊ฐ๊ฐ์ด **๋ฑ๊ธ/์ ์ โ ๊ฐ์ฒด** ์ด์ค๊ตฌ์กฐ๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ด ๋ถ๋ถ์ ํต์ฌ์ด๊ณ ,\n * ๊ทธ ์ด์ค์ฑ์ด ์ด ํธ์์ ๋ผ๋์ด๊ธฐ๋ ํ๋ค.\n */\nconst PART2: Isa95Concept[] = [\n { std: 'PersonnelClass', part: '2', label: 'twin.isa95.PersonnelClass', axis: 'personnelClasses', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'Person', part: '2', label: 'twin.isa95.Person', axis: 'persons', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'PersonnelCapability', part: '2', label: 'twin.isa95.PersonnelCapability', axis: null, shownOn: ['persons'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.capability' },\n { std: 'EquipmentClass', part: '2', label: 'twin.isa95.EquipmentClass', axis: 'equipmentClasses', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'Equipment', part: '2', label: 'twin.isa95.Equipment', axis: 'equipment', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'EquipmentCapability', part: '2', label: 'twin.isa95.EquipmentCapability', axis: null, shownOn: ['equipment'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.capability' },\n { std: 'PhysicalAssetClass', part: '2', label: 'twin.isa95.PhysicalAssetClass', axis: 'assetClasses', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'PhysicalAsset', part: '2', label: 'twin.isa95.PhysicalAsset', axis: 'assets', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'MaterialClass', part: '2', label: 'twin.isa95.MaterialClass', axis: 'materialClasses', structure: 'full', behavior: 'partial', surface: 'full' },\n { std: 'MaterialDefinition', part: '2', label: 'twin.isa95.MaterialDefinition', axis: 'materialDefinitions', structure: 'full', behavior: 'full', surface: 'full' },\n /* ๋กํธยท์๋ธ๋กํธ๋ ๊ฐ์ฒด ์ถ์ด ์๋๋ผ **๊ด์ธก**์ผ๋ก ์กด์ฌํ๋ค(EPCIS ๊ฐ์ฒด) โ ๊ตฌ์กฐ๋ ์ ๋์ด ๊ฐ๋๋ค. */\n { std: 'MaterialLot', part: '2', label: 'twin.isa95.MaterialLot', axis: null, structure: 'partial', behavior: 'full', surface: 'partial', note: 'twin.isa95.note.lot' },\n { std: 'MaterialSublot', part: '2', label: 'twin.isa95.MaterialSublot', axis: null, structure: 'none', behavior: 'none', surface: 'none' },\n { std: 'ProcessSegment', part: '2', label: 'twin.isa95.ProcessSegment', axis: 'operations', structure: 'full', behavior: 'full', surface: 'full' },\n /*\n * ์์ฑ์ ์์๋ง๋ค ๋ถ๋ ํ์ฅ์ด๋ผ **์๊ธฐ ์ถ์ด ์๋๋ค** โ ๊ทธ๋์ `axis` ๋ ์์ง๋ง ๊ตฌ์กฐ๋ ์์ ํ๋ค:\n * ๊ณ์ฝ(`ResourceProperty`: ๊ฐยท๋ฐ์ดํฐํยท๋จ์ยทํ์ยท๋ฑ๊ธ์์ฑ)์ด ํ์ค์ ๊ทธ๋๋ก ๋ด๊ณ , ์ธ์ ์คํธยท์ํยท\n * ํ๋ฉด์ด ๊ทธ๊ฒ์ ํต๊ณผ์ํจ๋ค.\n *\n * ๊ธฐ๋ฅ์ **๋ถ๋ถ**์ด๋ค: ํธ์คํธ์ ์ฃผํ ์ถ์ ๊ธฐ๊ฐ `speed` ๋ฅผ ์ฝ์ด ์ด๋ ์๊ฐ์ ๋ง๋๋ ๊ฒ์ด ์ ์ผํ ์๋น์ฒ๋ค\n * (๋ค๋ฅธ ์์ฑ์ ์์ง ์๋ฌด๋ ์ฝ์ง ์๋๋ค). ๊ทธ ์ฌ์ค์ `full` ๋ก ์ฌ๋ฆฌ๋ฉด ํ๊ฐ ๊ฑฐ์ง์ด ๋๋ค.\n */\n { std: 'Property', part: '2', label: 'twin.isa95.Property', axis: null, structure: 'full', behavior: 'partial', surface: 'full', note: 'twin.isa95.note.property' }\n]\n\n/*\n * Part 4 โ ์ผ์ ๊ณผ ์ค์ .\n *\n * **2026-08-11 ์ด์ ์๋ ์ด ๋ถ๋ถ์ด ๊ฑฐ์ ๋น์ด ์์๋ค.** ์ค๋ยท์์
์ ๋ฐํ์๊ณผ ์ ๋์ ์ค์ฌํ๋๋ฐ ์กฐํ\n * ๋ชจ๋ธ์ ์ถ์ด ์๋์๊ณ , ๊ทธ๋์ \"์ด ํธ์์ด ํ์ค์ ์ด๋๋ฅผ ์ฑ์ฐ๋\" ๋ผ๋ ์ง๋ฌธ์ ์ ๋ฐ๋ง ๋ตํ๋ค.\n *\n * ์ปค๋์ด ๊ณ์ฝ์ ๋ํ(`source: 'state'`) ๋ ์ถ์ด ์ถ๊ฐ๋์๋ค โ ์ด์ ์๊ตฌ(`orders`)์ ์๋ต(`tasks`)์ ๊ฐ๋
์ผ๋ก\n * ๊ฐ๋ฆฌ์ผ ๊ฑธ์ด ๋ค์ด๊ฐ ์ ์๋ค. ๋จ์ ๊ฒ์ **๊ณผ๊ฑฐ๋ก ๋ค์ ๊ณ์ฐํ๋ ๊ธธ**(์ ๋ ์ปค์ ํ์ด์ง)๊ณผ ๋ฅ๋ ฅยท๊ฒ์ฌ ๋ช
์ธ๋ค.\n */\nconst PART4: Isa95Concept[] = [\n { std: 'OperationsDefinition', part: '4', label: 'twin.isa95.OperationsDefinition', axis: 'productionSpec', structure: 'full', behavior: 'full', surface: 'partial', note: 'twin.isa95.note.opsdef' },\n /*\n * 2026-08-11 โ **์ถ์ด ์ถ๊ฐ๋์๋ค**(์ปค๋ 0.6.3 ยท `source: 'state'`). ์๊ตฌ๋ `orders`, ์๋ต์ `tasks` ๋ค.\n *\n * `structure` ๋ฅผ `full` ๋ก ์ฌ๋ฆฐ๋ค: ๋ด์ ์๋ฆฌ๊ฐ ๊ณ์ฝ์ ์๋ค(์ํ ๊ณ์ฝ + ์ถ ์ ์ธ). **ํ
์ด๋ธ ํฌ์์ด\n * ์๋ ๊ฒ์ ๊ฒฐ์์ด ์๋๋ค** โ ์ด ์ถ์ ์ ๋ณธ์ ์ ๋์ด๊ณ , ํฌ์ํ์ง ์๋ ๊ฒ์ด ๊ฒฐ์ ์ด๋ค(ADR-0032-D).\n *\n * `surface` ๋ `full` ์ด๋ค(๊ฐ์ ๋ ๋ ๋ฒ์งธ ๋จ๊ณ): ๋ชฉ๋กยท์์ธยท๊ด๊ณ์ ๋ํด **๊ณผ๊ฑฐ๋ก ๋ค์ ๊ณ์ฐํ๋ ๊ธธ**์ด ํ๋ฉด์\n * ์๋ค โ ์๊ฐ ์ปค์๋ฅผ ์ฎ๊ธฐ๋ฉด ๊ทธ ์์ ์ ์ฌ์ค์ด ๋์ค๊ณ , ๋ฌด์์ ๊ทผ๊ฑฐ๋ก ๋ตํ๋์ง๋ ํ๋ฉด์ด ๋งํ๋ค\n * (๋ผ์ด๋ธ=๊ถ์ ยท ์ ๋=ํ์ ยท ์ ์ ๋ฆฌ๋น์ ). ์ค์ธก: ์ด๋ฅธ ์๊ฐ 0๊ฑด ยท ํ๋ฃจ ๋ค 504๊ฑด.\n */\n { std: 'OperationsSchedule', part: '4', label: 'twin.isa95.OperationsSchedule', axis: 'orders', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.schedule' },\n { std: 'OperationsPerformance', part: '4', label: 'twin.isa95.OperationsPerformance', axis: 'tasks', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.performance' },\n { std: 'OperationsCapability', part: '4', label: 'twin.isa95.OperationsCapability', axis: null, shownOn: ['operations'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.opscapability' },\n /*\n * 2026-08-12 โ **์ถ์ด ์ถ๊ฐ๋์๋ค**(์ปค๋ 0.6.5). ์์ ์ํ์ด ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ์ ๋์์ด ์๊ฒผ๊ณ , ์๋ ๋ช
์ธ๋ฅผ\n * ๊ฐ๋ฆฌํค๋ฉด ์ ์ฑ์์ด ๋์ด์ง ์ฐธ์กฐ๋ก ์ผ๋ค.\n *\n * ๊ธฐ๋ฅ์ด **`partial` ๋ก ์ด์๋ฌ๋ค**(์ปค๋ 0.6.6): ๊ฒฐ๊ณผ(`TestResult`)๊ฐ ๊ณ์ฝ์ ๋ค์ด์ค๋ฉด์ ์ปค๋์ด ๋ฐฐ์ ์์\n * ๊ทธ๊ฒ์ ๋ณธ๋ค โ ๋ง๋ฃยท๋ถํฉ๊ฒฉ์ด๋ฉด ๊ทธ ์๊ฒฉ์ ์ฑ๋ฆฝํ์ง ์๋๋ค(์ค์ธก: ๋ง๋ฃ๋ ์ฉ์ ์ฌ๋ ์ฉ์ ์์
5๊ฑด ์ค ํ\n * ๋ฒ๋ ๋ฐฐ์ ๋์ง ์์๋ค).\n *\n * `full` ์ด ์๋ ์ด์ ๋ ๋์ด๋ค: **์ฌ๋๋ง ํ์ ํ๋ค**(์ค๋นยท์์ฐ์ ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ ์์ง ๋ฐฐ์ ์ ์ฐ์ง ์๋๋ค),\n * ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด ํ์ ํ์ง ์๋๋ค(์ ์ธํ ๊ฒ๋ง ์ ์ฝ์ด ๋๋ค โ ๊ทธ๊ฑด ๊ฒฐ์์ด ์๋๋ผ ๊ท์จ์ด๋ค).\n */\n { std: 'TestSpecification', part: '4', label: 'twin.isa95.TestSpecification', axis: 'testSpecifications', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.test' },\n { std: 'WorkMaster', part: '4', label: 'twin.isa95.WorkMaster', axis: 'recipes', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'WorkDirective', part: '4', label: 'twin.isa95.WorkDirective', axis: null, structure: 'none', behavior: 'none', surface: 'none' }\n]\n\n/** ํ์ค์ด ์๊ตฌํ๋ ๊ฒ ์ ๋ถ โ ์ด ๋ฐฐ์ด์ด ๊ณง ๊ธฐ์ค์ด๋ค. */\nexport const ISA95_CONCEPTS: Isa95Concept[] = [...PART2, ...PART4]\n\n/**\n * ์ ํฉ์ฑ ๋ณด๊ณ โ **์ฑ์ด ๊ฒ๊ณผ ๋น ์ง ๊ฒ์ ํจ๊ป.**\n *\n * `axis` ๋ฅผ ์ปค๋ ์ถ ๋ชฉ๋ก๊ณผ ๋ง์ถฐ ๋ณธ๋ค: ์ถ์ด ์๋ค๊ณ ์ ํ ์๋๋ฐ ์ปค๋์ ์์ผ๋ฉด ๊ทธ ์ ์ธ์ด ๋ก์ ๊ฒ์ด๋ฏ๋ก\n * **๊ตฌ์กฐ ์์์ผ๋ก ๋ฎ์ถ๊ณ ๊ทธ ์ฌ์ค์ ๋งํ๋ค**(์กฐ์ฉํ ํต๊ณผ์ํค๋ฉด ์ด ํ๊ฐ ๊ฑฐ์ง์ด ๋๋ค).\n */\nexport function isa95Coverage(axes: string[]): {\n model: string\n concepts: (Isa95Concept & { axisMissing?: boolean })[]\n totals: { concepts: number; structure: number; behavior: number; surface: number }\n} {\n const known = new Set(axes)\n const concepts = ISA95_CONCEPTS.map(c => {\n const axisMissing = !!c.axis && !known.has(c.axis)\n /* ๊ฐ๋ฆฌํค๋ ๊ณณ์ด ์์ด์ง ์ถ์ **๊ฐ๋ฆฌํค์ง ์๋๋ค** โ ์ฃฝ์ ๋ฌธ์ผ๋ก ๋ณด๋ด๋ฉด ํ๋ฉด์ด ๊ฑฐ์ง๋ง์ ํ๋ค.\n `axis` ์ ๊ฐ์ ๊ท์จ์ด๊ณ , ์ฌ๊ธฐ๊ฐ ๋น๋ฉด ๊ทธ ์ค์ ๋ค์ \"์ถ์ด ์๋ค\" ๋ก ์ ์งํ๊ฒ ๋์๊ฐ๋ค. */\n const shownOn = c.shownOn?.filter(a => known.has(a))\n const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c\n return axisMissing ? { ...fixed, structure: 'none' as CoverageLevel, axisMissing } : fixed\n })\n /* ์ฑ์ด ์๋ `full` ๋ง ์ผ๋ค โ ๋ถ๋ถ์ ์ฑ์ด ๊ฒ์ผ๋ก ์ธ๋ฉด ๊ธฐ์ค์ด ์ค์ค๋ก๋ฅผ ์์ธ๋ค. */\n const count = (k: 'structure' | 'behavior' | 'surface') => concepts.filter(c => c[k] === 'full').length\n return {\n model: 'ISA-95',\n concepts,\n totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"isa95-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/isa95-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ISA-95 ์ ํฉ์ฑ ๊ธฐ์ค โ **ํ์ค์ด ์๊ตฌํ๋ ๊ฒ์ ๋ชฉ๋ก.**\n *\n * โโ ์ ์ด ํ์ผ์ด ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ง๊ธ๊น์ง ํ๋ฉด์ \"์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ์ถ\" ๋ง ๋ณด์๋ค. ๊ทธ๋ฌ๋ฉด ์ฑ์ด ๊ฒ์ ์ธ์ด์ง์ง๋ง **๋น ์ง ๊ฒ์ ์
์ ์๋ค** โ\n * ์๋ ๊ฒ์ ํ๋ฉด์ ์์ผ๋ฏ๋ก ์๋ฌด๋ ๊ทธ๊ฒ์ ๋ฌป์ง ์๋๋ค. ํ์ค ์ค์๋ \"์ฐ๋ฆฌ ์ถ์ ํ์ค ์ด๋ฆ์ ๋ถ์๋ค\"\n * ๊ฐ ์๋๋ผ **ํ์ค์ ๋ชฉ๋ก์ ๊ธฐ์ค์ผ๋ก ๋น ์ง ๊ฒ์ด ์๋ค**๋ ๋ง์ด์ด์ผ ํ๋ค. ๊ธฐ์ค์ด ์ฝ๋๋ก ์์ด์ผ ๊ทธ\n * ๋ฌธ์ฅ์ ๊ฒ์ฌํ ์ ์๋ค.\n *\n * โโ ์ธ ์ธต์์ ๋ณธ๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ํ์ค ์ค์๋ ํ ์ธต์ ์ผ์ด ์๋๋ค. ๊ฐ๋
๋ง๋ค ์
์ ๋ฐ๋ก ๋ณธ๋ค:\n *\n * ยท `structure` โ **๋ฐ์ดํฐ๊ตฌ์กฐ**๊ฐ ์๋(์ปค๋ ์ถยทํธ์คํธ ํ์ ์ด ๊ฐ๋
์ ์๋ฆฌ๊ฐ ์๋)\n * ยท `behavior` โ **๊ธฐ๋ฅ**์ด ๊ทธ๊ฒ์ ์ฐ๋(์ปค๋์ด ๊ณํยท์งํยท์ง๊ณ์์ ์ค์ ๋ก ๋ค๋ฃจ๋)\n * ยท `surface` โ **UI ๋
ธ์ถ**์ด ์๋(์ฌ์ฉ์๊ฐ ๊ทธ๊ฒ์ ๋ณผ ์ ์๋)\n *\n * ์
์ ํฉ์น๋ฉด \"๊ตฌ์กฐ๋ ์๋๋ฐ ์๋ฌด๋ ์ ์ฐ๋ ์ปฌ๋ผ\" ๊ณผ \"์ปค๋์ ์ฐ๋๋ฐ ํ๋ฉด์ ์๋ ์ฌ์ค\" ์ด ๊ฐ์\n * ๊ฐ์ผ๋ก ๋ณด์ธ๋ค. ์ค์ ๋ก ์ด ํ๋ก์ ํธ์์ ๋ ๋ค ๋์๋ค(์ธ๋ ฅ ๋ช
์ธ๋ ๊ตฌ์กฐยท๊ธฐ๋ฅ์ด ์์์ง๋ง ํ๋ฉด์\n * ์์๊ณ , `properties` ๋ ๊ตฌ์กฐ๋ง ์๋ค).\n *\n * โโ ๊ฐ์ ๊ด์ธก์ด ์๋๋ผ ์ ์ธ์ด๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฌ๊ธฐ ์ ํ ๊ฒ์ **์ฌ๋์ด ํ๋จํด ์ ์ ์ฌ์ค**์ด๋ค(์๋ ํ์ ์ด ์๋๋ค). ๊ทธ๋์ ํ๋ฆด ์ ์๊ณ , ํ๋ฆฌ๋ฉด\n * ์ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์ผ ํ๋ค โ ํ๋ฉด์ ์ด ์ ์ธ์ ๊ทธ๋๋ก ๋ณด์ด๊ณ ์ง์ด๋ด์ง ์๋๋ค. ์๋์ผ๋ก ์ ์ ์๋ ๊ฒ\n * ํ๋๋ ์๋์ผ๋ก ํ๋ค: `axis` ๊ฐ ์ปค๋ ์ถ ๋ชฉ๋ก์ ์์ผ๋ฉด ๊ทธ๊ฒ์ **๊ตฌ์กฐ๊ฐ ์๋ ๊ฒ**์ด๋ค(์คํ ๋ฐฉ์ง).\n *\n * โโ ์ด ํ๊ฐ ์ปค๋์ ์๋ ์ด์ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ปค๋์ **๋ฐํ์ ๋ชจ๋ธ์ SSOT** ๋ค(๋ฌด์์ด ์๋๊ฐ). ์ด ํ๋ **์ฐธ์กฐ ๋ชจ๋ธ์ ๋ชฉ๋ก**์ด๋ค(๋ฌด์์ด ์์ด์ผ\n * ํ๋๊ฐ). ๋์ ๋ค๋ฅธ ์ข
๋ฅ์ ์ฌ์ค์ด๊ณ , ํ์๋ ์ปค๋์ ๋ฐฐํฌํ์ง ์๊ณ ๋ ๋์ด์ผ ํ๋ค.\n */\n\n/** ํ ์ธต์ ์ํ โ ์์ ยท ๋ถ๋ถ ยท ์์. \"๋ถ๋ถ\" ์ ๋๋ ์ด์ : ์ ๋ฐ ์๋ ๊ฒ์ ์๋ค๊ณ ํ๋ฉด ๊ธฐ์ค์ด ์ฃฝ๋๋ค. */\nexport type CoverageLevel = 'full' | 'partial' | 'none'\n\nexport interface Isa95Concept {\n /** ํ์ค์ด ๋ถ๋ฅด๋ ์ด๋ฆ โ ์ด ํ์ ํค๋ค(์ฐ๋ฆฌ ์ดํ๊ฐ ์๋๋ผ ํ์ค ์ดํ). */\n std: string\n /** ํ์ค์ ์ด๋ ๋ถ๋ถ์ธ๊ฐ โ Part 2(์์ ๋ชจ๋ธ) ยท Part 4(์ผ์ ยท์ค์ ) ๋ฑ. */\n part: string\n /** ์ฌ๋์ด ์ฝ๋ ์ด๋ฆ(i18n ํค). ํ๋ฉด์ด ๋ฒ์ญํ๋ค. */\n label: string\n /** ์ฐ๋ฆฌ ์ปค๋ ์ถ โ ์์ผ๋ฉด ๋ฐ์ดํฐ๊ตฌ์กฐ๊ฐ ์๋ ๊ฒ์ด๋ค. ์์ผ๋ฉด `null`. */\n axis: string | null\n /** ์ธ ์ธต์ ์ํ. `structure` ๋ `axis` ๋ก๋ ๊ฒ์ฆ๋๋ค. */\n structure: CoverageLevel\n behavior: CoverageLevel\n surface: CoverageLevel\n /** ์ ๊ทธ ์์ค์ธ์ง โ **๋ชจ๋ฅด๋ ๊ฒ์ ๊ฐ์ถ์ง ์๊ธฐ ์ํด** ํ ์ค๋ก ์ ๋๋ค(i18n ํค). */\n note?: string\n /**\n * ์๊ธฐ ์ถ์ด ์์ ๋ **์ด๋์ ๋ณด์ด๋** โ ๊ทธ ์ฌ์ค์ ๋ค๊ณ ์๋ ์ถ๋ค.\n *\n * ใ์ด๋์ใ์นธ์ด ๋ ๊ฐ์ง๋ฅผ ํฉ์ณ๊ณ ์์๋ค: *์์ง ์ถ์ด ์๋ค(๋ถ์ฑ)* ์ *์ถ์ผ ์ ์๋ค(์ค๊ณ)*. ๊ฐ์ฉ ๋ฅ๋ ฅ์\n * ๊ฐ์ฒด๊ฐ ์๋๋ผ ์์์ ์ง๊ธ ์ํ์ด๋ฏ๋ก ์ถ์ด ๋ ์ ์๋๋ฐ, ์ธ ์ธต์ด ๋ค ์์ ํ ์ค์ด \"๊ฐ๋
์ถ์ด ์์ต๋๋ค\"\n * ๋ผ๊ณ ๋ง ๋งํ๋ฉด **ํ๊ฐ ์ค์ค๋ก ๋ชจ์๋ ๋ง์ ํ๋ค**(๋ค ๋๋ค๋ฉด์ ์๋ค๊ณ ํ๋ค).\n *\n * ๊ทธ๋์ ์ถ์ผ ์ ์๋ ๊ฒ์ ๊ฐ ๊ณณ์ ๊ฐ๋ฆฌํจ๋ค. ์ฌ๊ธฐ๊ฐ ๋น์ด ์๊ณ ์ถ๋ ์์ผ๋ฉด ๊ทธ๊ฒ์ **์ง์ง ๋น์นธ**์ด๋ค.\n */\n shownOn?: string[]\n}\n\n/*\n * ๊ฐ์ฉ ๋ฅ๋ ฅ(2026-08-12, ์ปค๋ 0.6.8) โ **ํ์ ๊ณผ ์ด์ ๊ฐ ์ํ์ ์ค๋ ค ์จ๋ค**(`capability {available, reason}`).\n *\n * ์
๋ค ์์ ์ธ ๊ทผ๊ฑฐ: ์ํ๊ฐ ํ์ ์ ๋ค๊ณ ์ค๊ณ (์๋ฎฌยท๋ฏธ๋ฌ๊ฐ ๊ฐ์ ํจ์๋ก ํ์ํ๋ค), ๋ฐฐ์ ์ด ๊ฐ์ ํ์ ์\n * ์ฐ๊ณ , ๋ ํ๋ฉด์ด ๊ฐ์ ๋ฑ๋ง๋ก ๊ทธ ์ด์ ๋ฅผ ๋ณด์ธ๋ค(์์ ํญ ๋ฐฐ์ง ยท ์ธ์คํ์
๊ด์ธก ์ด).\n *\n * ์ ์ถ์ด ์๋๊ฐ โ ๊ฐ์ฉ ๋ฅ๋ ฅ์ ๊ฐ์ฒด๊ฐ ์๋๋ผ **์์์ ์ง๊ธ ์ํ**๋ค. ๊ฐ๋
์นด๋๋ก ์ธ์ฐ๋ฉด ์ฌ๋ยท์ค๋น์\n * ๋๋ํ ๋์ฌ \"๋ฅ๋ ฅ์ด ๋ช ๊ฐ์ธ๊ฐ\" ๋ฅผ ์ธ๊ฒ ๋๋๋ฐ, ๊ทธ๊ฑด ๋ฌผ์ ์ผ์ด ์๋๋ค.\n */\n\n/*\n * ์์ฐ ๋ฅ๋ ฅ(2026-08-13, ์ปค๋ 0.6.12) โ **๊ตฌ๊ฐ์ ์์ ํ์ค ์ข
๋ฅ๋ก ๊ตฌ๋ถํ๋ค.**\n *\n * `structure` ์์ : ๊ณ์ฝ์ด ๋ณด๊ณ ์๋ฅผ ๋ธ๋ค(`operationsCapabilityOf`) โ ๊ตฌ๊ฐ(StartTimeยทEndTime) ยท ํ์ค\n * ์ด๊ฑฐ๊ฐ(CommittedยทAvailableยทUnattainable) ยท ๊ณต์ ๋ณ ๋ถํด ยท ์ ์ฝํ๋ ์ถ. ๋ฑ๋ง์ B2MML ๋์กฐ ํ ํ์ค ๊ฒ์\n * ๊ทธ๋๋ก ์ด๋ค(์ฐ๋ฆฌ ๋ฑ๋ง์ ๋ง๋ค์ง ์์๋ค).\n * `behavior` ์์ : ์ฝ์ ์ ์ค๋์์, ๋ฌ์ฑ๋ถ๊ฐ๋ ์์ ํ์ (`capabilityOf`)์์ ์จ๋ค โ ๊ทธ๋ฆฌ๊ณ ๊ทธ ํ์ ์\n * ๋ฐฐ์ ์ด ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ํ ๋ฒ์ด๋ค. ํ์ค์ `Unattainable` ์ ์๊ฐ ๊ทธ ํ์ ๊ณผ ๊ฒน์น๋ค.\n * `surface` ์์ : ๋ ์๋ฆฌ์์ ๋ณด์ธ๋ค โ ์ฑ๊ณผ ํ๋ฉด์ด ํ์ฅ ์ ์ฒด์ \"์์ผ๋ก ๋ ๋ฐ์ ์ ์๋ ๋ชซ\" ์, ๊ณต์ \n * ์์ธ๊ฐ ๊ทธ ๊ณต์ ํ๋์ ๋ถํด(์ํยท์ฝ์ ยท๋ฌ์ฑ๋ถ๊ฐยท๊ฐ์ฉ)์ ์ ์ฝํ๋ ์ถ์ ๋ณด์ธ๋ค. ๋ ํ๋ฉด์ **๊ฐ์ ๋ฑ๋ง**์\n * ์ด๋ค(๊ฐ์ i18n ํค) โ ๊ฐ์ ์ฌ์ค์ ๋ค๋ฅด๊ฒ ๋ถ๋ฅด๋ฉด ์ด๋ ์ชฝ์ด ๋ง๋์ง ์๋ฌด๋ ๋ชจ๋ฅธ๋ค.\n *\n * ๋จ์ ๊ฒ โ ํ์ค์ **๊ฒ์๋(์ฝ์๋) ๋ฅ๋ ฅ**๋ ๋ด๋๋ค(๊ณ์ฐ์ด ์๋๋ผ ์ ์ธ). ๊ฐ์ ์ค์ ์์ค๊ฐ ์์ง\n * ์นจ๋ฌตํ๋ฏ๋ก ๋น ์ถ์ ๋จผ์ ๋ง๋ค์ง ์๋๋ค(์ํ ์ชฝ `workCalendar` ๋ฅผ ์ง์ด ์ด์ ์ ๊ฐ๋ค).\n *\n * ๊ณผ๊ฑฐ ๋ถํด(UsedยทUnused)๋ ์ด ๋ณด๊ณ ์์ ์๋ค โ ๊ทธ๊ฒ์ ์ค์ ์ด๊ณ ์ด๋ฏธ ๋ ๊ณณ์ ์๋ค(์ค๋น OEE ์ ๊ฐ๋/์ ํด,\n * ์ฑ๊ณผ ํ๋ฉด์ ๊ตฌ๊ฐ ๊ฐ๋๋ฅ ). ํ์ค์ด ๊ทธ ๋์ ๋ค๋ฅธ ์ข
๋ฅ๋ก ๋ถ๋ฅด๋ฏ๋ก **ํฉ์น์ง ์๋๋ค.**\n */\n\n/*\n * Part 2 โ ์์ ๋ชจ๋ธ. ๋ค ์์ ๊ฐ๊ฐ์ด **๋ฑ๊ธ/์ ์ โ ๊ฐ์ฒด** ์ด์ค๊ตฌ์กฐ๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ด ๋ถ๋ถ์ ํต์ฌ์ด๊ณ ,\n * ๊ทธ ์ด์ค์ฑ์ด ์ด ํธ์์ ๋ผ๋์ด๊ธฐ๋ ํ๋ค.\n */\nconst PART2: Isa95Concept[] = [\n { std: 'PersonnelClass', part: '2', label: 'twin.isa95.PersonnelClass', axis: 'personnelClasses', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'Person', part: '2', label: 'twin.isa95.Person', axis: 'persons', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'PersonnelCapability', part: '2', label: 'twin.isa95.PersonnelCapability', axis: null, shownOn: ['persons'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.capability' },\n { std: 'EquipmentClass', part: '2', label: 'twin.isa95.EquipmentClass', axis: 'equipmentClasses', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'Equipment', part: '2', label: 'twin.isa95.Equipment', axis: 'equipment', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'EquipmentCapability', part: '2', label: 'twin.isa95.EquipmentCapability', axis: null, shownOn: ['equipment'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.capability' },\n { std: 'PhysicalAssetClass', part: '2', label: 'twin.isa95.PhysicalAssetClass', axis: 'assetClasses', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'PhysicalAsset', part: '2', label: 'twin.isa95.PhysicalAsset', axis: 'assets', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'MaterialClass', part: '2', label: 'twin.isa95.MaterialClass', axis: 'materialClasses', structure: 'full', behavior: 'partial', surface: 'full' },\n { std: 'MaterialDefinition', part: '2', label: 'twin.isa95.MaterialDefinition', axis: 'materialDefinitions', structure: 'full', behavior: 'full', surface: 'full' },\n /* ๋กํธยท์๋ธ๋กํธ๋ ๊ฐ์ฒด ์ถ์ด ์๋๋ผ **๊ด์ธก**์ผ๋ก ์กด์ฌํ๋ค(EPCIS ๊ฐ์ฒด) โ ๊ตฌ์กฐ๋ ์ ๋์ด ๊ฐ๋๋ค. */\n { std: 'MaterialLot', part: '2', label: 'twin.isa95.MaterialLot', axis: null, structure: 'partial', behavior: 'full', surface: 'partial', note: 'twin.isa95.note.lot' },\n { std: 'MaterialSublot', part: '2', label: 'twin.isa95.MaterialSublot', axis: null, structure: 'none', behavior: 'none', surface: 'none' },\n { std: 'ProcessSegment', part: '2', label: 'twin.isa95.ProcessSegment', axis: 'operations', structure: 'full', behavior: 'full', surface: 'full' },\n /*\n * ์์ฑ์ ์์๋ง๋ค ๋ถ๋ ํ์ฅ์ด๋ผ **์๊ธฐ ์ถ์ด ์๋๋ค** โ ๊ทธ๋์ `axis` ๋ ์์ง๋ง ๊ตฌ์กฐ๋ ์์ ํ๋ค:\n * ๊ณ์ฝ(`ResourceProperty`: ๊ฐยท๋ฐ์ดํฐํยท๋จ์ยทํ์ยท๋ฑ๊ธ์์ฑ)์ด ํ์ค์ ๊ทธ๋๋ก ๋ด๊ณ , ์ธ์ ์คํธยท์ํยท\n * ํ๋ฉด์ด ๊ทธ๊ฒ์ ํต๊ณผ์ํจ๋ค.\n *\n * ๊ธฐ๋ฅ์ **๋ถ๋ถ**์ด๋ค: ํธ์คํธ์ ์ฃผํ ์ถ์ ๊ธฐ๊ฐ `speed` ๋ฅผ ์ฝ์ด ์ด๋ ์๊ฐ์ ๋ง๋๋ ๊ฒ์ด ์ ์ผํ ์๋น์ฒ๋ค\n * (๋ค๋ฅธ ์์ฑ์ ์์ง ์๋ฌด๋ ์ฝ์ง ์๋๋ค). ๊ทธ ์ฌ์ค์ `full` ๋ก ์ฌ๋ฆฌ๋ฉด ํ๊ฐ ๊ฑฐ์ง์ด ๋๋ค.\n */\n { std: 'Property', part: '2', label: 'twin.isa95.Property', axis: null, structure: 'full', behavior: 'partial', surface: 'full', note: 'twin.isa95.note.property' }\n]\n\n/*\n * Part 4 โ ์ผ์ ๊ณผ ์ค์ .\n *\n * **2026-08-11 ์ด์ ์๋ ์ด ๋ถ๋ถ์ด ๊ฑฐ์ ๋น์ด ์์๋ค.** ์ค๋ยท์์
์ ๋ฐํ์๊ณผ ์ ๋์ ์ค์ฌํ๋๋ฐ ์กฐํ\n * ๋ชจ๋ธ์ ์ถ์ด ์๋์๊ณ , ๊ทธ๋์ \"์ด ํธ์์ด ํ์ค์ ์ด๋๋ฅผ ์ฑ์ฐ๋\" ๋ผ๋ ์ง๋ฌธ์ ์ ๋ฐ๋ง ๋ตํ๋ค.\n *\n * ์ปค๋์ด ๊ณ์ฝ์ ๋ํ(`source: 'state'`) ๋ ์ถ์ด ์ถ๊ฐ๋์๋ค โ ์ด์ ์๊ตฌ(`orders`)์ ์๋ต(`tasks`)์ ๊ฐ๋
์ผ๋ก\n * ๊ฐ๋ฆฌ์ผ ๊ฑธ์ด ๋ค์ด๊ฐ ์ ์๋ค. ๋จ์ ๊ฒ์ **๊ณผ๊ฑฐ๋ก ๋ค์ ๊ณ์ฐํ๋ ๊ธธ**(์ ๋ ์ปค์ ํ์ด์ง)๊ณผ ๋ฅ๋ ฅยท๊ฒ์ฌ ๋ช
์ธ๋ค.\n */\nconst PART4: Isa95Concept[] = [\n { std: 'OperationsDefinition', part: '4', label: 'twin.isa95.OperationsDefinition', axis: 'productionSpec', structure: 'full', behavior: 'full', surface: 'partial', note: 'twin.isa95.note.opsdef' },\n /*\n * 2026-08-11 โ **์ถ์ด ์ถ๊ฐ๋์๋ค**(์ปค๋ 0.6.3 ยท `source: 'state'`). ์๊ตฌ๋ `orders`, ์๋ต์ `tasks` ๋ค.\n *\n * `structure` ๋ฅผ `full` ๋ก ์ฌ๋ฆฐ๋ค: ๋ด์ ์๋ฆฌ๊ฐ ๊ณ์ฝ์ ์๋ค(์ํ ๊ณ์ฝ + ์ถ ์ ์ธ). **ํ
์ด๋ธ ํฌ์์ด\n * ์๋ ๊ฒ์ ๊ฒฐ์์ด ์๋๋ค** โ ์ด ์ถ์ ์ ๋ณธ์ ์ ๋์ด๊ณ , ํฌ์ํ์ง ์๋ ๊ฒ์ด ๊ฒฐ์ ์ด๋ค(ADR-0032-D).\n *\n * `surface` ๋ `full` ์ด๋ค(๊ฐ์ ๋ ๋ ๋ฒ์งธ ๋จ๊ณ): ๋ชฉ๋กยท์์ธยท๊ด๊ณ์ ๋ํด **๊ณผ๊ฑฐ๋ก ๋ค์ ๊ณ์ฐํ๋ ๊ธธ**์ด ํ๋ฉด์\n * ์๋ค โ ์๊ฐ ์ปค์๋ฅผ ์ฎ๊ธฐ๋ฉด ๊ทธ ์์ ์ ์ฌ์ค์ด ๋์ค๊ณ , ๋ฌด์์ ๊ทผ๊ฑฐ๋ก ๋ตํ๋์ง๋ ํ๋ฉด์ด ๋งํ๋ค\n * (๋ผ์ด๋ธ=๊ถ์ ยท ์ ๋=ํ์ ยท ์ ์ ๋ฆฌ๋น์ ). ์ค์ธก: ์ด๋ฅธ ์๊ฐ 0๊ฑด ยท ํ๋ฃจ ๋ค 504๊ฑด.\n */\n { std: 'OperationsSchedule', part: '4', label: 'twin.isa95.OperationsSchedule', axis: 'orders', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.schedule' },\n { std: 'OperationsPerformance', part: '4', label: 'twin.isa95.OperationsPerformance', axis: 'tasks', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.performance' },\n { std: 'OperationsCapability', part: '4', label: 'twin.isa95.OperationsCapability', axis: null, shownOn: ['operations'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.opscapability' },\n /*\n * 2026-08-12 โ **์ถ์ด ์ถ๊ฐ๋์๋ค**(์ปค๋ 0.6.5). ์์ ์ํ์ด ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ์ ๋์์ด ์๊ฒผ๊ณ , ์๋ ๋ช
์ธ๋ฅผ\n * ๊ฐ๋ฆฌํค๋ฉด ์ ์ฑ์์ด ๋์ด์ง ์ฐธ์กฐ๋ก ์ผ๋ค.\n *\n * ๊ธฐ๋ฅ์ด **`partial` ๋ก ์ด์๋ฌ๋ค**(์ปค๋ 0.6.6): ๊ฒฐ๊ณผ(`TestResult`)๊ฐ ๊ณ์ฝ์ ๋ค์ด์ค๋ฉด์ ์ปค๋์ด ๋ฐฐ์ ์์\n * ๊ทธ๊ฒ์ ๋ณธ๋ค โ ๋ง๋ฃยท๋ถํฉ๊ฒฉ์ด๋ฉด ๊ทธ ์๊ฒฉ์ ์ฑ๋ฆฝํ์ง ์๋๋ค(์ค์ธก: ๋ง๋ฃ๋ ์ฉ์ ์ฌ๋ ์ฉ์ ์์
5๊ฑด ์ค ํ\n * ๋ฒ๋ ๋ฐฐ์ ๋์ง ์์๋ค).\n *\n * `full` ์ด ์๋ ์ด์ ๋ ๋์ด๋ค: **์ฌ๋๋ง ํ์ ํ๋ค**(์ค๋นยท์์ฐ์ ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ ์์ง ๋ฐฐ์ ์ ์ฐ์ง ์๋๋ค),\n * ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด ํ์ ํ์ง ์๋๋ค(์ ์ธํ ๊ฒ๋ง ์ ์ฝ์ด ๋๋ค โ ๊ทธ๊ฑด ๊ฒฐ์์ด ์๋๋ผ ๊ท์จ์ด๋ค).\n */\n { std: 'TestSpecification', part: '4', label: 'twin.isa95.TestSpecification', axis: 'testSpecifications', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.test' },\n { std: 'WorkMaster', part: '4', label: 'twin.isa95.WorkMaster', axis: 'recipes', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'WorkDirective', part: '4', label: 'twin.isa95.WorkDirective', axis: null, structure: 'none', behavior: 'none', surface: 'none' }\n]\n\n/** ํ์ค์ด ์๊ตฌํ๋ ๊ฒ ์ ๋ถ โ ์ด ๋ฐฐ์ด์ด ๊ณง ๊ธฐ์ค์ด๋ค. */\nexport const ISA95_CONCEPTS: Isa95Concept[] = [...PART2, ...PART4]\n\n/**\n * ์ ํฉ์ฑ ๋ณด๊ณ โ **์ฑ์ด ๊ฒ๊ณผ ๋น ์ง ๊ฒ์ ํจ๊ป.**\n *\n * `axis` ๋ฅผ ์ปค๋ ์ถ ๋ชฉ๋ก๊ณผ ๋ง์ถฐ ๋ณธ๋ค: ์ถ์ด ์๋ค๊ณ ์ ํ ์๋๋ฐ ์ปค๋์ ์์ผ๋ฉด ๊ทธ ์ ์ธ์ด ๋ก์ ๊ฒ์ด๋ฏ๋ก\n * **๊ตฌ์กฐ ์์์ผ๋ก ๋ฎ์ถ๊ณ ๊ทธ ์ฌ์ค์ ๋งํ๋ค**(์กฐ์ฉํ ํต๊ณผ์ํค๋ฉด ์ด ํ๊ฐ ๊ฑฐ์ง์ด ๋๋ค).\n */\n/**\n * ์ ์ธํ ์ถ์ ์ปค๋์ ์ถ ๋ชฉ๋ก๊ณผ ๋ง์ถ๋ค โ **์ด๊ธ๋ ๊ฒ์ ์กฐ์ฉํ ์ง์ฐ์ง ์๋๋ค.**\n *\n * ๋ ์๋ฆฌ๊ฐ ์ด๊ธ๋ ์ ์๋ค.\n * ยท `axis` โ ๊ทธ ๊ฐ๋
์์ ์ ๋ฌธ. ์ปค๋์ ์์ผ๋ฉด ๊ตฌ์กฐ๋ฅผ ใ์์ใ์ผ๋ก ๋ฎ์ถ๊ณ ๊ทธ ์ฌ์ค์ ๋งํ๋ค.\n * ยท `shownOn` โ ๊ทธ ์ฌ์ค์ ๋ค๊ณ ์๋ ๋ค๋ฅธ ์ถ. ์์ ์๋ ์๋ ์ถ์ **๋ง์์ด ๊ฑธ๋ฌ ๋๋ค.** ๊ทธ๋ฌ๋ฉด ๊ทธ ์ค์\n * ใ๊ฐ๋
์ถ์ด ์์ต๋๋คใ๋ก ๋ณด์ด๊ณ , ์ฌ๋์ ๊ทธ๊ฒ์ **์๋ ๊ทธ๋ฐ ๊ฒ**์ผ๋ก ์ฝ๋๋ค. ์ค์ ๋ก ๊ทธ ์ผ์ด ์์๋ค:\n * EPCIS ํ์ ์ผ๊ณฑ ์ค์ด ์ปค๋์ ์๋ ์ถ(`items`)์ ๊ธฐ๋๊ณ ์์๋๋ฐ, ๊ฒฝ๊ณ ๊ฐ ๋ฌ ๊ฒ์ ๋ ์ค๋ฟ์ด์๋ค.\n *\n * ๋ ์ค ํ๋๋ผ๋ ์ด๊ธ๋๋ฉด `axisMissing` ์ด๋ค โ ํ๊ฐ ์ค์ค๋ก ใ์ต์ ์ด ์๋๋คใ๋ผ๊ณ ๋งํ๊ฒ ํ๋ค.\n */\nexport function reconcileAxes(c: Isa95Concept, known: Set<string>): Isa95Concept & { axisMissing?: boolean } {\n const ownMissing = !!c.axis && !known.has(c.axis)\n const shownOn = c.shownOn?.filter(a => known.has(a))\n const lostShown = !!c.shownOn && (shownOn?.length ?? 0) !== c.shownOn.length\n const fixed = lostShown ? { ...c, shownOn } : c\n if (!ownMissing && !lostShown) return fixed\n /* ๊ตฌ์กฐ๋ฅผ ๋ฎ์ถ๋ ๊ฒ์ **์๊ธฐ ๋ฌธ์ด ์์ด์ง ๊ฒฝ์ฐ**๋ค โ ๋จ์ ์ถ์์ ๋ณด์ด๋ ๊ฒ์ ๊ตฌ์กฐ๊ฐ ์๋๋ผ ํ์์ ๋ฌธ์ ๋ค. */\n return ownMissing ? { ...fixed, structure: 'none' as CoverageLevel, axisMissing: true } : { ...fixed, axisMissing: true }\n}\n\nexport function isa95Coverage(axes: string[]): {\n model: string\n concepts: (Isa95Concept & { axisMissing?: boolean })[]\n totals: { concepts: number; structure: number; behavior: number; surface: number }\n} {\n const concepts = ISA95_CONCEPTS.map(c => reconcileAxes(c, new Set(axes)))\n /* ์ฑ์ด ์๋ `full` ๋ง ์ผ๋ค โ ๋ถ๋ถ์ ์ฑ์ด ๊ฒ์ผ๋ก ์ธ๋ฉด ๊ธฐ์ค์ด ์ค์ค๋ก๋ฅผ ์์ธ๋ค. */\n const count = (k: 'structure' | 'behavior' | 'surface') => concepts.filter(c => c[k] === 'full').length\n return {\n model: 'ISA-95',\n concepts,\n totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }\n }\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๊ฐ์ฒด ์๋ณ์ โ **ํ๋ชฉ ์ฐธ์กฐ**. ๋์ ํ์ ๊ฐ๊ณผ ๊ฒฌ์ค ์ ์๋ ๋ชจ์์ผ๋ก ๋๋ ค์ค๋ค.
|
|
3
|
+
*
|
|
4
|
+
* SGTIN ์ ํ์ค์ด ์๋ฆฌ๋ฅผ ์ ํด ๋์์ผ๋ฏ๋ก ๊ทธ ์๋ฆฌ์์ ํ๋ชฉ ์ฐธ์กฐ๋ฅผ ๊บผ๋ธ๋ค. ๊ทธ ๋ฐ์ ๋ชจ์์ **์๋์ง
|
|
5
|
+
* ์๋๋ค** โ ์ด๋ ๋ถํธ๊ฐ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋์ง๋ ์๋ณธ๋ง๋ค ๋ค๋ฅด๊ณ , ์ปค๋ ๊ณ์ฝ์ด ๊ทธ ๊ตฌ๋ถ์๋ฅผ ์ ํ ์ ์ด ์๋ค.
|
|
6
|
+
* ์์ ์ด ์๋ฆฌ์ ใ`@` ๋ค๋ ๊ฐ์ฒด๋คใ๋ฅผ ๋ฃ์๋๋ฐ, ๊ทธ๊ฒ์ ํ ์๋ณธ(chef)์ ๋ชจ์์ ๊ท์น์ผ๋ก ๊ตณํ ๊ฒ์ด์๋ค.
|
|
7
|
+
*
|
|
8
|
+
* ๊ทธ๋์ ์๋ฅด๋ ์ผ์ ์ฌ๊ธฐ์ ํ์ง ์๊ณ , **๊ทธ ํธ์์ ์ ์ธ๊ณผ ๊ฒฌ์ฃผ์ด** ํ์ ํ๋ค(ยง`resolveByDeclaration`).
|
|
9
|
+
* ์ ์ธ์ด ๋ต์ ์ฃผ์ง ๋ชปํ๋ฉด `null` ์ด๋ค โ ์ง์์ผ๋ก ์ด์ผ๋ฉด ๋จ์ ๋ ์ํผ์ ๊ฒฌ์ฃผ๊ฒ ๋๊ณ , ๊ทธ๊ฒ์ด ใ์ค๊ณ์
|
|
10
|
+
* ๋ค๋ฅด๋คใ๋ ๊ฑฐ์ง ์ง๋จ์ด ๋๋ค.
|
|
11
|
+
*/
|
|
12
|
+
export declare function itemRefOf(epc: unknown): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* ์ด ์๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋ **์ ์ธ ํญ๋ชฉ**์ ์ฐพ๋๋ค โ ์๋ณธ์ ์ ์ฒด์ฑ ๊ดํ์ ์์ง ์๊ณ , ๊ตฌ๋ถ์๋ ๋ชจ๋ฅธ๋ค.
|
|
15
|
+
*
|
|
16
|
+
* ์ธ ๊ฐ์ง๋ฅผ ์ฐจ๋ก๋ก ๋ณธ๋ค. ์ด๋ ๋จ๊ณ๋ **ํ๋ณด๊ฐ ๋ ์ด์์ด๋ฉด ๋ตํ์ง ์๋๋ค**(๋ชจ๋ฅด๋ ๊ฒ์ด ํ๋ฆฐ ๋ต๋ณด๋ค ๋ซ๋ค).
|
|
17
|
+
*
|
|
18
|
+
* โ ๊ทธ๋๋ก ๊ฐ๋ค
|
|
19
|
+
* โก ๊ด์ธก๋ ์๋ณ์๊ฐ ์ ์ธ์ **ํ์ฅ**ํ๋ค โ ๊ฐ์ฒด๋ ์๊ธฐ ํด๋์ค๋ก ์์ํ๋ค(`โฆ/product-M1` + ๊ฐ์ฒด ํ์)
|
|
20
|
+
* โข ํ๋ฉด์ด **์งง๊ฒ ์ค์ธ** ์๋ณ์๋ฅผ ๊ฑด๋ธ๋ค โ ์ ์ธ์ด ๊ทธ๊ฒ์ผ๋ก ๋๋๋ค(`net/class/product-M1`)
|
|
21
|
+
*
|
|
22
|
+
* โกโข์ ๋ถํธ๋ฅผ ๋ชจ๋ฅธ๋ค. ๊ทธ๋์ ์๋ณธ์ด `@`ยท`#`ยท`/` ๋ฌด์์ ์ฐ๋ , ๋๋ ์๋ฌด๊ฒ๋ ์ฐ์ง ์๋ ๊ฐ์ ๊ท์น์ด ์ ๋ค.
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveByDeclaration<T>(ref: string | null, declared: Map<string, T>): T | undefined;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* **๊ฐ์ฒด์์ ํ๋ชฉ์ผ๋ก** โ ์ ์ฒด์ฑ ๋ชจ์์ด ํ๋๊ฐ ์๋๋ค (2026-08-23).
|
|
4
|
+
*
|
|
5
|
+
* โโ ๋ฌด์์ด ์กฐ์ฉํ ๋น์ด ์์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
6
|
+
* ํ๋ฉด์ด ใ์ด ๊ฐ์ฒด๋ ์ ์ธ๋ ์์ฌ๊ฐ ์๋๋๋ค(๋ผ์ธ ๋ด๋ถ์ ์ค๊ฐ ์ฐ๋ฌผ์ผ ์ ์์ต๋๋ค)ใ๋ผ๊ณ ๋งํ๋๋ฐ, ๊ทธ
|
|
7
|
+
* ํ๋ชฉ์ ์๋ณธ์ ์ ์ธ์ ์ด๋ฆ๊น์ง ์์๋ค(ใ๋๋๊ทธ๋ฆฐ๋น์คใ). ๋์ ํ(`productionSpec.binding`)๋ ๋ฉ์ฉกํ๋ค.
|
|
8
|
+
*
|
|
9
|
+
* ์์ธ์ **๊ฐ์ฒด์์ ํ๋ชฉ์ ๊บผ๋ด๋ ๊ท์น**์ด์๋ค. ๊ทธ ๊ท์น์ด GS1 SGTIN URN ํ๋๋ง ์์๋ค.
|
|
10
|
+
*
|
|
11
|
+
* urn:epc:id:sgtin:0614141.077101.42 โ 077101 (์๋ ๋ชจ์)
|
|
12
|
+
* https://โฆ/class/product-M0000438@M2R0001 โ null (๋ชจ๋ฅด๋ ๋ชจ์)
|
|
13
|
+
*
|
|
14
|
+
* ์น URI ๋ก ์ ์ฒด์ฑ์ ๋งํ๋ ์๋ณธ์์๋ ์ธ์ ๋ `null` ์ด ๋์๊ณ , ๊ทธ๋์ **๊ฐ์ฒด๋ฅผ ์์ฌ์ ์ด์ ์ ์์๋ค.**
|
|
15
|
+
* ๊ทธ ๊ฒฐ๊ณผ๊ฐ ํ๋ฉด ๋ ๊ณณ์์ ์กฐ์ฉํ ๋น์นธ์ด์๋ค(๊ณ๋ณด ์ ํฉ์ฑ ยท ์ค๋๊ฐ ๋ฌด์์ ๋ง๋๋). ใ์์ผ๋ฉด ๋ถ์ด์ง
|
|
16
|
+
* ์๋๋คใ๋ ๊ท์จ์ ์งํค๊ธฐ ๋๋ฌธ์ ์๋ฌด ์ค๋ฅ๋ ๋์ง ์์๋ค.
|
|
17
|
+
*
|
|
18
|
+
* โโ ๋ฌด์์ ๋๋ ค์ฃผ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
19
|
+
* **๊ทธ ํธ์์ ๋์ ํ๊ฐ ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ชจ์**์ด๋ค. ๋ ์ธ๊ณ๊ฐ ์๋ก ๋ค๋ฅธ ๊ฒ์ ๊ฐ์ผ๋ก ์ด๋ค.
|
|
20
|
+
*
|
|
21
|
+
* SGTIN ์ธ๊ณ binding ๊ฐ = ํ๋ชฉ ์ฐธ์กฐ ์ซ์(`077101`) โ ์ซ์๋ฅผ ๋๋ ค์ค๋ค
|
|
22
|
+
* URI ์ธ๊ณ binding ๊ฐ = ํด๋์ค URI(`โฆ/product-Mโฆ`) โ ํด๋์ค URI ๋ฅผ ๋๋ ค์ค๋ค
|
|
23
|
+
*
|
|
24
|
+
* ๊ทธ๋์ ๋ ์ธ๊ณ๋ฅผ ํ ํจ์๊ฐ ๋ตํ๋ค โ ๋ถ๋ฅด๋ ์๋ฆฌ๊ฐ ์๋ณธ์ ์ ์ฒด์ฑ ๋ฐฉ์์ ์์ง ์์๋ ๋๋ค.
|
|
25
|
+
*
|
|
26
|
+
* โโ ๋ฌด์์ ์ง์ด๋ด์ง ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
27
|
+
* **์ด๋ ๋ถํธ๊ฐ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋์ง ๋ชจ๋ฅธ๋ค.** ๊ทธ๊ฒ์ ์๋ณธ๋ง๋ค ๋ค๋ฅด๊ณ ์ปค๋ ๊ณ์ฝ์ด ์ ํ ์ ์ด ์๋ค โ ํ
|
|
28
|
+
* ์๋ณธ(chef)์ด ์ฐ๋ `@` ๋ฅผ ๊ท์น์ผ๋ก ๊ตณํ๋ฉด ์ด ํ๋ฉด์ด ๊ทธ ๋ ๊ฑฐ์ ์์ ์๊ฒ ๋๋ค. ์๋ฅด๋ ํ๋จ์ ๊ทธ ํธ์์
|
|
29
|
+
* **์ ์ธ**์ด ํ๊ณ (ยง`resolveByDeclaration`), ํ๋ณด๊ฐ ๋ ์ด์์ด๋ฉด ๋ตํ์ง ์๋๋ค. ์ง์์ผ๋ก ์ด์ผ๋ฉด ๋จ์
|
|
30
|
+
* ๋ ์ํผ์ ๊ฒฌ์ฃผ๊ฒ ๋๊ณ , ๊ทธ๊ฒ์ด ใ์ค๊ณ์ ๋ค๋ฅด๋คใ๋ ๊ฑฐ์ง ์ง๋จ์ด ๋๋ค.
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.itemRefOf = itemRefOf;
|
|
34
|
+
exports.resolveByDeclaration = resolveByDeclaration;
|
|
35
|
+
/**
|
|
36
|
+
* ๊ฐ์ฒด ์๋ณ์ โ **ํ๋ชฉ ์ฐธ์กฐ**. ๋์ ํ์ ๊ฐ๊ณผ ๊ฒฌ์ค ์ ์๋ ๋ชจ์์ผ๋ก ๋๋ ค์ค๋ค.
|
|
37
|
+
*
|
|
38
|
+
* SGTIN ์ ํ์ค์ด ์๋ฆฌ๋ฅผ ์ ํด ๋์์ผ๋ฏ๋ก ๊ทธ ์๋ฆฌ์์ ํ๋ชฉ ์ฐธ์กฐ๋ฅผ ๊บผ๋ธ๋ค. ๊ทธ ๋ฐ์ ๋ชจ์์ **์๋์ง
|
|
39
|
+
* ์๋๋ค** โ ์ด๋ ๋ถํธ๊ฐ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋์ง๋ ์๋ณธ๋ง๋ค ๋ค๋ฅด๊ณ , ์ปค๋ ๊ณ์ฝ์ด ๊ทธ ๊ตฌ๋ถ์๋ฅผ ์ ํ ์ ์ด ์๋ค.
|
|
40
|
+
* ์์ ์ด ์๋ฆฌ์ ใ`@` ๋ค๋ ๊ฐ์ฒด๋คใ๋ฅผ ๋ฃ์๋๋ฐ, ๊ทธ๊ฒ์ ํ ์๋ณธ(chef)์ ๋ชจ์์ ๊ท์น์ผ๋ก ๊ตณํ ๊ฒ์ด์๋ค.
|
|
41
|
+
*
|
|
42
|
+
* ๊ทธ๋์ ์๋ฅด๋ ์ผ์ ์ฌ๊ธฐ์ ํ์ง ์๊ณ , **๊ทธ ํธ์์ ์ ์ธ๊ณผ ๊ฒฌ์ฃผ์ด** ํ์ ํ๋ค(ยง`resolveByDeclaration`).
|
|
43
|
+
* ์ ์ธ์ด ๋ต์ ์ฃผ์ง ๋ชปํ๋ฉด `null` ์ด๋ค โ ์ง์์ผ๋ก ์ด์ผ๋ฉด ๋จ์ ๋ ์ํผ์ ๊ฒฌ์ฃผ๊ฒ ๋๊ณ , ๊ทธ๊ฒ์ด ใ์ค๊ณ์
|
|
44
|
+
* ๋ค๋ฅด๋คใ๋ ๊ฑฐ์ง ์ง๋จ์ด ๋๋ค.
|
|
45
|
+
*/
|
|
46
|
+
function itemRefOf(epc) {
|
|
47
|
+
if (typeof epc !== 'string')
|
|
48
|
+
return null;
|
|
49
|
+
const s = epc.trim();
|
|
50
|
+
if (!s)
|
|
51
|
+
return null;
|
|
52
|
+
/* GS1 SGTIN โ ํ์ฌ ์ ๋์ฌ์ ์ผ๋ จ๋ฒํธ ์ฌ์ด์ ํ๋ชฉ ์ฐธ์กฐ. `idpat` ์ `*` ๋ ๊ฐ์ ์๋ฆฌ์์ ๊ฑธ๋ฆฐ๋ค. */
|
|
53
|
+
const sgtin = /sgtin:[^.]+\.([^.]+)\./.exec(s);
|
|
54
|
+
if (sgtin)
|
|
55
|
+
return sgtin[1];
|
|
56
|
+
/* ๊ทธ ๋ฐ์ ์ ์ฒด์ฑ(์น URI ๋ฑ)์ ๊ทธ๋๋ก ๋ธ๋ค โ ์๋ฅด๋ ํ๋จ์ ์ ์ธ์ด ํ๋ค. */
|
|
57
|
+
return s;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* ์ด ์๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋ **์ ์ธ ํญ๋ชฉ**์ ์ฐพ๋๋ค โ ์๋ณธ์ ์ ์ฒด์ฑ ๊ดํ์ ์์ง ์๊ณ , ๊ตฌ๋ถ์๋ ๋ชจ๋ฅธ๋ค.
|
|
61
|
+
*
|
|
62
|
+
* ์ธ ๊ฐ์ง๋ฅผ ์ฐจ๋ก๋ก ๋ณธ๋ค. ์ด๋ ๋จ๊ณ๋ **ํ๋ณด๊ฐ ๋ ์ด์์ด๋ฉด ๋ตํ์ง ์๋๋ค**(๋ชจ๋ฅด๋ ๊ฒ์ด ํ๋ฆฐ ๋ต๋ณด๋ค ๋ซ๋ค).
|
|
63
|
+
*
|
|
64
|
+
* โ ๊ทธ๋๋ก ๊ฐ๋ค
|
|
65
|
+
* โก ๊ด์ธก๋ ์๋ณ์๊ฐ ์ ์ธ์ **ํ์ฅ**ํ๋ค โ ๊ฐ์ฒด๋ ์๊ธฐ ํด๋์ค๋ก ์์ํ๋ค(`โฆ/product-M1` + ๊ฐ์ฒด ํ์)
|
|
66
|
+
* โข ํ๋ฉด์ด **์งง๊ฒ ์ค์ธ** ์๋ณ์๋ฅผ ๊ฑด๋ธ๋ค โ ์ ์ธ์ด ๊ทธ๊ฒ์ผ๋ก ๋๋๋ค(`net/class/product-M1`)
|
|
67
|
+
*
|
|
68
|
+
* โกโข์ ๋ถํธ๋ฅผ ๋ชจ๋ฅธ๋ค. ๊ทธ๋์ ์๋ณธ์ด `@`ยท`#`ยท`/` ๋ฌด์์ ์ฐ๋ , ๋๋ ์๋ฌด๊ฒ๋ ์ฐ์ง ์๋ ๊ฐ์ ๊ท์น์ด ์ ๋ค.
|
|
69
|
+
*/
|
|
70
|
+
function resolveByDeclaration(ref, declared) {
|
|
71
|
+
if (!ref)
|
|
72
|
+
return undefined;
|
|
73
|
+
const exact = declared.get(ref);
|
|
74
|
+
if (exact !== undefined)
|
|
75
|
+
return exact;
|
|
76
|
+
let hit;
|
|
77
|
+
let found = 0;
|
|
78
|
+
for (const [id, value] of declared) {
|
|
79
|
+
if (!(ref.startsWith(id) || id.endsWith(ref)))
|
|
80
|
+
continue;
|
|
81
|
+
found++;
|
|
82
|
+
if (found > 1)
|
|
83
|
+
return undefined;
|
|
84
|
+
hit = value;
|
|
85
|
+
}
|
|
86
|
+
return hit;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=item-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-ref.js","sourceRoot":"","sources":["../../../server/service/twin-model/item-ref.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;AAaH,8BAWC;AAaD,oDAaC;AAhDD;;;;;;;;;;GAUG;AACH,SAAgB,SAAS,CAAC,GAAY;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACxC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IACpB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnB,sEAAsE;IACtE,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC9C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;IAE1B,iDAAiD;IACjD,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,oBAAoB,CAAI,GAAkB,EAAE,QAAwB;IAClF,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACrC,IAAI,GAAkB,CAAA;IACtB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,SAAQ;QACvD,KAAK,EAAE,CAAA;QACP,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA;QAC/B,GAAG,GAAG,KAAK,CAAA;IACb,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC","sourcesContent":["/*\n * **๊ฐ์ฒด์์ ํ๋ชฉ์ผ๋ก** โ ์ ์ฒด์ฑ ๋ชจ์์ด ํ๋๊ฐ ์๋๋ค (2026-08-23).\n *\n * โโ ๋ฌด์์ด ์กฐ์ฉํ ๋น์ด ์์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ํ๋ฉด์ด ใ์ด ๊ฐ์ฒด๋ ์ ์ธ๋ ์์ฌ๊ฐ ์๋๋๋ค(๋ผ์ธ ๋ด๋ถ์ ์ค๊ฐ ์ฐ๋ฌผ์ผ ์ ์์ต๋๋ค)ใ๋ผ๊ณ ๋งํ๋๋ฐ, ๊ทธ\n * ํ๋ชฉ์ ์๋ณธ์ ์ ์ธ์ ์ด๋ฆ๊น์ง ์์๋ค(ใ๋๋๊ทธ๋ฆฐ๋น์คใ). ๋์ ํ(`productionSpec.binding`)๋ ๋ฉ์ฉกํ๋ค.\n *\n * ์์ธ์ **๊ฐ์ฒด์์ ํ๋ชฉ์ ๊บผ๋ด๋ ๊ท์น**์ด์๋ค. ๊ทธ ๊ท์น์ด GS1 SGTIN URN ํ๋๋ง ์์๋ค.\n *\n * urn:epc:id:sgtin:0614141.077101.42 โ 077101 (์๋ ๋ชจ์)\n * https://โฆ/class/product-M0000438@M2R0001 โ null (๋ชจ๋ฅด๋ ๋ชจ์)\n *\n * ์น URI ๋ก ์ ์ฒด์ฑ์ ๋งํ๋ ์๋ณธ์์๋ ์ธ์ ๋ `null` ์ด ๋์๊ณ , ๊ทธ๋์ **๊ฐ์ฒด๋ฅผ ์์ฌ์ ์ด์ ์ ์์๋ค.**\n * ๊ทธ ๊ฒฐ๊ณผ๊ฐ ํ๋ฉด ๋ ๊ณณ์์ ์กฐ์ฉํ ๋น์นธ์ด์๋ค(๊ณ๋ณด ์ ํฉ์ฑ ยท ์ค๋๊ฐ ๋ฌด์์ ๋ง๋๋). ใ์์ผ๋ฉด ๋ถ์ด์ง\n * ์๋๋คใ๋ ๊ท์จ์ ์งํค๊ธฐ ๋๋ฌธ์ ์๋ฌด ์ค๋ฅ๋ ๋์ง ์์๋ค.\n *\n * โโ ๋ฌด์์ ๋๋ ค์ฃผ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * **๊ทธ ํธ์์ ๋์ ํ๊ฐ ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ชจ์**์ด๋ค. ๋ ์ธ๊ณ๊ฐ ์๋ก ๋ค๋ฅธ ๊ฒ์ ๊ฐ์ผ๋ก ์ด๋ค.\n *\n * SGTIN ์ธ๊ณ binding ๊ฐ = ํ๋ชฉ ์ฐธ์กฐ ์ซ์(`077101`) โ ์ซ์๋ฅผ ๋๋ ค์ค๋ค\n * URI ์ธ๊ณ binding ๊ฐ = ํด๋์ค URI(`โฆ/product-Mโฆ`) โ ํด๋์ค URI ๋ฅผ ๋๋ ค์ค๋ค\n *\n * ๊ทธ๋์ ๋ ์ธ๊ณ๋ฅผ ํ ํจ์๊ฐ ๋ตํ๋ค โ ๋ถ๋ฅด๋ ์๋ฆฌ๊ฐ ์๋ณธ์ ์ ์ฒด์ฑ ๋ฐฉ์์ ์์ง ์์๋ ๋๋ค.\n *\n * โโ ๋ฌด์์ ์ง์ด๋ด์ง ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * **์ด๋ ๋ถํธ๊ฐ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋์ง ๋ชจ๋ฅธ๋ค.** ๊ทธ๊ฒ์ ์๋ณธ๋ง๋ค ๋ค๋ฅด๊ณ ์ปค๋ ๊ณ์ฝ์ด ์ ํ ์ ์ด ์๋ค โ ํ\n * ์๋ณธ(chef)์ด ์ฐ๋ `@` ๋ฅผ ๊ท์น์ผ๋ก ๊ตณํ๋ฉด ์ด ํ๋ฉด์ด ๊ทธ ๋ ๊ฑฐ์ ์์ ์๊ฒ ๋๋ค. ์๋ฅด๋ ํ๋จ์ ๊ทธ ํธ์์\n * **์ ์ธ**์ด ํ๊ณ (ยง`resolveByDeclaration`), ํ๋ณด๊ฐ ๋ ์ด์์ด๋ฉด ๋ตํ์ง ์๋๋ค. ์ง์์ผ๋ก ์ด์ผ๋ฉด ๋จ์\n * ๋ ์ํผ์ ๊ฒฌ์ฃผ๊ฒ ๋๊ณ , ๊ทธ๊ฒ์ด ใ์ค๊ณ์ ๋ค๋ฅด๋คใ๋ ๊ฑฐ์ง ์ง๋จ์ด ๋๋ค.\n */\n\n/**\n * ๊ฐ์ฒด ์๋ณ์ โ **ํ๋ชฉ ์ฐธ์กฐ**. ๋์ ํ์ ๊ฐ๊ณผ ๊ฒฌ์ค ์ ์๋ ๋ชจ์์ผ๋ก ๋๋ ค์ค๋ค.\n *\n * SGTIN ์ ํ์ค์ด ์๋ฆฌ๋ฅผ ์ ํด ๋์์ผ๋ฏ๋ก ๊ทธ ์๋ฆฌ์์ ํ๋ชฉ ์ฐธ์กฐ๋ฅผ ๊บผ๋ธ๋ค. ๊ทธ ๋ฐ์ ๋ชจ์์ **์๋์ง\n * ์๋๋ค** โ ์ด๋ ๋ถํธ๊ฐ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋์ง๋ ์๋ณธ๋ง๋ค ๋ค๋ฅด๊ณ , ์ปค๋ ๊ณ์ฝ์ด ๊ทธ ๊ตฌ๋ถ์๋ฅผ ์ ํ ์ ์ด ์๋ค.\n * ์์ ์ด ์๋ฆฌ์ ใ`@` ๋ค๋ ๊ฐ์ฒด๋คใ๋ฅผ ๋ฃ์๋๋ฐ, ๊ทธ๊ฒ์ ํ ์๋ณธ(chef)์ ๋ชจ์์ ๊ท์น์ผ๋ก ๊ตณํ ๊ฒ์ด์๋ค.\n *\n * ๊ทธ๋์ ์๋ฅด๋ ์ผ์ ์ฌ๊ธฐ์ ํ์ง ์๊ณ , **๊ทธ ํธ์์ ์ ์ธ๊ณผ ๊ฒฌ์ฃผ์ด** ํ์ ํ๋ค(ยง`resolveByDeclaration`).\n * ์ ์ธ์ด ๋ต์ ์ฃผ์ง ๋ชปํ๋ฉด `null` ์ด๋ค โ ์ง์์ผ๋ก ์ด์ผ๋ฉด ๋จ์ ๋ ์ํผ์ ๊ฒฌ์ฃผ๊ฒ ๋๊ณ , ๊ทธ๊ฒ์ด ใ์ค๊ณ์\n * ๋ค๋ฅด๋คใ๋ ๊ฑฐ์ง ์ง๋จ์ด ๋๋ค.\n */\nexport function itemRefOf(epc: unknown): string | null {\n if (typeof epc !== 'string') return null\n const s = epc.trim()\n if (!s) return null\n\n /* GS1 SGTIN โ ํ์ฌ ์ ๋์ฌ์ ์ผ๋ จ๋ฒํธ ์ฌ์ด์ ํ๋ชฉ ์ฐธ์กฐ. `idpat` ์ `*` ๋ ๊ฐ์ ์๋ฆฌ์์ ๊ฑธ๋ฆฐ๋ค. */\n const sgtin = /sgtin:[^.]+\\.([^.]+)\\./.exec(s)\n if (sgtin) return sgtin[1]\n\n /* ๊ทธ ๋ฐ์ ์ ์ฒด์ฑ(์น URI ๋ฑ)์ ๊ทธ๋๋ก ๋ธ๋ค โ ์๋ฅด๋ ํ๋จ์ ์ ์ธ์ด ํ๋ค. */\n return s\n}\n\n/**\n * ์ด ์๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋ **์ ์ธ ํญ๋ชฉ**์ ์ฐพ๋๋ค โ ์๋ณธ์ ์ ์ฒด์ฑ ๊ดํ์ ์์ง ์๊ณ , ๊ตฌ๋ถ์๋ ๋ชจ๋ฅธ๋ค.\n *\n * ์ธ ๊ฐ์ง๋ฅผ ์ฐจ๋ก๋ก ๋ณธ๋ค. ์ด๋ ๋จ๊ณ๋ **ํ๋ณด๊ฐ ๋ ์ด์์ด๋ฉด ๋ตํ์ง ์๋๋ค**(๋ชจ๋ฅด๋ ๊ฒ์ด ํ๋ฆฐ ๋ต๋ณด๋ค ๋ซ๋ค).\n *\n * โ ๊ทธ๋๋ก ๊ฐ๋ค\n * โก ๊ด์ธก๋ ์๋ณ์๊ฐ ์ ์ธ์ **ํ์ฅ**ํ๋ค โ ๊ฐ์ฒด๋ ์๊ธฐ ํด๋์ค๋ก ์์ํ๋ค(`โฆ/product-M1` + ๊ฐ์ฒด ํ์)\n * โข ํ๋ฉด์ด **์งง๊ฒ ์ค์ธ** ์๋ณ์๋ฅผ ๊ฑด๋ธ๋ค โ ์ ์ธ์ด ๊ทธ๊ฒ์ผ๋ก ๋๋๋ค(`net/class/product-M1`)\n *\n * โกโข์ ๋ถํธ๋ฅผ ๋ชจ๋ฅธ๋ค. ๊ทธ๋์ ์๋ณธ์ด `@`ยท`#`ยท`/` ๋ฌด์์ ์ฐ๋ , ๋๋ ์๋ฌด๊ฒ๋ ์ฐ์ง ์๋ ๊ฐ์ ๊ท์น์ด ์ ๋ค.\n */\nexport function resolveByDeclaration<T>(ref: string | null, declared: Map<string, T>): T | undefined {\n if (!ref) return undefined\n const exact = declared.get(ref)\n if (exact !== undefined) return exact\n let hit: T | undefined\n let found = 0\n for (const [id, value] of declared) {\n if (!(ref.startsWith(id) || id.endsWith(ref))) continue\n found++\n if (found > 1) return undefined\n hit = value\n }\n return hit\n}\n"]}
|