@operato/twin-kernel 0.11.26 → 0.11.27
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/flow-engine.d.ts +5 -1
- package/dist/flow-engine.js +4 -4
- package/dist/yms-kernel.js +9 -4
- package/dist-cjs/index.cjs +640 -601
- package/package.json +2 -2
package/dist/flow-engine.d.ts
CHANGED
|
@@ -29,7 +29,11 @@ export interface FlowLocation {
|
|
|
29
29
|
export interface FlowItem {
|
|
30
30
|
epc: string;
|
|
31
31
|
location: string;
|
|
32
|
-
|
|
32
|
+
/**
|
|
33
|
+
* CBV disposition. Optional, as in EPCIS: a yard trailer carries none — CBV 2.0 has no disposition for an
|
|
34
|
+
* asset waiting in a yard, and `bizStep: staging` already says it waits (ADR-0050 ruling, 2026-09-24).
|
|
35
|
+
*/
|
|
36
|
+
disposition?: string;
|
|
33
37
|
/** 무슨 품목인가 — 표준 `MaterialLot.MaterialDefinitionID`. 보통은 `gtin` 이 곧 정의 id 라 비어 있다. */
|
|
34
38
|
definitionId?: string;
|
|
35
39
|
/** 로트의 부분(표준 `MaterialSubLot.ID`) — 비직렬 로트가 자리마다 갈릴 때. */
|
package/dist/flow-engine.js
CHANGED
|
@@ -15,7 +15,7 @@ import { ObservedReducer } from "./observed-reducer.js";
|
|
|
15
15
|
/* 주체를 정하는 규칙은 유입 문과 한 벌이다 — 두 곳에 적으면 한쪽만 고쳐진다. */
|
|
16
16
|
import { resolveSubject } from '@operato/ops-contract';
|
|
17
17
|
import { WMS_ORDER_KIND } from '@operato/ops-contract';
|
|
18
|
-
import { transformationEvent, aggregationEvent, objectEvent, parseEpc, DISP, ILMD_ATTR, CBV_BIZSTEP, objectUri, bizTransactionUri, gdtiUri } from '@operato/ops-contract';
|
|
18
|
+
import { transformationEvent, aggregationEvent, objectEvent, parseEpc, DISP, ILMD_ATTR, CBV_BIZSTEP, PRIVATE_BIZSTEP, objectUri, bizTransactionUri, gdtiUri } from '@operato/ops-contract';
|
|
19
19
|
import { allocationPolicyOf } from "./allocation-policy.js";
|
|
20
20
|
import { ORDER_FOLD_DEFAULT, emptyFoldedOrders, foldOrdersInto, foldedOrderCount, pruneFoldedHours, orderFoldPolicyOf, planOrderFold } from '@operato/ops-contract';
|
|
21
21
|
import { OP_PARAM } from '@operato/ops-contract';
|
|
@@ -3611,7 +3611,7 @@ export class FlowEngine {
|
|
|
3611
3611
|
this.recordMaterialActual(t, it.definitionId ?? it.gtin, 'consumed', take, it.uom, it.epc);
|
|
3612
3612
|
/* 남은 수량을 그대로 알린다 — 관측 경로가 그 자리의 사실을 갱신한다(§quantityList). */
|
|
3613
3613
|
this.emit(objectEvent({
|
|
3614
|
-
eventTime: this.now(), action: 'OBSERVE', bizStep:
|
|
3614
|
+
eventTime: this.now(), action: 'OBSERVE', bizStep: PRIVATE_BIZSTEP.consuming, disposition: DISP.in_progress,
|
|
3615
3615
|
epcList: [], quantityList: [{ epcClass: it.gtin ?? it.epc, quantity: left, uom: it.uom }],
|
|
3616
3616
|
readPoint: it.location, bizLocation: it.location
|
|
3617
3617
|
}));
|
|
@@ -3639,7 +3639,7 @@ export class FlowEngine {
|
|
|
3639
3639
|
* 다른 작업이 같은 물품을 또 잡지 못하게 한다 — 소비 시점은 시작인데 변환은 완료 시점이라 그
|
|
3640
3640
|
* 사이가 열려 있다. **변환 중**으로 표시한다(상태와 사건을 한 번에 — §`observeDisposition`).
|
|
3641
3641
|
*/
|
|
3642
|
-
this.observeDisposition(whole, DISP.in_progress,
|
|
3642
|
+
this.observeDisposition(whole, DISP.in_progress, PRIVATE_BIZSTEP.consuming);
|
|
3643
3643
|
return;
|
|
3644
3644
|
}
|
|
3645
3645
|
const at = this.items.get(whole[0])?.location ?? t.toNode;
|
|
@@ -3654,7 +3654,7 @@ export class FlowEngine {
|
|
|
3654
3654
|
this.items.delete(epc);
|
|
3655
3655
|
}
|
|
3656
3656
|
this.emit(objectEvent({
|
|
3657
|
-
eventTime: this.now(), action: 'DELETE', bizStep:
|
|
3657
|
+
eventTime: this.now(), action: 'DELETE', bizStep: PRIVATE_BIZSTEP.consuming, disposition: DISP.in_progress,
|
|
3658
3658
|
epcList: whole.slice(), readPoint: at, bizLocation: at
|
|
3659
3659
|
}));
|
|
3660
3660
|
}
|
package/dist/yms-kernel.js
CHANGED
|
@@ -19,7 +19,7 @@ import { itemKeyOf } from '@operato/ops-contract';
|
|
|
19
19
|
import { firstFitPolicy } from "./allocation-policy.js";
|
|
20
20
|
import { FlowEngine } from "./flow-engine.js";
|
|
21
21
|
import { DISP, objectEvent, transactionEvent } from '@operato/ops-contract';
|
|
22
|
-
import { YARD_BIZSTEP } from '@operato/ops-contract';
|
|
22
|
+
import { YARD_BIZSTEP, YARD_PRIVATE_BIZSTEP } from '@operato/ops-contract';
|
|
23
23
|
const TRAVEL_MS = 20_000; // 야드 이동
|
|
24
24
|
const DWELL_MS = 30_000; // 도크 체류(상·하차) — depart 이동에 folded
|
|
25
25
|
const WINDOW_DELAY_MS = 40_000; // 도착 후 어포인트먼트 창까지(early arrival → 대기)
|
|
@@ -182,8 +182,13 @@ export class YmsKernel extends FlowEngine {
|
|
|
182
182
|
}
|
|
183
183
|
if (to.type === 'yard-slot') {
|
|
184
184
|
// drop 주차 — 야드 대기(창 도래까지). 도어는 depart 완료까지 미점유.
|
|
185
|
-
|
|
186
|
-
|
|
185
|
+
/*
|
|
186
|
+
* No disposition (ADR-0050 ruling, 2026-09-24). It was `sellable` — "product can be sold as is" — and a
|
|
187
|
+
* trailer is not product; CBV 2.0 has nothing for an asset waiting in a yard. `staging` says it waits.
|
|
188
|
+
* The step is ours, not CBV's (YARD_PRIVATE_BIZSTEP, contract 836c308).
|
|
189
|
+
*/
|
|
190
|
+
delete trailer.disposition;
|
|
191
|
+
this.emit(objectEvent({ eventTime: this.now(), action: 'OBSERVE', bizStep: YARD_PRIVATE_BIZSTEP.staging, epcList: [trailer.epc], readPoint: to.id, bizLocation: to.id }));
|
|
187
192
|
return;
|
|
188
193
|
}
|
|
189
194
|
if (to.type === 'dock-door') {
|
|
@@ -201,7 +206,7 @@ export class YmsKernel extends FlowEngine {
|
|
|
201
206
|
this.aggregate(trailer.epc, cargo, { bizStep: YARD_BIZSTEP.loading, readPoint: to.id, consume: { readPoint: staging.id, disposition: DISP.in_transit } });
|
|
202
207
|
}
|
|
203
208
|
this.trailerCargo.delete(trailer.epc); // 적재 완료 → 예약분 소진(트레일러가 화물 보유)
|
|
204
|
-
trailer.disposition
|
|
209
|
+
delete trailer.disposition; // 적재 완료(loaded) — no disposition, same ruling as the yard drop
|
|
205
210
|
}
|
|
206
211
|
else if (cargo.length && staging) {
|
|
207
212
|
// 하차: 트레일러←화물 분해(split) → 화물이 staging 에 materialize(WMS receiving hand-off).
|