@pisell/private-materials 6.12.167 → 6.12.169
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/build/lowcode/assets-daily.json +11 -11
- package/build/lowcode/assets-dev.json +2 -2
- package/build/lowcode/assets-prod.json +11 -11
- package/build/lowcode/meta.js +1 -1
- package/build/lowcode/render/default/view.css +1 -1
- package/build/lowcode/render/default/view.js +10 -10
- package/build/lowcode/view.css +1 -1
- package/build/lowcode/view.js +10 -10
- package/es/components/HDLKiosk/{contracts → app/contracts}/config.js +1 -1
- package/es/components/HDLKiosk/app/manifest.js +11 -11
- package/es/components/HDLKiosk/app/operations.js +92 -0
- package/es/components/HDLKiosk/app/workflow/barcode.js +11 -13
- package/es/components/HDLKiosk/app/workflow/index.js +16 -0
- package/es/components/HDLKiosk/app/workflow/predicates.js +1 -1
- package/es/components/HDLKiosk/app/workflow/quick.js +1 -1
- package/es/components/HDLKiosk/app/workflow/registry.js +4 -4
- package/es/components/HDLKiosk/app/workflow/scale.js +5 -1
- package/es/components/HDLKiosk/docs/00-/346/226/207/344/273/266/345/257/274/350/210/252.md +104 -167
- package/es/components/HDLKiosk/docs/01-/346/240/270/345/277/203/350/277/220/350/241/214/346/234/272/345/210/266.md +105 -101
- package/es/components/HDLKiosk/docs/03-/344/270/232/345/212/241/346/265/201/347/250/213/344/270/216/344/272/244/344/272/222/350/247/204/345/210/231.md +2 -2
- package/es/components/HDLKiosk/docs/04-/350/256/276/345/244/207/344/270/216/347/247/260/351/207/215.md +43 -26
- package/es/components/HDLKiosk/docs/05-/344/272/244/346/230/223/345/256/211/345/205/250.md +2 -0
- package/es/components/HDLKiosk/docs/07-/345/220/216/347/273/255/345/267/245/344/275/234.md +1 -1
- package/es/components/HDLKiosk/docs/08-/346/227/240/345/244/264Application/350/277/220/350/241/214/346/227/266/351/207/215/346/236/204/350/256/276/350/256/241.md +719 -0
- package/es/components/HDLKiosk/docs/09-Entry/350/256/276/345/244/207/344/272/213/344/273/266/351/207/215/346/236/204/344/277/256/345/244/215/346/212/245/345/221/212.md +187 -0
- package/es/components/HDLKiosk/docs/README.md +6 -2
- package/es/components/HDLKiosk/docs//345/256/236/346/226/275/350/277/233/345/272/246.md +8 -7
- package/es/components/HDLKiosk/docs//346/236/266/346/236/204/350/256/276/350/256/241.md +16 -18
- package/es/components/HDLKiosk/index.js +22 -28
- package/es/components/HDLKiosk/index.less +1 -1
- package/es/components/HDLKiosk/kernel/README.md +14 -13
- package/es/components/HDLKiosk/kernel/application/defineApplication.js +63 -24
- package/es/components/HDLKiosk/kernel/application/defineSlice.js +6 -6
- package/es/components/HDLKiosk/kernel/application/runtime.js +237 -0
- package/es/components/HDLKiosk/kernel/operations/coordinator.js +1 -1
- package/es/components/HDLKiosk/kernel/operations/registry.js +3 -3
- package/es/components/HDLKiosk/kernel/operations/sessionEpoch.js +1 -1
- package/es/components/HDLKiosk/kernel/operations/types.js +7 -3
- package/es/components/HDLKiosk/kernel/workflow/actor.js +51 -22
- package/es/components/HDLKiosk/kernel/workflow/compiler.js +23 -30
- package/es/components/HDLKiosk/runtime/createRuntime.js +238 -0
- package/es/components/HDLKiosk/{devices → runtime/devices}/dedupeStore.js +1 -1
- package/es/components/HDLKiosk/{devices → runtime/devices}/scaleIngress.js +1 -1
- package/es/components/HDLKiosk/{devices/scale/runtime.js → runtime/devices/scaleStore.js} +18 -24
- package/es/components/HDLKiosk/{devices → runtime/devices}/scannerIngress.js +1 -1
- package/es/components/HDLKiosk/runtime/devices/scannerSessionPort.js +60 -0
- package/es/components/HDLKiosk/runtime/devices/scannerSessionRouter.js +212 -0
- package/es/components/HDLKiosk/runtime/operations/barcode.js +18 -0
- package/es/components/HDLKiosk/runtime/operations/cart.js +44 -0
- package/es/components/HDLKiosk/{app → runtime}/operations/cartConsistency.js +1 -1
- package/es/components/HDLKiosk/{app → runtime}/operations/checkout.js +95 -110
- package/es/components/HDLKiosk/{app → runtime}/operations/checkoutRequirements.js +1 -1
- package/es/components/HDLKiosk/{app → runtime}/operations/checkoutSafety.js +1 -1
- package/es/components/HDLKiosk/{app → runtime}/operations/coordinator.js +2 -2
- package/es/components/HDLKiosk/runtime/operations/customization.js +70 -0
- package/es/components/HDLKiosk/{app → runtime}/operations/errors.js +1 -1
- package/es/components/HDLKiosk/runtime/operations/fulfillment.js +6 -0
- package/es/components/HDLKiosk/runtime/operations/identity.js +55 -0
- package/es/components/HDLKiosk/runtime/operations/registry.js +34 -0
- package/es/components/HDLKiosk/runtime/operations/session.js +29 -0
- package/es/components/HDLKiosk/runtime/operations/types.js +13 -0
- package/es/components/HDLKiosk/runtime/session/blockPolicy.js +14 -0
- package/es/components/HDLKiosk/runtime/{createWorkflowSession.js → session/createSession.js} +67 -17
- package/es/components/HDLKiosk/runtime/{domainTransitionRunner.js → session/transitionRunner.js} +10 -5
- package/es/components/HDLKiosk/runtime/{workflowContext.js → session/workflowContext.js} +2 -2
- package/es/components/HDLKiosk/runtime/{workflowLifecycle.js → session/workflowLifecycle.js} +2 -2
- package/es/components/HDLKiosk/runtime/triggers.js +28 -0
- package/es/components/HDLKiosk/slices/catalog/Screen/index.js +15 -8
- package/es/components/HDLKiosk/slices/catalog/Screen/index.less +74 -13
- package/es/components/HDLKiosk/slices/catalog/slice.js +2 -2
- package/es/components/HDLKiosk/slices/customization/Screen/index.js +37 -38
- package/es/components/HDLKiosk/slices/customization/Screen/index.less +5 -0
- package/es/components/HDLKiosk/slices/customization/slice.js +3 -4
- package/es/components/HDLKiosk/slices/fulfillment/slice.js +2 -2
- package/es/components/HDLKiosk/slices/fulfillment/view.js +1 -1
- package/es/components/HDLKiosk/slices/identity/Screen/index.js +2 -2
- package/es/components/HDLKiosk/slices/identity/slice.js +3 -3
- package/es/components/HDLKiosk/slices/identity/view.js +1 -1
- package/es/components/HDLKiosk/slices/payment/slice.js +3 -3
- package/es/components/HDLKiosk/slices/primaryProductPrompt/slice.js +2 -2
- package/es/components/HDLKiosk/slices/primaryProductPrompt/view.js +2 -2
- package/es/components/HDLKiosk/{runtime → ui}/HDLKioskWorkflowView.js +45 -131
- package/es/components/HDLKiosk/ui/ScaleSimulatorConsole/index.js +387 -0
- package/es/components/HDLKiosk/ui/ScaleSimulatorConsole/index.less +621 -0
- package/es/components/HDLKiosk/{app → ui}/ScreenRenderer.js +7 -7
- package/es/components/HDLKiosk/ui/controllers/useHDLKioskActionDispatcher.js +66 -0
- package/es/components/HDLKiosk/{runtime → ui}/controllers/useHDLKioskCustomerController.js +1 -1
- package/es/components/HDLKiosk/ui/controllers/useHDLKioskDeviceController.js +25 -0
- package/es/components/HDLKiosk/ui/controllers/useHDLKioskExitController.js +53 -0
- package/es/components/HDLKiosk/{runtime → ui}/controllers/useHDLKioskScreenData.js +1 -1
- package/es/components/HDLKiosk/ui/controllers/useHDLKioskSessionController.js +39 -0
- package/es/components/HDLKiosk/{app → ui}/entry/Screen/index.js +8 -6
- package/es/components/HDLKiosk/{app → ui}/entry/model.js +2 -2
- package/es/components/HDLKiosk/ui/scale.js +20 -0
- package/es/components/HDLKiosk/{runtime/useHostSnapshot.js → ui/snapshots.js} +6 -8
- package/es/components/HDLKiosk/{app → ui}/views.js +1 -1
- package/es/components/HDLKiosk/{runtime → ui}/workflowEvent.js +1 -1
- package/es/components/HDLKiosk/utils.js +4 -4
- package/es/components/bigSale/templates/HDLKiosk/adapter/HDLKioskPaymentRuntime.js +2 -1
- package/es/components/bigSale/templates/HDLKiosk/adapter/capabilities.js +1 -1
- package/es/components/bigSale/templates/HDLKiosk/adapter/projection.js +21 -11
- package/es/components/bigSale/templates/HDLKiosk/adapter/sales.js +21 -3
- package/es/components/bigSale/templates/HDLKiosk/adapter/scaleTrigger.js +20 -5
- package/es/components/bigSale/templates/HDLKiosk/adapter/useBigSaleHDLKioskHost.js +3 -0
- package/es/components/bigSale/templates/HDLKiosk/index.js +3 -3
- package/lib/components/HDLKiosk/{contracts → app/contracts}/config.js +1 -1
- package/lib/components/HDLKiosk/app/manifest.js +18 -19
- package/lib/components/HDLKiosk/app/operations.js +105 -0
- package/lib/components/HDLKiosk/app/workflow/barcode.js +11 -13
- package/lib/components/HDLKiosk/app/workflow/index.js +16 -0
- package/lib/components/HDLKiosk/app/workflow/predicates.js +1 -0
- package/lib/components/HDLKiosk/app/workflow/quick.js +1 -1
- package/lib/components/HDLKiosk/app/workflow/registry.js +3 -3
- package/lib/components/HDLKiosk/app/workflow/scale.js +5 -1
- package/lib/components/HDLKiosk/docs/00-/346/226/207/344/273/266/345/257/274/350/210/252.md +104 -167
- package/lib/components/HDLKiosk/docs/01-/346/240/270/345/277/203/350/277/220/350/241/214/346/234/272/345/210/266.md +105 -101
- package/lib/components/HDLKiosk/docs/03-/344/270/232/345/212/241/346/265/201/347/250/213/344/270/216/344/272/244/344/272/222/350/247/204/345/210/231.md +2 -2
- package/lib/components/HDLKiosk/docs/04-/350/256/276/345/244/207/344/270/216/347/247/260/351/207/215.md +43 -26
- package/lib/components/HDLKiosk/docs/05-/344/272/244/346/230/223/345/256/211/345/205/250.md +2 -0
- package/lib/components/HDLKiosk/docs/07-/345/220/216/347/273/255/345/267/245/344/275/234.md +1 -1
- package/lib/components/HDLKiosk/docs/08-/346/227/240/345/244/264Application/350/277/220/350/241/214/346/227/266/351/207/215/346/236/204/350/256/276/350/256/241.md +719 -0
- package/lib/components/HDLKiosk/docs/09-Entry/350/256/276/345/244/207/344/272/213/344/273/266/351/207/215/346/236/204/344/277/256/345/244/215/346/212/245/345/221/212.md +187 -0
- package/lib/components/HDLKiosk/docs/README.md +6 -2
- package/lib/components/HDLKiosk/docs//345/256/236/346/226/275/350/277/233/345/272/246.md +8 -7
- package/lib/components/HDLKiosk/docs//346/236/266/346/236/204/350/256/276/350/256/241.md +16 -18
- package/lib/components/HDLKiosk/index.js +25 -31
- package/lib/components/HDLKiosk/index.less +1 -1
- package/lib/components/HDLKiosk/kernel/README.md +14 -13
- package/lib/components/HDLKiosk/kernel/application/defineApplication.js +65 -25
- package/lib/components/HDLKiosk/kernel/application/defineSlice.js +6 -6
- package/lib/components/HDLKiosk/kernel/application/runtime.js +237 -0
- package/lib/components/HDLKiosk/kernel/operations/coordinator.js +1 -1
- package/lib/components/HDLKiosk/kernel/operations/registry.js +3 -3
- package/lib/components/HDLKiosk/kernel/operations/sessionEpoch.js +1 -1
- package/lib/components/HDLKiosk/kernel/operations/types.js +8 -3
- package/lib/components/HDLKiosk/kernel/workflow/actor.js +51 -22
- package/lib/components/HDLKiosk/kernel/workflow/compiler.js +23 -30
- package/lib/components/HDLKiosk/runtime/createRuntime.js +239 -0
- package/lib/components/HDLKiosk/{devices → runtime/devices}/dedupeStore.js +1 -1
- package/lib/components/HDLKiosk/{devices → runtime/devices}/scaleIngress.js +1 -1
- package/lib/components/HDLKiosk/{devices/scale/runtime.js → runtime/devices/scaleStore.js} +17 -27
- package/lib/components/HDLKiosk/{devices → runtime/devices}/scannerIngress.js +1 -1
- package/lib/components/HDLKiosk/runtime/devices/scannerSessionPort.js +60 -0
- package/lib/components/HDLKiosk/runtime/devices/scannerSessionRouter.js +212 -0
- package/lib/components/HDLKiosk/runtime/operations/barcode.js +17 -0
- package/lib/components/HDLKiosk/runtime/operations/cart.js +46 -0
- package/lib/components/HDLKiosk/{app → runtime}/operations/cartConsistency.js +1 -1
- package/lib/components/HDLKiosk/{app → runtime}/operations/checkout.js +97 -112
- package/lib/components/HDLKiosk/{app → runtime}/operations/checkoutRequirements.js +1 -1
- package/lib/components/HDLKiosk/{app → runtime}/operations/checkoutSafety.js +1 -1
- package/lib/components/HDLKiosk/{app → runtime}/operations/coordinator.js +2 -2
- package/lib/components/HDLKiosk/runtime/operations/customization.js +73 -0
- package/lib/components/HDLKiosk/{app → runtime}/operations/errors.js +1 -1
- package/lib/components/HDLKiosk/runtime/operations/fulfillment.js +5 -0
- package/lib/components/HDLKiosk/runtime/operations/identity.js +55 -0
- package/lib/components/HDLKiosk/runtime/operations/registry.js +34 -0
- package/lib/components/HDLKiosk/runtime/operations/session.js +30 -0
- package/lib/components/HDLKiosk/runtime/operations/types.js +14 -0
- package/lib/components/HDLKiosk/runtime/session/blockPolicy.js +14 -0
- package/lib/components/HDLKiosk/runtime/{createWorkflowSession.js → session/createSession.js} +71 -21
- package/lib/components/HDLKiosk/runtime/{domainTransitionRunner.js → session/transitionRunner.js} +10 -5
- package/lib/components/HDLKiosk/runtime/{workflowContext.js → session/workflowContext.js} +2 -2
- package/lib/components/HDLKiosk/runtime/{workflowLifecycle.js → session/workflowLifecycle.js} +2 -2
- package/lib/components/HDLKiosk/runtime/triggers.js +28 -0
- package/lib/components/HDLKiosk/slices/catalog/Screen/index.js +15 -8
- package/lib/components/HDLKiosk/slices/catalog/Screen/index.less +74 -13
- package/lib/components/HDLKiosk/slices/catalog/slice.js +3 -3
- package/lib/components/HDLKiosk/slices/customization/Screen/index.js +38 -39
- package/lib/components/HDLKiosk/slices/customization/Screen/index.less +5 -0
- package/lib/components/HDLKiosk/slices/customization/slice.js +5 -6
- package/lib/components/HDLKiosk/slices/fulfillment/slice.js +3 -3
- package/lib/components/HDLKiosk/slices/fulfillment/view.js +1 -1
- package/lib/components/HDLKiosk/slices/identity/Screen/index.js +2 -2
- package/lib/components/HDLKiosk/slices/identity/slice.js +4 -4
- package/lib/components/HDLKiosk/slices/identity/view.js +1 -1
- package/lib/components/HDLKiosk/slices/payment/slice.js +5 -5
- package/lib/components/HDLKiosk/slices/primaryProductPrompt/slice.js +2 -2
- package/lib/components/HDLKiosk/slices/primaryProductPrompt/view.js +2 -2
- package/lib/components/HDLKiosk/{runtime → ui}/HDLKioskWorkflowView.js +46 -132
- package/lib/components/HDLKiosk/ui/ScaleSimulatorConsole/index.js +390 -0
- package/lib/components/HDLKiosk/ui/ScaleSimulatorConsole/index.less +621 -0
- package/lib/components/HDLKiosk/{app → ui}/ScreenRenderer.js +7 -7
- package/lib/components/HDLKiosk/ui/controllers/useHDLKioskActionDispatcher.js +67 -0
- package/lib/components/HDLKiosk/{runtime → ui}/controllers/useHDLKioskCustomerController.js +1 -1
- package/lib/components/HDLKiosk/ui/controllers/useHDLKioskDeviceController.js +26 -0
- package/lib/components/HDLKiosk/ui/controllers/useHDLKioskExitController.js +54 -0
- package/lib/components/HDLKiosk/{runtime → ui}/controllers/useHDLKioskScreenData.js +1 -1
- package/lib/components/HDLKiosk/ui/controllers/useHDLKioskSessionController.js +40 -0
- package/lib/components/HDLKiosk/{app → ui}/entry/Screen/index.js +8 -6
- package/lib/components/HDLKiosk/{app → ui}/entry/model.js +2 -2
- package/lib/components/HDLKiosk/ui/scale.js +24 -0
- package/lib/components/HDLKiosk/{runtime/useHostSnapshot.js → ui/snapshots.js} +6 -7
- package/lib/components/HDLKiosk/{app → ui}/views.js +1 -1
- package/lib/components/HDLKiosk/{runtime → ui}/workflowEvent.js +1 -1
- package/lib/components/HDLKiosk/utils.js +4 -4
- package/lib/components/bigSale/templates/HDLKiosk/adapter/HDLKioskPaymentRuntime.js +2 -1
- package/lib/components/bigSale/templates/HDLKiosk/adapter/capabilities.js +1 -1
- package/lib/components/bigSale/templates/HDLKiosk/adapter/projection.js +21 -10
- package/lib/components/bigSale/templates/HDLKiosk/adapter/sales.js +20 -2
- package/lib/components/bigSale/templates/HDLKiosk/adapter/scaleTrigger.js +19 -4
- package/lib/components/bigSale/templates/HDLKiosk/adapter/useBigSaleHDLKioskHost.js +3 -0
- package/lib/components/bigSale/templates/HDLKiosk/index.js +4 -4
- package/package.json +2 -2
- package/es/components/HDLKiosk/app/constants.js +0 -9
- package/es/components/HDLKiosk/app/operations/barcode.js +0 -22
- package/es/components/HDLKiosk/app/operations/cart.js +0 -60
- package/es/components/HDLKiosk/app/operations/fulfillment.js +0 -11
- package/es/components/HDLKiosk/app/operations/session.js +0 -41
- package/es/components/HDLKiosk/app/operations/types.js +0 -11
- package/es/components/HDLKiosk/devices/entryArbiter.js +0 -33
- package/es/components/HDLKiosk/runtime/controllers/useHDLKioskDeviceController.js +0 -75
- package/es/components/HDLKiosk/runtime/controllers/useHDLKioskScannerController.js +0 -160
- package/es/components/HDLKiosk/runtime/controllers/useHDLKioskSessionController.js +0 -185
- package/es/components/HDLKiosk/runtime/useWorkflowSnapshot.js +0 -12
- package/es/components/HDLKiosk/slices/customization/operation.js +0 -80
- package/es/components/HDLKiosk/slices/identity/operation.js +0 -60
- package/lib/components/HDLKiosk/app/constants.js +0 -9
- package/lib/components/HDLKiosk/app/operations/barcode.js +0 -21
- package/lib/components/HDLKiosk/app/operations/cart.js +0 -62
- package/lib/components/HDLKiosk/app/operations/fulfillment.js +0 -10
- package/lib/components/HDLKiosk/app/operations/session.js +0 -42
- package/lib/components/HDLKiosk/app/operations/types.js +0 -12
- package/lib/components/HDLKiosk/devices/entryArbiter.js +0 -33
- package/lib/components/HDLKiosk/runtime/controllers/useHDLKioskDeviceController.js +0 -76
- package/lib/components/HDLKiosk/runtime/controllers/useHDLKioskScannerController.js +0 -161
- package/lib/components/HDLKiosk/runtime/controllers/useHDLKioskSessionController.js +0 -186
- package/lib/components/HDLKiosk/runtime/useWorkflowSnapshot.js +0 -13
- package/lib/components/HDLKiosk/slices/customization/operation.js +0 -83
- package/lib/components/HDLKiosk/slices/identity/operation.js +0 -60
- /package/es/components/HDLKiosk/{app → ui}/entry/Screen/index.less +0 -0
- /package/lib/components/HDLKiosk/{app → ui}/entry/Screen/index.less +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { _asyncToGenerator } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/asyncToGenerator.js";
|
|
2
|
+
import { canonicalizeSkuValue, createSkuValueFingerprint } from "../../../../plus/skuOptionsSelection/utils/canonicalSkuValue.js";
|
|
3
|
+
import { productRemovePrimaryProductOperation, productSyncPrimaryWeightedProductOperation } from "../../app/operations.js";
|
|
4
|
+
import { operationFailed } from "./errors.js";
|
|
5
|
+
import { finalizeCartMutation } from "./cartConsistency.js";
|
|
6
|
+
import { bindOperation } from "./types.js";
|
|
7
|
+
import Decimal from "decimal.js";
|
|
8
|
+
//#region src/components/HDLKiosk/runtime/operations/customization.ts
|
|
9
|
+
/**
|
|
10
|
+
* 文件角色:在 Customization Next 边界提交称重主商品本地草稿。
|
|
11
|
+
* 运行机制:校验稳定净重/必选项,调用 Host/OS 主商品 writer,再验证目标行、重量、
|
|
12
|
+
* SkuValue 和“新增或原行发生变化”的最小 receipt/Projection 事实。
|
|
13
|
+
* 边界:页面输入变化不调用本 Operation;OS 内部的加购弹窗与业务判断不属于 HDLKiosk。
|
|
14
|
+
*/
|
|
15
|
+
const productRemovePrimaryProductOperationBinding = bindOperation(productRemovePrimaryProductOperation, { execute: function() {
|
|
16
|
+
var _ref = _asyncToGenerator(function* (context, input, signal) {
|
|
17
|
+
if (!input.lineId) return {
|
|
18
|
+
status: "succeeded",
|
|
19
|
+
data: {}
|
|
20
|
+
};
|
|
21
|
+
const mutation = yield context.host.sales.removeLine({ lineId: input.lineId }, signal);
|
|
22
|
+
return finalizeCartMutation(context, mutation, signal, () => mutation.status === "succeeded" && mutation.data.removedLineId === input.lineId || !context.host.sales.getObservedSnapshot().cart.lines.some((item) => item.lineId === input.lineId));
|
|
23
|
+
});
|
|
24
|
+
return function execute(_x, _x2, _x3) {
|
|
25
|
+
return _ref.apply(this, arguments);
|
|
26
|
+
};
|
|
27
|
+
}() });
|
|
28
|
+
function hasValidSkuValue(input) {
|
|
29
|
+
const canonical = canonicalizeSkuValue(input.skuValue);
|
|
30
|
+
return Boolean(input.productId && canonical && canonical.productId === input.productId);
|
|
31
|
+
}
|
|
32
|
+
function sameSkuValue(expected, actual) {
|
|
33
|
+
const expectedFingerprint = createSkuValueFingerprint(expected);
|
|
34
|
+
return Boolean(expectedFingerprint && expectedFingerprint === createSkuValueFingerprint(actual));
|
|
35
|
+
}
|
|
36
|
+
function sameWeight(actual, expected) {
|
|
37
|
+
const actualValue = new Decimal(actual || NaN);
|
|
38
|
+
const expectedValue = new Decimal(expected || NaN);
|
|
39
|
+
return actualValue.isFinite() && expectedValue.isFinite() && actualValue.equals(expectedValue);
|
|
40
|
+
}
|
|
41
|
+
const productSyncPrimaryWeightedProductOperationBinding = bindOperation(productSyncPrimaryWeightedProductOperation, { execute: function() {
|
|
42
|
+
var _ref2 = _asyncToGenerator(function* (context, input, signal) {
|
|
43
|
+
if (!hasValidSkuValue(input)) return operationFailed("customizationInputInvalid", "back");
|
|
44
|
+
const beforeLines = new Map(context.host.sales.getObservedSnapshot().cart.lines.map((line) => [line.lineId, line.quantity]));
|
|
45
|
+
const before = context.host.sales.getObservedSnapshot();
|
|
46
|
+
const previousPrimary = input.existingLineId ? before.cart.lines.find((line) => line.lineId === input.existingLineId) : void 0;
|
|
47
|
+
if (input.existingLineId && (!previousPrimary || previousPrimary.productId !== input.productId)) return operationFailed("customizationExistingLineInvalid", "back");
|
|
48
|
+
const mutation = yield context.host.sales.syncPrimaryWeightedProduct(input, signal);
|
|
49
|
+
return finalizeCartMutation(context, mutation, signal, () => {
|
|
50
|
+
const after = context.host.sales.getObservedSnapshot();
|
|
51
|
+
const projectionMatches = after.cart.lines.some((line) => {
|
|
52
|
+
if (mutation.status === "succeeded" && mutation.data.affectedLineId && line.lineId !== mutation.data.affectedLineId) return false;
|
|
53
|
+
if (line.productId !== input.productId) return false;
|
|
54
|
+
const skuMatches = sameSkuValue(input.skuValue, line.skuValue);
|
|
55
|
+
const weightMatches = sameWeight(line.quantity, input.measurement.netWeightKg);
|
|
56
|
+
const previousQuantity = beforeLines.get(line.lineId);
|
|
57
|
+
if (input.existingLineId) return line.lineId === input.existingLineId && skuMatches && weightMatches && mutation.status === "succeeded" && mutation.data.affectedLineId === input.existingLineId && after.observationId > before.observationId;
|
|
58
|
+
return skuMatches && weightMatches && (previousQuantity === void 0 || previousQuantity !== line.quantity);
|
|
59
|
+
});
|
|
60
|
+
const successfulOutcome = mutation.status === "succeeded" ? mutation.data : void 0;
|
|
61
|
+
const confirmedLine = successfulOutcome === null || successfulOutcome === void 0 ? void 0 : successfulOutcome.confirmedLine;
|
|
62
|
+
return Boolean(confirmedLine && confirmedLine.productId === input.productId && (!(successfulOutcome === null || successfulOutcome === void 0 ? void 0 : successfulOutcome.affectedLineId) || confirmedLine.lineId === successfulOutcome.affectedLineId) && (!input.existingLineId || (successfulOutcome === null || successfulOutcome === void 0 ? void 0 : successfulOutcome.affectedLineId) === input.existingLineId && confirmedLine.lineId === input.existingLineId) && sameWeight(confirmedLine.quantity, input.measurement.netWeightKg) && sameSkuValue(input.skuValue, confirmedLine.skuValue) && (Boolean(input.existingLineId) || !beforeLines.has(confirmedLine.lineId) || beforeLines.get(confirmedLine.lineId) !== confirmedLine.quantity)) || projectionMatches;
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
return function execute(_x4, _x5, _x6) {
|
|
66
|
+
return _ref2.apply(this, arguments);
|
|
67
|
+
};
|
|
68
|
+
}() });
|
|
69
|
+
//#endregion
|
|
70
|
+
export { productRemovePrimaryProductOperationBinding, productSyncPrimaryWeightedProductOperationBinding };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { setFulfillmentOperation } from "../../app/operations.js";
|
|
2
|
+
import { bindOperation } from "./types.js";
|
|
3
|
+
//#region src/components/HDLKiosk/runtime/operations/fulfillment.ts
|
|
4
|
+
const setFulfillmentOperationBinding = bindOperation(setFulfillmentOperation, { execute: (context, input, signal) => context.host.sales.setFulfillment(input, signal) });
|
|
5
|
+
//#endregion
|
|
6
|
+
export { setFulfillmentOperationBinding };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { _asyncToGenerator } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/asyncToGenerator.js";
|
|
2
|
+
import { identitySyncOperation } from "../../app/operations.js";
|
|
3
|
+
import { createOperationError, operationFailed, operationUnknown } from "./errors.js";
|
|
4
|
+
import { bindOperation } from "./types.js";
|
|
5
|
+
//#region src/components/HDLKiosk/runtime/operations/identity.ts
|
|
6
|
+
function partialFailure(code, cause) {
|
|
7
|
+
return {
|
|
8
|
+
status: "partialFailure",
|
|
9
|
+
error: createOperationError(code, "staff", cause)
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function identityMatches(customerId, customer) {
|
|
13
|
+
if (!customerId) return (customer === null || customer === void 0 ? void 0 : customer.member) !== true;
|
|
14
|
+
if ((customer === null || customer === void 0 ? void 0 : customer.member) !== true) return false;
|
|
15
|
+
return customer.customerId === customerId;
|
|
16
|
+
}
|
|
17
|
+
const identitySyncOperationBinding = bindOperation(identitySyncOperation, { execute: function() {
|
|
18
|
+
var _ref = _asyncToGenerator(function* (context, input, signal) {
|
|
19
|
+
var _input$customerId;
|
|
20
|
+
if (!input || input.customerId !== void 0 && !input.customerId.trim()) return operationFailed("identityInputInvalid", "back");
|
|
21
|
+
const customerId = (_input$customerId = input.customerId) === null || _input$customerId === void 0 ? void 0 : _input$customerId.trim();
|
|
22
|
+
const beforeSelection = context.host.sales.getObservedSnapshot();
|
|
23
|
+
const selected = yield context.host.sales.selectIdentity(customerId ? { customerId } : {}, signal);
|
|
24
|
+
if (selected.status !== "succeeded") return selected;
|
|
25
|
+
if (signal.aborted) return operationUnknown("identityAbortedAfterWrite");
|
|
26
|
+
const afterSelection = context.host.sales.getObservedSnapshot();
|
|
27
|
+
const hasOrderLines = beforeSelection.cart.lineCount > 0 || afterSelection.cart.lineCount > 0;
|
|
28
|
+
let summaryConfirmed = false;
|
|
29
|
+
if (hasOrderLines) {
|
|
30
|
+
const consistency = yield context.host.sales.waitForCartConsistency(signal);
|
|
31
|
+
if (consistency.status !== "succeeded") {
|
|
32
|
+
if (consistency.status === "unknown") return consistency;
|
|
33
|
+
return partialFailure("identityConsistencyFailed", consistency);
|
|
34
|
+
}
|
|
35
|
+
const summary = yield context.host.sales.recalculateSummary(signal);
|
|
36
|
+
if (summary.status !== "succeeded") {
|
|
37
|
+
if (summary.status === "unknown") return summary;
|
|
38
|
+
return partialFailure("identitySummaryRecalculationFailed", summary);
|
|
39
|
+
}
|
|
40
|
+
summaryConfirmed = Boolean(summary.data.confirmedSummary);
|
|
41
|
+
}
|
|
42
|
+
const observed = context.host.sales.getObservedSnapshot();
|
|
43
|
+
if (hasOrderLines && !summaryConfirmed && observed.summary.status !== "ready") return partialFailure("identitySummaryProjectionMissing");
|
|
44
|
+
if (!(customerId ? identityMatches(customerId, selected.data.customer) : selected.data.customer === void 0) && !identityMatches(customerId, observed.customer)) return operationUnknown("identitySelectionNotObserved");
|
|
45
|
+
return {
|
|
46
|
+
status: "succeeded",
|
|
47
|
+
data: void 0
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
return function execute(_x, _x2, _x3) {
|
|
51
|
+
return _ref.apply(this, arguments);
|
|
52
|
+
};
|
|
53
|
+
}() });
|
|
54
|
+
//#endregion
|
|
55
|
+
export { identitySyncOperationBinding };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createOperationRegistry } from "./types.js";
|
|
2
|
+
import { barcodeConsumeOperationBinding } from "./barcode.js";
|
|
3
|
+
import { cartAddProductOperationBinding, cartRemoveLineOperationBinding, cartUpdateQuantityOperationBinding } from "./cart.js";
|
|
4
|
+
import { checkoutOpenOperationBinding, checkoutPayEftposOperationBinding, checkoutPrepareOperationBinding, checkoutRequestStaffPaymentApprovalOperationBinding } from "./checkout.js";
|
|
5
|
+
import { setFulfillmentOperationBinding } from "./fulfillment.js";
|
|
6
|
+
import { sessionEnsureOperationBinding, sessionResetOperationBinding } from "./session.js";
|
|
7
|
+
import { identitySyncOperationBinding } from "./identity.js";
|
|
8
|
+
import { productRemovePrimaryProductOperationBinding, productSyncPrimaryWeightedProductOperationBinding } from "./customization.js";
|
|
9
|
+
//#region src/components/HDLKiosk/runtime/operations/registry.ts
|
|
10
|
+
/**
|
|
11
|
+
* 文件角色:为 HDLKiosk Operation Contract 提供生产 Runtime Handler Registry。
|
|
12
|
+
* 边界:Application Manifest 只引用 Contract;Host 业务方法只能从本 Binding 层进入。
|
|
13
|
+
*/
|
|
14
|
+
const HDLKIOSK_OPERATION_BINDINGS = Object.freeze([
|
|
15
|
+
barcodeConsumeOperationBinding,
|
|
16
|
+
cartAddProductOperationBinding,
|
|
17
|
+
cartRemoveLineOperationBinding,
|
|
18
|
+
cartUpdateQuantityOperationBinding,
|
|
19
|
+
checkoutOpenOperationBinding,
|
|
20
|
+
checkoutPayEftposOperationBinding,
|
|
21
|
+
checkoutPrepareOperationBinding,
|
|
22
|
+
checkoutRequestStaffPaymentApprovalOperationBinding,
|
|
23
|
+
sessionEnsureOperationBinding,
|
|
24
|
+
sessionResetOperationBinding,
|
|
25
|
+
setFulfillmentOperationBinding,
|
|
26
|
+
identitySyncOperationBinding,
|
|
27
|
+
productRemovePrimaryProductOperationBinding,
|
|
28
|
+
productSyncPrimaryWeightedProductOperationBinding
|
|
29
|
+
]);
|
|
30
|
+
function createHDLKioskOperationRegistry() {
|
|
31
|
+
return createOperationRegistry(HDLKIOSK_OPERATION_BINDINGS);
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { createHDLKioskOperationRegistry };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { _asyncToGenerator } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/asyncToGenerator.js";
|
|
2
|
+
import { sessionEnsureOperation, sessionResetOperation } from "../../app/operations.js";
|
|
3
|
+
import { operationUnknown } from "./errors.js";
|
|
4
|
+
import { bindOperation } from "./types.js";
|
|
5
|
+
//#region src/components/HDLKiosk/runtime/operations/session.ts
|
|
6
|
+
function forwardFailure(result) {
|
|
7
|
+
return result;
|
|
8
|
+
}
|
|
9
|
+
const sessionEnsureOperationBinding = bindOperation(sessionEnsureOperation, { execute: ({ host }, _input, signal) => host.sales.ensureSession(signal) });
|
|
10
|
+
const sessionResetOperationBinding = bindOperation(sessionResetOperation, { execute: function() {
|
|
11
|
+
var _ref = _asyncToGenerator(function* ({ host }, _input, signal) {
|
|
12
|
+
const before = host.sales.getObservedSnapshot();
|
|
13
|
+
if (before.payment.status === "pending" || before.payment.status === "unknown") return operationUnknown("resetBlockedByPaymentState");
|
|
14
|
+
const reset = yield host.sales.clearAndReset(signal);
|
|
15
|
+
if (reset.status !== "succeeded") return forwardFailure(reset);
|
|
16
|
+
if (!reset.data.cartEmpty) return operationUnknown("resetHostResultNotEmpty");
|
|
17
|
+
const consistency = yield host.sales.waitForCartConsistency(signal);
|
|
18
|
+
if (consistency.status !== "succeeded") return forwardFailure(consistency);
|
|
19
|
+
return {
|
|
20
|
+
status: "succeeded",
|
|
21
|
+
data: void 0
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
return function execute(_x, _x2, _x3) {
|
|
25
|
+
return _ref.apply(this, arguments);
|
|
26
|
+
};
|
|
27
|
+
}() });
|
|
28
|
+
//#endregion
|
|
29
|
+
export { sessionEnsureOperationBinding, sessionResetOperationBinding };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { _objectSpread2 } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js";
|
|
2
|
+
import { createKernelOperationRegistry } from "../../kernel/operations/registry.js";
|
|
3
|
+
import { bindKernelOperation } from "../../kernel/operations/types.js";
|
|
4
|
+
//#region src/components/HDLKiosk/runtime/operations/types.ts
|
|
5
|
+
function bindOperation(contract, handler) {
|
|
6
|
+
const bound = bindKernelOperation(contract, { execute: handler.execute });
|
|
7
|
+
return Object.freeze(_objectSpread2(_objectSpread2({}, bound), {}, { verify: handler.verify }));
|
|
8
|
+
}
|
|
9
|
+
function createOperationRegistry(operations) {
|
|
10
|
+
return createKernelOperationRegistry(operations);
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { bindOperation, createOperationRegistry };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/components/HDLKiosk/runtime/session/blockPolicy.ts
|
|
2
|
+
const CHECKOUT_DISPATCH_OPERATIONS = new Set(["checkout.open", "checkout.payEftpos"]);
|
|
3
|
+
/** 这些结果发生在任何支付调用之前,不存在重复扣款风险。 */
|
|
4
|
+
const RETRYABLE_CHECKOUT_PREFLIGHT_ERRORS = new Set(["checkoutProjectionUnstable", "checkoutCartStillChanging"]);
|
|
5
|
+
function shouldHardBlockOperationResult(operationId, result) {
|
|
6
|
+
var _result$error$details;
|
|
7
|
+
if (result.status !== "partialFailure" && result.status !== "unknown") return false;
|
|
8
|
+
if (operationId === "session.reset") return true;
|
|
9
|
+
if (!CHECKOUT_DISPATCH_OPERATIONS.has(operationId)) return false;
|
|
10
|
+
if (((_result$error$details = result.error.details) === null || _result$error$details === void 0 ? void 0 : _result$error$details.checkoutDispatched) === false) return false;
|
|
11
|
+
return !RETRYABLE_CHECKOUT_PREFLIGHT_ERRORS.has(result.error.code);
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { shouldHardBlockOperationResult };
|
package/es/components/HDLKiosk/runtime/{createWorkflowSession.js → session/createSession.js}
RENAMED
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { composeWorkflowLifecycles } from "
|
|
10
|
-
import { createWorkflowActor } from "
|
|
11
|
-
import { compileWorkflowStructure } from "
|
|
12
|
-
import {
|
|
1
|
+
import { _objectSpread2 } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js";
|
|
2
|
+
import { _asyncToGenerator } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/asyncToGenerator.js";
|
|
3
|
+
import { defaultActivityRegistry, getBuiltInWorkflowDefinition } from "../../app/workflow/registry.js";
|
|
4
|
+
import { defaultPredicateRegistry } from "../../app/workflow/predicates.js";
|
|
5
|
+
import { createHDLKioskBeforeEachGuard, defaultNavigationGuardRegistry } from "../../app/workflow/navigationGuards.js";
|
|
6
|
+
import { validateHDLKioskWorkflowPolicy } from "../../app/workflow/policy.js";
|
|
7
|
+
import { HDL_WORKFLOW_IDS } from "../../app/workflow/index.js";
|
|
8
|
+
import { createHDLKioskOperationRegistry } from "../operations/registry.js";
|
|
9
|
+
import { composeWorkflowLifecycles } from "../../kernel/lifecycle.js";
|
|
10
|
+
import { createWorkflowActor } from "../../kernel/workflow/actor.js";
|
|
11
|
+
import { compileWorkflowStructure } from "../../kernel/workflow/compiler.js";
|
|
12
|
+
import { createOperationCoordinator } from "../operations/coordinator.js";
|
|
13
|
+
import { shouldHardBlockOperationResult } from "./blockPolicy.js";
|
|
14
|
+
import { createHDLKioskTransitionRunner } from "./transitionRunner.js";
|
|
13
15
|
import { createHDLKioskWorkflowLifecycle } from "./workflowLifecycle.js";
|
|
14
16
|
import { reduceHDLKioskWorkflowContext } from "./workflowContext.js";
|
|
15
17
|
import { locales } from "@pisell/utils";
|
|
16
|
-
//#region src/components/HDLKiosk/runtime/
|
|
18
|
+
//#region src/components/HDLKiosk/runtime/session/createSession.ts
|
|
17
19
|
/**
|
|
18
20
|
* 文件角色:创建一次点餐会话所需的全部纯 Core 对象。
|
|
19
21
|
* 运行机制:选择/编译 Definition,组装 Activity Registry、Operation Registry、
|
|
@@ -21,7 +23,7 @@ import { locales } from "@pisell/utils";
|
|
|
21
23
|
* 边界:每次会话创建一次;不持有 React UI,也不复用上一单 Actor。
|
|
22
24
|
*/
|
|
23
25
|
function createHDLKioskWorkflowSession(entry, host, options = {}) {
|
|
24
|
-
var _options$initialConte, _options$lifecycleExt;
|
|
26
|
+
var _options$initialConte, _options$lifecycleExt, _options$cause, _options$sessionId;
|
|
25
27
|
const operations = createHDLKioskOperationRegistry();
|
|
26
28
|
const structuralCompilation = compileWorkflowStructure(getBuiltInWorkflowDefinition(entry), {
|
|
27
29
|
operations,
|
|
@@ -41,7 +43,7 @@ function createHDLKioskWorkflowSession(entry, host, options = {}) {
|
|
|
41
43
|
});
|
|
42
44
|
let actorRef;
|
|
43
45
|
const coordinator = createOperationCoordinator(host, operations, {
|
|
44
|
-
checkoutRequirementIds: definition.
|
|
46
|
+
checkoutRequirementIds: definition.requirements,
|
|
45
47
|
getWorkflowContext: () => {
|
|
46
48
|
var _actorRef$getSnapshot;
|
|
47
49
|
return (_actorRef$getSnapshot = actorRef === null || actorRef === void 0 ? void 0 : actorRef.getSnapshot().context) !== null && _actorRef$getSnapshot !== void 0 ? _actorRef$getSnapshot : initialContext;
|
|
@@ -66,6 +68,40 @@ function createHDLKioskWorkflowSession(entry, host, options = {}) {
|
|
|
66
68
|
beforeEach: createHDLKioskBeforeEachGuard(() => host.sales.getObservedSnapshot())
|
|
67
69
|
});
|
|
68
70
|
actorRef = workflowActor;
|
|
71
|
+
let paymentProjectionObservationId;
|
|
72
|
+
const advanceConfirmedPayment = () => {
|
|
73
|
+
var _definition$nodes$sna;
|
|
74
|
+
const snapshot = workflowActor.getSnapshot();
|
|
75
|
+
const projection = host.sales.getObservedSnapshot();
|
|
76
|
+
if (snapshot.status !== "idle" || ((_definition$nodes$sna = definition.nodes[snapshot.nodeId]) === null || _definition$nodes$sna === void 0 ? void 0 : _definition$nodes$sna.activity) !== "paymentMethod" || projection.payment.status !== "succeeded" || paymentProjectionObservationId === projection.observationId) return;
|
|
77
|
+
paymentProjectionObservationId = projection.observationId;
|
|
78
|
+
workflowActor.send({
|
|
79
|
+
type: "ACTIVITY_INTENT",
|
|
80
|
+
stepId: snapshot.nodeId,
|
|
81
|
+
activityId: "paymentMethod",
|
|
82
|
+
intent: "complete",
|
|
83
|
+
intentId: `projection:payment:${snapshot.sessionEpoch}:${projection.observationId}`
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
let unsubscribePaymentProjection = () => void 0;
|
|
87
|
+
let unsubscribePaymentWorkflow = () => void 0;
|
|
88
|
+
try {
|
|
89
|
+
unsubscribePaymentProjection = host.sales.subscribe(advanceConfirmedPayment);
|
|
90
|
+
unsubscribePaymentWorkflow = workflowActor.subscribe(advanceConfirmedPayment);
|
|
91
|
+
} catch (error) {
|
|
92
|
+
unsubscribePaymentProjection();
|
|
93
|
+
workflowActor.dispose();
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
advanceConfirmedPayment();
|
|
97
|
+
const sessionSnapshot = workflowActor.getSnapshot();
|
|
98
|
+
const cause = (_options$cause = options.cause) !== null && _options$cause !== void 0 ? _options$cause : Object.freeze({
|
|
99
|
+
trigger: "manual",
|
|
100
|
+
channel: definition.id,
|
|
101
|
+
occurrenceId: `${definition.id}:${sessionSnapshot.sessionEpoch}`,
|
|
102
|
+
correlationId: `${definition.id}:${sessionSnapshot.sessionEpoch}`
|
|
103
|
+
});
|
|
104
|
+
let disposed = false;
|
|
69
105
|
try {
|
|
70
106
|
const snapshot = workflowActor.getSnapshot();
|
|
71
107
|
host.telemetry.emit({
|
|
@@ -79,10 +115,24 @@ function createHDLKioskWorkflowSession(entry, host, options = {}) {
|
|
|
79
115
|
}
|
|
80
116
|
});
|
|
81
117
|
} catch (_unused) {}
|
|
118
|
+
const disposeSession = () => {
|
|
119
|
+
if (disposed) return;
|
|
120
|
+
disposed = true;
|
|
121
|
+
unsubscribePaymentProjection();
|
|
122
|
+
unsubscribePaymentWorkflow();
|
|
123
|
+
workflowActor.dispose();
|
|
124
|
+
};
|
|
125
|
+
const publicActor = Object.freeze(_objectSpread2(_objectSpread2({}, workflowActor), {}, { dispose: disposeSession }));
|
|
82
126
|
return Object.freeze({
|
|
127
|
+
id: (_options$sessionId = options.sessionId) !== null && _options$sessionId !== void 0 ? _options$sessionId : `${definition.id}:${sessionSnapshot.sessionEpoch}:${cause.occurrenceId}`,
|
|
128
|
+
workflowId: definition.id,
|
|
129
|
+
cause,
|
|
83
130
|
entry,
|
|
84
131
|
definition,
|
|
85
|
-
actor:
|
|
132
|
+
actor: publicActor,
|
|
133
|
+
dispatch: (event) => workflowActor.send(event),
|
|
134
|
+
isActive: () => !disposed && workflowActor.getSnapshot().status !== "finished",
|
|
135
|
+
dispose: disposeSession,
|
|
86
136
|
ensure: (intentId) => {
|
|
87
137
|
const snapshot = workflowActor.getSnapshot();
|
|
88
138
|
return coordinator.execute("session.ensure", {
|
|
@@ -101,7 +151,7 @@ function createHDLKioskWorkflowSession(entry, host, options = {}) {
|
|
|
101
151
|
sessionEpoch: snapshot.sessionEpoch,
|
|
102
152
|
input
|
|
103
153
|
});
|
|
104
|
-
if (
|
|
154
|
+
if (shouldHardBlockOperationResult(commandId, result)) workflowActor.block(result.error, intentId);
|
|
105
155
|
return result;
|
|
106
156
|
});
|
|
107
157
|
return function executeCommand(_x, _x2, _x3) {
|
package/es/components/HDLKiosk/runtime/{domainTransitionRunner.js → session/transitionRunner.js}
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { _asyncToGenerator } from "
|
|
2
|
-
import { resolveOperationTransition } from "
|
|
3
|
-
|
|
1
|
+
import { _asyncToGenerator } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/asyncToGenerator.js";
|
|
2
|
+
import { resolveOperationTransition } from "../../kernel/workflow/transition.js";
|
|
3
|
+
import { shouldHardBlockOperationResult } from "./blockPolicy.js";
|
|
4
|
+
//#region src/components/HDLKiosk/runtime/session/transitionRunner.ts
|
|
4
5
|
let domainErrorSequence = 0;
|
|
5
6
|
function createDomainWorkflowError(code, recovery = "staff", cause) {
|
|
6
7
|
domainErrorSequence += 1;
|
|
@@ -44,7 +45,7 @@ function createHDLKioskTransitionRunner({ host, coordinator, predicates, now = D
|
|
|
44
45
|
const error = createDomainWorkflowError("workflowPredicateEvaluationFailed", "staff", cause);
|
|
45
46
|
emitError(error, workflowId, stepId, event.intent);
|
|
46
47
|
return {
|
|
47
|
-
status: "
|
|
48
|
+
status: "stay",
|
|
48
49
|
lastError: error
|
|
49
50
|
};
|
|
50
51
|
}
|
|
@@ -94,6 +95,10 @@ function createHDLKioskTransitionRunner({ host, coordinator, predicates, now = D
|
|
|
94
95
|
status: "stay",
|
|
95
96
|
lastError: createDomainWorkflowError("checkoutPaymentCancelled", "retry", result.reason)
|
|
96
97
|
};
|
|
98
|
+
if ((result.status === "partialFailure" || result.status === "unknown") && !shouldHardBlockOperationResult(command.id, result)) return {
|
|
99
|
+
status: "stay",
|
|
100
|
+
lastError: result.error
|
|
101
|
+
};
|
|
97
102
|
const decision = resolveOperationTransition({
|
|
98
103
|
currentNodeId: stepId,
|
|
99
104
|
targetNodeId: transition.target,
|
|
@@ -105,7 +110,7 @@ function createHDLKioskTransitionRunner({ host, coordinator, predicates, now = D
|
|
|
105
110
|
};
|
|
106
111
|
if (decision.nodeId === transition.target) return {
|
|
107
112
|
status: "advance",
|
|
108
|
-
|
|
113
|
+
receipt: (command.id === "checkout.open" || command.id === "checkout.payEftpos") && result.status === "succeeded" ? result.data : void 0
|
|
109
114
|
};
|
|
110
115
|
return {
|
|
111
116
|
status: "stay",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { _objectSpread2 } from "
|
|
2
|
-
//#region src/components/HDLKiosk/runtime/workflowContext.ts
|
|
1
|
+
import { _objectSpread2 } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js";
|
|
2
|
+
//#region src/components/HDLKiosk/runtime/session/workflowContext.ts
|
|
3
3
|
const reduceHDLKioskWorkflowContext = (context, patch) => {
|
|
4
4
|
if (!patch) return context;
|
|
5
5
|
const fulfillment = patch.fulfillment === "dine_in" || patch.fulfillment === "takeaway" ? patch.fulfillment : context.fulfillment;
|
package/es/components/HDLKiosk/runtime/{workflowLifecycle.js → session/workflowLifecycle.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { _asyncToGenerator } from "
|
|
2
|
-
//#region src/components/HDLKiosk/runtime/workflowLifecycle.ts
|
|
1
|
+
import { _asyncToGenerator } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/asyncToGenerator.js";
|
|
2
|
+
//#region src/components/HDLKiosk/runtime/session/workflowLifecycle.ts
|
|
3
3
|
function createHDLKioskWorkflowLifecycle(host, now = Date.now) {
|
|
4
4
|
const lifecycle = {
|
|
5
5
|
committed: function() {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createScaleIngress } from "./devices/scaleIngress.js";
|
|
2
|
+
//#region src/components/HDLKiosk/runtime/triggers.ts
|
|
3
|
+
function createHDLKioskEntryTriggerAdapters(host, config, scannerTriggerAdapter) {
|
|
4
|
+
const scaleIngress = createScaleIngress();
|
|
5
|
+
const onWeight = Object.freeze({
|
|
6
|
+
trigger: "onWeight",
|
|
7
|
+
activate: ({ emit }) => host.devices.subscribe((event) => {
|
|
8
|
+
if (event.type !== "weightChanged") return;
|
|
9
|
+
const accepted = scaleIngress.accept(event, {
|
|
10
|
+
active: true,
|
|
11
|
+
supported: config.enabledEntries.includes("scale") && Boolean(config.primaryWeightedProductId) && host.capabilities.scale.available && host.capabilities.scale.weightChangeTrigger,
|
|
12
|
+
workflowLocked: false,
|
|
13
|
+
nodeAcceptsEvent: true,
|
|
14
|
+
paymentFrozen: false
|
|
15
|
+
});
|
|
16
|
+
if (accepted.status !== "accepted") return;
|
|
17
|
+
emit({
|
|
18
|
+
channel: "weighing-product",
|
|
19
|
+
occurrenceId: accepted.event.eventId,
|
|
20
|
+
correlationId: `device:scale:${accepted.event.eventId}`,
|
|
21
|
+
payload: { weight: accepted.event.weight }
|
|
22
|
+
});
|
|
23
|
+
}, { sources: ["scale"] })
|
|
24
|
+
});
|
|
25
|
+
return Object.freeze([scannerTriggerAdapter, onWeight]);
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { createHDLKioskEntryTriggerAdapters };
|
|
@@ -226,20 +226,24 @@ function CatalogScreen({ products, loading, errorReference, errorMessage, busy,
|
|
|
226
226
|
const item = rawItem;
|
|
227
227
|
const product = item;
|
|
228
228
|
const quantity = formatQuantity(orderBar.quantitiesByProduct[product.productId]);
|
|
229
|
+
const addProduct = () => send({
|
|
230
|
+
kind: "command",
|
|
231
|
+
command: "cart.addProduct",
|
|
232
|
+
input: {
|
|
233
|
+
productId: product.productId,
|
|
234
|
+
quantity: "1"
|
|
235
|
+
}
|
|
236
|
+
});
|
|
229
237
|
const action = /* @__PURE__ */ React.createElement("button", {
|
|
230
238
|
type: "button",
|
|
231
239
|
className: `${KIOSK_CATALOG_PRODUCT_CARD_CLASS_NAME}__add`,
|
|
232
240
|
disabled: busy || !product.available,
|
|
233
241
|
"aria-label": `${locales.getText("pisell2.hdl-kiosk.catalog-add-item")}: ${product.name}`,
|
|
234
242
|
"aria-busy": busy || void 0,
|
|
235
|
-
onClick: () =>
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
productId: product.productId,
|
|
240
|
-
quantity: "1"
|
|
241
|
-
}
|
|
242
|
-
})
|
|
243
|
+
onClick: (event) => {
|
|
244
|
+
event.stopPropagation();
|
|
245
|
+
addProduct();
|
|
246
|
+
}
|
|
243
247
|
}, quantity ? /* @__PURE__ */ React.createElement("span", { "data-length": Math.min(quantity.length, 5) }, quantity) : /* @__PURE__ */ React.createElement(PlusIcon, null));
|
|
244
248
|
return /* @__PURE__ */ React.createElement(ProductCard, {
|
|
245
249
|
key: product.productId,
|
|
@@ -247,6 +251,9 @@ function CatalogScreen({ products, loading, errorReference, errorMessage, busy,
|
|
|
247
251
|
index,
|
|
248
252
|
scenario: "booking2",
|
|
249
253
|
selectionTrigger: "click",
|
|
254
|
+
onSelect: busy || !product.available ? void 0 : addProduct,
|
|
255
|
+
onSelectCover: busy || !product.available ? void 0 : addProduct,
|
|
256
|
+
onSelectInfo: busy || !product.available ? void 0 : addProduct,
|
|
250
257
|
className: KIOSK_CATALOG_PRODUCT_CARD_CLASS_NAME,
|
|
251
258
|
customSkuCardAllConfig: createKioskCatalogProductCardConfig({
|
|
252
259
|
title: product.name,
|