@operato/twin-kernel 0.6.3 → 0.6.5
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/contract.d.ts +50 -0
- package/dist/domain-catalog.js +25 -0
- package/dist/flow-engine.js +14 -0
- package/dist/observed-reducer.js +1 -0
- package/dist-cjs/index.cjs +45 -0
- package/package.json +1 -1
package/dist/contract.d.ts
CHANGED
|
@@ -149,6 +149,33 @@ export interface ResourceProperty {
|
|
|
149
149
|
* 자리가 없으면 사실이 들어오지 못한다.
|
|
150
150
|
*/
|
|
151
151
|
export type TestSpecificationRefs = string[];
|
|
152
|
+
/**
|
|
153
|
+
* 시험 명세 — **참조가 가리키는 대상.**
|
|
154
|
+
*
|
|
155
|
+
* ── 왜 최소 모양인가 ──────────────────────────────────────────────────────────
|
|
156
|
+
* 자원 아홉 종류가 이미 이것을 **가리키고 있었다**(`TestSpecificationRefs`). 그런데 가리켜지는 것이
|
|
157
|
+
* 모델에 없어서 그 참조는 **허공을 가리켰다** — 값을 실을 수는 있어도 그것이 무엇인지 아무도 답할 수
|
|
158
|
+
* 없었고, 화면은 그 사실을 조용히 넘겼다. 대상을 세우는 것이 이 선언의 일이다.
|
|
159
|
+
*
|
|
160
|
+
* 여기 담는 것은 **셋뿐이다**: 식별자·설명·판. 표준의 명세 타입(`B2MML-OperationsTest.xsd`)에는 재는
|
|
161
|
+
* 속성과 합격 기준이 더 있는데, 그 필드 이름을 **아직 1차 출처와 대조하지 않았다.** 짐작해 넣으면
|
|
162
|
+
* 표준 이름을 발명하는 것이고 이 저장소의 가드가 그것을 잡는다 — 대조한 뒤에 늘린다.
|
|
163
|
+
*
|
|
164
|
+
* 그래서 지금 이 축은 **"무엇으로 검증했다고 하는지"를 이름으로 답한다.** 그 이상을 주장하지 않는다.
|
|
165
|
+
*
|
|
166
|
+
* ── 결과는 여기 담지 않는다 ───────────────────────────────────────────────────
|
|
167
|
+
* 명세는 **선언**이고 시험 결과는 **관측**이다(누가 언제 통과했나). 결과의 집은 저널이고, 축이
|
|
168
|
+
* 필요해지면 일정·실적과 같은 방식(`source: 'state'|'journal'`)으로 따로 낸다. 한 축에 둘을 담으면
|
|
169
|
+
* 선언과 관측을 가르는 이 트윈의 뼈대가 무너진다.
|
|
170
|
+
*/
|
|
171
|
+
export interface TestSpecification {
|
|
172
|
+
/** 표준 `ID` — 자원의 `testSpecificationIds` 가 이 값을 가리킨다. */
|
|
173
|
+
id: string;
|
|
174
|
+
/** 표준 `Description`. i18n 키일 수 있다(사람 언어는 표현 계층이 렌더한다). */
|
|
175
|
+
description?: string;
|
|
176
|
+
/** 표준 `Version` — 같은 시험의 판이 바뀌면 자격의 뜻도 바뀐다(어느 판으로 검증했나). */
|
|
177
|
+
version?: string;
|
|
178
|
+
}
|
|
152
179
|
/**
|
|
153
180
|
* 유효 기간 — **ISA-95 `EffectiveStartDate` / `EffectiveEndDate`.**
|
|
154
181
|
*
|
|
@@ -878,6 +905,13 @@ export interface OrderState {
|
|
|
878
905
|
id: string;
|
|
879
906
|
kind: string;
|
|
880
907
|
status: string;
|
|
908
|
+
/**
|
|
909
|
+
* **무엇을 만드나** — GS1 품목 참조(단일 품목 작업지시). 여러 품목이면 `lines[].gtin` 이 말한다.
|
|
910
|
+
*
|
|
911
|
+
* 이 자리가 없던 동안 상태에는 "1개" 만 남고 **무엇을 1개인지** 사라졌다. 화면·예측·계보가 품목을
|
|
912
|
+
* 알 수 없다는 뜻이고, 확보분(`allocated`)이 같은 식으로 빠져 계보의 절반이 사라졌던 것과 같은 부류다.
|
|
913
|
+
*/
|
|
914
|
+
gtin?: string;
|
|
881
915
|
progress?: number;
|
|
882
916
|
held?: boolean;
|
|
883
917
|
/**
|
|
@@ -1254,6 +1288,14 @@ export interface OrderStatusDelta {
|
|
|
1254
1288
|
status: string;
|
|
1255
1289
|
requested: number;
|
|
1256
1290
|
fulfilled: number;
|
|
1291
|
+
/**
|
|
1292
|
+
* **무엇을 만드나** — 상태의 `OrderState.gtin` 과 같은 값.
|
|
1293
|
+
*
|
|
1294
|
+
* 스냅샷에만 실으면 **미러가 이 필드를 못 채운다**(라이브는 이벤트로만 배운다). 같은 사실은
|
|
1295
|
+
* 델타·스냅샷·씨앗 **세 자리**에 함께 실어야 한다 — `allocated` 가 두 자리에만 있어서 웜스타트가
|
|
1296
|
+
* 잃었던 것과 같은 부류다(패리티 가드가 이것을 잡았다).
|
|
1297
|
+
*/
|
|
1298
|
+
gtin?: string;
|
|
1257
1299
|
held?: boolean;
|
|
1258
1300
|
/**
|
|
1259
1301
|
* 오더 라인(SKU+수량) — 선택. 있으면 이행 예측이 "남은 데맨드(라인별 requested-fulfilled)를
|
|
@@ -1379,6 +1421,14 @@ export interface TwinModelDef {
|
|
|
1379
1421
|
* **절대 구간**(`StartDateTime`/`FinishDateTime`)을 계산해 넣는 것이다.
|
|
1380
1422
|
*/
|
|
1381
1423
|
utcOffsetMinutes?: number;
|
|
1424
|
+
/**
|
|
1425
|
+
* **시험 명세** — 표준 `TestSpecification`. 자원의 `testSpecificationIds` 가 가리키는 대상.
|
|
1426
|
+
*
|
|
1427
|
+
* 선언하지 않아도 트윈은 돈다 — 그때 그 참조는 **가리킬 것이 없다**(화면이 끊어진 참조로 센다).
|
|
1428
|
+
* 커널은 이 값으로 자격을 판정하지 않는다: 판정에는 **결과**가 필요하고 결과는 아직 모델에 없다.
|
|
1429
|
+
* 없는 것으로 판정하면 자격자가 전부 사라져 라인이 영구히 굶는다.
|
|
1430
|
+
*/
|
|
1431
|
+
testSpecifications?: TestSpecification[];
|
|
1382
1432
|
/**
|
|
1383
1433
|
* **등급 정의** — 표준 `PersonnelClass` · `EquipmentClass` · `PhysicalAssetClass`.
|
|
1384
1434
|
*
|
package/dist/domain-catalog.js
CHANGED
|
@@ -44,6 +44,16 @@ export const TWIN_AXES = [
|
|
|
44
44
|
standardClass: { isa95: 'OperationsSegment' } },
|
|
45
45
|
{ axis: 'materials', path: 'productionSpec.definition.materials', label: 'twin.axis.materials', kind: 'class',
|
|
46
46
|
standardClass: { isa95: 'MaterialDefinition' } },
|
|
47
|
+
/*
|
|
48
|
+
* 시험 명세 — **자원 아홉 종류가 가리키는 대상.**
|
|
49
|
+
*
|
|
50
|
+
* 이 축이 없던 동안 `testSpecificationIds` 는 허공을 가리켰다(값은 실리는데 무엇인지 아무도 모른다).
|
|
51
|
+
* 축이 서면 인스펙션의 선 채움이 **끊어진 참조를 센다** — 없는 명세를 가리키면 화면이 말한다.
|
|
52
|
+
*
|
|
53
|
+
* `kind: 'spec'` 이다: 자원도 등급도 아니고 **판정의 정의**다(공정·레시피와 같은 부류).
|
|
54
|
+
*/
|
|
55
|
+
{ axis: 'testSpecifications', path: 'testSpecifications', label: 'twin.axis.testSpecifications', kind: 'spec',
|
|
56
|
+
standardClass: { isa95: 'TestSpecification' } },
|
|
47
57
|
/*
|
|
48
58
|
* ── ISA-95 Part 4 — 일정과 실적 ────────────────────────────────────────────────
|
|
49
59
|
*
|
|
@@ -101,6 +111,21 @@ export const TWIN_RELATIONS = [
|
|
|
101
111
|
{ from: 'tasks', field: 'toNode', target: { kind: 'axis', axis: 'locations' }, via: 'twin.rel.at', optional: true },
|
|
102
112
|
{ from: 'tasks', field: 'resourceRef', target: { kind: 'axis', axis: 'equipment' }, via: 'twin.rel.by', optional: true },
|
|
103
113
|
{ from: 'tasks', field: 'personnel[]', target: { kind: 'axis', axis: 'persons' }, via: 'twin.rel.crew', optional: true },
|
|
114
|
+
/*
|
|
115
|
+
* 자격을 검증한 시험 — **여덟 갈래.** 자원(개체)과 등급 양쪽이 가리킨다: 표준이 그 둘 모두에 이
|
|
116
|
+
* 참조를 두었기 때문이다(개체는 "이 사람이 통과했다", 등급은 "이 자격은 이 시험을 요구한다").
|
|
117
|
+
*
|
|
118
|
+
* **자리(`locations`)에는 없다** — 표준이 자리를 시험 대상으로 두지 않았고 그 비대칭은 표준의
|
|
119
|
+
* 판단이다(`contract.ts` 가 "우리도 자리에 넣지 않는다" 고 적었다).
|
|
120
|
+
*/
|
|
121
|
+
{ from: 'persons', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
122
|
+
{ from: 'personnelClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
123
|
+
{ from: 'equipment', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
124
|
+
{ from: 'equipmentClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
125
|
+
{ from: 'assets', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
126
|
+
{ from: 'assetClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
127
|
+
{ from: 'materialDefinitions', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
128
|
+
{ from: 'materialClasses', field: 'testSpecificationIds[]', target: { kind: 'axis', axis: 'testSpecifications' }, via: 'twin.rel.test', optional: true },
|
|
104
129
|
/* 공정이 도는 자리·자원 — 항목이 아니라 **타입**을 가리킨다 */
|
|
105
130
|
{ from: 'operations', field: 'locationType', target: { kind: 'type', role: 'location' }, via: 'twin.rel.at', optional: true },
|
|
106
131
|
{ from: 'operations', field: 'resourceType', target: { kind: 'type', role: 'equipment' }, via: 'twin.rel.by', optional: true }
|
package/dist/flow-engine.js
CHANGED
|
@@ -524,6 +524,7 @@ export class FlowEngine {
|
|
|
524
524
|
/* 확보분과 거래번호도 함께 옮긴다 — 여기서 떨구면 위에서 실어 온 것이 마지막 한 걸음에서
|
|
525
525
|
사라진다(같은 사실이 델타·스냅샷·이 변환 **세 길**을 지난다). */
|
|
526
526
|
...(o.allocated?.length ? { allocated: o.allocated } : {}),
|
|
527
|
+
...(o.gtin ? { gtin: o.gtin } : {}),
|
|
527
528
|
...(o.bizTransaction ? { bizTransaction: o.bizTransaction } : {})
|
|
528
529
|
}));
|
|
529
530
|
for (const o of observedOrders) {
|
|
@@ -541,6 +542,8 @@ export class FlowEngine {
|
|
|
541
542
|
/* **확보해 둔 것과 거래번호를 이어받는다.** 비우면 되살아난 오더가 아무것도 안 잡은 것처럼
|
|
542
543
|
보이고, 그 오더의 진행 중 작업이 완료될 때 계보가 입력 없이 나간다. 상태가 말해 주지
|
|
543
544
|
않으면(옛 저널) 그때는 비는 것이 사실이다 — 없는 것을 지어내지 않는다. */
|
|
545
|
+
/* 품목도 함께 — 씨앗이 흘리면 되살아난 오더가 무엇을 만드는지 모른다. */
|
|
546
|
+
...(o.gtin ? { gtin: o.gtin } : {}),
|
|
544
547
|
bizTransaction: o.bizTransaction ?? '', allocated: (o.allocated ?? []).slice(), picked: [], shipmentEpc: null, lines,
|
|
545
548
|
/* **보류를 이어받는다** — 잃으면 씨앗이 사람이 일부러 멈춘 오더를 다시 계획해 내보낸다.
|
|
546
549
|
씨앗 왕복 대조가 이것을 잡았다(그 전에는 사람이 코드를 읽어야만 알 수 있었다). */
|
|
@@ -863,6 +866,16 @@ export class FlowEngine {
|
|
|
863
866
|
id: o.id, kind: o.kind, status: o.status,
|
|
864
867
|
progress: o.requested ? o.fulfilled / o.requested : 0,
|
|
865
868
|
requested: o.requested, fulfilled: o.fulfilled,
|
|
869
|
+
/*
|
|
870
|
+
* **무엇을 만드는 오더인가** — 이것이 없으면 "1개" 만 남고 무엇을 1개인지 사라진다.
|
|
871
|
+
*
|
|
872
|
+
* 커널은 오더를 만들 때부터 이 값을 들고 있는데(`gtin: product.gtin`) 스냅샷이 흘리고 있었다.
|
|
873
|
+
* 그러면 화면·예측·계보가 품목을 알 수 없다 — 확보분(`allocated`)이 같은 식으로 빠져 계보의
|
|
874
|
+
* 절반이 사라졌던 것과 같은 부류다(그때 배운 것을 여기서도 적용한다).
|
|
875
|
+
*
|
|
876
|
+
* 라인이 있는 오더는 `lines[].gtin` 이 품목을 말하고, 단일 품목 작업지시는 이 자리가 말한다.
|
|
877
|
+
*/
|
|
878
|
+
...(o.gtin ? { gtin: o.gtin } : {}),
|
|
866
879
|
...(o.lines?.length ? { lines: o.lines.map(l => ({ gtin: l.gtin, requested: l.requested })) } : {}),
|
|
867
880
|
...(o.priority !== undefined ? { priority: o.priority } : {}),
|
|
868
881
|
...(o.startTime ? { startTime: o.startTime } : {}),
|
|
@@ -1474,6 +1487,7 @@ export class FlowEngine {
|
|
|
1474
1487
|
...(o.lines?.length ? { lines: o.lines.map(l => ({ gtin: l.gtin, requested: l.requested })) } : {}),
|
|
1475
1488
|
/* 진행 중 할당과 거래번호를 함께 싣는다 — 이것이 없으면 웜스타트가 잃고, 되살아난 오더의
|
|
1476
1489
|
계보가 입력 없이 나간다(무엇이 무엇으로 바뀌었나의 절반이 사라진다). */
|
|
1490
|
+
...(o.gtin ? { gtin: o.gtin } : {}),
|
|
1477
1491
|
...(o.allocated?.length ? { allocated: o.allocated.slice() } : {}),
|
|
1478
1492
|
...(o.bizTransaction ? { bizTransaction: o.bizTransaction } : {})
|
|
1479
1493
|
});
|
package/dist/observed-reducer.js
CHANGED
|
@@ -344,6 +344,7 @@ export class ObservedReducer {
|
|
|
344
344
|
...(d.endTime ? { endTime: d.endTime } : {}),
|
|
345
345
|
/* 진행 중 확보분과 거래번호 — **미러도 같은 필드를 채운다.** 시뮬만 아는 사실을 두면
|
|
346
346
|
그 위에서 세운 예측이 두 구동에서 달라진다(패리티 검사가 지키는 것이 이것이다). */
|
|
347
|
+
...(d.gtin ? { gtin: d.gtin } : {}),
|
|
347
348
|
...(d.allocated?.length ? { allocated: d.allocated.slice() } : {}),
|
|
348
349
|
...(d.bizTransaction ? { bizTransaction: d.bizTransaction } : {}),
|
|
349
350
|
held: d.held
|
package/dist-cjs/index.cjs
CHANGED
|
@@ -1185,6 +1185,7 @@ var ObservedReducer = class {
|
|
|
1185
1185
|
...d.endTime ? { endTime: d.endTime } : {},
|
|
1186
1186
|
/* 진행 중 확보분과 거래번호 — **미러도 같은 필드를 채운다.** 시뮬만 아는 사실을 두면
|
|
1187
1187
|
그 위에서 세운 예측이 두 구동에서 달라진다(패리티 검사가 지키는 것이 이것이다). */
|
|
1188
|
+
...d.gtin ? { gtin: d.gtin } : {},
|
|
1188
1189
|
...d.allocated?.length ? { allocated: d.allocated.slice() } : {},
|
|
1189
1190
|
...d.bizTransaction ? { bizTransaction: d.bizTransaction } : {},
|
|
1190
1191
|
held: d.held
|
|
@@ -1675,6 +1676,21 @@ var TWIN_AXES = [
|
|
|
1675
1676
|
kind: "class",
|
|
1676
1677
|
standardClass: { isa95: "MaterialDefinition" }
|
|
1677
1678
|
},
|
|
1679
|
+
/*
|
|
1680
|
+
* 시험 명세 — **자원 아홉 종류가 가리키는 대상.**
|
|
1681
|
+
*
|
|
1682
|
+
* 이 축이 없던 동안 `testSpecificationIds` 는 허공을 가리켰다(값은 실리는데 무엇인지 아무도 모른다).
|
|
1683
|
+
* 축이 서면 인스펙션의 선 채움이 **끊어진 참조를 센다** — 없는 명세를 가리키면 화면이 말한다.
|
|
1684
|
+
*
|
|
1685
|
+
* `kind: 'spec'` 이다: 자원도 등급도 아니고 **판정의 정의**다(공정·레시피와 같은 부류).
|
|
1686
|
+
*/
|
|
1687
|
+
{
|
|
1688
|
+
axis: "testSpecifications",
|
|
1689
|
+
path: "testSpecifications",
|
|
1690
|
+
label: "twin.axis.testSpecifications",
|
|
1691
|
+
kind: "spec",
|
|
1692
|
+
standardClass: { isa95: "TestSpecification" }
|
|
1693
|
+
},
|
|
1678
1694
|
/*
|
|
1679
1695
|
* ── ISA-95 Part 4 — 일정과 실적 ────────────────────────────────────────────────
|
|
1680
1696
|
*
|
|
@@ -1743,6 +1759,21 @@ var TWIN_RELATIONS = [
|
|
|
1743
1759
|
{ from: "tasks", field: "toNode", target: { kind: "axis", axis: "locations" }, via: "twin.rel.at", optional: true },
|
|
1744
1760
|
{ from: "tasks", field: "resourceRef", target: { kind: "axis", axis: "equipment" }, via: "twin.rel.by", optional: true },
|
|
1745
1761
|
{ from: "tasks", field: "personnel[]", target: { kind: "axis", axis: "persons" }, via: "twin.rel.crew", optional: true },
|
|
1762
|
+
/*
|
|
1763
|
+
* 자격을 검증한 시험 — **여덟 갈래.** 자원(개체)과 등급 양쪽이 가리킨다: 표준이 그 둘 모두에 이
|
|
1764
|
+
* 참조를 두었기 때문이다(개체는 "이 사람이 통과했다", 등급은 "이 자격은 이 시험을 요구한다").
|
|
1765
|
+
*
|
|
1766
|
+
* **자리(`locations`)에는 없다** — 표준이 자리를 시험 대상으로 두지 않았고 그 비대칭은 표준의
|
|
1767
|
+
* 판단이다(`contract.ts` 가 "우리도 자리에 넣지 않는다" 고 적었다).
|
|
1768
|
+
*/
|
|
1769
|
+
{ from: "persons", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1770
|
+
{ from: "personnelClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1771
|
+
{ from: "equipment", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1772
|
+
{ from: "equipmentClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1773
|
+
{ from: "assets", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1774
|
+
{ from: "assetClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1775
|
+
{ from: "materialDefinitions", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1776
|
+
{ from: "materialClasses", field: "testSpecificationIds[]", target: { kind: "axis", axis: "testSpecifications" }, via: "twin.rel.test", optional: true },
|
|
1746
1777
|
/* 공정이 도는 자리·자원 — 항목이 아니라 **타입**을 가리킨다 */
|
|
1747
1778
|
{ from: "operations", field: "locationType", target: { kind: "type", role: "location" }, via: "twin.rel.at", optional: true },
|
|
1748
1779
|
{ from: "operations", field: "resourceType", target: { kind: "type", role: "equipment" }, via: "twin.rel.by", optional: true }
|
|
@@ -2570,6 +2601,7 @@ var FlowEngine = class {
|
|
|
2570
2601
|
/* 확보분과 거래번호도 함께 옮긴다 — 여기서 떨구면 위에서 실어 온 것이 마지막 한 걸음에서
|
|
2571
2602
|
사라진다(같은 사실이 델타·스냅샷·이 변환 **세 길**을 지난다). */
|
|
2572
2603
|
...o.allocated?.length ? { allocated: o.allocated } : {},
|
|
2604
|
+
...o.gtin ? { gtin: o.gtin } : {},
|
|
2573
2605
|
...o.bizTransaction ? { bizTransaction: o.bizTransaction } : {}
|
|
2574
2606
|
}));
|
|
2575
2607
|
for (const o of observedOrders) {
|
|
@@ -2585,6 +2617,8 @@ var FlowEngine = class {
|
|
|
2585
2617
|
/* **확보해 둔 것과 거래번호를 이어받는다.** 비우면 되살아난 오더가 아무것도 안 잡은 것처럼
|
|
2586
2618
|
보이고, 그 오더의 진행 중 작업이 완료될 때 계보가 입력 없이 나간다. 상태가 말해 주지
|
|
2587
2619
|
않으면(옛 저널) 그때는 비는 것이 사실이다 — 없는 것을 지어내지 않는다. */
|
|
2620
|
+
/* 품목도 함께 — 씨앗이 흘리면 되살아난 오더가 무엇을 만드는지 모른다. */
|
|
2621
|
+
...o.gtin ? { gtin: o.gtin } : {},
|
|
2588
2622
|
bizTransaction: o.bizTransaction ?? "",
|
|
2589
2623
|
allocated: (o.allocated ?? []).slice(),
|
|
2590
2624
|
picked: [],
|
|
@@ -2890,6 +2924,16 @@ var FlowEngine = class {
|
|
|
2890
2924
|
progress: o.requested ? o.fulfilled / o.requested : 0,
|
|
2891
2925
|
requested: o.requested,
|
|
2892
2926
|
fulfilled: o.fulfilled,
|
|
2927
|
+
/*
|
|
2928
|
+
* **무엇을 만드는 오더인가** — 이것이 없으면 "1개" 만 남고 무엇을 1개인지 사라진다.
|
|
2929
|
+
*
|
|
2930
|
+
* 커널은 오더를 만들 때부터 이 값을 들고 있는데(`gtin: product.gtin`) 스냅샷이 흘리고 있었다.
|
|
2931
|
+
* 그러면 화면·예측·계보가 품목을 알 수 없다 — 확보분(`allocated`)이 같은 식으로 빠져 계보의
|
|
2932
|
+
* 절반이 사라졌던 것과 같은 부류다(그때 배운 것을 여기서도 적용한다).
|
|
2933
|
+
*
|
|
2934
|
+
* 라인이 있는 오더는 `lines[].gtin` 이 품목을 말하고, 단일 품목 작업지시는 이 자리가 말한다.
|
|
2935
|
+
*/
|
|
2936
|
+
...o.gtin ? { gtin: o.gtin } : {},
|
|
2893
2937
|
...o.lines?.length ? { lines: o.lines.map((l) => ({ gtin: l.gtin, requested: l.requested })) } : {},
|
|
2894
2938
|
...o.priority !== void 0 ? { priority: o.priority } : {},
|
|
2895
2939
|
...o.startTime ? { startTime: o.startTime } : {},
|
|
@@ -3445,6 +3489,7 @@ var FlowEngine = class {
|
|
|
3445
3489
|
...o.lines?.length ? { lines: o.lines.map((l) => ({ gtin: l.gtin, requested: l.requested })) } : {},
|
|
3446
3490
|
/* 진행 중 할당과 거래번호를 함께 싣는다 — 이것이 없으면 웜스타트가 잃고, 되살아난 오더의
|
|
3447
3491
|
계보가 입력 없이 나간다(무엇이 무엇으로 바뀌었나의 절반이 사라진다). */
|
|
3492
|
+
...o.gtin ? { gtin: o.gtin } : {},
|
|
3448
3493
|
...o.allocated?.length ? { allocated: o.allocated.slice() } : {},
|
|
3449
3494
|
...o.bizTransaction ? { bizTransaction: o.bizTransaction } : {}
|
|
3450
3495
|
});
|
package/package.json
CHANGED