@things-factory/headless-twin 10.0.14 โ 10.0.17
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/attention-digest.d.ts +4 -4
- package/dist-server/engine/attention-digest.js +7 -7
- package/dist-server/engine/attention-digest.js.map +1 -1
- package/dist-server/engine/canonical-ingest.d.ts +11 -2
- package/dist-server/engine/canonical-ingest.js +137 -8
- 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/declared-stimulus.js +1 -1
- package/dist-server/engine/declared-stimulus.js.map +1 -1
- package/dist-server/engine/energy-topology.js +1 -1
- package/dist-server/engine/energy-topology.js.map +1 -1
- package/dist-server/engine/ingest-dedupe.d.ts +38 -0
- package/dist-server/engine/ingest-dedupe.js +145 -0
- package/dist-server/engine/ingest-dedupe.js.map +1 -0
- package/dist-server/engine/ingest-health.d.ts +124 -9
- package/dist-server/engine/ingest-health.js +169 -15
- package/dist-server/engine/ingest-health.js.map +1 -1
- package/dist-server/engine/integration-probes.d.ts +3 -3
- package/dist-server/engine/integration-probes.js +6 -6
- package/dist-server/engine/integration-probes.js.map +1 -1
- package/dist-server/engine/kpi-baseline.js +4 -4
- package/dist-server/engine/kpi-baseline.js.map +1 -1
- package/dist-server/engine/kpi-fold.d.ts +122 -12
- package/dist-server/engine/kpi-fold.js +247 -18
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.d.ts +11 -11
- package/dist-server/engine/kpi-query.js +185 -28
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/live-feed-registry.d.ts +1 -1
- package/dist-server/engine/live-feed-registry.js +1 -1
- 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.map +1 -1
- package/dist-server/engine/local-declarations.d.ts +7 -7
- package/dist-server/engine/local-declarations.js +9 -9
- package/dist-server/engine/local-declarations.js.map +1 -1
- package/dist-server/engine/log.d.ts +1 -1
- package/dist-server/engine/log.js +1 -1
- package/dist-server/engine/log.js.map +1 -1
- package/dist-server/engine/measured-estimator.js +1 -1
- package/dist-server/engine/measured-estimator.js.map +1 -1
- package/dist-server/engine/measured-yield.js +1 -1
- package/dist-server/engine/measured-yield.js.map +1 -1
- package/dist-server/engine/model-basis.d.ts +1 -1
- package/dist-server/engine/model-basis.js +1 -1
- package/dist-server/engine/model-basis.js.map +1 -1
- package/dist-server/engine/model-gap.d.ts +3 -3
- package/dist-server/engine/model-gap.js +1 -1
- package/dist-server/engine/model-gap.js.map +1 -1
- package/dist-server/engine/model-vocabulary.js +1 -1
- package/dist-server/engine/model-vocabulary.js.map +1 -1
- package/dist-server/engine/oee-accumulator.d.ts +4 -4
- package/dist-server/engine/oee-accumulator.js +3 -3
- package/dist-server/engine/oee-accumulator.js.map +1 -1
- package/dist-server/engine/property-effects.js +2 -2
- package/dist-server/engine/property-effects.js.map +1 -1
- package/dist-server/engine/read-time.d.ts +22 -0
- package/dist-server/engine/read-time.js +81 -0
- package/dist-server/engine/read-time.js.map +1 -0
- package/dist-server/engine/restart-policy.js +1 -1
- 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/spec-coverage.d.ts +2 -2
- package/dist-server/engine/spec-coverage.js +1 -1
- package/dist-server/engine/spec-coverage.js.map +1 -1
- package/dist-server/engine/stage-path.d.ts +4 -4
- package/dist-server/engine/stage-path.js +1 -1
- package/dist-server/engine/stage-path.js.map +1 -1
- package/dist-server/engine/state-axes.d.ts +1 -1
- package/dist-server/engine/state-axes.js +2 -2
- package/dist-server/engine/state-axes.js.map +1 -1
- package/dist-server/engine/travel-estimator.d.ts +2 -2
- package/dist-server/engine/travel-estimator.js +1 -1
- package/dist-server/engine/travel-estimator.js.map +1 -1
- package/dist-server/engine/twin-engine.d.ts +243 -53
- package/dist-server/engine/twin-engine.js +690 -191
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/engine/warm-start.d.ts +2 -2
- package/dist-server/engine/warm-start.js +5 -5
- package/dist-server/engine/warm-start.js.map +1 -1
- package/dist-server/index.js +1 -1
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js +1 -1
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +1 -1
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js +3 -3
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js.map +1 -1
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js +2 -2
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js.map +1 -1
- package/dist-server/migrations/1786300000000-IndexEventTypeByTime.d.ts +5 -0
- package/dist-server/migrations/1786300000000-IndexEventTypeByTime.js +54 -0
- package/dist-server/migrations/1786300000000-IndexEventTypeByTime.js.map +1 -0
- package/dist-server/migrations/1786400000000-IndexEventCreatedAt.d.ts +5 -0
- package/dist-server/migrations/1786400000000-IndexEventCreatedAt.js +44 -0
- package/dist-server/migrations/1786400000000-IndexEventCreatedAt.js.map +1 -0
- package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.d.ts +6 -0
- package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.js +84 -0
- package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.js.map +1 -0
- package/dist-server/migrations/index.js +7 -1
- package/dist-server/migrations/index.js.map +1 -1
- package/dist-server/routes.d.ts +1 -0
- package/dist-server/routes.js +69 -5
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/index.d.ts +2 -2
- package/dist-server/service/index.js +27 -24
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/control-routing.d.ts +1 -1
- package/dist-server/service/reference/control-routing.js +1 -1
- package/dist-server/service/reference/control-routing.js.map +1 -1
- package/dist-server/service/reference/discovery-result.d.ts +2 -2
- package/dist-server/service/reference/discovery-result.js +3 -3
- package/dist-server/service/reference/discovery-result.js.map +1 -1
- package/dist-server/service/reference/hook-contract.d.ts +43 -0
- package/dist-server/service/reference/hook-contract.js +59 -0
- package/dist-server/service/reference/hook-contract.js.map +1 -0
- package/dist-server/service/reference/ingest-space.d.ts +1 -1
- package/dist-server/service/reference/ingest-space.js +4 -4
- package/dist-server/service/reference/ingest-space.js.map +1 -1
- package/dist-server/service/reference/knob-defaults.d.ts +1 -1
- package/dist-server/service/reference/knob-defaults.js +4 -4
- package/dist-server/service/reference/knob-defaults.js.map +1 -1
- package/dist-server/service/reference/reference-adapter.d.ts +140 -8
- package/dist-server/service/reference/reference-adapter.js +27 -0
- package/dist-server/service/reference/reference-adapter.js.map +1 -1
- package/dist-server/service/reference/reference-hook.d.ts +20 -0
- package/dist-server/service/reference/reference-hook.js +133 -0
- package/dist-server/service/reference/reference-hook.js.map +1 -0
- package/dist-server/service/reference/reference-live.d.ts +2 -2
- package/dist-server/service/reference/reference-live.js +88 -13
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +14 -14
- package/dist-server/service/reference/reference-master.js +34 -12
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-resolver.d.ts +1 -1
- package/dist-server/service/reference/reference-resolver.js +10 -10
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/reference/twin-reference.d.ts +3 -3
- package/dist-server/service/reference/twin-reference.js.map +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.d.ts +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.js +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.js.map +1 -1
- package/dist-server/service/twin-audit/command-audit.d.ts +1 -1
- package/dist-server/service/twin-audit/command-audit.js.map +1 -1
- package/dist-server/service/twin-audit/twin-audit-event.d.ts +1 -1
- package/dist-server/service/twin-audit/twin-audit-event.js.map +1 -1
- package/dist-server/service/twin-audit/twin-audit-query.js +1 -1
- package/dist-server/service/twin-audit/twin-audit-query.js.map +1 -1
- package/dist-server/service/twin-control/twin-control-mutation.js +1 -1
- package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-keys.d.ts +22 -2
- package/dist-server/service/twin-event/twin-event-keys.js +37 -5
- package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-type.d.ts +1 -0
- package/dist-server/service/twin-event/twin-event-type.js +8 -1
- package/dist-server/service/twin-event/twin-event-type.js.map +1 -1
- package/dist-server/service/twin-event/twin-event.d.ts +2 -2
- package/dist-server/service/twin-event/twin-event.js +32 -4
- package/dist-server/service/twin-event/twin-event.js.map +1 -1
- package/dist-server/service/twin-forecast/forecast-metrics.js +1 -1
- package/dist-server/service/twin-forecast/forecast-metrics.js.map +1 -1
- package/dist-server/service/twin-forecast/gap-analytics.d.ts +1 -1
- package/dist-server/service/twin-forecast/gap-analytics.js.map +1 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js +29 -11
- package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.d.ts +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js.map +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js.map +1 -1
- package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
- package/dist-server/service/twin-journal/event-type-split-shape.d.ts +50 -0
- package/dist-server/service/twin-journal/event-type-split-shape.js +111 -0
- package/dist-server/service/twin-journal/event-type-split-shape.js.map +1 -0
- package/dist-server/service/twin-journal/event-type-split.d.ts +15 -0
- package/dist-server/service/twin-journal/event-type-split.js +102 -0
- package/dist-server/service/twin-journal/event-type-split.js.map +1 -0
- package/dist-server/service/twin-journal/journal-order.d.ts +15 -0
- package/dist-server/service/twin-journal/journal-order.js +17 -0
- package/dist-server/service/twin-journal/journal-order.js.map +1 -0
- package/dist-server/service/twin-journal/twin-journal-query.d.ts +5 -5
- package/dist-server/service/twin-journal/twin-journal-query.js +232 -21
- package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +27 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +59 -3
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.js +14 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.js.map +1 -1
- package/dist-server/service/twin-model/axis-journal-evidence.js +1 -1
- package/dist-server/service/twin-model/axis-journal-evidence.js.map +1 -1
- package/dist-server/service/twin-model/epcis-coverage.js +36 -1
- package/dist-server/service/twin-model/epcis-coverage.js.map +1 -1
- package/dist-server/service/twin-model/iec61850-coverage.js +1 -1
- package/dist-server/service/twin-model/iec61850-coverage.js.map +1 -1
- package/dist-server/service/twin-model/isa95-coverage.d.ts +15 -2
- package/dist-server/service/twin-model/isa95-coverage.js +32 -8
- package/dist-server/service/twin-model/isa95-coverage.js.map +1 -1
- package/dist-server/service/twin-model/item-ref.js +2 -2
- package/dist-server/service/twin-model/item-ref.js.map +1 -1
- package/dist-server/service/twin-model/name-index.d.ts +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.d.ts +1 -1
- package/dist-server/service/twin-model/project-structure.js +3 -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 +1 -1
- package/dist-server/service/twin-model/twin-equipment.js.map +1 -1
- package/dist-server/service/twin-model/twin-lineage-query.js +16 -5
- package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-location.d.ts +1 -1
- package/dist-server/service/twin-model/twin-location.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-item-query.d.ts +3 -3
- package/dist-server/service/twin-model/twin-model-item-query.js +14 -14
- package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-mutation.d.ts +2 -2
- package/dist-server/service/twin-model/twin-model-mutation.js +4 -4
- package/dist-server/service/twin-model/twin-model-mutation.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-query.js +117 -28
- package/dist-server/service/twin-model/twin-model-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-tree-query.js +22 -0
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-operation.d.ts +1 -1
- package/dist-server/service/twin-model/twin-operation.js +1 -1
- package/dist-server/service/twin-model/twin-operation.js.map +1 -1
- package/dist-server/service/twin-space/move-space.js +2 -2
- package/dist-server/service/twin-space/move-space.js.map +1 -1
- package/dist-server/service/twin-space/representation-role.d.ts +2 -0
- package/dist-server/service/twin-space/representation-role.js +18 -0
- package/dist-server/service/twin-space/representation-role.js.map +1 -0
- package/dist-server/service/twin-space/space-integrity.d.ts +1 -1
- package/dist-server/service/twin-space/space-integrity.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-representation.d.ts +2 -0
- package/dist-server/service/twin-space/twin-space-representation.js +16 -0
- package/dist-server/service/twin-space/twin-space-representation.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-resolver.d.ts +2 -2
- package/dist-server/service/twin-space/twin-space-resolver.js +36 -7
- package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
- package/dist-server/service/twin-structure/twin-structure.js +3 -3
- package/dist-server/service/twin-structure/twin-structure.js.map +1 -1
- package/dist-server/service/twin-subject/event-subjects.d.ts +43 -0
- package/dist-server/service/twin-subject/event-subjects.js +137 -0
- package/dist-server/service/twin-subject/event-subjects.js.map +1 -0
- package/dist-server/service/twin-subject/index.d.ts +9 -0
- package/dist-server/service/twin-subject/index.js +16 -0
- package/dist-server/service/twin-subject/index.js.map +1 -0
- package/dist-server/service/twin-subject/item-resolver.d.ts +10 -0
- package/dist-server/service/twin-subject/item-resolver.js +93 -0
- package/dist-server/service/twin-subject/item-resolver.js.map +1 -0
- package/dist-server/service/twin-subject/subject-query-shape.d.ts +22 -0
- package/dist-server/service/twin-subject/subject-query-shape.js +88 -0
- package/dist-server/service/twin-subject/subject-query-shape.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-backfill.d.ts +23 -0
- package/dist-server/service/twin-subject/twin-subject-backfill.js +159 -0
- package/dist-server/service/twin-subject/twin-subject-backfill.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-event.d.ts +14 -0
- package/dist-server/service/twin-subject/twin-subject-event.js +111 -0
- package/dist-server/service/twin-subject/twin-subject-event.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-fast-path.d.ts +39 -0
- package/dist-server/service/twin-subject/twin-subject-fast-path.js +295 -0
- package/dist-server/service/twin-subject/twin-subject-fast-path.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-query.d.ts +27 -0
- package/dist-server/service/twin-subject/twin-subject-query.js +232 -0
- package/dist-server/service/twin-subject/twin-subject-query.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-writer.d.ts +27 -0
- package/dist-server/service/twin-subject/twin-subject-writer.js +166 -0
- package/dist-server/service/twin-subject/twin-subject-writer.js.map +1 -0
- package/dist-server/service/twin-target/twin-target-resolver.js +1 -1
- package/dist-server/service/twin-target/twin-target-resolver.js.map +1 -1
- package/dist-shared/entity-delta.d.ts +1 -1
- package/dist-shared/entity-delta.js +3 -3
- package/dist-shared/entity-delta.js.map +1 -1
- package/dist-shared/touched-items.js +2 -2
- package/dist-shared/touched-items.js.map +1 -1
- package/dist-shared/twin-level.js +1 -1
- package/dist-shared/twin-level.js.map +1 -1
- package/package.json +3 -3
- package/server/engine/attention-digest.ts +9 -9
- package/server/engine/canonical-ingest.ts +170 -13
- package/server/engine/command-routing.ts +1 -1
- package/server/engine/declared-stimulus.ts +1 -1
- package/server/engine/energy-topology.ts +1 -1
- package/server/engine/ingest-dedupe.ts +149 -0
- package/server/engine/ingest-health.ts +234 -20
- package/server/engine/integration-probes.ts +7 -7
- package/server/engine/kpi-baseline.ts +4 -4
- package/server/engine/kpi-fold.ts +395 -27
- package/server/engine/kpi-query.ts +212 -46
- package/server/engine/live-feed-registry.ts +1 -1
- package/server/engine/load-meter.ts +1 -1
- package/server/engine/local-declarations.ts +13 -13
- package/server/engine/log.ts +1 -1
- package/server/engine/measured-estimator.ts +1 -1
- package/server/engine/measured-yield.ts +1 -1
- package/server/engine/model-basis.ts +2 -2
- package/server/engine/model-gap.ts +3 -3
- package/server/engine/model-vocabulary.ts +1 -1
- package/server/engine/oee-accumulator.ts +4 -4
- package/server/engine/property-effects.ts +2 -2
- package/server/engine/read-time.ts +77 -0
- package/server/engine/restart-policy.ts +1 -1
- package/server/engine/runtime-key.ts +1 -1
- package/server/engine/spec-coverage.ts +3 -3
- package/server/engine/stage-path.ts +5 -5
- package/server/engine/state-axes.ts +2 -2
- package/server/engine/travel-estimator.ts +2 -2
- package/server/engine/twin-engine.ts +764 -201
- package/server/engine/warm-start.ts +6 -6
- package/server/index.ts +1 -1
- package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +1 -1
- package/server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.ts +3 -3
- package/server/migrations/1786200000000-CarryLiveFeedCursor.ts +2 -2
- package/server/migrations/1786300000000-IndexEventTypeByTime.ts +48 -0
- package/server/migrations/1786400000000-IndexEventCreatedAt.ts +38 -0
- package/server/migrations/1786500000000-CreateTwinSubjectEvents.ts +93 -0
- package/server/migrations/index.ts +7 -1
- package/server/routes.ts +68 -5
- package/server/service/index.ts +4 -1
- package/server/service/reference/control-routing.ts +1 -1
- package/server/service/reference/discovery-result.ts +3 -3
- package/server/service/reference/hook-contract.ts +103 -0
- package/server/service/reference/ingest-space.ts +4 -4
- package/server/service/reference/knob-defaults.ts +4 -4
- package/server/service/reference/reference-adapter.ts +166 -9
- package/server/service/reference/reference-hook.ts +145 -0
- package/server/service/reference/reference-live.ts +92 -14
- package/server/service/reference/reference-master.ts +39 -17
- package/server/service/reference/reference-resolver.ts +10 -10
- package/server/service/reference/twin-reference.ts +3 -3
- package/server/service/twin-attention/twin-attention-query.ts +1 -1
- package/server/service/twin-audit/command-audit.ts +1 -1
- package/server/service/twin-audit/twin-audit-event.ts +2 -2
- package/server/service/twin-audit/twin-audit-query.ts +1 -1
- package/server/service/twin-control/twin-control-mutation.ts +1 -1
- package/server/service/twin-event/twin-event-keys.ts +37 -5
- package/server/service/twin-event/twin-event-type.ts +18 -1
- package/server/service/twin-event/twin-event.ts +32 -6
- package/server/service/twin-forecast/forecast-metrics.ts +1 -1
- package/server/service/twin-forecast/gap-analytics.ts +1 -1
- package/server/service/twin-forecast/twin-forecast-query.ts +30 -11
- package/server/service/twin-ingest-window/twin-ingest-window-query.ts +1 -1
- package/server/service/twin-ingest-window/twin-ingest-window-writer.ts +1 -1
- package/server/service/twin-instance/twin-instance.ts +4 -4
- package/server/service/twin-journal/event-type-split-shape.ts +112 -0
- package/server/service/twin-journal/event-type-split.ts +144 -0
- package/server/service/twin-journal/journal-order.ts +20 -0
- package/server/service/twin-journal/twin-journal-query.ts +224 -20
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +57 -3
- package/server/service/twin-metrics/twin-metrics-query.ts +14 -1
- package/server/service/twin-model/axis-journal-evidence.ts +1 -1
- package/server/service/twin-model/epcis-coverage.ts +36 -1
- package/server/service/twin-model/iec61850-coverage.ts +1 -1
- package/server/service/twin-model/isa95-coverage.ts +45 -8
- package/server/service/twin-model/item-ref.ts +2 -2
- package/server/service/twin-model/name-index.ts +1 -1
- package/server/service/twin-model/project-structure.ts +4 -4
- package/server/service/twin-model/twin-equipment.ts +2 -2
- package/server/service/twin-model/twin-lineage-query.ts +16 -5
- package/server/service/twin-model/twin-location.ts +1 -1
- package/server/service/twin-model/twin-model-item-query.ts +14 -14
- package/server/service/twin-model/twin-model-mutation.ts +4 -4
- package/server/service/twin-model/twin-model-query.ts +117 -28
- package/server/service/twin-model/twin-model-tree-query.ts +25 -1
- package/server/service/twin-model/twin-operation.ts +2 -2
- package/server/service/twin-space/move-space.ts +3 -3
- package/server/service/twin-space/representation-role.ts +15 -0
- package/server/service/twin-space/space-integrity.ts +1 -1
- package/server/service/twin-space/twin-space-representation.ts +37 -0
- package/server/service/twin-space/twin-space-resolver.ts +39 -7
- package/server/service/twin-structure/twin-structure.ts +3 -3
- package/server/service/twin-subject/event-subjects.ts +155 -0
- package/server/service/twin-subject/index.ts +10 -0
- package/server/service/twin-subject/item-resolver.ts +92 -0
- package/server/service/twin-subject/subject-query-shape.ts +84 -0
- package/server/service/twin-subject/twin-subject-backfill.ts +196 -0
- package/server/service/twin-subject/twin-subject-event.ts +101 -0
- package/server/service/twin-subject/twin-subject-fast-path.ts +346 -0
- package/server/service/twin-subject/twin-subject-query.ts +210 -0
- package/server/service/twin-subject/twin-subject-writer.ts +189 -0
- package/server/service/twin-target/twin-target-resolver.ts +1 -1
- package/shared/entity-delta.ts +3 -3
- package/shared/touched-items.ts +2 -2
- package/shared/twin-level.ts +1 -1
- package/test/adopt-structure-live.test.ts +3 -3
- package/test/aggregate-not-findone.test.ts +112 -0
- package/test/attention-digest.test.ts +6 -6
- package/test/axis-read.test.ts +2 -2
- package/test/boot-resume.test.ts +20 -7
- package/test/broadcast-period.test.ts +2 -2
- package/test/broadcast-queue-overflow.test.ts +244 -0
- package/test/canonical-ingest-vocabularies.test.ts +179 -7
- package/test/canonical-quantity-door.test.ts +2 -2
- package/test/checkpoint-refuses-empty.test.ts +2 -2
- package/test/connector-capability-declaration.test.ts +88 -0
- package/test/control-capability.test.ts +1 -1
- package/test/cursor-stall-not-read-failure.test.ts +2 -2
- package/test/declaration-reaches-model.test.ts +5 -5
- package/test/declared-stimulus.test.ts +4 -4
- package/test/discovery-result.test.ts +2 -2
- package/test/entity-delta.test.ts +4 -4
- package/test/event-subjects.test.ts +147 -0
- package/test/event-time-column.test.ts +3 -3
- package/test/event-type-split.test.ts +155 -0
- package/test/fold-gap-speaks.test.ts +53 -0
- package/test/forecast-metrics.test.ts +1 -1
- package/test/forecast-tuning.test.ts +1 -1
- package/test/ingest-health-engine.test.ts +2 -2
- package/test/ingest-health-wiring.test.ts +7 -5
- package/test/ingest-health.test.ts +6 -6
- package/test/ingest-history.test.ts +2 -2
- package/test/ingest-idempotent.test.ts +132 -0
- package/test/ingest-space.test.ts +3 -3
- package/test/integration-probes.test.ts +3 -3
- package/test/integration-runner.test.ts +1 -1
- package/test/item-ref.test.ts +1 -1
- package/test/journal-order-axis.test.ts +80 -0
- package/test/journal-read-discipline.test.ts +16 -6
- package/test/journal-retention.test.ts +171 -29
- package/test/journal-sort-axis.test.ts +1 -1
- package/test/journal-write-door.test.ts +3 -3
- package/test/journal-write-trend.test.ts +1 -1
- package/test/kernel-kind-guard.test.ts +3 -3
- package/test/knob-defaults.test.ts +1 -1
- package/test/kpi-baseline-db.test.ts +2 -2
- package/test/kpi-fold.test.ts +185 -14
- package/test/kpi-query-bench.test.ts +3 -3
- package/test/live-cursor-wiring.test.ts +6 -6
- package/test/live-kernel-facts.test.ts +11 -11
- package/test/live-mirror-parity.test.ts +3 -3
- package/test/load-meter.test.ts +1 -1
- package/test/local-declarations.test.ts +10 -10
- package/test/log-stamp.test.ts +1 -1
- package/test/measured-yield.test.ts +2 -2
- package/test/merge-streams.test.ts +70 -0
- package/test/mirror-resumes-from-checkpoint.test.ts +13 -13
- package/test/model-basis.test.ts +2 -2
- package/test/model-gap.test.ts +4 -4
- package/test/model-vocabulary.test.ts +2 -2
- package/test/move-space.test.ts +1 -1
- package/test/oee-accumulator.test.ts +2 -2
- package/test/operational-vocabulary.test.ts +2 -2
- package/test/project-structure-db.test.ts +2 -2
- package/test/projection-reaches-screen.test.ts +2 -2
- package/test/property-effects.test.ts +3 -3
- package/test/read-failure-ledger.test.ts +106 -0
- package/test/read-failure-visible.test.ts +7 -7
- package/test/read-time.test.ts +118 -0
- package/test/reference-grounding.test.ts +1 -1
- package/test/reference-hook.test.ts +86 -0
- package/test/registry-key-guard.test.ts +1 -1
- package/test/rename-twin.test.ts +81 -0
- package/test/restart-policy.test.ts +3 -3
- package/test/resync-origin-site.test.ts +3 -3
- package/test/revision-axis.test.ts +14 -8
- package/test/runtime-key.test.ts +3 -3
- package/test/snapshot-freshness.test.ts +4 -4
- package/test/source-outcome-audit.test.ts +1 -1
- package/test/space-integrity.test.ts +1 -1
- package/test/space-representation.test.ts +66 -0
- package/test/space-scope-includes-stopped.test.ts +55 -0
- package/test/spec-coverage.test.ts +1 -1
- package/test/standard-coverage.test.ts +43 -1
- package/test/status-tally.test.ts +1 -1
- package/test/structure-revision-db.test.ts +7 -7
- package/test/subject-fast-path.test.ts +148 -0
- package/test/subject-read-model.test.ts +175 -0
- package/test/touched-items.test.ts +2 -2
- package/test/twin-audit.test.ts +1 -1
- package/test/twin-event-keys.test.ts +49 -3
- package/test/twin-model-item-db.test.ts +5 -5
- package/test/twin-model-tree-db.test.ts +35 -2
- package/test/twin-origin-resync.test.ts +1 -1
- package/test/warm-start-seam.test.ts +1 -1
- package/test/warm-start.test.ts +6 -6
- package/test/withheld-door.test.ts +95 -0
- package/test/yield-loop.test.ts +4 -4
- package/tsconfig.shared.tsbuildinfo +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
* ์ด๋ค ๊ธฐ์ค์ ์ผ๋์ง๋ ๊ฒฐ๊ณผ์ `window.basis` ๋ก ๋ฐํ๋ค โ ์จ๊ธฐ๋ฉด ์ฌ์ฉ์๊ฐ ์ซ์๋ฅผ ์คํดํ๋ค.
|
|
16
16
|
*/
|
|
17
17
|
import { twinWarn } from './log.js'
|
|
18
|
+
import { mergeStreams } from '../service/twin-journal/event-type-split-shape.js'
|
|
19
|
+
import { hydratedDate } from './read-time.js'
|
|
18
20
|
import { Between, In } from 'typeorm'
|
|
19
21
|
|
|
20
22
|
import { hierarchyOf, levelOfLocationType, electricalUpstreamOf, EMS_LOCATION_TYPES, EMS_PROPERTY, type TariffDeclaration } from '@operato/twin-kernel'
|
|
@@ -49,20 +51,29 @@ import { MAX_BASELINE_PERIODS, baselineWindows, summarizeBaseline, type Baseline
|
|
|
49
51
|
* ๋๋ ๊ฐ์ด๋ผ, ๋ ์ฌ์ค์ด ํ ํด๋์ ๋ค์ด์์ผ ์ฐฝ์ด ์ด๊ธ๋ ์ ์๋ค. ํ๋ณธ(`energy.measured`)์ ์ฝ์ง ์๋๋ค โ
|
|
50
52
|
* ์ ๋์ ์๊ณ (ยง4.1 ์ธ์ ์คํธ ๊ณ์ฝ) ์ฌ๊ธฐ์ ํ์ํ ๊ฒ์ ๋ง๊ฐ๋ ๊ตฌ๊ฐ๋ฟ์ด๋ค.
|
|
51
53
|
*/
|
|
52
|
-
const BUSINESS_EVENTS = ['task.status', 'order.status', 'energy.demand.window']
|
|
54
|
+
const BUSINESS_EVENTS = ['task.status', 'order.status', 'energy.demand.window', 'energy.generation.period', 'energy.usage.period', 'energy.bill']
|
|
53
55
|
|
|
54
|
-
/** ํ ๋ฒ์
|
|
56
|
+
/** ํ ๋ฒ์ ๊ณ์ฐํ ์ด๋ฒคํธ ์ํ โ ํฐ ๊ตฌ๊ฐ์ด ์๋ฒ๋ฅผ ๋ถ์ก์ง ์๊ฒ. */
|
|
55
57
|
const MAX_EVENTS = 20000
|
|
56
58
|
|
|
59
|
+
/**
|
|
60
|
+
* ์ข
๋ฅ๋ฅผ ๋๋ ๋ฌผ์ ๋ ๋ง๋ค ๊ฐ๋ ์์ ์ํ โ ๋์ ร ์ข
๋ฅ.
|
|
61
|
+
*
|
|
62
|
+
* ๊ฐ๋๋ง๋ค ์ํ(`MAX_EVENTS`)๊น์ง ๋ฐ์์ผ ํฉ์น ๊ฒฐ๊ณผ๊ฐ ์ ํํ๋ค(ยง`mergeStreams`). ๊ทธ๋์ ๊ฐ๋๊ฐ ๋๋ฉด
|
|
63
|
+
* ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ทธ๋งํผ ๋ ๋ค. ์
(์ข
๋ฅ) ร ๋(ํธ์)๊น์ง๋ ์ต์
์ 12๋ง ํ์ด๊ณ , ๊ทธ ์ด์์ ์์ ํ ์ง์๋ก ๊ฐ๋ค โ
|
|
64
|
+
* ๋๋ฆฌ์ง๋ง ๋ต์ ๊ฐ๋ค.
|
|
65
|
+
*/
|
|
66
|
+
const KPI_MAX_SPLIT = 6
|
|
67
|
+
|
|
57
68
|
export interface TwinKpiInput {
|
|
58
69
|
domainId: string
|
|
59
70
|
/** ํ ํธ์. `spaceId` ์ ๋ ์ค ํ๋๋ ์์ด์ผ ํ๋ค. */
|
|
60
71
|
instanceId?: string
|
|
61
72
|
/**
|
|
62
|
-
* ํ **๊ณต๊ฐ** โ ๊ทธ ๊ณต๊ฐ์์ ๊ฐ๋ ์ค์ธ ํธ์ ์ ๋ถ๋ฅผ **ํ ๋ฒ์
|
|
73
|
+
* ํ **๊ณต๊ฐ** โ ๊ทธ ๊ณต๊ฐ์์ ๊ฐ๋ ์ค์ธ ํธ์ ์ ๋ถ๋ฅผ **ํ ๋ฒ์ ๊ณ์ฐํ๋ค**.
|
|
63
74
|
*
|
|
64
|
-
* ํธ์๋ณ๋ก
|
|
65
|
-
* ๊ทธ๋์ ์ด๋ฒคํธ๋ฅผ ๋ชจ์ **ํ ๋ฒ**
|
|
75
|
+
* ํธ์๋ณ๋ก ๊ณ์ฐํด ํ๊ท ์ ๋ค์ ํ๊ท ํ๋ฉด ๋ถ์์๊ฐ ๊ฑฐ์ง์ด ๋๋ค(p90 ์ ํ๊ท ์ p90 ์ด ์๋๋ค).
|
|
76
|
+
* ๊ทธ๋์ ์ด๋ฒคํธ๋ฅผ ๋ชจ์ **ํ ๋ฒ** ๊ณ์ฐํ๋ค. ์ฌ์ฉ์๋ "๋ถ์ฐ ์ฐฝ๊ณ " ๋ฅผ ๋ณด๊ณ , ๊ทธ ์์ ํธ์์ด ๋ช ๊ฐ๋
|
|
66
77
|
* ํฉ์ณ์ ๋ณธ๋ค(ํค๋ ํธ์ ์
๋ ํฐ๋ฅผ ์์ค ๊ฒฐ์ ๊ณผ ๊ฐ์ ๊ท์จ).
|
|
67
78
|
*/
|
|
68
79
|
spaceId?: string
|
|
@@ -76,14 +87,14 @@ export interface TwinKpiInput {
|
|
|
76
87
|
lookbackMinutes?: number
|
|
77
88
|
/**
|
|
78
89
|
* ์ฐฝ์ N ๋ฑ๋ถํด **๊ตฌ๊ฐ๋ณ ๊ฐ๋** ํจ๊ป ๋ธ๋ค(์ถ์ธ์ฉ). 1~48, ๊ธฐ๋ณธ 0(์ชผ๊ฐ์ง ์์).
|
|
79
|
-
* ์กฐํ๋ ํ ๋ฒ์ด๊ณ
|
|
90
|
+
* ์กฐํ๋ ํ ๋ฒ์ด๊ณ ๊ณ์ฐ๋ง N ๋ฒ ๋ฐ๋ณตํ๋ค โ ํด๋๊ฐ ์์ํ๋ฏ๋ก ๊ฐ์ธ๋ค.
|
|
80
91
|
*/
|
|
81
92
|
buckets?: number
|
|
82
93
|
/**
|
|
83
94
|
* ๊ฐ์ ์ฌ์ค์ **๋ค๋ฅธ ๊ด์ ์ผ๋ก** ์ชผ๊ฐ ๋ค: ์์๋ณยท์์
์ข
๋ฅ๋ณยท๋์ฐฉ์ง์ ๋ณยท์ค๋๋ณยท๊ตฌ์ญ๋ณ.
|
|
84
95
|
*
|
|
85
96
|
* ๊ณ ์ ๋ ํ ๋ ์ฆ๋ง ๋ผ ์ ์์ผ๋ฉด "๊ตฌ์ญ๋ณ๋ก๋ ์ด๋ค๊ฐ" ๋ผ๋ ์ง๋ฌธ์ ํ๋ฉด๋ AI ๋ ๋ตํ ์ ์๋ค.
|
|
86
|
-
* ์ถ์ ์กฐํ ์ธ์ ํ๋์ด๊ณ ,
|
|
97
|
+
* ์ถ์ ์กฐํ ์ธ์ ํ๋์ด๊ณ , ๊ณ์ฐ๋ ์์ ํจ์๋ผ ์ถ์ ํ๋ ๋ ๋ณด๋ ๊ฐ์ด ๊ฑฐ์ ์๋ค.
|
|
87
98
|
*/
|
|
88
99
|
groupBy?: KpiGroupBy
|
|
89
100
|
/** ์ถ์ ์ํ(๊ธฐ๋ณธ 20, ์ต๋ 100). ๋์น๋ฉด ์๋ผ๋ด๊ณ ์๋ฆฐ ์๋ฅผ ํจ๊ป ์๋ฆฐ๋ค. */
|
|
@@ -92,12 +103,12 @@ export interface TwinKpiInput {
|
|
|
92
103
|
* **๋ฌด์๊ณผ ๋น๊ตํ ๊ฒ์ธ๊ฐ** โ ๊ฐ์ ๊ธธ์ด์ ์ ๊ตฌ๊ฐ(previous)์ด๋ ํ๋ฃจ ์ ๊ฐ์ ์๊ฐ(yesterday).
|
|
93
104
|
*
|
|
94
105
|
* ์ซ์ ํ๋๋ก๋ ์ข์์ก๋์ง ๋๋น ์ก๋์ง ์ ์ ์๋ค("29์ด" ๊ฐ ๊ฐ์ ์ธ์ง ์
ํ์ธ์ง). ์ฐฝ๋ง ์ฎ๊ฒจ ํ ๋ฒ ๋
|
|
95
|
-
*
|
|
106
|
+
* ๊ณ์ฐํ๋ฉด ๋๋ฏ๋ก(ํด๋๋ ์์) ๊ฐ์ธ๋ค. ๋น๊ต ๊ตฌ๊ฐ์ ๊ธฐ๋ก์ด ์์ผ๋ฉด **delta ๋ฅผ ๋ง๋ค์ง ์๋๋ค** โ
|
|
96
107
|
* ์๋ ๊ฒ์ 0% ๋ก ๊ทธ๋ฆฌ๋ฉด "๋ณํ ์์" ์ด๋ผ๋ ๊ฑฐ์ง์ด ๋๋ค.
|
|
97
108
|
*/
|
|
98
109
|
compareTo?: 'previous' | 'yesterday'
|
|
99
110
|
/**
|
|
100
|
-
* **์ฌ๋ฌ ๊ตฌ๊ฐ ๋์ ๋น๊ต** โ ์ต๊ทผ N ๊ตฌ๊ฐ์ ๊ฐ์ ์๊ฐ๋๋ฅผ ํจ๊ป
|
|
111
|
+
* **์ฌ๋ฌ ๊ตฌ๊ฐ ๋์ ๋น๊ต** โ ์ต๊ทผ N ๊ตฌ๊ฐ์ ๊ฐ์ ์๊ฐ๋๋ฅผ ํจ๊ป ๊ณ์ฐํด **๋ถํฌ**์ ๊ทธ ์์ ์๋ฆฌ๋ฅผ ๋ธ๋ค.
|
|
101
112
|
*
|
|
102
113
|
* `compareTo` ๋ ํ ๊ตฌ๊ฐ๋ง ๋ด์ ํ๋จ์ด "์ด์ ๋ณด๋ค ๋์์ก๋ค" ์์ ๋ฉ์ถ๋ค โ ์ด์ ๋ ๋๋นด์ผ๋ฉด ์ธ๋ชจ๊ฐ ์๋ค.
|
|
103
114
|
* ์ต๊ทผ ๋ฉฐ์น ์ ๊ฐ์ ์๊ฐ๋๋ฅผ ๋ณด๋ฉด ๋ชฉํ ์์ด๋ "์ง๋ 7์ผ ์ค ๊ฐ์ฅ ๋ฎ๋ค" ๋ฅผ ๋งํ ์ ์๋ค.
|
|
@@ -122,7 +133,7 @@ export interface TwinKpiOutput extends Omit<Partial<KpiResult>, 'window'> {
|
|
|
122
133
|
/**
|
|
123
134
|
* ์กฐํ๊ฐ **์ํ์ ๊ฑธ๋ ธ๋๊ฐ**(๊ตฌ๊ฐ์ด ๋๋ฌด ์ปค์ ์ผ๋ถ๋ง ์ฝ์์ ์ ์๋ค).
|
|
124
135
|
*
|
|
125
|
-
* true ๋ฉด ์ด ๊ตฌ๊ฐ์ ์ซ์๋ **ํํ**์ด๋ค โ ์ค์ ๋ก๋ ๋ ์์์ ์ ์๋ค.
|
|
136
|
+
* true ๋ฉด ์ด ๊ตฌ๊ฐ์ ์ซ์๋ **ํํ**์ด๋ค โ ์ค์ ๋ก๋ ๋ ์์์ ์ ์๋ค. ์๋ฆฌ์ง ์๊ณ ์๋ผ๋ด๋ฉด ์ซ์๊ฐ ์๋ฆฌ์ง ์๊ณ
|
|
126
137
|
* ์์์ง๊ณ ์ฌ์ฉ์๋ ๊ทธ๊ฒ์ ์ฑ๊ณผ ํ๋ฝ์ผ๋ก ์ฝ๋๋ค. ๊ตฌ๊ฐ์ ์ขํ ๋ค์ ๋ฌผ์ด์ผ ํ๋ค.
|
|
127
138
|
*/
|
|
128
139
|
eventsCapped?: boolean
|
|
@@ -132,9 +143,9 @@ export interface TwinKpiOutput extends Omit<Partial<KpiResult>, 'window'> {
|
|
|
132
143
|
*/
|
|
133
144
|
measured: boolean
|
|
134
145
|
note?: string
|
|
135
|
-
/** ๋ฌด์์ ์ง๊ณํ๋ โ ๊ณต๊ฐ์ด๋ฉด ํฉ์ณ
|
|
146
|
+
/** ๋ฌด์์ ์ง๊ณํ๋ โ ๊ณต๊ฐ์ด๋ฉด ํฉ์ณ ๊ณ์ฐํ ํธ์ ๋ชฉ๋ก์ ๋ฐํ๋ค(์ซ์์ ์ถ์ฒ๋ฅผ ์จ๊ธฐ์ง ์๋๋ค). */
|
|
136
147
|
/**
|
|
137
|
-
* ๋ฌด์์ ์ง๊ณํ๋ โ ๊ณต๊ฐ์ด๋ฉด ํฉ์ณ
|
|
148
|
+
* ๋ฌด์์ ์ง๊ณํ๋ โ ๊ณต๊ฐ์ด๋ฉด ํฉ์ณ ๊ณ์ฐํ ํธ์ ๋ชฉ๋ก.
|
|
138
149
|
*
|
|
139
150
|
* `restartPolicies` ๋ **์ด ์ซ์๊ฐ ๋ฌด์์ ์ฑ๊ณผ์ธ์ง**๋ฅผ ๋งํ๋ค: mirror(์ค์ ์์คํ
์ ๋ฐ์) ยท
|
|
140
151
|
* `resume`(์ด์ด์ง๋ ๊ฐ์ ์ธ๊ณ) ยท `reset`(์ฌํ ์คํ ์ฌ๋ณธ). ๊ฐ์ "345๊ฑด" ์ด ํ์ค์ ์ค์ ์ผ ์๋, ์๋ฎฌ๋ ์ด์
์
|
|
@@ -152,7 +163,7 @@ export interface TwinKpiOutput extends Omit<Partial<KpiResult>, 'window'> {
|
|
|
152
163
|
*/
|
|
153
164
|
targets?: TargetVerdict[]
|
|
154
165
|
/**
|
|
155
|
-
* ๋น๊ต ๊ตฌ๊ฐ(์์ฒญํ์ ๋๋ง) โ ๊ฐ์ ๊ท์นยท๊ฐ์ ๊ธธ์ด๋ก
|
|
166
|
+
* ๋น๊ต ๊ตฌ๊ฐ(์์ฒญํ์ ๋๋ง) โ ๊ฐ์ ๊ท์นยท๊ฐ์ ๊ธธ์ด๋ก ๊ณ์ฐํ ์ ๊ตฌ๊ฐ๊ณผ์ ์ฐจ์ด.
|
|
156
167
|
*
|
|
157
168
|
* `measured:false` ๋ฉด ๊ทธ ๊ตฌ๊ฐ์ ๊ธฐ๋ก์ด ์๋ค๋ ๋ป์ด๊ณ `delta` ๋ ์๋ค(0 ์ด ์๋๋ค).
|
|
158
169
|
* delta ๋ **ํ์ฌ โ ๋น๊ต๊ตฌ๊ฐ** ์ด๋ค. ์ข๊ณ ๋์จ์ ํ๋จํ์ง ์๋๋ค โ ์ฒ๋ฆฌ๋์ ํด์๋ก ์ข๊ณ ์์๋
|
|
@@ -212,7 +223,7 @@ type KpiGroupOut = NonNullable<KpiResult['groups']>['items'][number] &
|
|
|
212
223
|
*
|
|
213
224
|
* **ํ ํ๋ง ๋ณด๋ฉด ์ ๋๋ค.** `parentId` ๋ ๊ตฌ์ญ์ผ ์๋ ์๊ณ ์ค๊ฐ ๋จ(๋ผ์ธยท์
)์ผ ์๋ ์๋ค. ๋ผ์ธ์ด ๋ผ๋ฉด
|
|
214
225
|
* ํ ํ์ง๋ฆฌ ์ฝ๋๋ "๊ตฌ์ญ์ด LINE-1" ์ด๋ผ๊ณ ๋ตํ๊ณ , ๊ทธ id ๋ ๊ตฌ์ญ ๋ชฉ๋ก์ ์์ผ๋ฏ๋ก ๊ทธ ์๋ ์คํ
์ด์
์ด
|
|
215
|
-
* **์ง๊ณ์์
|
|
226
|
+
* **์ง๊ณ์์ ์ค๋ฅ ์์ด ๋น ์ง๋ค**(์๋ฌ ์์ด ํ๋ฆฐ ์ซ์). ๊ทธ๋์ ์ปค๋ `hierarchyOf` ๋ก ์ฌ์ฌ์ ๋๊น์ง ๊ฑท๋๋ค โ
|
|
216
227
|
* ๊ฑท๋ ๊ท์น์ ์ปค๋์ ํ ๋ฒ๋ฟ์ด๊ณ ์๋น์ฒ๋ ๊ทธ๊ฒ๋ง ๋ถ๋ฅธ๋ค.
|
|
217
228
|
*/
|
|
218
229
|
/**
|
|
@@ -338,7 +349,7 @@ async function locationAreaMap(
|
|
|
338
349
|
*
|
|
339
350
|
* ์ฌ๋ฌ ์๋์ง ํธ์์ด ํ ํ์ฅ์ ์์ผ๋ฉด **์ฒ์ ์ ์ธ๋ ๊ฒ ํ๋**๋ฅผ ์ด๋ค. ํ๊ท ์ ๋ด๊ฑฐ๋ ํฉ์น์ง ์๋๋ค:
|
|
340
351
|
* ์๊ธ์ ๊ณ์ฝ์ด๊ณ , ๋ ๊ณ์ฝ์ ์์ ๋จ๊ฐ๋ ์ด๋ ๊ณ์ฝ๋ ์๋๋ค. ์๋ก ๋ค๋ฅธ ๋จ๊ฐ๊ฐ ์ ์ธ๋ผ ์์ผ๋ฉด ๊ทธ๊ฒ์
|
|
341
|
-
* ๋ฐํ๋ค(
|
|
352
|
+
* ๋ฐํ๋ค(์๋ฆฌ์ง ์๊ณ ํ๋๋ฅผ ๊ณ ๋ฅด๋ฉด ์ ๊ทธ ๊ธ์ก์ธ์ง ์๋ฌด๋ ์ค๋ช
ํ ์ ์๋ค).
|
|
342
353
|
*/
|
|
343
354
|
async function tariffOf(
|
|
344
355
|
domainId: string,
|
|
@@ -357,11 +368,14 @@ async function tariffOf(
|
|
|
357
368
|
}
|
|
358
369
|
const d = num(EMS_PROPERTY.demandChargePerKW)
|
|
359
370
|
const e = num(EMS_PROPERTY.energyChargePerKWh)
|
|
371
|
+
/* ์๊ธ์ ์ฉ์ ๋ ฅ โ ์์ผ๋ฉด ๊ธฐ๋ณธ์๊ธ์ด ์กฐ๊ฑด๋ถ ํ์์ด ์๋๋ผ ์ฌ์ค์ด ๋๋ค(ยง`electricityCost`). */
|
|
372
|
+
const b = num(EMS_PROPERTY.billingDemandKW)
|
|
360
373
|
const cur = props.get(EMS_PROPERTY.currency)
|
|
361
374
|
if (d === undefined && e === undefined) continue
|
|
362
375
|
found.push({
|
|
363
376
|
...(d !== undefined ? { demandChargePerKW: d } : {}),
|
|
364
377
|
...(e !== undefined ? { energyChargePerKWh: e } : {}),
|
|
378
|
+
...(b !== undefined ? { billingDemandKW: b } : {}),
|
|
365
379
|
...(cur ? { currency: String(cur) } : {})
|
|
366
380
|
})
|
|
367
381
|
}
|
|
@@ -369,7 +383,11 @@ async function tariffOf(
|
|
|
369
383
|
if (!found.length) return {}
|
|
370
384
|
const first = found[0]
|
|
371
385
|
const same = found.every(
|
|
372
|
-
t =>
|
|
386
|
+
t =>
|
|
387
|
+
t.demandChargePerKW === first.demandChargePerKW &&
|
|
388
|
+
t.energyChargePerKWh === first.energyChargePerKWh &&
|
|
389
|
+
t.billingDemandKW === first.billingDemandKW &&
|
|
390
|
+
t.currency === first.currency
|
|
373
391
|
)
|
|
374
392
|
return { tariff: first, ...(same ? {} : { conflict: true }) }
|
|
375
393
|
}
|
|
@@ -435,11 +453,33 @@ async function resourceFeederMap(
|
|
|
435
453
|
}
|
|
436
454
|
|
|
437
455
|
/**
|
|
438
|
-
* ์ด ๊ณต๊ฐ์ ์๋์ง ํธ์๋ค์ ๊ณํต๋ โ ๋ชจ๋ธ์ ์ฝ์ด ํธ๋ฆฌ๋ก
|
|
456
|
+
* ์ด ๊ณต๊ฐ์ ์๋์ง ํธ์๋ค์ ๊ณํต๋ โ ๋ชจ๋ธ์ ์ฝ์ด ํธ๋ฆฌ๋ก ์ฒ๋ฆฌํ๋ค.
|
|
439
457
|
*
|
|
440
458
|
* ์ฌ๋ฌ ํธ์์ด ํ ๊ณต๊ฐ์ ์์ผ๋ฉด **๊ฐ ํธ์์ ๋ฟ๋ฆฌ๋ฅผ ๋๋ํ** ๋๋ค(ํ๋๋ก ํฉ์น๋ฉด ์๋ ๊ฒฐ์ ์ ๊ทธ๋ฆฌ๊ฒ ๋๋ค).
|
|
441
459
|
* ์๋์ง ํธ์์ด ์์ผ๋ฉด ๋ง๋ค์ง ์๋๋ค โ ๋น ๊ทธ๋ฆผ์ ๊ณ ์ฅ์ผ๋ก ์ฝํ๋ค.
|
|
442
460
|
*/
|
|
461
|
+
/**
|
|
462
|
+
* ์ด ํธ์๋ค์ด ์ด์ด๋ฐ๊ณ ์๋ **๋ง์ง๋ง ์ฒญ๊ตฌ์** โ ์๊ธ์ ์ฉ์ ๋ ฅ์ ์ฐ์ ๊ทผ๊ฑฐ.
|
|
463
|
+
*
|
|
464
|
+
* ์ ๋์ด ์๋๋ผ ์ํ์์ ์ฝ๋ ์ด์ : ์ฒญ๊ตฌ๋ ํ ๋ฌ์ ํ ๋ฒ์ด๋ผ ํ๋ฃจ ์ฐฝ์ ์กฐํ์๋ ๊ฑธ๋ฆฌ์ง ์๋๋ค.
|
|
465
|
+
* ๊ทธ๋ฐ๋ฐ ๊ทธ ๊ฐ์ **๊ทธ ์ฐฝ์๋ ์ ์ฉ๋๋ค**(์๊ธ ์ ๋๊ฐ ๊ทธ๋ ๊ฒ ๊ตฐ๋ค). ์ปค๋์ด ์ฌ๊ธฐ๋์์๋ ์ด์ด๋ฐ์ผ๋ฏ๋ก
|
|
466
|
+
* ์ํ๊ฐ ๊ทธ ์๋ฆฌ๋ค.
|
|
467
|
+
*
|
|
468
|
+
* ํธ์์ด ์ฌ๋ฟ์ด๋ฉด ๊ฐ์ฅ ๋ฆ๊ฒ ๋๋ ๊ฒ์ ์ด๋ค โ ํ์ฅ ํ๋์ ์ฒญ๊ตฌ๊ฐ ์ฌ๋ฟ์ด๋ฉด ๊ทธ๊ฒ์ ๋ค๋ฅธ ๋ฌธ์ ์ด๊ณ ,
|
|
469
|
+
* ์ฌ๊ธฐ์ ๊ณจ๋ผ ๊ฐ์ถ์ง ์๋๋ค.
|
|
470
|
+
*/
|
|
471
|
+
function latestBillOf(domainId: string, instanceIds: string[]): { to: string; billingDemandKW?: number } | undefined {
|
|
472
|
+
let best: { to: string; billingDemandKW?: number } | undefined
|
|
473
|
+
for (const instanceId of instanceIds) {
|
|
474
|
+
const bill = (TwinEngine.snapshot(domainId, instanceId) as any)?.energy?.lastBill
|
|
475
|
+
if (!bill?.to) continue
|
|
476
|
+
if (!best || Date.parse(bill.to) > Date.parse(best.to)) {
|
|
477
|
+
best = { to: String(bill.to), ...(Number.isFinite(Number(bill.billingDemandKW)) ? { billingDemandKW: Number(bill.billingDemandKW) } : {}) }
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
return best
|
|
481
|
+
}
|
|
482
|
+
|
|
443
483
|
async function energyTopologyOf(
|
|
444
484
|
domainId: string,
|
|
445
485
|
instanceIds: string[],
|
|
@@ -465,15 +505,50 @@ async function energyTopologyOf(
|
|
|
465
505
|
return merged.roots.length ? merged : undefined
|
|
466
506
|
}
|
|
467
507
|
|
|
468
|
-
/**
|
|
508
|
+
/**
|
|
509
|
+
* ์ด ๋์๋ค์ **๋ง์ง๋ง ์
๋ฌด ๊ธฐ๋ก ์๊ฐ**(ISO). ๊ธฐ๋ก์ด ์์ผ๋ฉด null.
|
|
510
|
+
*
|
|
511
|
+
* โโ ๋ ๊ฐ์ง๋ฅผ ํจ๊ป ๊ณ ์ณค๋ค (2026-08-28 ์ค์ธก) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
512
|
+
* ์์ ํ์ ์ด๋ฌ๋ค.
|
|
513
|
+
*
|
|
514
|
+
* findOne({ where: { domain: { id }, instanceId: In(โฆ), eventType: In(์
) }, order: { revision: 'DESC' } })
|
|
515
|
+
*
|
|
516
|
+
* **โ ๊ด๊ณ๋ก ๋ฌผ์ด ๋ ๋จ๊ณ ์ง์๊ฐ ๋๋ค.** ์์ชฝ์ ์ํ์ด ์์ด ์กฐ๊ฑด์ ๋ง๋ ํ์ **์ ๋ถ ๋ง๋ ๋ค** ํ๋๋ฅผ
|
|
517
|
+
* ๊ณ ๋ฅธ๋ค โ ๊ทธ ํธ์์ ์
๋ฌด ์ฌ์ค์ด 97๋ง ํ์ด๊ณ `payload` ๊น์ง ์ค๋ ค ์จ๋ค. ์ด ํ์ผ์ ๋ค๋ฅธ ์๋ฆฌ๊ฐ ๊ฐ์ ๊ฒ์
|
|
518
|
+
* ์ค์ธกํด ์ ์ด ๋์๋ค(ยง`twinEvents`: 0.024์ด ๋ 12์ด). ์๋ฒ ๋ก๊ทธ์ ใ๋๋ฆฐ ์ง์ใ๋ก ์ฐํ ์๋ ๊ฒ์ด
|
|
519
|
+
* ์ด๊ฒ์ด๊ณ , ํ์ฅ ์ฑ๊ณผ ํ๋ฉด์ 7.2์ด๊ฐ ์ฌ๊ธฐ์ ๋์๋ค.
|
|
520
|
+
*
|
|
521
|
+
* **โก ใ๋ง์ง๋ง ์๊ฐใ์ ์ํ๋ฉด์ `revision` ์ผ๋ก ์ ๋ ฌํ๋ค.** ๊ทธ ๋์ ์ด๊ธ๋๋ค โ ์ฐ๊ฒฐ๋ ์์คํ
์ ๋์ฝ๋
|
|
522
|
+
* ํธ์์ ์๋ณธ์ ์๊ฐ์ ์ฃ๊ณ ๋์ฐฉ ์์๋ก ๋ฆฌ๋น์ ์ ๋ฐ์ผ๋ฏ๋ก, ๋ฆฌ๋น์ ์ด ๊ฐ์ฅ ํฐ ํ์ด 4์ ์ฌ์ค์ผ ์ ์๋ค
|
|
523
|
+
* (๊ฐ์ ์ด๊ธ๋จ์ ์ค๋ ์ ๋ ๋ชฉ๋ก์์๋ ๊ณ ์ณค๋ค). ์ฐฝ์ ๋์ ๊ทธ ๊ฐ์ผ๋ก ์ก์ผ๋ฉด **์ฐฝ ์์ฒด๊ฐ ํ๋ฆฐ๋ค.**
|
|
524
|
+
*
|
|
525
|
+
* ์ง๊ธ์ ์ข
๋ฅ๋ง๋ค `MAX(eventTime)` ์ ๋ฌป๋๋ค. `(domain, instance, event_type, event_time)` ์์ธ์
|
|
526
|
+
* ๋์ ์ง์ผ๋ฏ๋ก ์ข
๋ฅ๋น ํ ๋ฒ์ด๊ณ , ์
์ค ๊ฐ์ฅ ๋ฆ์ ๊ฒ์ด ๋ต์ด๋ค.
|
|
527
|
+
*/
|
|
469
528
|
async function latestEventTime(domainId: string, instanceIds: string[]): Promise<string | null> {
|
|
470
529
|
if (instanceIds.length === 0) return null
|
|
471
|
-
const
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
530
|
+
const rows = await Promise.all(
|
|
531
|
+
instanceIds.flatMap(instanceId =>
|
|
532
|
+
BUSINESS_EVENTS.map(eventType =>
|
|
533
|
+
getReadRepository(TwinEvent)
|
|
534
|
+
.createQueryBuilder('e')
|
|
535
|
+
.select('MAX(e.eventTime)', 'at')
|
|
536
|
+
.where('e.domain = :domainId', { domainId })
|
|
537
|
+
.andWhere('e.instanceId = :instanceId', { instanceId })
|
|
538
|
+
.andWhere('e.eventType = :eventType', { eventType })
|
|
539
|
+
.getRawOne<{ at: unknown }>()
|
|
540
|
+
.catch(() => null)
|
|
541
|
+
)
|
|
542
|
+
)
|
|
543
|
+
)
|
|
544
|
+
/* ๋๋ผ์ด๋ฒ๊ฐ ์ค ๊ฐ์ ์๊ฐ๋๊ฐ ์์ ์ ์๋ค โ ์ปฌ๋ผ ๋ณํ์ ์ง๋๊ฒ ํ๋ค(ยง`hydratedDate`). */
|
|
545
|
+
const repo = getReadRepository(TwinEvent)
|
|
546
|
+
let latest: Date | null = null
|
|
547
|
+
for (const r of rows) {
|
|
548
|
+
const at = hydratedDate(repo, 'eventTime', r?.at)
|
|
549
|
+
if (at && (!latest || at.getTime() > latest.getTime())) latest = at
|
|
550
|
+
}
|
|
551
|
+
return latest ? latest.toISOString() : null
|
|
477
552
|
}
|
|
478
553
|
|
|
479
554
|
/**
|
|
@@ -539,24 +614,82 @@ async function fetchEvents(domainId: string, instanceIds: string[], fromMs: numb
|
|
|
539
614
|
* ๋จ๋ ๋น์ฉ์ ๊ฐ์ถ์ง ์๋๋ค: `payload` ํ์ฑ์ ์ฌ์ ํ ๋ฉ์ธ ์ค๋ ๋ ์ผ์ด๊ณ ์ฐ๊ฒฐ์ ๋๋ ๋ ๋๋์ง ์๋๋ค
|
|
540
615
|
* (์ค์ธก ํ๊ท 1.5์ด). ๊ทธ๊ฒ์ ๋ ์ค์ด๋ ค๋ฉด ํด๋๊ฐ payload ์์ ๋ฌด์์ ์ฐ๋์ง ์ขํ์ผ ํ๋ค โ ๋ณ ๊ฑด์ด๋ค.
|
|
541
616
|
*/
|
|
542
|
-
const
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
617
|
+
const from = new Date(fromMs - lookbackMs)
|
|
618
|
+
const to = new Date(toMs)
|
|
619
|
+
|
|
620
|
+
/**
|
|
621
|
+
* ํ ๊ฐ๋๋ฅผ ๋ฌป๋๋ค โ **์ข
๋ฅ๋ฅผ ์ ํ์ผ์น๋ก** ์ค๋ค. ๊ทธ๊ฒ์ด ์ด ๊ณ ์นจ์ ์์ ์ด๋ค.
|
|
622
|
+
*/
|
|
623
|
+
const readOne = (instanceId: string, eventType: string) =>
|
|
624
|
+
getReadRepository(TwinEvent)
|
|
625
|
+
.createQueryBuilder('e')
|
|
626
|
+
.select(['e.eventType AS "eventType"', 'e.eventTime AS "eventTime"', 'e.revision AS "revision"', 'e.payload AS "payload"'])
|
|
627
|
+
.where('e.domain = :domainId', { domainId })
|
|
628
|
+
.andWhere('e.instanceId = :instanceId', { instanceId })
|
|
629
|
+
.andWhere('e.eventType = :eventType', { eventType })
|
|
630
|
+
.andWhere('e.eventTime BETWEEN :from AND :to', { from, to })
|
|
631
|
+
.orderBy('e.eventTime', 'ASC')
|
|
632
|
+
.addOrderBy('e.revision', 'ASC')
|
|
633
|
+
.limit(MAX_EVENTS)
|
|
634
|
+
.getRawMany<{ eventType: string; eventTime: unknown; revision: unknown; payload: unknown }>()
|
|
635
|
+
|
|
636
|
+
/*
|
|
637
|
+
* โโ **์ข
๋ฅ๋ฅผ ๋๋ ๋ฌป๋๋ค** (2026-08-28 ์ค์ธก) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
638
|
+
*
|
|
639
|
+
* ์์ ์๋ `eventType IN (์
)` + ์๊ฐ ๋ฒ์ + ์๊ฐ์์ด์๋ค. ๊ทธ ๋ชจ์์์ sqlite ๋ ์ข
๋ฅ ์์ธ์ ๋ฒ๋ฆฌ๊ณ
|
|
640
|
+
* ์๊ฐ ์์ธ์ผ๋ก **๊ตฌ๊ฐ ์ ์ฒด๋ฅผ ๊ฑธ์ผ๋ฉฐ ํ๋ง๋ค ์ข
๋ฅ๋ฅผ ํ์ธํ๋ค.** ์นํํธ๋(์ ๋ 3,140๋งํ) ์ค์ธก:
|
|
641
|
+
*
|
|
642
|
+
* ์ฐฝ 1์๊ฐ ๊ตฌ๊ฐ ์ 0ํ ยท ์ฐ๋ ํ 0 40๋ฐ๋ฆฌ์ด
|
|
643
|
+
* ์ฐฝ 24์๊ฐ ๊ตฌ๊ฐ ์ 254,185ํ ยท ์ฐ๋ ํ 0 3,776๋ฐ๋ฆฌ์ด โ 25๋ง ํ์ ๊ฑธ์ด 0๊ฑด์ ์ด๋ค
|
|
644
|
+
* ์ฐฝ 7์ผ ๊ตฌ๊ฐ ์ 2,070,625ํ ยท 34,143 173๋ฐ๋ฆฌ์ด โ ์ํ์ ์ผ์ฐ ๋ฟ์ ์คํ๋ ค ๋น ๋ฅด๋ค
|
|
645
|
+
*
|
|
646
|
+
* ์ฐฝ์ ๋ํ๋ฉด ๋นจ๋ผ์ง๋ ๊ฒ ์์ฒด๊ฐ ์ ํธ์๋ค. ์ข
๋ฅ๋ฅผ ์ ํ์ผ์น๋ก ๋ฌผ์ผ๋ฉด
|
|
647
|
+
* `ix_twin_event_7 (domain, instance, event_type, event_time)` ์ด ๋ฒ์๊น์ง ์์ธ์์ ์ค๋ค.
|
|
648
|
+
*
|
|
649
|
+
* ๋๋ ์๋ฅผ ์ ํํ๋ค โ ๊ฐ๋๋ง๋ค ์ํ๊น์ง ๋ฐ์์ผ ์ ํํ๋ฏ๋ก(ยง`mergeStreams`) ๊ฐ๋๊ฐ ๋ง์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ
|
|
650
|
+
* ๊ทธ๋งํผ ๋ ๋ค. ๋์ผ๋ฉด ์์ ํ ์ง์๋ก ๊ฐ๋ค(๋๋ฆฌ์ง๋ง ๋ต์ ๊ฐ๋ค).
|
|
651
|
+
*/
|
|
652
|
+
const pairs = instanceIds.length * BUSINESS_EVENTS.length
|
|
653
|
+
let raw: { eventType: string; eventTime: unknown; revision: unknown; payload: unknown }[]
|
|
654
|
+
let mergedCapped = false
|
|
655
|
+
if (pairs && pairs <= KPI_MAX_SPLIT) {
|
|
656
|
+
const streams = await Promise.all(
|
|
657
|
+
instanceIds.flatMap(instanceId => BUSINESS_EVENTS.map(eventType => readOne(instanceId, eventType)))
|
|
658
|
+
)
|
|
659
|
+
const merged = mergeStreams(streams, MAX_EVENTS, (a, b) => {
|
|
660
|
+
const at = String(a.eventTime ?? '').localeCompare(String(b.eventTime ?? ''))
|
|
661
|
+
if (at !== 0) return at
|
|
662
|
+
return Number(a.revision ?? 0) - Number(b.revision ?? 0)
|
|
663
|
+
})
|
|
664
|
+
if (merged.underfilled) {
|
|
665
|
+
/* ์์ ์ ์๋ ์ผ์ด๋ค โ ๊ฐ๋๊ฐ ์ํ๋ณด๋ค ๋ง์ด ๋ฐ์ ์๋ค. ์กฐ์ฉํ ์ฐ์ง ์๊ณ ๋งํ๋ค. */
|
|
666
|
+
twinWarn('[twin-kpi] a per-type stream returned more than the cap โ the merge cannot be trusted; falling back')
|
|
667
|
+
raw = []
|
|
668
|
+
} else {
|
|
669
|
+
raw = merged.items
|
|
670
|
+
mergedCapped = merged.capped
|
|
671
|
+
}
|
|
672
|
+
} else {
|
|
673
|
+
raw = await getReadRepository(TwinEvent)
|
|
674
|
+
.createQueryBuilder('e')
|
|
675
|
+
.select(['e.eventType AS "eventType"', 'e.eventTime AS "eventTime"', 'e.revision AS "revision"', 'e.payload AS "payload"'])
|
|
676
|
+
.where('e.domain = :domainId', { domainId })
|
|
677
|
+
.andWhere('e.instanceId IN (:...instanceIds)', { instanceIds })
|
|
678
|
+
.andWhere('e.eventType IN (:...types)', { types: BUSINESS_EVENTS })
|
|
679
|
+
.andWhere('e.eventTime BETWEEN :from AND :to', { from, to })
|
|
680
|
+
.orderBy('e.eventTime', 'ASC')
|
|
681
|
+
.addOrderBy('e.revision', 'ASC')
|
|
682
|
+
.limit(MAX_EVENTS)
|
|
683
|
+
.getRawMany<{ eventType: string; eventTime: unknown; revision: unknown; payload: unknown }>()
|
|
684
|
+
mergedCapped = raw.length >= MAX_EVENTS
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
/* ์ํ์ ์ ํํ ๋ฟ์ผ๋ฉด **๋ ์์์ ์ ์๋ค** โ ๊ทธ ์ฌ์ค์ ๋๋ ค์ค๋ค. ์๋ฆฌ์ง ์๊ณ ์๋ผ๋ด๋ฉด ์ซ์๊ฐ ์๋ฆฌ์ง ์๊ณ
|
|
555
688
|
* ์์์ง๊ณ , ์ฌ์ฉ์๋ ๊ทธ๊ฒ์ ์ฑ๊ณผ ํ๋ฝ์ผ๋ก ์ฝ๋๋ค(๊ฐ์ฅ ๋์ ์ข
๋ฅ์ ๊ฑฐ์ง์ด๋ค). */
|
|
556
689
|
return {
|
|
557
690
|
/* ํด๋๋ ISO ๋ฌธ์์ด ์ถ์ผ๋ก ์ํ๋๋ค(kpi-fold) โ ๊ฒฝ๊ณ์์ ํ ๋ฒ๋ง ์ฎ๊ธด๋ค. */
|
|
558
691
|
events: raw.map(r => ({ eventType: r.eventType, eventTime: isoOf(r.eventTime), payload: jsonOf(r.payload) })),
|
|
559
|
-
capped:
|
|
692
|
+
capped: mergedCapped
|
|
560
693
|
}
|
|
561
694
|
}
|
|
562
695
|
|
|
@@ -594,15 +727,37 @@ function jsonOf(v: unknown): any {
|
|
|
594
727
|
/**
|
|
595
728
|
* ์ง๊ณ ๋์ ํธ์ ๋ชฉ๋ก.
|
|
596
729
|
*
|
|
597
|
-
* ๊ณต๊ฐ์ด ์ฃผ์ด์ง๋ฉด
|
|
730
|
+
* ๊ณต๊ฐ์ด ์ฃผ์ด์ง๋ฉด ๊ทธ ๊ณต๊ฐ์ **์ด์ ๋ชฉ์ ** ํธ์์ ๋ชจ์๋ค โ ๋ฒค์น ์ฌ๋ณธ์ ์ฌ์ฉ์๊ฐ ๋ณด๋ ํ์ฅ์ด ์๋๋ค.
|
|
598
731
|
* ํธ์์ด ์ง์ ๋๋ฉด ๊ทธ๊ฒ ํ๋. ๋ ๋ค ์์ผ๋ฉด ๋ฌด์์ ์ฌ์ผ ํ ์ง ์ ์ ์์ผ๋ฏ๋ก ๋ช
์ ์คํจํ๋ค.
|
|
732
|
+
*
|
|
733
|
+
* โโ **ใ์ง๊ธ ๋๋๊ฐใ๋ก ๊ฑธ๋ฌ๋ด์ง ์๋๋ค** (2026-08-28 ์ค์ธก) โโโโโโโโโโโโโโโโโโ
|
|
734
|
+
* ์ฌ๊ธฐ์ `running` ์กฐ๊ฑด์ด ์์๋ค. ๊ทธ๋์ ๋ฉ์ถ ํธ์์ ํ์ฅ์ผ๋ก ๋ฌผ์์ ๋ ๋์์์ ๋น ์ก๊ณ , ํ๋ฉด์
|
|
735
|
+
* ใ๊ธฐ๋ก์ด ์์ต๋๋คใ๋ผ๊ณ ๋งํ๋ค โ **์ ๋์๋ ์๋๋ฐ.**
|
|
736
|
+
*
|
|
737
|
+
* twinEventList(instanceId: "ems-plant-1") 1,792๊ฑด
|
|
738
|
+
* twinEventList(spaceId: "ems-plant-1-site") 0๊ฑด โ ๊ฐ์ ํธ์, ๊ฐ์ ๋๋ฉ์ธ
|
|
739
|
+
*
|
|
740
|
+
* ๊ท๋ชจ๋ก ๋ณด๋ฉด ์ด๊ฒ์ ์์ธ๊ฐ ์๋๋ผ ๊ธฐ๋ณธ๊ฐ์ด์๋ค: ๋ฑ๋ก๋ ํธ์ 30๊ฐ ์ค **๋๋ ๊ฒ์ด 2๊ฐ, ๋ฉ์ถ ๊ฒ์ด 28๊ฐ**๋ค.
|
|
741
|
+
* ์ฆ ํ์ฅ์ผ๋ก ๋ฌป๋ ์ ๋ ์กฐํ๊ฐ ๋๋ถ๋ถ์ ํ์ฅ์์ ๊ฑฐ์ง ใ์๋คใ๋ฅผ ๋๋ค.
|
|
742
|
+
*
|
|
743
|
+
* ์ง์ด ์ด์ ๋ ๋ ๊ฐ์ง๋ค.
|
|
744
|
+
*
|
|
745
|
+
* โ **์ ๋์ ๊ธฐ๋ก์ด๊ณ , ํ๋ก์ธ์ค๊ฐ ์ง๊ธ ๋๋์ง๋ ๋ค๋ฅธ ์ถ์ด๋ค.** ์ฐฝ ์์ ์๋ ์ฌ์ค์ ์ฌ์ค์ด๋ค.
|
|
746
|
+
* ์๋ ์ค์ด ํธ์์ ์ง์ ํ ๊ฒฝ์ฐ์ ๋ํด ์ด๋ฏธ ๊ทธ ์์น์ ์ ์ด ๋์๋ค(ใ์ ์งยท๋น๋ฑ๋ก์ด์ด๋ ์ ๋์ ๋จ์
|
|
747
|
+
* ์์ ์ ์๋คใ). ๊ฐ์ ์์น์ด ํ์ฅ ๊ฒฝ๋ก์๋ง ์ ์ฉ๋์ง ์๊ณ ์์๋ค.
|
|
748
|
+
* โก ์ ์ฃผ์์ด ๋๋ ์ด์ (ใ๋ฒค์น ์ฌ๋ณธ์ ์ฌ์ฉ์๊ฐ ๋ณด๋ ํ์ฅ์ด ์๋๋คใ)๋ **๋ฒค์น ์ ์ธ๋ง** ์ค๋ช
ํ๋ค.
|
|
749
|
+
* `running` ์๋ ๊ทผ๊ฑฐ๊ฐ ์ ํ ์์ง ์์๋ค.
|
|
750
|
+
*
|
|
751
|
+
* **๋ฐ๋๋ ๊ฒ**: ํ์ฅ KPI ๊ฐ ์ด์ ๋ฉ์ถ ํธ์์ ์ง๋ ๊ธฐ๋ก๋ ์ผ๋ค. ์ฐฝ ์์ ์ฌ์ค์ ์ธ๋ ๊ฒ์ด ๊ทธ ์งํ์
|
|
752
|
+
* ์ ์์ด๋ฏ๋ก ๊ทธ๊ฒ์ด ๋ง๋ค. ใ์ง๊ธ ๋๋ ๊ฒ๋งใ์ด ํ์ํ ํ๋ฉด์ด ์๊ธฐ๋ฉด ๊ทธ๋ **์ด๋ฆ ์๋ ์ถ**์ผ๋ก ๋ฐ๋๋ค โ
|
|
753
|
+
* ์ฌ๊ธฐ์ ์จ๊ฒจ ๋๋ฉด ๋ ๋ฌผ์์ด ํ ์นธ์ ์ด๋ค.
|
|
599
754
|
*/
|
|
600
755
|
async function resolveTargets(input: TwinKpiInput): Promise<{ instanceIds: string[]; restartPolicies: string[] }> {
|
|
601
756
|
if (!input.instanceId && !input.spaceId) throw new Error('either instanceId or spaceId is required')
|
|
602
757
|
const list = await TwinEngine.list(input.domainId)
|
|
603
758
|
const rows = input.instanceId
|
|
604
759
|
? list.filter((x: any) => x?.instanceId === input.instanceId)
|
|
605
|
-
: list.filter((x: any) => x?.
|
|
760
|
+
: list.filter((x: any) => x?.spaceId === input.spaceId && x.purpose !== 'bench' && x.instanceId)
|
|
606
761
|
/* ๋ชฉ๋ก์์ ๋ชป ์ฐพ์๋(์ ์งยท๋น๋ฑ๋ก) ์ง์ ๋ ํธ์์ ๊ทธ๋๋ก ์กฐํํ๋ค โ ์ ๋์ ๋จ์ ์์ ์ ์๋ค. */
|
|
607
762
|
const instanceIds = rows.length ? rows.map((x: any) => x.instanceId as string) : input.instanceId ? [input.instanceId] : []
|
|
608
763
|
/* ์ปฌ๋ผ์ด NOT NULL ์ด๋ผ 'unknown' ์ผ๋ก ๋ฉ์ธ ์ผ์ด ์๋ค โ ๋น๋ฉด ๊ณ์ฝ์ด ๊นจ์ง ๊ฒ์ด์ง ๋ชจ๋ฅด๋ ์ํ๊ฐ ์๋๋ค. */
|
|
@@ -677,12 +832,23 @@ export async function computeTwinKpi(input: TwinKpiInput): Promise<TwinKpiOutput
|
|
|
677
832
|
const feederMap = await resourceFeederMap(input.domainId, instanceIds)
|
|
678
833
|
/* ์๊ธ ๋จ๊ฐ๋ ์ถ๊ณผ ๋ฌด๊ดํ๊ฒ ์ฝ๋๋ค โ ๊ธ์ก์ ๊ฐ์ ์ฐฝ์ ์ ๋ ฅ๋ยท์ต๋์์์์ ๋์ค๋ ์ฌ์ค์ด๋ค. */
|
|
679
834
|
const tariffFound = await tariffOf(input.domainId, instanceIds)
|
|
835
|
+
/*
|
|
836
|
+
* โโ ์๊ธ์ ์ฉ์ ๋ ฅ์ **์ฒญ๊ตฌ์๊ฐ ๋จผ์ ๋ค** (2026-08-29) โโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
837
|
+
*
|
|
838
|
+
* ๊ทธ ๊ฐ์ ์ต๊ทผ ๋ช ๋ฌ์ ์ต๊ณ ์์๋ก **๋งค๋ฌ ๋ค์ ์ ํด์ง๋ค.** ์ ์ธ์ ๋ฐ์ ๋๋ฉด ๋งค๋ฌ ์ฌ๋์ด ๊ฐฑ์ ํด์ผ
|
|
839
|
+
* ํ๊ณ , ์ ํ๋ฉด ๋ก์ ๊ฐ์ผ๋ก ๊ธฐ๋ณธ์๊ธ์ด ์กฐ์ฉํ ํ๋ฆฐ๋ค.
|
|
840
|
+
*
|
|
841
|
+
* ์๋ณธ์ด ์ฒญ๊ตฌ์์ ๊ทธ ๊ฐ์ ์ค์ด ๋งค์ผ ๋ณด๋ธ๋ค. ์ฐฝ ๋ฐ์ ์ฒญ๊ตฌ์๋ ์ ๋ ์กฐํ์ ๊ฑธ๋ฆฌ์ง ์์ผ๋ฏ๋ก
|
|
842
|
+
* **์ปค๋ ์ํ์ ์ด์ด์ ธ ์๋ ๋ง์ง๋ง ์ฒญ๊ตฌ์**๋ฅผ ํจ๊ป ๋๊ธด๋ค(ยง`EnergyState.lastBill`).
|
|
843
|
+
*/
|
|
844
|
+
const lastBill = latestBillOf(input.domainId, instanceIds)
|
|
680
845
|
const kpi = foldKpi(events, { fromMs, toMs }, {
|
|
681
846
|
groupBy: input.groupBy,
|
|
682
847
|
locationArea: areaMap.locationArea,
|
|
683
848
|
resourceFeeder: feederMap.resourceFeeder,
|
|
684
849
|
meterFeeder: feederMap.meterFeeder,
|
|
685
850
|
...(tariffFound.tariff ? { tariff: tariffFound.tariff } : {}),
|
|
851
|
+
...(lastBill ? { lastBill } : {}),
|
|
686
852
|
...shiftCtx,
|
|
687
853
|
groupLimit: input.groupLimit
|
|
688
854
|
})
|
|
@@ -691,14 +857,14 @@ export async function computeTwinKpi(input: TwinKpiInput): Promise<TwinKpiOutput
|
|
|
691
857
|
*
|
|
692
858
|
* ํด๋๋ ์์ํ๋ค(๋ก๊ทธ๋ฅผ ๋ชจ๋ฅธ๋ค) โ ๊ทธ๋์ ๋ถ๋ฅด๋ ์ชฝ์ด ๋งํ๋ค. ์ ๋งํด์ผ ํ๋: ์ด ํด๋๋ ์ค๋์
|
|
693
859
|
* ์๋ฃ๋ฅผ **๋์์ด ๋ชฉ๋ก**์ผ๋ก ํ์ ํ๊ณ , ๊ทธ๊ฒ์ ์๋ณธ์ ๋ฑ๋ง์์ ๋ป์ ์ถ๋ก ํ๋ ๊ฒ์ด๋ค. ์ปค๋ฅํฐ๊ฐ
|
|
694
|
-
* ์๊ธฐ ํ๋ก ์ฎ๊ธฐ์ง ์์ผ๋ฉด ๊ทธ ๋ฑ๋ง์ด ๋ชฉ๋ก์ ์์ด **์๋ฃ๊ฐ
|
|
860
|
+
* ์๊ธฐ ํ๋ก ์ฎ๊ธฐ์ง ์์ผ๋ฉด ๊ทธ ๋ฑ๋ง์ด ๋ชฉ๋ก์ ์์ด **์๋ฃ๊ฐ ์๋ฆฌ์ง ์๊ณ 0 ์ผ๋ก ์ธ์ด์ง๋ค.**
|
|
695
861
|
*
|
|
696
862
|
* ์ค์ ๋ก ๊ทธ๋ฌ๋ค: ์ฒซ ์ค ์๋ณธ์ `FINISHED` ๊ฐ ๋ชฉ๋ก์ ์์ด ์๋ฃ ์ค๋๊ฐ ์ ๋ถ 0 ์ด์๊ณ , ์ฌ๋์ด ํ๋ฉด์
|
|
697
863
|
* ๋ณด๊ณ ์์ฌํด์์ผ ๋๋ฌ๋ฌ๋ค(๊ทธ ์ปค๋ฅํฐ์๋ ์ํ ํ๊ฐ ์ ์๋ผ **์์ผ๋ฉด์** ์ค๋ ๊ฒฝ๋ก์์ ์ฐ์ด์ง ์์๋ค).
|
|
698
864
|
* ๊ทธ๋ ๋ชฉ๋ก์ ๋ฑ๋ง์ ๋ํ ๊ฒ์ ๊ทธ ์ฌ์ค์ ๊ฐ๋ฆฐ ๋๋นต์ด์๋ค.
|
|
699
865
|
*
|
|
700
866
|
* ๊ทธ๋ฌ๋ ์ด ๋ก๊ทธ๋ ใ๋ชฉ๋ก์ ๋๋ ค๋ผใ๊ฐ ์๋๋ผ **ใ๊ทธ ์ปค๋ฅํฐ๊ฐ ์ฎ๊ธฐ์ง ์์๋คใ**๋ฅผ ๋ปํ๋ค. ํ๋ฉด์ ๋ณด์ง
|
|
701
|
-
* ์๋ ์ฌ๋๋ ์์์ผ ํ๋ฏ๋ก ๋ก๊ทธ์ ๋จ๊ธด๋ค โ
|
|
867
|
+
* ์๋ ์ฌ๋๋ ์์์ผ ํ๋ฏ๋ก ๋ก๊ทธ์ ๋จ๊ธด๋ค โ ๋ค์ด์จ ๊ฒ์ด ์๋ 0 ์ด ์ด ์์คํ
์์ ๊ฐ์ฅ ๋น์ผ ์นจ๋ฌต์ด๋ค.
|
|
702
868
|
*
|
|
703
869
|
* ์๋ฃ๊ฐ ํ๋๋ ์์ ๋๋ง ๋งํ๋ค: `picking` ์ฒ๋ผ ์๋ฃ๊ฐ ์๋ ๋ฑ๋ง์ด ์์ฌ ์๋ ๊ฒ์ ์ ์์ด๊ณ ,
|
|
704
870
|
* ๊ทธ๊ฒ๊น์ง ๋งค๋ฒ ๊ฒฝ๊ณ ํ๋ฉด ์ง์ง ์ ํธ๊ฐ ๋ฌปํ๋ค.
|
|
@@ -741,7 +907,7 @@ export async function computeTwinKpi(input: TwinKpiInput): Promise<TwinKpiOutput
|
|
|
741
907
|
for (const w of windows) {
|
|
742
908
|
const { events: pastEvents, capped: pastCapped } = await fetchEvents(input.domainId, instanceIds, w.fromMs, w.toMs, lookbackMs)
|
|
743
909
|
baseCapped = baseCapped || pastCapped
|
|
744
|
-
/* ์ถ ์์ด, **๊ฐ์ ๊ต๋ ์ ์**๋ก
|
|
910
|
+
/* ์ถ ์์ด, **๊ฐ์ ๊ต๋ ์ ์**๋ก ์ฒ๋ฆฌํ๋ค(์ ์๊ฐ ๋ค๋ฅด๋ฉด ๊ฐ์ ์๊ฐ๋๊ฐ ์๋๊ฒ ๋๋ค). */
|
|
745
911
|
const past = foldKpi(pastEvents, w, { locationArea: areaMap.locationArea, ...shiftCtx })
|
|
746
912
|
const values: Partial<Record<TwinMetricId, number | undefined>> = {}
|
|
747
913
|
for (const metric of Object.keys(TWIN_METRIC) as TwinMetricId[]) values[metric] = TWIN_METRIC[metric].of(past)
|
|
@@ -783,7 +949,7 @@ export async function computeTwinKpi(input: TwinKpiInput): Promise<TwinKpiOutput
|
|
|
783
949
|
}))
|
|
784
950
|
: undefined
|
|
785
951
|
|
|
786
|
-
/* ๋น๊ต ๊ตฌ๊ฐ โ **๊ฐ์ ๊ธธ์ดยท๊ฐ์ ๊ท์น**์ผ๋ก ํ ๋ฒ ๋
|
|
952
|
+
/* ๋น๊ต ๊ตฌ๊ฐ โ **๊ฐ์ ๊ธธ์ดยท๊ฐ์ ๊ท์น**์ผ๋ก ํ ๋ฒ ๋ ๊ณ์ฐํ๋ค. ๊ธฐ๋ก์ด ์์ผ๋ฉด delta ๋ฅผ ๋ง๋ค์ง ์๋๋ค
|
|
787
953
|
* (์๋ ๊ฒ์ 0 ์ผ๋ก ๊ทธ๋ฆฌ๋ฉด "๋ณํ ์์" ์ด๋ผ๋ ๊ฑฐ์ง์ด ๋๋ค). */
|
|
788
954
|
let comparison: TwinKpiOutput['comparison']
|
|
789
955
|
/* ๊ด์ ร ๋น๊ต ๊ต์ฐจ โ ์ถ๋ณ delta ์ **์ฌ๋ผ์ง ์ถ**(์ ์ ์์๊ณ ์ง๊ธ ์๋ ๊ฒ). */
|
|
@@ -799,13 +965,13 @@ export async function computeTwinKpi(input: TwinKpiInput): Promise<TwinKpiOutput
|
|
|
799
965
|
w.toMs,
|
|
800
966
|
lookbackMs
|
|
801
967
|
)
|
|
802
|
-
/* ์ถ์ด ์์ฒญ๋์ผ๋ฉด ๋น๊ต ๊ตฌ๊ฐ๋ **๊ฐ์ ์ถ**์ผ๋ก
|
|
968
|
+
/* ์ถ์ด ์์ฒญ๋์ผ๋ฉด ๋น๊ต ๊ตฌ๊ฐ๋ **๊ฐ์ ์ถ**์ผ๋ก ์ฒ๋ฆฌํ๋ค โ ๊ต์ฐจ("๊ตฌ์ญ๋ณ๋ก ์ด์ ๋๋น")๋ฅผ ๋ด๊ธฐ ์ํด.
|
|
803
969
|
* ์ํ์ ์ถ์ด ์๋ก ์ด๊ธ๋์ง ์๊ฒ ๋๋ํ ๋๋ค(ํ์ฌ ์ถ์ด ์ํ ์์ ์๋๋ฐ ๋น๊ต ์ถ์์ ๋ฐ๋ ค๋๋ฉด
|
|
804
970
|
* ์๋๋ฐ ์๋ค๊ณ ๋งํ๊ฒ ๋๋ค). */
|
|
805
971
|
const prev = foldKpi(prevEvents, w, {
|
|
806
972
|
groupBy: input.groupBy,
|
|
807
973
|
locationArea: areaMap.locationArea,
|
|
808
|
-
...shiftCtx, // ๋น๊ต ๊ตฌ๊ฐ๋ **๊ฐ์ ๊ต๋ ์ ์**๋ก
|
|
974
|
+
...shiftCtx, // ๋น๊ต ๊ตฌ๊ฐ๋ **๊ฐ์ ๊ต๋ ์ ์**๋ก ์ฒ๋ฆฌํ๋ค(์ ์๊ฐ ๋ค๋ฅด๋ฉด ์ถ์ด ์ด๊ธ๋๋ค)
|
|
809
975
|
groupLimit: input.groupBy ? 100 : undefined
|
|
810
976
|
})
|
|
811
977
|
prevCappedFlag = prevCapped
|
|
@@ -29,7 +29,7 @@ export function registerLiveFeedProbe(probe: LiveFeedProbe): void {
|
|
|
29
29
|
* ํผ๋๊ฐ ๋ถ์ด ์๋ โ ์ด๋ ์ฅ๋ถ๋ ๊ทธ๋ ๋ค๊ณ ํ๋ฉด ๊ทธ๋ ๋ค.
|
|
30
30
|
*
|
|
31
31
|
* ์ฅ๋ถ๊ฐ ํฐ์ง๋ ๊ฒ์ ์ด ํ์ ์ ์ฒด์ ์คํจ๋ก ๋ง๋ค์ง ์๋๋ค: ํ ๊ณ์ธต์ด ๋ตํ์ง ๋ชปํด๋ ๋ค๋ฅธ ๊ณ์ธต์ ์ฌ์ค์
|
|
32
|
-
* ๊ทธ๋๋ก ์ฐธ์ด๋ค. ๋ค๋ง
|
|
32
|
+
* ๊ทธ๋๋ก ์ฐธ์ด๋ค. ๋ค๋ง **์๋ฆฌ์ง ์๊ณ ๋๊ธฐ์ง ์๋๋ค** โ ๋ตํ์ง ๋ชปํ ์ฅ๋ถ๋ ๋ก๊ทธ์ ๋จ๊ธด๋ค.
|
|
33
33
|
*/
|
|
34
34
|
export function liveFeedAttached(instanceId: string): boolean {
|
|
35
35
|
for (const probe of probes) {
|
|
@@ -63,7 +63,7 @@ export interface LoadMeter {
|
|
|
63
63
|
overBudget: number
|
|
64
64
|
/**
|
|
65
65
|
* ๋ง์ง๋ง ๊ฒฝ๊ณ ์๊ฐ(ms). **ํ ๋ฒ๋ ์ ํ์ผ๋ฉด `-Infinity`** โ 0 ์ผ๋ก ๋๋ฉด "0 ์์ ์ ๊ฒฝ๊ณ ํ๋ค" ๊ฐ ๋์ด
|
|
66
|
-
* ์ฒซ ๋๋ฆฐ ํฑ์ด
|
|
66
|
+
* ์ฒซ ๋๋ฆฐ ํฑ์ด ์๋ฆฌ์ง ์๊ณ ์ง๋๊ฐ๋ค(๊ฒ์ฌ๊ฐ ๊ทธ๊ฒ์ ์ก์๋ค).
|
|
67
67
|
*/
|
|
68
68
|
lastWarnMs: number
|
|
69
69
|
}
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
*
|
|
26
26
|
* โโ ์ ๋ชจ๋ธ์ ๋ฐ๋ก ์ฐ์ง ์๊ณ ๊ฒน์ผ๋ก ๋๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
27
27
|
* ๋ชจ๋ธ์ **์์ฒ์ ์ฌ๋ณธ**์ด๋ค. ๋ค์ ์ฝ๊ธฐ(resync)๋ ๊ทธ ์ฌ๋ณธ์ ์๋ก ๊ทธ๋ฆฌ๋ฏ๋ก, ๋ชจ๋ธ์ ์ง์ ์ด ๊ฐ์ ๋ค์
|
|
28
|
-
* ๋ค์ ์ฝ๊ธฐ์์
|
|
28
|
+
* ๋ค์ ์ฝ๊ธฐ์์ **์ค๋ฅ ์์ด ์ฌ๋ผ์ง๋ค** โ ์๊ธ์ด ์ฌ๋ผ์ง๋ฉด ๊ธ์ก๋ ์ฌ๋ผ์ง๊ณ , ์ฌ์ฉ์๋ ์ด์ ๋ฅผ ์ ์ ์๋ค.
|
|
29
29
|
* ๊ทธ๋์ ๋ก์ปฌ ์ ์ธ์ ๋ฐ๋ก ๋ณด๊ดํ๊ณ , ๋ชจ๋ธ์ ๊ทธ๋ฆด ๋๋ง๋ค ๊ทธ ์์ ์น๋๋ค. ๋ค์ผ๋ก ใ๋๊ฐ ๋งํ ๊ฐ์ธ๊ฐใ์
|
|
30
30
|
* ๋ตํ ์ ์๋ค โ ์ด ์์คํ
์ด ๊ทผ๊ฑฐ๋ฅผ ๊ฐ๊ณผ ํจ๊ป ๋ค๋๊ฒ ํ๋ ๊ท์จ๊ณผ ๊ฐ๋ค(`basis`ยท`derived` ์ ํ ๊ฒฐ).
|
|
31
31
|
*
|
|
@@ -56,7 +56,7 @@ export interface LocalDeclaration {
|
|
|
56
56
|
/**
|
|
57
57
|
* ๋จ์(UN/CEFACT ์ฝ๋) โ **์ด๋ค ๊ฐ์ ๋จ์ ์์ด๋ ๋ป์ด ์๋ค.**
|
|
58
58
|
*
|
|
59
|
-
* ์๋๊ฐ ๊ทธ๋ ๋ค: ๋จ์๊ฐ ์์ผ๋ฉด ์ด๋ ์๊ฐ ์ถ์ ๊ธฐ๊ฐ ๊ทธ ์ค๋น๋ฅผ **๊ฑฐ์ ํ๋ค**(๊ทธ๋ฌ๋ฉด ๊ณต์ ์๊ฐ์ด
|
|
59
|
+
* ์๋๊ฐ ๊ทธ๋ ๋ค: ๋จ์๊ฐ ์์ผ๋ฉด ์ด๋ ์๊ฐ ์ถ์ ๊ธฐ๊ฐ ๊ทธ ์ค๋น๋ฅผ **๊ฑฐ์ ํ๋ค**(๊ทธ๋ฌ๋ฉด ๊ณต์ ์๊ฐ์ด ์๋ฆฌ์ง ์๊ณ
|
|
60
60
|
* ์ฌ๋ผ์ง๋ค). ๋ช
์ธ๊ฐ ๋จ์๋ฅผ ์๊ตฌํ๋ฉด(`uomChoices`) ๋ฐ๊ณ , ๊ทธ ๋ชฉ๋ก์ ์๋ ์ฝ๋๋ ๊ฑฐ์ ํ๋ค โ ์ฝ๋ ์ชฝ์ด
|
|
61
61
|
* ๋ชจ๋ฅด๋ ๋จ์๋ฅผ ๋ฐ์ ๋๋ฉด ํ๋ฉด์ ๋ฃ์๋ค๊ณ ๋งํ๊ณ ๊ณ์ฐ์ ๊ทธ ๊ฐ์ ๋ฒ๋ฆฐ๋ค.
|
|
62
62
|
*/
|
|
@@ -120,7 +120,7 @@ export interface RejectedDeclaration {
|
|
|
120
120
|
* ๊ทธ ์ด๋ฆ์ ๊ณต์ ์ ์ด ํธ์์์ ํ์ธํ ์ ์๋ค โ ์ปค๋์ด ๋๋ฆฐ ์ ๋ ์๊ณ ๋ช
์ธ ํ์๋ ์๋ค.
|
|
121
121
|
*
|
|
122
122
|
* ๊ณต์ ์ ์ธ์ ์๋ฆฌยท์ค๋น์ ๋ฌ๋ฆฌ **๋ชจ๋ธ์ ํ์ด ์์ด๋ ์ฑ๋ฆฝํ๋ค**(์ฐฝ๊ณ ยท์ผ๋์๋ ํ์ด ์์ ์๋ค).
|
|
123
|
-
* ๊ทธ๋์ ์คํ๋ฅผ ์ก์ ์ค ๊ฒ์ด ์ด๋ฆ ๋์กฐ๋ฟ์ด๋ค โ ๊ทธ๋ง์ ์์ผ๋ฉด ๊ฐ์
|
|
123
|
+
* ๊ทธ๋์ ์คํ๋ฅผ ์ก์ ์ค ๊ฒ์ด ์ด๋ฆ ๋์กฐ๋ฟ์ด๋ค โ ๊ทธ๋ง์ ์์ผ๋ฉด ๊ฐ์ ์๋ฆฌ์ง ์๊ณ ์๋ฌด ์ผ๋ ํ์ง ์๋๋ค.
|
|
124
124
|
*/
|
|
125
125
|
| 'unknown-operation'
|
|
126
126
|
/** ๋ฌด์์ ๊ธฐ๋ํ๋ โ ์ฌ๋์ด ๊ณ ์น ์ ์๊ฒ(๋ช
์ธ์ ๋ฌธ์ฅ). */
|
|
@@ -199,7 +199,7 @@ const COMMON_SPECS: DeclarablePropertySpec[] = [
|
|
|
199
199
|
*
|
|
200
200
|
* ํผ์ก 90%ยท๋ถ๋ 15%๋ ์ฐ๋ฆฌ๊ฐ ์ ํ ์์๋ค. ํต๋ก๋ฅผ 95%๋ก ์ฑ์ ์ฐ๋ ์ฐฝ๊ณ ๋ ๊ทธ ๊ธฐ์ค์์ ์๊ตฌํ ใ๋ณ๋ชฉใ
|
|
201
201
|
* ์ด๊ณ , ์ด๊ธฐ ๋ผ์ธ์ ๊ณ์ ใ๋ถ๋ ๊ณผ๋คใ๋ก ์ด๋ค โ ๊ทธ๋ ์ง์ง ๊ฒฝ๋ณด๋ ํจ๊ป ๋ฌปํ๋ค. ์ ์ธ์ด ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์
|
|
202
|
-
* ์ฐ๋ ์ฃผ์๊ฐ `basis: 'default'` ๋ก ๊ทธ ์ฌ์ค์ ๋ฐํ๋ค(
|
|
202
|
+
* ์ฐ๋ ์ฃผ์๊ฐ `basis: 'default'` ๋ก ๊ทธ ์ฌ์ค์ ๋ฐํ๋ค(์๋ฆฌ์ง ์๊ณ ๊ธฐ๋ณธ๊ฐ์ ์ง์ค๋ก ๋์ง ์๋๋ค).
|
|
203
203
|
*/
|
|
204
204
|
{
|
|
205
205
|
id: ATTENTION_PROPERTY.congestionRatio,
|
|
@@ -276,7 +276,7 @@ const COMMON_SPECS: DeclarablePropertySpec[] = [
|
|
|
276
276
|
* ๊ณต์ ๋ชจ์ ํ์ ํ ์นธ ๋ด๋๋ค โ **์ปค๋์ด ์ฝ๋ ํ๊ธฐ ๊ทธ๋๋ก**(์์จ 0..1, ์
์
ISO 8601).
|
|
277
277
|
*
|
|
278
278
|
* ํ๋ฅผ ํต์งธ๋ก ์๋ก ๋ง๋ค์ด ์น๋๋ค: ๊ฐ์ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฒน์ด ์ง๋๋ฏ๋ก(ํ์ฅ โ ํธ์) ๊ทธ๋๋ง๋ค ์ ๊ฐ์ฒด์ฌ์ผ
|
|
279
|
-
* ์ ๊ฒน์ ๊ฒ์
|
|
279
|
+
* ์ ๊ฒน์ ๊ฒ์ ์๋ฆฌ์ง ์๊ณ ๋ฎ์ด์ฐ์ง ์๋๋ค.
|
|
280
280
|
*/
|
|
281
281
|
function putParam(next: any, kind: string, paramId: string, value: string): void {
|
|
282
282
|
const table = { ...(next.localParams ?? {}) }
|
|
@@ -321,7 +321,7 @@ export function declarablePropertySpecs(kind: string | undefined): DeclarablePro
|
|
|
321
321
|
/**
|
|
322
322
|
* ๋ก์ปฌ ์ ์ธ์ ๊ฒ์ฌํ๋ค โ **๋ฐ์ ๊ฒ๊ณผ ๋ฐ์ง ์์ ๊ฒ์ ํจ๊ป** ๋๋ ค์ค๋ค.
|
|
323
323
|
*
|
|
324
|
-
*
|
|
324
|
+
* ์๋ฆฌ์ง ์๊ณ ๊ฑธ๋ฌ๋ด์ง ์๋ ์ด์ : ์ฌ์ฉ์๋ ๊ฐ์ ๋ฃ์๋ค๊ณ ๋ฏฟ๋๋ค. ๋ฌด์์ด ์ ๋น ์ก๋์ง ๋งํด์ผ ๊ณ ์น ์ ์๋ค.
|
|
325
325
|
*/
|
|
326
326
|
export function validateLocalDeclarations(
|
|
327
327
|
kind: string | undefined,
|
|
@@ -342,7 +342,7 @@ export function validateLocalDeclarations(
|
|
|
342
342
|
const target: DeclarationTarget = d?.target === 'equipment' ? 'equipment' : d?.target === 'operation' ? 'operation' : 'location'
|
|
343
343
|
const id = String(d?.id ?? '').trim()
|
|
344
344
|
if (!id) {
|
|
345
|
-
/* ์ด๋ ๋์์ธ์ง ๋ชจ๋ฅด๋ฉด ์น์ ์๋ฆฌ๊ฐ ์๋ค โ ๊ทธ ์ฌ์ค์ ๋งํ๋ค(
|
|
345
|
+
/* ์ด๋ ๋์์ธ์ง ๋ชจ๋ฅด๋ฉด ์น์ ์๋ฆฌ๊ฐ ์๋ค โ ๊ทธ ์ฌ์ค์ ๋งํ๋ค(์๋ฆฌ์ง ์๊ณ ๋ฒ๋ฆฌ์ง ์๋๋ค). */
|
|
346
346
|
rejected.push({ target, id: '', propertyId: '', reason: 'no-target-id' })
|
|
347
347
|
continue
|
|
348
348
|
}
|
|
@@ -449,7 +449,7 @@ export function mergeLocalDeclarations(
|
|
|
449
449
|
* ๊ณ ์ณ ๋ฃ์๋ค๋ ๊ฒ์ ใ์์ฒ์ ๊ฐ์ด ๋ก์๋คใ๋ ๋ป์ด๋ค. ๋ค๋ง ๊ทธ ์ฌ์ค์ด ๋ณด์ฌ์ผ ํ๋ฏ๋ก `source: 'local'` ๋ฅผ
|
|
450
450
|
* ๊ฐ์ ๋ถ์ธ๋ค โ ํ๋ฉดยท๊ฐ์ฌ๊ฐ ใ๋๊ฐ ๋งํ ๊ฐ์ธ๊ฐใ๋ฅผ ๋์ง์ ์ ์๋ค.
|
|
451
451
|
*
|
|
452
|
-
* ๋ชจ๋ธ์ ์๋ ๋์์ ์น์ผ๋ ค ํ๋ฉด
|
|
452
|
+
* ๋ชจ๋ธ์ ์๋ ๋์์ ์น์ผ๋ ค ํ๋ฉด **์๋ฆฌ์ง ์๊ณ ๋ฒ๋ฆฌ์ง ์๊ณ ** ๊ทธ ์ฌ์ค์ ๋๋ ค์ค๋ค(๊ตฌ์กฐ๊ฐ ๋ฐ๋์ด ๊ทธ ์ค๋น๊ฐ
|
|
453
453
|
* ์ฌ๋ผ์ก์ ์ ์๊ณ , ๊ทธ๋ ์ฌ์ฉ์์ ์ ์ธ์ ๊ฐ ๊ณณ์ด ์๋ค).
|
|
454
454
|
*/
|
|
455
455
|
export function applyLocalDeclarations<
|
|
@@ -461,7 +461,7 @@ export function applyLocalDeclarations<
|
|
|
461
461
|
model: T
|
|
462
462
|
missingTargets: { target: string; id: string }[]
|
|
463
463
|
/**
|
|
464
|
-
* ์ฝ์ ์ ์๋ ๊ฐ์ผ๋ก ๋ฐ๊ฟ ์ ์์๋ ์ ์ธ โ
|
|
464
|
+
* ์ฝ์ ์ ์๋ ๊ฐ์ผ๋ก ๋ฐ๊ฟ ์ ์์๋ ์ ์ธ โ **์๋ฆฌ์ง ์๊ณ ๋ฒ๋ฆฌ์ง ์๊ธฐ ์ํ ์๋ฆฌ.**
|
|
465
465
|
*
|
|
466
466
|
* ์ง๊ธ์ ๊ณต์ ์๊ฐ์์๋ง ๋๋ค(๋จ์๊ฐ ์๊ฑฐ๋ ์๊ฐ ์๋๋ฉด ISO 8601 ๊ธฐ๊ฐ์ ๋ง๋ค ์ ์๋ค). ๋ฌธ์์ ์ด๋ฏธ
|
|
467
467
|
* ๊ฒ์ฌํ๋ฏ๋ก ์ ์ ๊ฒฝ๋ก์์๋ ๋น์ด ์๊ณ , ์ ๊ฒน์ด๋ ์์ผ๋ก ๋ฃ์ ๋ฐ์ดํฐ์์ ๋๋ฌ๋๋ค.
|
|
@@ -504,7 +504,7 @@ export function applyLocalDeclarations<
|
|
|
504
504
|
*
|
|
505
505
|
* ๊ฒน์๋ ๋จ์๋ฅผ ๋ด๊ณ ๋ ๋ชจ๋ธ์ ์น์ ๋ ๋จ์ด๋จ๋ฆฌ๊ณ ์์๋ค โ ๊ทธ๋ฌ๋ฉด ์๋๋ฅผ ๋ฃ์ด๋ ์ด๋ ์๊ฐ ์ถ์ ๊ธฐ๊ฐ
|
|
506
506
|
* ๊ทธ ์ค๋น๋ฅผ **๋ฒ๋ฆฐ๋ค**(ใspeed has no unit of measureใ). ํ๋ฉด์ ใ๋ฃ์์ต๋๋คใ๋ผ๊ณ ๋งํ๊ณ ๊ณ์ฐ์
|
|
507
|
-
* ๊ทธ ๊ฐ์ ๋ชป ์ฐ๋, ๊ฐ์ฅ
|
|
507
|
+
* ๊ทธ ๊ฐ์ ๋ชป ์ฐ๋, ๊ฐ์ฅ ๋ค์ด์จ ๊ฒ์ด ์๋ ์ข
๋ฅ์ ๊ฒฐํจ์ด๋ค.
|
|
508
508
|
*/
|
|
509
509
|
const next = { id: p.id, value: String(p.value), ...((p as any).uom ? { uom: String((p as any).uom) } : {}), source: 'local' as const }
|
|
510
510
|
if (at >= 0) props[at] = { ...props[at], ...next }
|
|
@@ -531,7 +531,7 @@ export function applyLocalDeclarations<
|
|
|
531
531
|
const uom = String((p as any).uom ?? '')
|
|
532
532
|
/*
|
|
533
533
|
* ๊ฐ์ **์ปค๋์ด ์ฝ๋ ํ๊ธฐ๋ก** ๋ฐ๊ฟ ๋ด๋๋ค โ ์๊ฐ์ ISO 8601, ์์จ์ ๋น์จ(0..1).
|
|
534
|
-
* ๋ฐ๊ฟ ์ ์์ผ๋ฉด ๋ด์ง ์๊ณ ๊ทธ ์ฌ์ค์ ๋ธ๋ค(
|
|
534
|
+
* ๋ฐ๊ฟ ์ ์์ผ๋ฉด ๋ด์ง ์๊ณ ๊ทธ ์ฌ์ค์ ๋ธ๋ค(์๋ฆฌ์ง ์๊ณ 0 ์ด๋ ๋น ๊ฐ์ผ๋ก ๋ง๋ค์ง ์๋๋ค).
|
|
535
535
|
*/
|
|
536
536
|
if (p.id === OPERATION_PROPERTY.duration) {
|
|
537
537
|
const iso = isoDurationOf(p.value, uom)
|
|
@@ -596,7 +596,7 @@ export interface RevokedDeclaration extends DeclarationRevocation {
|
|
|
596
596
|
/**
|
|
597
597
|
* ๊ฒน์์ ์ ์ธ์ **๋บ๋ค** โ ๊ฐ์ ๋ฃ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ๊ฒฐ์ ์ด๋ฏ๋ก ๋ค๋ฅธ ๋ฌธ์ด๋ค.
|
|
598
598
|
*
|
|
599
|
-
* ์๋ ๊ฒ์ ๋บ๋ค๊ณ ๋งํ์ง ์๋๋ค: ๊ฒน์ ์๋ ๋์ยท์์ฑ์ `notFound` ๋ก ๋๋ ค์ค๋ค(
|
|
599
|
+
* ์๋ ๊ฒ์ ๋บ๋ค๊ณ ๋งํ์ง ์๋๋ค: ๊ฒน์ ์๋ ๋์ยท์์ฑ์ `notFound` ๋ก ๋๋ ค์ค๋ค(์๋ฆฌ์ง ์๊ณ ์ฑ๊ณตํ๋ฉด
|
|
600
600
|
* ์ฌ์ฉ์๋ ์ง์ ๋ค๊ณ ๋ฏฟ๊ณ ๊ฐ์ ๊ทธ๋๋ก ๋จ๋๋ค โ ๊ฐ์ฅ ๋น์ผ ์ข
๋ฅ์ ์นจ๋ฌต์ด๋ค).
|
|
601
601
|
*
|
|
602
602
|
* ์์ฑ์ด ํ๋๋ ๋จ์ง ์์ ๋์์ ๊ฒน์์ ์ฌ๋ผ์ง๋ค(๋น ๊ป๋ฐ๊ธฐ๋ฅผ ๋จ๊ธฐ์ง ์๋๋ค).
|
|
@@ -750,7 +750,7 @@ export function applyDeclarationLayers<
|
|
|
750
750
|
instanceLayerApplied: LocalDeclaration[]
|
|
751
751
|
/** ๊ฐ ๊ณณ์ด ์๋ ๋์ โ ์ด๋ ๋ฒ์์์ ๋ฌ๋์ง ํจ๊ป ๋ธ๋ค(ํ์ฅ ๊ฒน์ ๊ทธ ํธ์์ ์์ ์ ์๋ค). */
|
|
752
752
|
missingTargets: { scope: DeclarationScope; target: string; id: string }[]
|
|
753
|
-
/** ์ฝ์ ์ ์๋ ๊ฐ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ ์ ์ธ โ ๋ฒ์์ ํจ๊ป(
|
|
753
|
+
/** ์ฝ์ ์ ์๋ ๊ฐ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ ์ ์ธ โ ๋ฒ์์ ํจ๊ป(์๋ฆฌ์ง ์๊ณ ๋ฒ๋ฆฌ์ง ์๋๋ค). */
|
|
754
754
|
unreadable: { scope: DeclarationScope; target: string; id: string; propertyId: string }[]
|
|
755
755
|
} {
|
|
756
756
|
const first = applyLocalDeclarations(model, spaceLayer)
|
package/server/engine/log.ts
CHANGED
|
@@ -46,7 +46,7 @@ export function stamp(at: Date = new Date()): string {
|
|
|
46
46
|
* ์ธ์ ์ฌ๋ฟ์ ํ ์ค๋ก โ **์ด๋ค ์ธ์๋ ๋ฒ๋ฆฌ์ง ์๋๋ค.**
|
|
47
47
|
*
|
|
48
48
|
* `console.error(msg, err)` ์ฒ๋ผ ์ฐ๋ ์๋ฆฌ๊ฐ ๋ง๋ค. ํ๋ ์์ํฌ ๋ก๊ฑฐ์ ๊ทธ๋๋ก ๋๊ธฐ๋ฉด ๋ ๋ฒ์งธ ์ธ์๋
|
|
49
|
-
* meta ๋ก ๋ค์ด๊ฐ ์ฐ๋ฆฌ ํ์(`message` ๋ง ์ฐ๋๋ค)์์
|
|
49
|
+
* meta ๋ก ๋ค์ด๊ฐ ์ฐ๋ฆฌ ํ์(`message` ๋ง ์ฐ๋๋ค)์์ **์ค๋ฅ ์์ด ์ฌ๋ผ์ง๋ค.** ๊ทธ๋์ ์ฌ๊ธฐ์ ๋ฌธ์์ด๋ก ํธ๋ค.
|
|
50
50
|
* ์ค๋ฅ๋ ์คํ๊น์ง โ ์คํ์ด ์์ผ๋ฉด ใ์ด๋์ ๋ฌ๋ใ๋ฅผ ์๋๋ค.
|
|
51
51
|
*/
|
|
52
52
|
export function line(args: unknown[]): string {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* - ํ๋ณธ์ด ์ ์ผ๋ฉด ์ฐ์ง ์๋๋ค(`minSamples`). ํ๋ ๊ฑด์ p50 ์ ๊ทธ ํ์ฅ์ ๊ฐ์ด ์๋๋ค.
|
|
19
19
|
* - 'unknown' ์ถ์ ์ฐ์ง ์๋๋ค โ ์ข
๋ฅ๋ฅผ ๋ชจ๋ฅด๋ ๊ธฐ๋ก์ ํน์ ์ข
๋ฅ์ ๊ทผ๊ฑฐ๋ก ์ผ์ ์ ์๋ค.
|
|
20
20
|
* - ํผ์ง์ด ์ฑ๋ฆฝํ์ง ์์ผ๋ฉด(p10 โฅ p90, ๋๋ 0) **ํผ์ง ์์ด ํ๊ท ๋ง** ๋๊ธด๋ค. ์๋ ํ๋ค๋ฆผ์ ๋ง๋ค์ง ์๋๋ค.
|
|
21
|
-
* - ๋ฌด์์ ๋ฐฐ์ ๊ณ ๋ฌด์์ ํ๋ณธ ๋ถ์กฑ์ผ๋ก ๋ฒ๋ ธ๋์ง ํจ๊ป ๋ธ๋ค(
|
|
21
|
+
* - ๋ฌด์์ ๋ฐฐ์ ๊ณ ๋ฌด์์ ํ๋ณธ ๋ถ์กฑ์ผ๋ก ๋ฒ๋ ธ๋์ง ํจ๊ป ๋ธ๋ค(์๋ฆฌ์ง ์๊ณ ์ผ๋ถ๋ง ๋ฐ์ํ์ง ์๋๋ค).
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
/** ์ปค๋ `DurationEstimate` ์ ๊ฐ์ ๋ชจ์(์ปค๋ ํ์
์ ์์กดํ์ง ์๊ธฐ ์ํด ๊ตฌ์กฐ๋ก ๋ง์ถ๋ค). */
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* ์ฌ๊ธฐ์๋ `good + scrap` ๋ง ์ด๋ค โ `tasks` ๋ฅผ ๋ถ๋ชจ๋ก ์ฐ๋ฉด ์ด๋ยท์ฒด๋ฅ๊ฐ ์์ฌ ์ํ๋ฅ ์ด ๋ฎ๊ฒ ๋์จ๋ค.
|
|
19
19
|
* - **0 ๋ ์ฌ์ค์ด๋ค.** ์ ๋ถ ๋ถ๋์ด๋ฉด 0 ์ ๋ฐฐ์ด๋ค(๊ทธ ํ์ฅ์ด ๊ทธ๋ฌ๋ค). ใ๊ฐ์ด ์๋คใ์ ๊ตฌ๋ณํด ๋ค๋ฃฌ๋ค โ
|
|
20
20
|
* ์ปค๋์ด `0` ์ ๋ฐ์ผ๋ฉด ์ ๋ ๋ถ๋์ผ๋ก ๊ตด๋ฌ๊ฐ๊ณ , ๊ทธ๊ฒ์ด ๊ด์ธก๊ณผ ๊ฐ์ ๊ฒฐ๋ก ์ด๋ค.
|
|
21
|
-
* - ๋ฌด์์ ๋ฐฐ์ ๊ณ ๋ฌด์์ ํ๋ณธ ๋ถ์กฑ์ผ๋ก ๋ฒ๋ ธ๋์ง ํจ๊ป ๋ธ๋ค(
|
|
21
|
+
* - ๋ฌด์์ ๋ฐฐ์ ๊ณ ๋ฌด์์ ํ๋ณธ ๋ถ์กฑ์ผ๋ก ๋ฒ๋ ธ๋์ง ํจ๊ป ๋ธ๋ค(์๋ฆฌ์ง ์๊ณ ์ผ๋ถ๋ง ๋ฐ์ํ์ง ์๋๋ค).
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
/** ์ปค๋ `YieldEstimator` ์ ๊ฐ์ ๋ชจ์(์ปค๋ ํ์
์ ์์กดํ์ง ์๊ธฐ ์ํด ๊ตฌ์กฐ๋ก ๋ง์ถ๋ค). */
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* ์ฃผ๋ฉด **์ด์ค ๋ณด์ **์ด ๋์ด ์ ํ๋๊ฐ ๋๋น ์ง๋ค. ํ์ต ์์ ์ accAfter ๋ ๋๋ ์ ํจํ์ง ์๋ค.
|
|
8
8
|
*
|
|
9
9
|
* ๊ทธ๋์ ๋ณด์ ๊ธฐ๋ก์ **๊ทธ๋ ๋ชจ๋ธ์ ๊ทผ๊ฑฐ**๋ฅผ ํจ๊ป ๋จ๊ธฐ๊ณ , ์ ์ฉ ์ ์ ์ง๊ธ ๊ทผ๊ฑฐ์ ๋น๊ตํ๋ค. ๋ฌ๋ผ์ก์ผ๋ฉด
|
|
10
|
-
* ์ ์ฉํ์ง ์๊ณ **๊ทธ ์ฌ์ค์ ์๋ต์ ์ฃ๋๋ค**(
|
|
10
|
+
* ์ ์ฉํ์ง ์๊ณ **๊ทธ ์ฌ์ค์ ์๋ต์ ์ฃ๋๋ค**(์ค๋ฅ ์์ด ์ฌ๋ผ์ง๋ฉด ์ฌ์ฉ์๋ ํ์ต์ด ์ ์ ๋ฃ๋์ง ๋ชจ๋ฅธ๋ค).
|
|
11
11
|
*
|
|
12
12
|
* ๋น๊ต๋ **์๋ ํ์ฉ์ค์ฐจ**๋ก ํ๋ค(์์ํ ์ง๋ฌธ์ด ์๋๋ผ). ์ค์ธก p50 ์ ์ ๊ธฐ๋ก์ด ์์ผ ๋๋ง๋ค 1~2์ด์ฉ
|
|
13
13
|
* ํ๋ค๋ฆฌ๋๋ฐ, ๊ฐ์ ๋ฒํท์ผ๋ก ํฉ์ณ ๋น๊ตํ๋ฉด ๋ฒํท ๊ฒฝ๊ณ์ ๊ฑธ๋ฆฐ ๊ฐ์ด 1์ด ๋๋ฆฌํํธ๋ก๋ ๋ฌ๋ผ์ ธ ๋ฒ๋ฆฐ๋ค โ
|
|
@@ -40,7 +40,7 @@ export interface ModelBasis {
|
|
|
40
40
|
* ์ ์ธ๋ ๊ณต์ โ key + ISO 8601 ์๋ฌธ(๋ฌธ์์ด์ ๊ทธ๋๋ก ๋น๊ตํ๋ค: ์ ์ธ์ด ๋ฐ๋๋ฉด ๋ค๋ฅธ ๋ชจ๋ธ).
|
|
41
41
|
*
|
|
42
42
|
* **๋ณ๋ํญ๋ ์ง๋ฌธ์ ๋ ๋ค.** ๋ณ๋ํญ์ด ํ์ฉ์ค์ฐจ๋ฅผ ์ ํ๋ฏ๋ก(ยงtoleranceOf), ๊ทธ๊ฒ์ด ๋ฐ๋์๋๋ฐ "๊ฐ์ ๋ชจ๋ธ"
|
|
43
|
-
* ์ด๋ผ๊ณ ํ๋ฉด ํ์ ์ ์ฃ๋๊ฐ
|
|
43
|
+
* ์ด๋ผ๊ณ ํ๋ฉด ํ์ ์ ์ฃ๋๊ฐ ์๋ฆฌ์ง ์๊ณ ๋ฐ๋ ์ฑ๋ก ํ์ต์ด ์ด์ด์ง๋ค.
|
|
44
44
|
*/
|
|
45
45
|
declared?: DeclaredOperation[]
|
|
46
46
|
}
|