@pisell/pisellos 2.1.119 → 2.1.120
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/apis/picoding.d.ts +0 -0
- package/dist/apis/picoding.js +1 -0
- package/dist/model/index.d.ts +1 -0
- package/dist/model/index.js +1 -0
- package/dist/model/strategy/adapter/index.d.ts +7 -0
- package/dist/model/strategy/adapter/index.js +7 -0
- package/dist/model/strategy/adapter/itemRule/adapter.d.ts +59 -0
- package/dist/model/strategy/adapter/itemRule/adapter.js +439 -0
- package/dist/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
- package/dist/model/strategy/adapter/itemRule/evaluator.js +169 -0
- package/dist/model/strategy/adapter/itemRule/examples.d.ts +64 -0
- package/dist/model/strategy/adapter/itemRule/examples.js +315 -0
- package/dist/model/strategy/adapter/itemRule/index.d.ts +5 -0
- package/dist/model/strategy/adapter/itemRule/index.js +5 -0
- package/dist/model/strategy/adapter/itemRule/type.d.ts +206 -0
- package/dist/model/strategy/adapter/itemRule/type.js +101 -0
- package/dist/model/strategy/adapter/promotion/adapter.d.ts +66 -0
- package/dist/model/strategy/adapter/promotion/adapter.js +271 -0
- package/dist/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
- package/dist/model/strategy/adapter/promotion/evaluator.js +1206 -0
- package/dist/model/strategy/adapter/promotion/examples.d.ts +138 -0
- package/dist/model/strategy/adapter/promotion/examples.js +166 -0
- package/dist/model/strategy/adapter/promotion/index.d.ts +4 -0
- package/dist/model/strategy/adapter/promotion/index.js +0 -0
- package/dist/model/strategy/adapter/promotion/type.d.ts +447 -0
- package/dist/model/strategy/adapter/promotion/type.js +209 -0
- package/dist/model/strategy/adapter/type.d.ts +28 -0
- package/dist/model/strategy/adapter/type.js +1 -0
- package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +84 -0
- package/dist/model/strategy/adapter/walletPass/evaluator.js +502 -0
- package/dist/model/strategy/adapter/walletPass/example.d.ts +4 -0
- package/dist/model/strategy/adapter/walletPass/example.js +258 -0
- package/dist/model/strategy/adapter/walletPass/index.d.ts +32 -0
- package/dist/model/strategy/adapter/walletPass/index.js +182 -0
- package/dist/model/strategy/adapter/walletPass/locales.d.ts +1 -0
- package/dist/model/strategy/adapter/walletPass/locales.js +26 -0
- package/dist/model/strategy/adapter/walletPass/type.d.ts +187 -0
- package/dist/model/strategy/adapter/walletPass/type.js +1 -0
- package/dist/model/strategy/adapter/walletPass/utils.d.ts +50 -0
- package/dist/model/strategy/adapter/walletPass/utils.js +1104 -0
- package/dist/model/strategy/engine.d.ts +106 -0
- package/dist/model/strategy/engine.js +611 -0
- package/dist/model/strategy/index.d.ts +3 -0
- package/dist/model/strategy/index.js +8 -0
- package/dist/model/strategy/strategy-example.d.ts +5 -0
- package/dist/model/strategy/strategy-example.js +331 -0
- package/dist/model/strategy/type.d.ts +228 -0
- package/dist/model/strategy/type.js +94 -0
- package/dist/modules/Cart/utils/cartProduct.js +1 -0
- package/dist/modules/OpenData/index.d.ts +23 -0
- package/dist/modules/OpenData/index.js +167 -0
- package/dist/modules/OpenData/types.d.ts +73 -0
- package/dist/modules/OpenData/types.js +1 -0
- package/dist/modules/OpenData/utils.d.ts +2 -0
- package/dist/modules/OpenData/utils.js +75 -0
- package/dist/modules/Order/index.d.ts +58 -1
- package/dist/modules/Order/index.js +780 -29
- package/dist/modules/Order/types.d.ts +144 -12
- package/dist/modules/Order/utils.d.ts +25 -0
- package/dist/modules/Order/utils.js +225 -1
- package/dist/modules/Product/index.d.ts +1 -1
- package/dist/modules/Product/utils.js +2 -2
- package/dist/modules/ProductList/index.d.ts +1 -1
- package/dist/modules/ProductList/index.js +2 -1
- package/dist/modules/Quotation/index.d.ts +48 -0
- package/dist/modules/Quotation/index.js +245 -0
- package/dist/modules/Quotation/types.d.ts +42 -0
- package/dist/modules/Quotation/types.js +1 -0
- package/dist/modules/Rules/index.js +4 -1
- package/dist/modules/SalesSummary/index.d.ts +63 -0
- package/dist/modules/SalesSummary/index.js +174 -0
- package/dist/modules/SalesSummary/types.d.ts +59 -0
- package/dist/modules/SalesSummary/types.js +1 -0
- package/dist/modules/SalesSummary/utils.d.ts +30 -0
- package/dist/modules/SalesSummary/utils.js +513 -0
- package/dist/modules/ScanOrderLogger/index.d.ts +21 -0
- package/dist/modules/ScanOrderLogger/index.js +161 -0
- package/dist/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
- package/dist/modules/ScanOrderLogger/providers/feishu.js +95 -0
- package/dist/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
- package/dist/modules/ScanOrderLogger/providers/grafana.js +50 -0
- package/dist/modules/ScanOrderLogger/types.d.ts +46 -0
- package/dist/modules/ScanOrderLogger/types.js +1 -0
- package/dist/modules/Schedule/getDateIsInSchedule.js +11 -18
- package/dist/modules/Summary/utils.d.ts +3 -3
- package/dist/modules/Summary/utils.js +4 -4
- package/dist/modules/index.d.ts +4 -0
- package/dist/modules/index.js +5 -1
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingByStep/types.d.ts +3 -1
- package/dist/solution/BookingByStep/types.js +5 -1
- package/dist/solution/BookingTicket/index.d.ts +1 -1
- package/dist/solution/ScanOrder/index.d.ts +90 -0
- package/dist/solution/ScanOrder/index.js +1853 -0
- package/dist/solution/ScanOrder/types.d.ts +210 -0
- package/dist/solution/ScanOrder/types.js +16 -0
- package/dist/solution/ScanOrder/utils.d.ts +93 -0
- package/dist/solution/ScanOrder/utils.js +397 -0
- package/dist/solution/VenueBooking/index.d.ts +158 -0
- package/dist/solution/VenueBooking/index.js +2873 -0
- package/dist/solution/VenueBooking/sales-section-4-annotated.json +343 -0
- package/dist/solution/VenueBooking/types.d.ts +130 -0
- package/dist/solution/VenueBooking/types.js +21 -0
- package/dist/solution/VenueBooking/utils/dateSummary.d.ts +10 -0
- package/dist/solution/VenueBooking/utils/dateSummary.js +102 -0
- package/dist/solution/VenueBooking/utils/resource.d.ts +4 -0
- package/dist/solution/VenueBooking/utils/resource.js +94 -0
- package/dist/solution/VenueBooking/utils/slotMerge.d.ts +29 -0
- package/dist/solution/VenueBooking/utils/slotMerge.js +204 -0
- package/dist/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
- package/dist/solution/VenueBooking/utils/timeSlot.js +256 -0
- package/dist/solution/VenueBooking/utils.d.ts +1 -0
- package/dist/solution/VenueBooking/utils.js +1 -0
- package/dist/solution/index.d.ts +2 -0
- package/dist/solution/index.js +3 -1
- package/lib/apis/picoding.d.ts +0 -0
- package/lib/apis/picoding.js +0 -0
- package/lib/model/index.d.ts +1 -0
- package/lib/model/index.js +23 -0
- package/lib/model/strategy/adapter/index.d.ts +7 -0
- package/lib/model/strategy/adapter/index.js +57 -0
- package/lib/model/strategy/adapter/itemRule/adapter.d.ts +59 -0
- package/lib/model/strategy/adapter/itemRule/adapter.js +338 -0
- package/lib/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
- package/lib/model/strategy/adapter/itemRule/evaluator.js +124 -0
- package/lib/model/strategy/adapter/itemRule/examples.d.ts +64 -0
- package/lib/model/strategy/adapter/itemRule/examples.js +269 -0
- package/lib/model/strategy/adapter/itemRule/index.d.ts +5 -0
- package/lib/model/strategy/adapter/itemRule/index.js +58 -0
- package/lib/model/strategy/adapter/itemRule/type.d.ts +206 -0
- package/lib/model/strategy/adapter/itemRule/type.js +46 -0
- package/lib/model/strategy/adapter/promotion/adapter.d.ts +66 -0
- package/lib/model/strategy/adapter/promotion/adapter.js +217 -0
- package/lib/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
- package/lib/model/strategy/adapter/promotion/evaluator.js +844 -0
- package/lib/model/strategy/adapter/promotion/examples.d.ts +138 -0
- package/lib/model/strategy/adapter/promotion/examples.js +192 -0
- package/lib/model/strategy/adapter/promotion/index.d.ts +4 -0
- package/lib/model/strategy/adapter/promotion/index.js +0 -0
- package/lib/model/strategy/adapter/promotion/type.d.ts +447 -0
- package/lib/model/strategy/adapter/promotion/type.js +51 -0
- package/lib/model/strategy/adapter/type.d.ts +28 -0
- package/lib/model/strategy/adapter/type.js +17 -0
- package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +84 -0
- package/lib/model/strategy/adapter/walletPass/evaluator.js +424 -0
- package/lib/model/strategy/adapter/walletPass/example.d.ts +4 -0
- package/lib/model/strategy/adapter/walletPass/example.js +207 -0
- package/lib/model/strategy/adapter/walletPass/index.d.ts +32 -0
- package/lib/model/strategy/adapter/walletPass/index.js +142 -0
- package/lib/model/strategy/adapter/walletPass/locales.d.ts +1 -0
- package/lib/model/strategy/adapter/walletPass/locales.js +54 -0
- package/lib/model/strategy/adapter/walletPass/type.d.ts +187 -0
- package/lib/model/strategy/adapter/walletPass/type.js +17 -0
- package/lib/model/strategy/adapter/walletPass/utils.d.ts +50 -0
- package/lib/model/strategy/adapter/walletPass/utils.js +791 -0
- package/lib/model/strategy/engine.d.ts +106 -0
- package/lib/model/strategy/engine.js +450 -0
- package/lib/model/strategy/index.d.ts +3 -0
- package/lib/model/strategy/index.js +38 -0
- package/lib/model/strategy/strategy-example.d.ts +5 -0
- package/lib/model/strategy/strategy-example.js +318 -0
- package/lib/model/strategy/type.d.ts +228 -0
- package/lib/model/strategy/type.js +44 -0
- package/lib/modules/Cart/utils/cartProduct.js +1 -0
- package/lib/modules/OpenData/index.d.ts +23 -0
- package/lib/modules/OpenData/index.js +116 -0
- package/lib/modules/OpenData/types.d.ts +73 -0
- package/lib/modules/OpenData/types.js +17 -0
- package/lib/modules/OpenData/utils.d.ts +2 -0
- package/lib/modules/OpenData/utils.js +111 -0
- package/lib/modules/Order/index.d.ts +58 -1
- package/lib/modules/Order/index.js +423 -1
- package/lib/modules/Order/types.d.ts +144 -12
- package/lib/modules/Order/utils.d.ts +25 -0
- package/lib/modules/Order/utils.js +229 -0
- package/lib/modules/Product/index.d.ts +1 -1
- package/lib/modules/Product/utils.js +2 -2
- package/lib/modules/ProductList/index.d.ts +1 -1
- package/lib/modules/ProductList/index.js +2 -1
- package/lib/modules/Quotation/index.d.ts +48 -0
- package/lib/modules/Quotation/index.js +149 -0
- package/lib/modules/Quotation/types.d.ts +42 -0
- package/lib/modules/Quotation/types.js +17 -0
- package/lib/modules/Rules/index.js +4 -1
- package/lib/modules/SalesSummary/index.d.ts +63 -0
- package/lib/modules/SalesSummary/index.js +105 -0
- package/lib/modules/SalesSummary/types.d.ts +59 -0
- package/lib/modules/SalesSummary/types.js +17 -0
- package/lib/modules/SalesSummary/utils.d.ts +30 -0
- package/lib/modules/SalesSummary/utils.js +452 -0
- package/lib/modules/ScanOrderLogger/index.d.ts +21 -0
- package/lib/modules/ScanOrderLogger/index.js +135 -0
- package/lib/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
- package/lib/modules/ScanOrderLogger/providers/feishu.js +82 -0
- package/lib/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
- package/lib/modules/ScanOrderLogger/providers/grafana.js +52 -0
- package/lib/modules/ScanOrderLogger/types.d.ts +46 -0
- package/lib/modules/ScanOrderLogger/types.js +17 -0
- package/lib/modules/Schedule/getDateIsInSchedule.js +9 -11
- package/lib/modules/Summary/utils.d.ts +3 -3
- package/lib/modules/Summary/utils.js +4 -4
- package/lib/modules/index.d.ts +4 -0
- package/lib/modules/index.js +9 -1
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingByStep/types.d.ts +3 -1
- package/lib/solution/BookingByStep/types.js +10 -0
- package/lib/solution/BookingTicket/index.d.ts +1 -1
- package/lib/solution/ScanOrder/index.d.ts +90 -0
- package/lib/solution/ScanOrder/index.js +1071 -0
- package/lib/solution/ScanOrder/types.d.ts +210 -0
- package/lib/solution/ScanOrder/types.js +36 -0
- package/lib/solution/ScanOrder/utils.d.ts +93 -0
- package/lib/solution/ScanOrder/utils.js +359 -0
- package/lib/solution/VenueBooking/index.d.ts +158 -0
- package/lib/solution/VenueBooking/index.js +1545 -0
- package/lib/solution/VenueBooking/sales-section-4-annotated.json +343 -0
- package/lib/solution/VenueBooking/types.d.ts +130 -0
- package/lib/solution/VenueBooking/types.js +44 -0
- package/lib/solution/VenueBooking/utils/dateSummary.d.ts +10 -0
- package/lib/solution/VenueBooking/utils/dateSummary.js +101 -0
- package/lib/solution/VenueBooking/utils/resource.d.ts +4 -0
- package/lib/solution/VenueBooking/utils/resource.js +80 -0
- package/lib/solution/VenueBooking/utils/slotMerge.d.ts +29 -0
- package/lib/solution/VenueBooking/utils/slotMerge.js +209 -0
- package/lib/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
- package/lib/solution/VenueBooking/utils/timeSlot.js +200 -0
- package/lib/solution/VenueBooking/utils.d.ts +1 -0
- package/lib/solution/VenueBooking/utils.js +69 -0
- package/lib/solution/index.d.ts +2 -0
- package/lib/solution/index.js +5 -1
- package/package.json +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './type';
|
|
2
|
+
export { default as WalletPassAdapter } from './walletPass';
|
|
3
|
+
export { WalletPassEvaluator } from './walletPass/evaluator';
|
|
4
|
+
export { PromotionEvaluator } from './promotion/evaluator';
|
|
5
|
+
export { PromotionAdapter } from './promotion/adapter';
|
|
6
|
+
export { ItemRuleEvaluator } from './itemRule/evaluator';
|
|
7
|
+
export { ItemRuleAdapter } from './itemRule/adapter';
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/model/strategy/adapter/index.ts
|
|
31
|
+
var adapter_exports = {};
|
|
32
|
+
__export(adapter_exports, {
|
|
33
|
+
ItemRuleAdapter: () => import_adapter2.ItemRuleAdapter,
|
|
34
|
+
ItemRuleEvaluator: () => import_evaluator3.ItemRuleEvaluator,
|
|
35
|
+
PromotionAdapter: () => import_adapter.PromotionAdapter,
|
|
36
|
+
PromotionEvaluator: () => import_evaluator2.PromotionEvaluator,
|
|
37
|
+
WalletPassAdapter: () => import_walletPass.default,
|
|
38
|
+
WalletPassEvaluator: () => import_evaluator.WalletPassEvaluator
|
|
39
|
+
});
|
|
40
|
+
module.exports = __toCommonJS(adapter_exports);
|
|
41
|
+
__reExport(adapter_exports, require("./type"), module.exports);
|
|
42
|
+
var import_walletPass = __toESM(require("./walletPass"));
|
|
43
|
+
var import_evaluator = require("./walletPass/evaluator");
|
|
44
|
+
var import_evaluator2 = require("./promotion/evaluator");
|
|
45
|
+
var import_adapter = require("./promotion/adapter");
|
|
46
|
+
var import_evaluator3 = require("./itemRule/evaluator");
|
|
47
|
+
var import_adapter2 = require("./itemRule/adapter");
|
|
48
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
49
|
+
0 && (module.exports = {
|
|
50
|
+
ItemRuleAdapter,
|
|
51
|
+
ItemRuleEvaluator,
|
|
52
|
+
PromotionAdapter,
|
|
53
|
+
PromotionEvaluator,
|
|
54
|
+
WalletPassAdapter,
|
|
55
|
+
WalletPassEvaluator,
|
|
56
|
+
...require("./type")
|
|
57
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { EvaluationResult, RuntimeContext, ActionEffect } from '../../type';
|
|
2
|
+
import type { BusinessAdapter } from '../type';
|
|
3
|
+
import { type ItemRuleBusinessData, type QuantityCheckResult, type PrefillItemResult, type QuantityLimitResult } from './type';
|
|
4
|
+
/**
|
|
5
|
+
* ItemRule 适配器
|
|
6
|
+
*
|
|
7
|
+
* 将堂食扫码点餐的商品规则业务数据转换为策略引擎格式,
|
|
8
|
+
* 并将引擎结果转换为数量校验和预填购物车的业务结果。
|
|
9
|
+
*/
|
|
10
|
+
export declare class ItemRuleAdapter implements BusinessAdapter {
|
|
11
|
+
name: string;
|
|
12
|
+
version: string;
|
|
13
|
+
prepareContext(businessData: ItemRuleBusinessData): RuntimeContext;
|
|
14
|
+
transformResult(result: EvaluationResult, businessData?: ItemRuleBusinessData): {
|
|
15
|
+
quantityChecks: QuantityCheckResult[];
|
|
16
|
+
prefillItems: PrefillItemResult[];
|
|
17
|
+
};
|
|
18
|
+
formatConfig(result: EvaluationResult, businessData?: ItemRuleBusinessData): {
|
|
19
|
+
result: EvaluationResult;
|
|
20
|
+
businessData?: ItemRuleBusinessData;
|
|
21
|
+
};
|
|
22
|
+
private processQuantityCheck;
|
|
23
|
+
/**
|
|
24
|
+
* 根据 scope 判断当前提交是否需要评估此规则
|
|
25
|
+
*/
|
|
26
|
+
private shouldEvaluateForScope;
|
|
27
|
+
/**
|
|
28
|
+
* 计算目标商品在购物车中的实际数量
|
|
29
|
+
*
|
|
30
|
+
* cumulative scope 时还会加上历史订单数量。
|
|
31
|
+
*/
|
|
32
|
+
private calculateActualQuantity;
|
|
33
|
+
/**
|
|
34
|
+
* 逐条评估数量规则
|
|
35
|
+
*/
|
|
36
|
+
private evaluateQuantityRules;
|
|
37
|
+
/**
|
|
38
|
+
* 根据 source 解析出数量规则的实际数值
|
|
39
|
+
*/
|
|
40
|
+
private resolveQuantityValue;
|
|
41
|
+
/**
|
|
42
|
+
* 格式化校验提示语,替换 {min} {max} 占位符
|
|
43
|
+
*/
|
|
44
|
+
private formatValidationMessage;
|
|
45
|
+
/**
|
|
46
|
+
* 从单个 QUANTITY_CHECK action 中提取数量限制配置。
|
|
47
|
+
*
|
|
48
|
+
* 根据 scope + submissionIndex 判断是否适用,
|
|
49
|
+
* 解析动态数量来源(pax)后返回 min/max/exact/mustInclude。
|
|
50
|
+
* 不适用或无配置时返回 null。
|
|
51
|
+
*/
|
|
52
|
+
extractQuantityLimits(action: ActionEffect, businessData: ItemRuleBusinessData): QuantityLimitResult | null;
|
|
53
|
+
private processPrefillCart;
|
|
54
|
+
/**
|
|
55
|
+
* 根据 quantityFrom 计算预填数量
|
|
56
|
+
*/
|
|
57
|
+
private resolvePrefillQuantity;
|
|
58
|
+
}
|
|
59
|
+
export default ItemRuleAdapter;
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/model/strategy/adapter/itemRule/adapter.ts
|
|
20
|
+
var adapter_exports = {};
|
|
21
|
+
__export(adapter_exports, {
|
|
22
|
+
ItemRuleAdapter: () => ItemRuleAdapter,
|
|
23
|
+
default: () => adapter_default
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(adapter_exports);
|
|
26
|
+
var import_type = require("./type");
|
|
27
|
+
var ItemRuleAdapter = class {
|
|
28
|
+
constructor() {
|
|
29
|
+
this.name = "ItemRuleAdapter";
|
|
30
|
+
this.version = "1.0.0";
|
|
31
|
+
}
|
|
32
|
+
prepareContext(businessData) {
|
|
33
|
+
const { pax, cartItems, serviceType, submissionIndex, custom } = businessData;
|
|
34
|
+
return {
|
|
35
|
+
entities: {
|
|
36
|
+
cartItems,
|
|
37
|
+
historicalItems: businessData.historicalItems || [],
|
|
38
|
+
pax
|
|
39
|
+
},
|
|
40
|
+
attributes: {
|
|
41
|
+
serviceType: serviceType || "",
|
|
42
|
+
totalPax: pax.total,
|
|
43
|
+
adultPax: pax.adult,
|
|
44
|
+
childPax: pax.child,
|
|
45
|
+
submissionIndex: submissionIndex ?? 0,
|
|
46
|
+
cartItemCount: cartItems.length,
|
|
47
|
+
cartTotalQuantity: cartItems.reduce((sum, item) => sum + item.quantity, 0),
|
|
48
|
+
...custom
|
|
49
|
+
},
|
|
50
|
+
metadata: {
|
|
51
|
+
timestamp: Date.now()
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
transformResult(result, businessData) {
|
|
56
|
+
const quantityChecks = [];
|
|
57
|
+
const prefillItems = [];
|
|
58
|
+
if (!result.applicable || !businessData) {
|
|
59
|
+
return { quantityChecks, prefillItems };
|
|
60
|
+
}
|
|
61
|
+
for (const action of result.matchedActions) {
|
|
62
|
+
if (action.type === import_type.ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK) {
|
|
63
|
+
const checkResult = this.processQuantityCheck(action, businessData);
|
|
64
|
+
if (checkResult) {
|
|
65
|
+
quantityChecks.push(checkResult);
|
|
66
|
+
}
|
|
67
|
+
} else if (action.type === import_type.ITEM_RULE_ACTION_TYPES.PREFILL_CART) {
|
|
68
|
+
const items = this.processPrefillCart(action, businessData);
|
|
69
|
+
prefillItems.push(...items);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return { quantityChecks, prefillItems };
|
|
73
|
+
}
|
|
74
|
+
formatConfig(result, businessData) {
|
|
75
|
+
return { result, businessData };
|
|
76
|
+
}
|
|
77
|
+
// ============================================
|
|
78
|
+
// Quantity Check 处理
|
|
79
|
+
// ============================================
|
|
80
|
+
processQuantityCheck(action, businessData) {
|
|
81
|
+
const config = action.config;
|
|
82
|
+
if (!config)
|
|
83
|
+
return null;
|
|
84
|
+
const { scope, quantityRules, targetType, targets, validationMessage } = config;
|
|
85
|
+
if (!this.shouldEvaluateForScope(scope, businessData.submissionIndex ?? 0)) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const actualQuantity = this.calculateActualQuantity(
|
|
89
|
+
targets,
|
|
90
|
+
scope,
|
|
91
|
+
businessData
|
|
92
|
+
);
|
|
93
|
+
const { passed, failedRules, requiredMin, requiredMax, requiredExact, mustInclude } = this.evaluateQuantityRules(quantityRules, actualQuantity, businessData);
|
|
94
|
+
const message = this.formatValidationMessage(
|
|
95
|
+
validationMessage,
|
|
96
|
+
requiredMin,
|
|
97
|
+
requiredMax,
|
|
98
|
+
requiredExact
|
|
99
|
+
);
|
|
100
|
+
return {
|
|
101
|
+
ruleId: action.id,
|
|
102
|
+
passed,
|
|
103
|
+
targetType,
|
|
104
|
+
targets,
|
|
105
|
+
actualQuantity,
|
|
106
|
+
requiredMin,
|
|
107
|
+
requiredMax,
|
|
108
|
+
requiredExact,
|
|
109
|
+
mustInclude,
|
|
110
|
+
validationMessage: message,
|
|
111
|
+
scope,
|
|
112
|
+
failedRules: passed ? void 0 : failedRules
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 根据 scope 判断当前提交是否需要评估此规则
|
|
117
|
+
*/
|
|
118
|
+
shouldEvaluateForScope(scope, submissionIndex) {
|
|
119
|
+
switch (scope) {
|
|
120
|
+
case "each_submission":
|
|
121
|
+
return true;
|
|
122
|
+
case "first_submission_only":
|
|
123
|
+
return submissionIndex === 0;
|
|
124
|
+
case "subsequent_only":
|
|
125
|
+
return submissionIndex > 0;
|
|
126
|
+
case "cumulative":
|
|
127
|
+
return true;
|
|
128
|
+
default:
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 计算目标商品在购物车中的实际数量
|
|
134
|
+
*
|
|
135
|
+
* cumulative scope 时还会加上历史订单数量。
|
|
136
|
+
*/
|
|
137
|
+
calculateActualQuantity(targets, scope, businessData) {
|
|
138
|
+
const targetIds = new Set(targets.map((t) => t.product_id));
|
|
139
|
+
let quantity = 0;
|
|
140
|
+
const countFromItems = (items) => {
|
|
141
|
+
for (const item of items) {
|
|
142
|
+
if (targetIds.has(item.product_id)) {
|
|
143
|
+
quantity += item.quantity;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
if (scope === "cumulative") {
|
|
148
|
+
if (businessData.historicalItems) {
|
|
149
|
+
countFromItems(businessData.historicalItems);
|
|
150
|
+
}
|
|
151
|
+
countFromItems(businessData.cartItems);
|
|
152
|
+
} else {
|
|
153
|
+
countFromItems(businessData.cartItems);
|
|
154
|
+
}
|
|
155
|
+
return quantity;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 逐条评估数量规则
|
|
159
|
+
*/
|
|
160
|
+
evaluateQuantityRules(rules, actualQuantity, businessData) {
|
|
161
|
+
const failedRules = [];
|
|
162
|
+
let requiredMin;
|
|
163
|
+
let requiredMax;
|
|
164
|
+
let requiredExact;
|
|
165
|
+
let mustInclude;
|
|
166
|
+
for (const rule of rules) {
|
|
167
|
+
const resolvedValue = this.resolveQuantityValue(rule, businessData);
|
|
168
|
+
switch (rule.comparison) {
|
|
169
|
+
case "minimum": {
|
|
170
|
+
if (requiredMin === void 0 || resolvedValue > requiredMin) {
|
|
171
|
+
requiredMin = resolvedValue;
|
|
172
|
+
}
|
|
173
|
+
if (actualQuantity < resolvedValue) {
|
|
174
|
+
failedRules.push(rule);
|
|
175
|
+
}
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
case "maximum": {
|
|
179
|
+
if (requiredMax === void 0 || resolvedValue < requiredMax) {
|
|
180
|
+
requiredMax = resolvedValue;
|
|
181
|
+
}
|
|
182
|
+
if (actualQuantity > resolvedValue) {
|
|
183
|
+
failedRules.push(rule);
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
case "exact": {
|
|
188
|
+
requiredExact = resolvedValue;
|
|
189
|
+
if (actualQuantity !== resolvedValue) {
|
|
190
|
+
failedRules.push(rule);
|
|
191
|
+
}
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
case "must_include": {
|
|
195
|
+
mustInclude = true;
|
|
196
|
+
if (actualQuantity < 1) {
|
|
197
|
+
failedRules.push(rule);
|
|
198
|
+
}
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
passed: failedRules.length === 0,
|
|
205
|
+
failedRules,
|
|
206
|
+
requiredMin,
|
|
207
|
+
requiredMax,
|
|
208
|
+
requiredExact,
|
|
209
|
+
mustInclude
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* 根据 source 解析出数量规则的实际数值
|
|
214
|
+
*/
|
|
215
|
+
resolveQuantityValue(rule, businessData) {
|
|
216
|
+
switch (rule.source) {
|
|
217
|
+
case "total_pax":
|
|
218
|
+
return businessData.pax.total;
|
|
219
|
+
case "adult_pax":
|
|
220
|
+
return businessData.pax.adult;
|
|
221
|
+
case "fixed":
|
|
222
|
+
return rule.value ?? 0;
|
|
223
|
+
default:
|
|
224
|
+
return rule.value ?? 0;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* 格式化校验提示语,替换 {min} {max} 占位符
|
|
229
|
+
*/
|
|
230
|
+
formatValidationMessage(template, min, max, exact, locale) {
|
|
231
|
+
if (!template)
|
|
232
|
+
return void 0;
|
|
233
|
+
let text = typeof template === "string" ? template : template[locale || "en"] || Object.values(template)[0] || "";
|
|
234
|
+
text = text.replace(/\{min\}/g, String(min ?? ""));
|
|
235
|
+
text = text.replace(/\{max\}/g, String(max ?? ""));
|
|
236
|
+
text = text.replace(/\{exact\}/g, String(exact ?? ""));
|
|
237
|
+
return text;
|
|
238
|
+
}
|
|
239
|
+
// ============================================
|
|
240
|
+
// Quantity Limit 提取(仅读取配置,不做校验)
|
|
241
|
+
// ============================================
|
|
242
|
+
/**
|
|
243
|
+
* 从单个 QUANTITY_CHECK action 中提取数量限制配置。
|
|
244
|
+
*
|
|
245
|
+
* 根据 scope + submissionIndex 判断是否适用,
|
|
246
|
+
* 解析动态数量来源(pax)后返回 min/max/exact/mustInclude。
|
|
247
|
+
* 不适用或无配置时返回 null。
|
|
248
|
+
*/
|
|
249
|
+
extractQuantityLimits(action, businessData) {
|
|
250
|
+
const config = action.config;
|
|
251
|
+
if (!config)
|
|
252
|
+
return null;
|
|
253
|
+
const { scope, quantityRules, targetType, targets } = config;
|
|
254
|
+
if (!this.shouldEvaluateForScope(scope, businessData.submissionIndex ?? 0)) {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
let requiredMin;
|
|
258
|
+
let requiredMax;
|
|
259
|
+
let requiredExact;
|
|
260
|
+
let mustInclude;
|
|
261
|
+
for (const rule of quantityRules) {
|
|
262
|
+
const resolvedValue = this.resolveQuantityValue(rule, businessData);
|
|
263
|
+
switch (rule.comparison) {
|
|
264
|
+
case "minimum": {
|
|
265
|
+
if (requiredMin === void 0 || resolvedValue > requiredMin) {
|
|
266
|
+
requiredMin = resolvedValue;
|
|
267
|
+
}
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
case "maximum": {
|
|
271
|
+
if (requiredMax === void 0 || resolvedValue < requiredMax) {
|
|
272
|
+
requiredMax = resolvedValue;
|
|
273
|
+
}
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
case "exact": {
|
|
277
|
+
requiredExact = resolvedValue;
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
case "must_include": {
|
|
281
|
+
mustInclude = true;
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
ruleId: action.id,
|
|
288
|
+
targetType,
|
|
289
|
+
targets,
|
|
290
|
+
requiredMin,
|
|
291
|
+
requiredMax,
|
|
292
|
+
requiredExact,
|
|
293
|
+
mustInclude,
|
|
294
|
+
scope
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
// ============================================
|
|
298
|
+
// Prefill Cart 处理
|
|
299
|
+
// ============================================
|
|
300
|
+
processPrefillCart(action, businessData) {
|
|
301
|
+
const config = action.config;
|
|
302
|
+
if (!(config == null ? void 0 : config.products))
|
|
303
|
+
return [];
|
|
304
|
+
const results = [];
|
|
305
|
+
for (const prefillProduct of config.products) {
|
|
306
|
+
const quantity = this.resolvePrefillQuantity(prefillProduct.quantityFrom, prefillProduct.quantity, businessData);
|
|
307
|
+
if (quantity <= 0)
|
|
308
|
+
continue;
|
|
309
|
+
results.push({
|
|
310
|
+
ruleId: action.id,
|
|
311
|
+
product_id: prefillProduct.product_id,
|
|
312
|
+
product_variant_id: prefillProduct.product_variant_id,
|
|
313
|
+
quantity
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
return results;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* 根据 quantityFrom 计算预填数量
|
|
320
|
+
*/
|
|
321
|
+
resolvePrefillQuantity(quantityFrom, fixedValue, businessData) {
|
|
322
|
+
switch (quantityFrom) {
|
|
323
|
+
case "total_pax":
|
|
324
|
+
return businessData.pax.total;
|
|
325
|
+
case "adult_pax":
|
|
326
|
+
return businessData.pax.adult;
|
|
327
|
+
case "fixed":
|
|
328
|
+
return fixedValue ?? 0;
|
|
329
|
+
default:
|
|
330
|
+
return fixedValue ?? 0;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
var adapter_default = ItemRuleAdapter;
|
|
335
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
336
|
+
0 && (module.exports = {
|
|
337
|
+
ItemRuleAdapter
|
|
338
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { StrategyConfig } from '../../type';
|
|
2
|
+
import { type ItemRuleBusinessData, type ItemRuleEvaluationResult, type QuantityCheckResult, type QuantityLimitResult, type PrefillItemResult } from './type';
|
|
3
|
+
/**
|
|
4
|
+
* ItemRule 评估器
|
|
5
|
+
*
|
|
6
|
+
* 组合 StrategyEngine + ItemRuleAdapter,提供面向业务的高层 API。
|
|
7
|
+
* 支持批量评估多条 item_rule 策略配置,聚合数量校验和预填购物车结果。
|
|
8
|
+
*/
|
|
9
|
+
export declare class ItemRuleEvaluator {
|
|
10
|
+
private engine;
|
|
11
|
+
private adapter;
|
|
12
|
+
private strategyConfigs;
|
|
13
|
+
constructor();
|
|
14
|
+
/**
|
|
15
|
+
* 设置策略配置列表
|
|
16
|
+
* 自动过滤 metadata.type === 'item_rule' 的配置
|
|
17
|
+
*/
|
|
18
|
+
setStrategyConfigs(configs: StrategyConfig[]): void;
|
|
19
|
+
getStrategyConfigs(): StrategyConfig[];
|
|
20
|
+
/**
|
|
21
|
+
* 完整评估:数量校验 + 预填购物车
|
|
22
|
+
*/
|
|
23
|
+
evaluate(businessData: ItemRuleBusinessData): ItemRuleEvaluationResult;
|
|
24
|
+
/**
|
|
25
|
+
* 获取当前配置中各商品的数量限制
|
|
26
|
+
*
|
|
27
|
+
* 不做购物车校验,仅从策略配置中提取 QUANTITY_CHECK 规则的
|
|
28
|
+
* min / max / exact / mustInclude 限制值。
|
|
29
|
+
* 会评估条件是否满足、根据 scope + submissionIndex 过滤。
|
|
30
|
+
*/
|
|
31
|
+
getQuantityLimits(businessData: ItemRuleBusinessData): QuantityLimitResult[];
|
|
32
|
+
/**
|
|
33
|
+
* 便捷方法:仅做数量校验,返回是否全部通过及失败详情
|
|
34
|
+
*/
|
|
35
|
+
validateCart(businessData: ItemRuleBusinessData): {
|
|
36
|
+
passed: boolean;
|
|
37
|
+
failures: QuantityCheckResult[];
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* 便捷方法:仅获取需要预填到购物车的商品
|
|
41
|
+
*/
|
|
42
|
+
getPrefillItems(businessData: ItemRuleBusinessData): PrefillItemResult[];
|
|
43
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/model/strategy/adapter/itemRule/evaluator.ts
|
|
20
|
+
var evaluator_exports = {};
|
|
21
|
+
__export(evaluator_exports, {
|
|
22
|
+
ItemRuleEvaluator: () => ItemRuleEvaluator
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(evaluator_exports);
|
|
25
|
+
var import_engine = require("../../engine");
|
|
26
|
+
var import_adapter = require("./adapter");
|
|
27
|
+
var import_type = require("./type");
|
|
28
|
+
var ItemRuleEvaluator = class {
|
|
29
|
+
constructor() {
|
|
30
|
+
this.strategyConfigs = [];
|
|
31
|
+
this.engine = new import_engine.StrategyEngine({
|
|
32
|
+
debug: false,
|
|
33
|
+
enableTrace: false
|
|
34
|
+
});
|
|
35
|
+
this.adapter = new import_adapter.ItemRuleAdapter();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 设置策略配置列表
|
|
39
|
+
* 自动过滤 metadata.type === 'item_rule' 的配置
|
|
40
|
+
*/
|
|
41
|
+
setStrategyConfigs(configs) {
|
|
42
|
+
this.strategyConfigs = configs.filter(
|
|
43
|
+
(c) => c.metadata.type === "item_rule"
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
getStrategyConfigs() {
|
|
47
|
+
return this.strategyConfigs;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 完整评估:数量校验 + 预填购物车
|
|
51
|
+
*/
|
|
52
|
+
evaluate(businessData) {
|
|
53
|
+
const configs = businessData.strategyConfigs ? businessData.strategyConfigs.filter((c) => c.metadata.type === "item_rule") : this.strategyConfigs;
|
|
54
|
+
const allQuantityChecks = [];
|
|
55
|
+
const allPrefillItems = [];
|
|
56
|
+
const rawResults = [];
|
|
57
|
+
const context = this.adapter.prepareContext(businessData);
|
|
58
|
+
for (const config of configs) {
|
|
59
|
+
const evalResult = this.engine.evaluate(config, context);
|
|
60
|
+
rawResults.push(evalResult);
|
|
61
|
+
const { quantityChecks, prefillItems } = this.adapter.transformResult(
|
|
62
|
+
evalResult,
|
|
63
|
+
businessData
|
|
64
|
+
);
|
|
65
|
+
allQuantityChecks.push(...quantityChecks);
|
|
66
|
+
allPrefillItems.push(...prefillItems);
|
|
67
|
+
}
|
|
68
|
+
const failedChecks = allQuantityChecks.filter((c) => !c.passed);
|
|
69
|
+
return {
|
|
70
|
+
quantityChecks: allQuantityChecks,
|
|
71
|
+
prefillItems: allPrefillItems,
|
|
72
|
+
allPassed: failedChecks.length === 0,
|
|
73
|
+
failedChecks,
|
|
74
|
+
rawResults
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 获取当前配置中各商品的数量限制
|
|
79
|
+
*
|
|
80
|
+
* 不做购物车校验,仅从策略配置中提取 QUANTITY_CHECK 规则的
|
|
81
|
+
* min / max / exact / mustInclude 限制值。
|
|
82
|
+
* 会评估条件是否满足、根据 scope + submissionIndex 过滤。
|
|
83
|
+
*/
|
|
84
|
+
getQuantityLimits(businessData) {
|
|
85
|
+
const configs = businessData.strategyConfigs ? businessData.strategyConfigs.filter((c) => c.metadata.type === "item_rule") : this.strategyConfigs;
|
|
86
|
+
const results = [];
|
|
87
|
+
const context = this.adapter.prepareContext(businessData);
|
|
88
|
+
for (const config of configs) {
|
|
89
|
+
const evalResult = this.engine.evaluate(config, context);
|
|
90
|
+
if (!evalResult.applicable)
|
|
91
|
+
continue;
|
|
92
|
+
for (const action of evalResult.matchedActions) {
|
|
93
|
+
if (action.type !== import_type.ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK)
|
|
94
|
+
continue;
|
|
95
|
+
const limit = this.adapter.extractQuantityLimits(action, businessData);
|
|
96
|
+
if (limit) {
|
|
97
|
+
results.push(limit);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return results;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 便捷方法:仅做数量校验,返回是否全部通过及失败详情
|
|
105
|
+
*/
|
|
106
|
+
validateCart(businessData) {
|
|
107
|
+
const result = this.evaluate(businessData);
|
|
108
|
+
return {
|
|
109
|
+
passed: result.allPassed,
|
|
110
|
+
failures: result.failedChecks
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 便捷方法:仅获取需要预填到购物车的商品
|
|
115
|
+
*/
|
|
116
|
+
getPrefillItems(businessData) {
|
|
117
|
+
const result = this.evaluate(businessData);
|
|
118
|
+
return result.prefillItems;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
122
|
+
0 && (module.exports = {
|
|
123
|
+
ItemRuleEvaluator
|
|
124
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { StrategyConfig } from '../../type';
|
|
2
|
+
/**
|
|
3
|
+
* 场景:火锅店扫码点餐,要求小料数量 >= 成人人数,自动添加到购物车
|
|
4
|
+
*
|
|
5
|
+
* WHEN: Always active
|
|
6
|
+
* THEN:
|
|
7
|
+
* - Quantity Check: 小料最少数量 = Adult Pax
|
|
8
|
+
* - Prefill Cart: 自动添加小料 x Adult Pax
|
|
9
|
+
*/
|
|
10
|
+
export declare const MIN_CONDIMENT_PER_PERSON_STRATEGY: StrategyConfig;
|
|
11
|
+
/**
|
|
12
|
+
* 场景:包子限量供应,每桌最多3份(含加单累计),肉包和菜包合计
|
|
13
|
+
*
|
|
14
|
+
* WHEN: Always active
|
|
15
|
+
* THEN:
|
|
16
|
+
* - Quantity Check: 肉包 + 菜包 合计 <= 3,scope=cumulative
|
|
17
|
+
*/
|
|
18
|
+
export declare const MAX_BUNS_PER_TABLE_STRATEGY: StrategyConfig;
|
|
19
|
+
/**
|
|
20
|
+
* 场景:堂食必须选择一个锅底(按商品匹配),自动预填默认锅底
|
|
21
|
+
*
|
|
22
|
+
* WHEN: Service Type = Dine-in
|
|
23
|
+
* THEN:
|
|
24
|
+
* - Quantity Check: 指定锅底商品精确1份
|
|
25
|
+
* - Prefill Cart: 自动添加默认锅底 x 1
|
|
26
|
+
*/
|
|
27
|
+
export declare const HOTPOT_BASE_REQUIRED_STRATEGY: StrategyConfig;
|
|
28
|
+
/**
|
|
29
|
+
* ItemRuleEvaluator 简洁调用示例
|
|
30
|
+
*
|
|
31
|
+
* 覆盖方法:
|
|
32
|
+
* - setStrategyConfigs
|
|
33
|
+
* - getStrategyConfigs
|
|
34
|
+
* - evaluate
|
|
35
|
+
* - getQuantityLimits
|
|
36
|
+
* - validateCart
|
|
37
|
+
* - getPrefillItems
|
|
38
|
+
*/
|
|
39
|
+
export declare function quickUseItemRuleEvaluator(): {
|
|
40
|
+
configCount: number;
|
|
41
|
+
evaluation: import("./type").ItemRuleEvaluationResult;
|
|
42
|
+
quantityLimits: import("./type").QuantityLimitResult[];
|
|
43
|
+
validation: {
|
|
44
|
+
passed: boolean;
|
|
45
|
+
failures: import("./type").QuantityCheckResult[];
|
|
46
|
+
};
|
|
47
|
+
prefillItems: import("./type").PrefillItemResult[];
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* ItemRuleEvaluator 完整可运行 Demo
|
|
51
|
+
*
|
|
52
|
+
* 说明:
|
|
53
|
+
* 1) 首次提交:触发 first_submission_only + cumulative + 条件规则
|
|
54
|
+
* 2) 追加提交:演示 first_submission_only 不再触发
|
|
55
|
+
* 3) 覆盖 strategyConfigs 临时传入:演示按需仅评估部分规则
|
|
56
|
+
*/
|
|
57
|
+
export declare function runItemRuleEvaluatorDemo(): {
|
|
58
|
+
firstEvaluation: import("./type").ItemRuleEvaluationResult;
|
|
59
|
+
validateResult: {
|
|
60
|
+
passed: boolean;
|
|
61
|
+
failures: import("./type").QuantityCheckResult[];
|
|
62
|
+
};
|
|
63
|
+
prefillItems: import("./type").PrefillItemResult[];
|
|
64
|
+
};
|