@things-factory/headless-twin 10.0.17 โ 10.0.18
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 +12 -85
- package/dist-server/engine/canonical-ingest.js +92 -26
- package/dist-server/engine/canonical-ingest.js.map +1 -1
- package/dist-server/engine/energy-topology.js +3 -3
- package/dist-server/engine/energy-topology.js.map +1 -1
- package/dist-server/engine/kpi-fold.d.ts +91 -3
- package/dist-server/engine/kpi-fold.js +149 -25
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.js +99 -11
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/local-declarations.js +6 -5
- package/dist-server/engine/local-declarations.js.map +1 -1
- package/dist-server/engine/model-vocabulary.js +2 -2
- package/dist-server/engine/model-vocabulary.js.map +1 -1
- package/dist-server/engine/oee-accumulator.d.ts +2 -1
- package/dist-server/engine/oee-accumulator.js +3 -2
- package/dist-server/engine/oee-accumulator.js.map +1 -1
- package/dist-server/engine/twin-engine.d.ts +72 -2
- package/dist-server/engine/twin-engine.js +150 -4
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/routes.js +1 -1
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/index.d.ts +1 -1
- package/dist-server/service/index.js +3 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/reference-live.js +1 -1
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +11 -2
- package/dist-server/service/reference/reference-master.js +1 -1
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-resolver.js +2 -2
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/reference/template-registry.d.ts +1 -1
- package/dist-server/service/reference/template-registry.js.map +1 -1
- package/dist-server/service/twin-backfill/backfill-period-facts.d.ts +24 -0
- package/dist-server/service/twin-backfill/backfill-period-facts.js +96 -0
- package/dist-server/service/twin-backfill/backfill-period-facts.js.map +1 -0
- package/dist-server/service/twin-backfill/backfill-shape.d.ts +34 -0
- package/dist-server/service/twin-backfill/backfill-shape.js +75 -0
- package/dist-server/service/twin-backfill/backfill-shape.js.map +1 -0
- package/dist-server/service/twin-backfill/index.d.ts +2 -0
- package/dist-server/service/twin-backfill/index.js +6 -0
- package/dist-server/service/twin-backfill/index.js.map +1 -0
- package/dist-server/service/twin-backfill/twin-backfill-resolver.d.ts +10 -0
- package/dist-server/service/twin-backfill/twin-backfill-resolver.js +44 -0
- package/dist-server/service/twin-backfill/twin-backfill-resolver.js.map +1 -0
- package/dist-server/service/twin-control/twin-control-mutation.js +2 -2
- package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
- package/dist-server/service/twin-lifecycle/domain-catalog.js +2 -1
- package/dist-server/service/twin-lifecycle/domain-catalog.js.map +1 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
- package/dist-server/service/twin-model/name-index.js +1 -1
- package/dist-server/service/twin-model/name-index.js.map +1 -1
- package/dist-server/service/twin-model/project-structure.js +4 -3
- package/dist-server/service/twin-model/project-structure.js.map +1 -1
- package/dist-server/service/twin-model/twin-equipment.d.ts +1 -1
- package/dist-server/service/twin-model/twin-equipment.js +2 -2
- package/dist-server/service/twin-model/twin-equipment.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-item-query.js +1 -1
- package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-query.js +4 -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 +1 -1
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-resolver.js +1 -1
- package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
- package/dist-shared/entity-delta.js +1 -1
- package/dist-shared/entity-delta.js.map +1 -1
- package/package.json +7 -6
- package/server/engine/canonical-ingest.ts +72 -84
- package/server/engine/energy-topology.ts +1 -1
- package/server/engine/kpi-fold.ts +219 -36
- package/server/engine/kpi-query.ts +97 -4
- package/server/engine/local-declarations.ts +2 -1
- package/server/engine/model-vocabulary.ts +1 -1
- package/server/engine/oee-accumulator.ts +4 -2
- package/server/engine/twin-engine.ts +163 -5
- package/server/routes.ts +6 -1
- package/server/service/index.ts +3 -0
- package/server/service/reference/reference-live.ts +8 -2
- package/server/service/reference/reference-master.ts +12 -3
- package/server/service/reference/reference-resolver.ts +1 -1
- package/server/service/reference/template-registry.ts +1 -1
- package/server/service/twin-backfill/backfill-period-facts.ts +168 -0
- package/server/service/twin-backfill/backfill-shape.ts +86 -0
- package/server/service/twin-backfill/index.ts +3 -0
- package/server/service/twin-backfill/twin-backfill-resolver.ts +35 -0
- package/server/service/twin-control/twin-control-mutation.ts +1 -1
- package/server/service/twin-lifecycle/domain-catalog.ts +2 -1
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +1 -1
- package/server/service/twin-model/name-index.ts +1 -1
- package/server/service/twin-model/project-structure.ts +3 -2
- package/server/service/twin-model/twin-equipment.ts +14 -2
- package/server/service/twin-model/twin-model-item-query.ts +1 -1
- package/server/service/twin-model/twin-model-query.ts +2 -2
- package/server/service/twin-model/twin-model-tree-query.ts +1 -1
- package/server/service/twin-space/twin-space-resolver.ts +1 -1
- package/shared/entity-delta.ts +1 -1
- package/test/axis-read.test.ts +4 -3
- package/test/backfill-shape.test.ts +89 -0
- package/test/broadcast-cost-baseline.test.ts +2 -1
- package/test/canonical-ingest-vocabularies.test.ts +82 -3
- package/test/capability-mapping.test.ts +1 -1
- package/test/contract-layer-guard.test.ts +48 -0
- package/test/declaration-reaches-model.test.ts +2 -0
- package/test/equipment-identity-reaches.test.ts +57 -0
- package/test/fact-scope-wiring.test.ts +96 -0
- package/test/generated-not-counted.test.ts +99 -0
- package/test/ingest-bench.test.ts +2 -1
- package/test/ingest-wiring-guard.test.ts +197 -0
- package/test/kpi-fold.test.ts +81 -0
- package/test/live-mirror-parity.test.ts +6 -3
- package/test/local-declarations.test.ts +3 -2
- package/test/master-to-twin.test.ts +2 -2
- package/test/oee-accumulator.test.ts +18 -3
- package/test/projection-reaches-screen.test.ts +5 -0
- package/test/projection-reads-declared.test.ts +109 -0
- package/test/property-effects.test.ts +7 -3
- package/test/scale-twin-bench.test.ts +2 -1
- package/test/vocabulary-guard.test.ts +1 -1
- package/tsconfig.shared.tsbuildinfo +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -54,9 +54,10 @@ const attention_digest_js_1 = require("./attention-digest.js");
|
|
|
54
54
|
const live_feed_registry_js_1 = require("./live-feed-registry.js");
|
|
55
55
|
const ingest_health_js_1 = require("./ingest-health.js");
|
|
56
56
|
const ingest_dedupe_js_1 = require("./ingest-dedupe.js");
|
|
57
|
-
const
|
|
57
|
+
const ops_contract_1 = require("@operato/ops-contract");
|
|
58
58
|
/* ์ปค๋ ๋ฐํ์ ๋ก๋ โ CJS ๋ฒ๋ค(dist-cjs). ํ์
์ ์ import type ๋ก. replay = ์ด๋ฒคํธ์ดโ์ํ ์ฌ๊ตฌ์ฑ(๋ณต๊ตฌยท์๊ฐ์ฌํ). */
|
|
59
|
-
const { WmsKernel, YmsKernel, MesKernel, EmsKernel, TwinRuntime, StateProjector, replay, replayFrom, replayWithCheckpoint, replaySegments
|
|
59
|
+
const { WmsKernel, YmsKernel, MesKernel, EmsKernel, TwinRuntime, StateProjector, replay, replayFrom, replayWithCheckpoint, replaySegments } = require('@operato/twin-kernel');
|
|
60
|
+
const { readBoardLocations, readBoardEquipment, DOMAIN_CATALOG, OP_EVENT, validateScenario } = require('@operato/ops-contract');
|
|
60
61
|
const KERNELS = { wms: WmsKernel, yms: YmsKernel, mes: MesKernel, ems: EmsKernel };
|
|
61
62
|
/**
|
|
62
63
|
* ์๊ฐ์ถ์ ๊ตฌํ ๋ ํ ๋ฒ์ ๋์ฐ๋ ํธ์ ์.
|
|
@@ -1366,6 +1367,7 @@ class TwinEngine {
|
|
|
1366
1367
|
return this.instances[key];
|
|
1367
1368
|
const Kernel = kernelFor(kind);
|
|
1368
1369
|
const kernel = new Kernel(domainId, undefined, this.productionSpecOf(model));
|
|
1370
|
+
kernel.scopeId = id;
|
|
1369
1371
|
kernel.loadTwinModel(model); // ๊ตฌ์กฐ๋ง. ์ํ๋ ์๋ ์์คํํธ๊ฐ ์ฃผ์
ํ๋ค.
|
|
1370
1372
|
this.applyOperations(kernel, model, id); // ์๊ฐยท์์จ ๋ช
์ธ(์์ผ๋ฉด) โ ์์ผ๋ฉด ์ปค๋ ๊ธฐ๋ณธ๊ฐ
|
|
1371
1373
|
/* ์ถ์ ๊ธฐ๋ DB ์กฐํ๋ฅผ ํฌํจํด ๋น๋๊ธฐ โ ๊ธฐ๋์ ๋ง์ง ์๊ณ ๋ถ๋๋ค(๋ถ๊ธฐ ์ ์์
์ ๋ช
์ธยท์์๋ก ์ฐ์ถ). */
|
|
@@ -1559,6 +1561,7 @@ class TwinEngine {
|
|
|
1559
1561
|
return this.instances[key];
|
|
1560
1562
|
const Kernel = kernelFor(kind);
|
|
1561
1563
|
const kernel = new Kernel(domainId, undefined, this.productionSpecOf(model));
|
|
1564
|
+
kernel.scopeId = id;
|
|
1562
1565
|
kernel.loadTwinModel(model);
|
|
1563
1566
|
/* **์ธ์ฐ๋ ์ชฝ์ด ์๋ ์ฌ์ค์ ์ธ์ธ ๋ ๋งํ๋ค.** ์์ ์๋ ์ฒซ ์ด๋ฒคํธ๊ฐ ๋์ฐฉํด์ผ ์ปค๋์ด ์ค์ค๋ก๋ฅผ
|
|
1564
1567
|
๊ด์ธก ๊ตฌ๋์ผ๋ก ์ฌ๊ฒผ๊ณ , ๊ทธ๋์ ์์ง ์๋ฌด๊ฒ๋ ๋ชป ๋ฐ์ ๋ฏธ๋ฌ๋ ์๋ฎฌ๋ ์ด์
์ทจ๊ธ์ ๋ฐ์๋ค. */
|
|
@@ -2164,9 +2167,20 @@ class TwinEngine {
|
|
|
2164
2167
|
if (carried.length)
|
|
2165
2168
|
jobs.push(this.persistCarried(inst.domainId, inst.id, carried));
|
|
2166
2169
|
if (plain.length && inst.revision != null) {
|
|
2170
|
+
/*
|
|
2171
|
+
* โโ ๋ง๊ฐ๋ ๊ตฌ๊ฐ ์ฌ์ค์ ํ ๋ฒ๋ง ์ ๋๋ค (2026-08-30) โโโโโโโโโโโโโโโโโโโโโโโ
|
|
2172
|
+
*
|
|
2173
|
+
* ์ด๋ฏธ ์๋ ๊ฒ์ ๊ฑธ๋ฌ๋ธ ๋ค์ ๋ฒํธ๋ฅผ ๋งค๊ธด๋ค. ๊ฑธ๋ฌ๋ด๊ธฐ ์ ์ ๋งค๊ธฐ๋ฉด **์ฐ์ง ์์ ๋ฒํธ๊ฐ ๋น๊ณ **,
|
|
2174
|
+
* ๊ทธ ๊ตฌ๋ฉ์ด ์ ๋์ ๋ฆฌ๋น์ ์ฐ์์ฑ์ ๋๋๋ค.
|
|
2175
|
+
*/
|
|
2176
|
+
/*
|
|
2177
|
+
* ๋ฒํธ๋ **๋จผ์ ์ก๋๋ค**(๋๊ธฐ). ๊ฑธ๋ฌ๋ธ ๋ค์ ์ก์ผ๋ฉด ๋ flush ๊ฐ ๊ฒน์น ๋ ๊ฐ์ ๋ฒํธ๋ฅผ ๋ ๋ฒ ์ด๋ค.
|
|
2178
|
+
* ๊ฑธ๋ฌ์ง ๋งํผ ๋ฒํธ๊ฐ ๋น์ง๋ง, ๊ทธ ๊ตฌ๋ฉ์ ํด๋กญ์ง ์๋ค โ ๋ฆฌ๋น์ ์ ๊ฐ์ ์๊ฐ์ ๊ฐ๋ฆฌ๋ ๋ฐ๋ง ์ฐ๊ณ
|
|
2179
|
+
* ์ด์ด์ง์ ์๊ตฌํ์ง ์๋๋ค(์ ๋ ๋จธ๋ฆฌ๋ ์ต๋๊ฐ์ด๋ค).
|
|
2180
|
+
*/
|
|
2167
2181
|
const start = inst.revision;
|
|
2168
2182
|
inst.revision = start + plain.length;
|
|
2169
|
-
jobs.push(this.
|
|
2183
|
+
jobs.push(this.dropAlreadyWritten(inst.domainId, inst.id, plain).then(fresh => fresh.length ? this.persistBatch(inst.domainId, inst.id, fresh, start) : undefined));
|
|
2170
2184
|
}
|
|
2171
2185
|
if (!jobs.length)
|
|
2172
2186
|
return Promise.resolve();
|
|
@@ -2193,6 +2207,76 @@ class TwinEngine {
|
|
|
2193
2207
|
* ์์ ์๋ ์ด ๊ฒฝ๋ก๊ฐ **๋ธํ๋ง๋ค ํ ํ์ฉ** ์ ์ฅํ๋ค(๊ทธ๋ฆฌ๊ณ ํ๋ง๋ค ๊ตฌ์กฐ ๋ฆฌ๋น์ ์ ๋ฌผ์๋ค). ๊ท๋ชจ์์ ๊ทธ๊ฒ์ด
|
|
2194
2208
|
* ํธ์คํธ๋ฅผ ๋จน์๋ค(ยง7.1 ์ค์ธก). ์ฌ๊ธฐ์ ๊ตฌ์กฐ ๋ฆฌ๋น์ ์ **ํ ๋ฒ๋ง** ๋ฌป๋๋ค.
|
|
2195
2209
|
*/
|
|
2210
|
+
/**
|
|
2211
|
+
* **๋ง๊ฐ๋ ๊ตฌ๊ฐ ์ฌ์ค์ ํ ๋ฒ๋ง ์ ๋๋ค** โ ๊ฐ์ ์ฌ์ค์ด ๋ ๋ฒ ์ค๋ฉด ํ ์ฌ์ค์ด๋ค (2026-08-30).
|
|
2212
|
+
*
|
|
2213
|
+
* โโ ์ ์ฐ๋ ์๋ฆฌ์์ ๋ง๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
2214
|
+
* ์ปค๋์ด ๊ทธ ์ฌ์ค๋ค์ ์ ์ฒด์ฑ์ ๋ด์ฉ์์ ๋ง๋ ๋ค(์ข
๋ฅยท๋์ยท์์ยท๋). ๊ทธ๋ฐ๋ฐ ์ ๋์ ๊ธฐ๋ณธํค๋ ์๋ก
|
|
2215
|
+
* ๋ง๋๋ uuid ๋ผ, **id ๊ฐ ๊ธ์ ํ๋๊น์ง ๊ฐ์๋ ํ์ด ๋ฐ๋ก ์์๋ค.**
|
|
2216
|
+
*
|
|
2217
|
+
* ์ค์ธก(2026-08-30): ๋ฐ์ ๋จ๊ฐ๊ฐ ํ 7๊ฐยท์๋ก ๋ค๋ฅธ id 4๊ฐ์๋ค. 8์ 27์ผ ๋จ๊ฐ๊ฐ ์ธ ๋ฒ ์์๊ณ ,
|
|
2218
|
+
* ๊ทธ ๊ตฌ๊ฐ์ ์์ต์ด ์ธ ๋ฒ ์ธ์ด์ง๋ค.
|
|
2219
|
+
*
|
|
2220
|
+
* ์ปค๋ฅํฐ๊ฐ ์ปค์๋ก ๋ง๋ ๊ฒ์ด ์ฒซ ๋ฐฉ์ด์ ์ด๊ณ ๊ทธ์ชฝ๋ ๊ณ ์ณค๋ค. ๊ทธ๋ฐ๋ฐ **์ปค๋ฅํฐ๊ฐ ํ ๋ฒ ์ค์ํ๋ฉด ์ ๋์ด
|
|
2221
|
+
* ๋ถํ๊ณ ๊ทธ ์์ ๋ชจ๋ ํฉ์ด ํ๋ฆฐ๋ค.** ์ ์ฒด์ฑ์ ์ปค๋์ด ์ ์ธํ ์ฌ์ค์ด๋ฏ๋ก, ์ด๋ ๋ฌธ์ผ๋ก ๋ค์ด์ค๋
|
|
2222
|
+
* ์ง์ผ์ ธ์ผ ํ๋ค โ ์ฑ์ฐ๊ธฐ ๊ฒฝ๋ก์๋ง ์์ผ๋ฉด ๊ทธ ๋ณด์ฆ์ ใ์ด๋ ๋ฌธ์ผ๋ก ์๋๋ใ์ ๊ฑธ๋ฆฐ๋ค.
|
|
2223
|
+
*
|
|
2224
|
+
* โโ ๊ฐ์ด ์ผ ์ด์ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
2225
|
+
* ๋ง๊ฐ๋ ๊ตฌ๊ฐ ์ฌ์ค๋ง ๋ณธ๋ค(์์ ์ ๊ด์ธก์ ๊ทธ๋๋ก ์ง๋๋ค โ ๋ฐ๋ณต์ด ๋ป์ ๊ฐ์ง๋ค). ๊ทธ๊ฒ๋ค์ ๋๋ฌผ์ด์
|
|
2226
|
+
* (ํ ์๊ฐ์ ํ ์ค) ํ ๋ฌถ์์ ๋ช ๊ฐ๋ฟ์ด๊ณ , ๊ทธ ๊ตฌ๊ฐ์ ๊ทธ ์ข
๋ฅ๋ง ์์ธ์ผ๋ก ์ฝ๋๋ค.
|
|
2227
|
+
*/
|
|
2228
|
+
static { this.PERIOD_FACT_TYPES = new Set([
|
|
2229
|
+
'energy.usage.period',
|
|
2230
|
+
'energy.generation.period',
|
|
2231
|
+
'energy.generation.price',
|
|
2232
|
+
'energy.tariff.basis',
|
|
2233
|
+
'energy.bill'
|
|
2234
|
+
]); }
|
|
2235
|
+
static async dropAlreadyWritten(domainId, instanceId, envelopes) {
|
|
2236
|
+
const periodFacts = envelopes.filter(e => this.PERIOD_FACT_TYPES.has(String(e?.eventType)) && typeof e?.eventId === 'string');
|
|
2237
|
+
if (!periodFacts.length)
|
|
2238
|
+
return envelopes;
|
|
2239
|
+
const times = periodFacts.map(e => Date.parse(String(e.eventTime))).filter(n => Number.isFinite(n));
|
|
2240
|
+
if (!times.length)
|
|
2241
|
+
return envelopes;
|
|
2242
|
+
const types = [...new Set(periodFacts.map(e => String(e.eventType)))];
|
|
2243
|
+
const existing = await (0, shell_1.getRepository)(twin_event_js_1.TwinEvent)
|
|
2244
|
+
.createQueryBuilder('e')
|
|
2245
|
+
.select(['e.payload AS "payload"'])
|
|
2246
|
+
.where('e.domain = :domainId', { domainId })
|
|
2247
|
+
.andWhere('e.instanceId = :instanceId', { instanceId })
|
|
2248
|
+
.andWhere('e.eventType IN (:...types)', { types })
|
|
2249
|
+
.andWhere('e.eventTime BETWEEN :fromAt AND :toAt', { fromAt: new Date(Math.min(...times)), toAt: new Date(Math.max(...times)) })
|
|
2250
|
+
.getRawMany()
|
|
2251
|
+
.catch(() => []);
|
|
2252
|
+
const seen = new Set();
|
|
2253
|
+
for (const row of existing) {
|
|
2254
|
+
let p = row.payload;
|
|
2255
|
+
if (typeof p === 'string') {
|
|
2256
|
+
try {
|
|
2257
|
+
p = JSON.parse(p);
|
|
2258
|
+
}
|
|
2259
|
+
catch {
|
|
2260
|
+
p = undefined;
|
|
2261
|
+
}
|
|
2262
|
+
}
|
|
2263
|
+
if (typeof p?.eventId === 'string' && p.eventId)
|
|
2264
|
+
seen.add(p.eventId);
|
|
2265
|
+
}
|
|
2266
|
+
/* ํ ๋ฌถ์ ์์ ๊ฐ์ ๊ฒ์ด ๋ ์์ด๋ ํ๋๋ง ์ ๋๋ค. */
|
|
2267
|
+
const kept = [];
|
|
2268
|
+
for (const e of envelopes) {
|
|
2269
|
+
if (!this.PERIOD_FACT_TYPES.has(String(e?.eventType)) || typeof e?.eventId !== 'string') {
|
|
2270
|
+
kept.push(e);
|
|
2271
|
+
continue;
|
|
2272
|
+
}
|
|
2273
|
+
if (seen.has(e.eventId))
|
|
2274
|
+
continue;
|
|
2275
|
+
seen.add(e.eventId);
|
|
2276
|
+
kept.push(e);
|
|
2277
|
+
}
|
|
2278
|
+
return kept;
|
|
2279
|
+
}
|
|
2196
2280
|
static async persistCarried(domainId, instanceId, items) {
|
|
2197
2281
|
const repo = (0, shell_1.getRepository)(twin_event_js_1.TwinEvent);
|
|
2198
2282
|
const structureRev = await this.structureRevOf(domainId, instanceId);
|
|
@@ -2301,6 +2385,23 @@ class TwinEngine {
|
|
|
2301
2385
|
}));
|
|
2302
2386
|
}
|
|
2303
2387
|
/**
|
|
2388
|
+
* โโ **ํธ์์ ์ค๋น์ ๋ง์คํฐ๊ฐ ์๋๋ค** (์ฌ์ฉ์ ๊ฒฐ์ 2026-08-30) โโโโโโโโโโโโโ
|
|
2389
|
+
*
|
|
2390
|
+
* ์ธ์ยท์ค๋นยท์์ฐ์ ๋ง์คํฐ๋ `@things-factory/ops-master` ๋ค. ํธ์์ ๊ทธ๊ฒ์ **๋น๊ฒจ ์** ๋ชจ๋ธ์
|
|
2391
|
+
* ๋ฐ์ํ๊ณ , ์ฌ๊ธฐ ๋จ๋ ๊ฒ์ ๊ทธ ๊ฒฐ๊ณผ์ ์บ์๋ค.
|
|
2392
|
+
*
|
|
2393
|
+
* ๊ทธ๋์ ์ด ํจ์๊ฐ ํ๋ ์ผ์ ์ ์ด ์๋ค.
|
|
2394
|
+
*
|
|
2395
|
+
* ํธ์ ์์์ ์ฌ๋์ด ๋ํ ์ค๋น ๊ฐ์ ยท์๋ฎฌ๋ ์ด์
์ ์ฌ์ค์ด๋ค โ ํธ์์ด ๋ ๋ค (์ง๊ธ ์ด ํจ์)
|
|
2396
|
+
* ํ์ฅ์ ์ค์ ๋ก ์๋ ์ค๋น ๋ง์คํฐ์ ์ฌ์ค์ด๋ค โ ํธ์์ด ๋ง๋ค์ง ์๋๋ค
|
|
2397
|
+
*
|
|
2398
|
+
* ์ด ํจ์๋ **ํธ์ ์ ์ด ๋ช
๋ น**(`resource.add`) ๋ค์๋ง ๋ถ๋ฆฐ๋ค. ๊ด์ธก์์ ์ค๋น๊ฐ ์๊ธฐ๋ ๊ฒฝ๋ก๊ฐ ์๋๋ค.
|
|
2399
|
+
* ๊ด์ธก์ผ๋ก ๋ชจ๋ฅด๋ ์ค๋น๊ฐ ๋ค์ด์ค๋ฉด ๊ทธ๊ฒ์ **๋ง์คํฐ์ ์๋ ๊ฒ**์ด๊ณ , ํธ์์ด ์กฐ์ฉํ ๋ง๋ค์ด ์ฃผ๋ฉด ๋
|
|
2400
|
+
* ๊ณณ์ด ์๋ก ๋ค๋ฅธ ์ค๋น ๋ชฉ๋ก์ ๊ฐ๊ฒ ๋๋ค. ๊ทธ๋๋ ๋ง๋ค์ง ๋ง๊ณ ใ๋ชจ๋ฅด๋ ์ค๋น๊ฐ ์๋คใ๋ก ์ธ์ด์ผ ํ๋ค.
|
|
2401
|
+
*
|
|
2402
|
+
* ๋น๊ฒจ ์ค๋ ๊ธธ์ด ๋ถ์ผ๋ฉด ์ด ์ฃผ์์ ์์ชฝ ์ ๋ฐ๋ง ๋จ๋๋ค.
|
|
2403
|
+
*
|
|
2404
|
+
* โโ ์๋ ์ค๋ช
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
2304
2405
|
* ๋ผ์ด๋ธ ๊ตฌ์กฐ ๋ณ์ด(resource.add ๋ฑ)๋ฅผ ์ ์ฅ๋ model ์ ๋ฐ์ โ ๋ฐํ์ ์ปค๋์ ๋ฌด๋ฒ๋ฅผ registry model.equipment ์ ๋๊ธฐ.
|
|
2305
2406
|
* ์ด๊ฒ ์์ผ๋ฉด ๋ฐํ์์ ์ถ๊ฐ๋ผ๋(์ํยท์ ๋์ ๋ฐ์) ์ ์ฅ model ๋ ์๋ณธ์ด๋ผ ํ๋ก๋น์ ๋ ํธ์ง๊ธฐยท์ฌ๊ธฐ๋(loadTwinModel)์ด
|
|
2306
2407
|
* ์ถ๊ฐ๋ถ์ ์๋๋ค. ๊ธฐ์กด model.equipment ํญ๋ชฉ์ ๋ณด์กด(homeLocation ์ ์ง)ํ๊ณ ์ id ๋ง append(์ถ๊ฐ ์์ location=homeLocation).
|
|
@@ -3104,7 +3205,7 @@ class TwinEngine {
|
|
|
3104
3205
|
*/
|
|
3105
3206
|
if (model?.utcOffsetMinutes === undefined) {
|
|
3106
3207
|
for (const e of (model?.equipment ?? [])) {
|
|
3107
|
-
const hasProfile = (e?.properties ?? []).some(p => String(p?.id) ===
|
|
3208
|
+
const hasProfile = (e?.properties ?? []).some(p => String(p?.id) === ops_contract_1.EMS_PROPERTY.genDailyProfile && String(p?.value ?? '').trim());
|
|
3108
3209
|
if (hasProfile)
|
|
3109
3210
|
warnings.push((0, reference_master_js_3.generationWithoutTimeZone)(String(model?.spaceId ?? ''), String(e.id)));
|
|
3110
3211
|
}
|
|
@@ -4003,6 +4104,51 @@ class TwinEngine {
|
|
|
4003
4104
|
* `offered` ๋ **์ ์๋ ๋ ์ฝ๋ ์**๋ค(๊ฑฐ๋ถ ์ฌ๋ถ ๋ฌด๊ด). ํต๊ณผ์จ์ ์๋ก ๋ค๋ฅธ ๋ ๊ณ์๊ธฐ์์ ๋๋ ๊ณ์ฐํ๋ฉด
|
|
4004
4105
|
* ๋ถ๋ชจ์ ๋ถ์๊ฐ ๋ค๋ฅธ ๊ฒ์ ์ธ๊ฒ ๋๋ฏ๋ก, ํ์๋ฆฌ์์ ๋ณธ ์๋ฅผ ๊ทธ๋๋ก ๋๊ธด๋ค.
|
|
4005
4106
|
*/
|
|
4107
|
+
/**
|
|
4108
|
+
* ์ด ํธ์์ ์ ๋์ด ์ง๊ธ ๋ช ๋ฒ๊น์ง ์ ํ๋ โ **์ ๊ทผ์๋ก ๋ธ๋ค.**
|
|
4109
|
+
*
|
|
4110
|
+
* ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๋ฐ์์ ์ง์ ์์ธํ์ง ์๊ฒ ํ๋ ๊ฒ์ด ์ด ์ ์ฅ์์ ๊ท์จ์ด๋ค(ยง`engine-registry-access`).
|
|
4111
|
+
* ์ง๋ ๊ธฐ๋ก์ ์ฑ์ฐ๋ ๊ธธ์ด ๋ค์ ๋ฒํธ๋ฅผ ์์์ผ ํด์ ์ด์๋ค.
|
|
4112
|
+
*
|
|
4113
|
+
* ํธ์์ด ๋๋ ์ค์ด ์๋๋ฉด 0 ์ด๋ค โ ๊ทธ๋๋ ์ ๋๋ง ์๊ณ ์ด์ด ๋ถ์ผ ๋ฒํธ๋ฅผ ์ปค๋์ด ๋ค๊ณ ์์ง ์๋ค.
|
|
4114
|
+
*/
|
|
4115
|
+
/**
|
|
4116
|
+
* ๋ง๊ฐ๋ ๊ตฌ๊ฐ ์ฌ์ค์ **์ด๋ฆ์ ์ง์ ๋ ์ธ ๋ฒ์์ ์ ์ธ** โ ์ ์
๋ฌธ์ ๋๊ธด๋ค.
|
|
4117
|
+
*
|
|
4118
|
+
* โโ ์ ํธ์คํธ๊ฐ ์ฃผ๋ (2026-08-30) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
4119
|
+
* ์ปค๋์ `new Kernel(domainId, โฆ)` ์ผ๋ก ์๋ฏ๋ก **์๊ธฐ๊ฐ ์ด๋ ํธ์์ธ์ง ๋ชจ๋ฅธ๋ค.** ๊ทธ๋ฐ๋ฐ ์ค๋น ๋ฒํธ๋
|
|
4120
|
+
* ํธ์ ์์์๋ง ํตํ๋ ์ด๋ฆํ๋ผ, ํ ๋๋ฉ์ธ์ ํ์ฅ์ด ๋์ด๋ฉด ์๋ก ๋ค๋ฅธ ์ค๋น์ ๊ฐ์ ๋ ์ด ํ ์ฌ์ค์ด
|
|
4121
|
+
* ๋๋ค. ์ค์ธก์ผ๋ก ๊ทธ ์ผ์ด ๋ฌ๋ค โ ๋ ๋ฐ์ ์์ `002` ๊ฐ ๊ฒน์ณ, ์ฌ๋ฌ ํ์ฅ์ ํจ๊ป ๊ณ์ฐํ๋ ์ฑ๊ณผ ํ๋ฉด์์
|
|
4122
|
+
* ํ์ชฝ ๋ฐ์ ๋์ด ์ฌ๋ผ์ง๋ค.
|
|
4123
|
+
*
|
|
4124
|
+
* ์ ์ธ๋ ์ ์ฒด์ฑ์ **์ปค๋์ด ๋ตํ๋ค**(ยง`FlowEngine.equipmentIdentity`) โ ํ์ ์ ๋ ๊ณณ์ ๋์ง ์๋๋ค.
|
|
4125
|
+
* ํธ์์ด ๋๊ณ ์์ง ์์ผ๋ฉด ์ ์ธ์ ๋ฌผ์ ๊ณณ์ด ์์ผ๋ฏ๋ก ๋ฒ์๋ง ๋๊ธด๋ค(๊ทธ๋๋ ๊ฒน์น์ง๋ ์๋๋ค).
|
|
4126
|
+
*/
|
|
4127
|
+
static factScope(domainId, instanceId) {
|
|
4128
|
+
const inst = this.instances[(0, runtime_key_js_1.runtimeKey)(domainId, instanceId)];
|
|
4129
|
+
const kernel = inst?.kernel;
|
|
4130
|
+
if (typeof kernel?.equipmentIdentity !== 'function')
|
|
4131
|
+
return { scopeId: instanceId };
|
|
4132
|
+
return {
|
|
4133
|
+
scopeId: instanceId,
|
|
4134
|
+
identityOf: (kind, localId) => (kind === 'equipment' ? kernel.equipmentIdentity(localId) : undefined)
|
|
4135
|
+
};
|
|
4136
|
+
}
|
|
4137
|
+
static journalHead(domainId, instanceId) {
|
|
4138
|
+
const inst = this.instances[(0, runtime_key_js_1.runtimeKey)(domainId, instanceId)];
|
|
4139
|
+
return Number(inst?.revision ?? 0);
|
|
4140
|
+
}
|
|
4141
|
+
/**
|
|
4142
|
+
* ์ ๋์ ๊ทธ๋งํผ ์ ์์ผ๋ ๋ฒํธ๋ฅผ ๋ฐ์ด ์ค๋ค.
|
|
4143
|
+
*
|
|
4144
|
+
* ๋ฐ์ด ์ฃผ์ง ์์ผ๋ฉด ๋ค์์ ๋ผ์ด๋ธ๊ฐ **๊ฐ์ ๋ฒํธ๋ฅผ ๋ค์ ์ด๋ค** โ ๊ฐ์ ์๊ฐ์ ๋ ์ฌ์ค์ ๊ฐ๋ฆด ์ ์๊ฒ ๋๋ค.
|
|
4145
|
+
*/
|
|
4146
|
+
static advanceJournalHead(domainId, instanceId, by) {
|
|
4147
|
+
const inst = this.instances[(0, runtime_key_js_1.runtimeKey)(domainId, instanceId)];
|
|
4148
|
+
if (!inst || !(by > 0))
|
|
4149
|
+
return;
|
|
4150
|
+
inst.revision = Number(inst.revision ?? 0) + by;
|
|
4151
|
+
}
|
|
4006
4152
|
static recordIngestResult(domainId, instanceId, offered, rejected, nowMs = Date.now(),
|
|
4007
4153
|
/**
|
|
4008
4154
|
* ๋งคํ์ ํต๊ณผํ๋๋ฐ **์ปค๋์ด ๋ฐ์ง ์์** ์(`ingestLive` ์ ๋ฐํ๊ณผ ๊ฒฌ์ฃผ์ด ์ป๋๋ค).
|