@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.
Files changed (231) hide show
  1. package/dist/apis/picoding.d.ts +0 -0
  2. package/dist/apis/picoding.js +1 -0
  3. package/dist/model/index.d.ts +1 -0
  4. package/dist/model/index.js +1 -0
  5. package/dist/model/strategy/adapter/index.d.ts +7 -0
  6. package/dist/model/strategy/adapter/index.js +7 -0
  7. package/dist/model/strategy/adapter/itemRule/adapter.d.ts +59 -0
  8. package/dist/model/strategy/adapter/itemRule/adapter.js +439 -0
  9. package/dist/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
  10. package/dist/model/strategy/adapter/itemRule/evaluator.js +169 -0
  11. package/dist/model/strategy/adapter/itemRule/examples.d.ts +64 -0
  12. package/dist/model/strategy/adapter/itemRule/examples.js +315 -0
  13. package/dist/model/strategy/adapter/itemRule/index.d.ts +5 -0
  14. package/dist/model/strategy/adapter/itemRule/index.js +5 -0
  15. package/dist/model/strategy/adapter/itemRule/type.d.ts +206 -0
  16. package/dist/model/strategy/adapter/itemRule/type.js +101 -0
  17. package/dist/model/strategy/adapter/promotion/adapter.d.ts +66 -0
  18. package/dist/model/strategy/adapter/promotion/adapter.js +271 -0
  19. package/dist/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
  20. package/dist/model/strategy/adapter/promotion/evaluator.js +1206 -0
  21. package/dist/model/strategy/adapter/promotion/examples.d.ts +138 -0
  22. package/dist/model/strategy/adapter/promotion/examples.js +166 -0
  23. package/dist/model/strategy/adapter/promotion/index.d.ts +4 -0
  24. package/dist/model/strategy/adapter/promotion/index.js +0 -0
  25. package/dist/model/strategy/adapter/promotion/type.d.ts +447 -0
  26. package/dist/model/strategy/adapter/promotion/type.js +209 -0
  27. package/dist/model/strategy/adapter/type.d.ts +28 -0
  28. package/dist/model/strategy/adapter/type.js +1 -0
  29. package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +84 -0
  30. package/dist/model/strategy/adapter/walletPass/evaluator.js +502 -0
  31. package/dist/model/strategy/adapter/walletPass/example.d.ts +4 -0
  32. package/dist/model/strategy/adapter/walletPass/example.js +258 -0
  33. package/dist/model/strategy/adapter/walletPass/index.d.ts +32 -0
  34. package/dist/model/strategy/adapter/walletPass/index.js +182 -0
  35. package/dist/model/strategy/adapter/walletPass/locales.d.ts +1 -0
  36. package/dist/model/strategy/adapter/walletPass/locales.js +26 -0
  37. package/dist/model/strategy/adapter/walletPass/type.d.ts +187 -0
  38. package/dist/model/strategy/adapter/walletPass/type.js +1 -0
  39. package/dist/model/strategy/adapter/walletPass/utils.d.ts +50 -0
  40. package/dist/model/strategy/adapter/walletPass/utils.js +1104 -0
  41. package/dist/model/strategy/engine.d.ts +106 -0
  42. package/dist/model/strategy/engine.js +611 -0
  43. package/dist/model/strategy/index.d.ts +3 -0
  44. package/dist/model/strategy/index.js +8 -0
  45. package/dist/model/strategy/strategy-example.d.ts +5 -0
  46. package/dist/model/strategy/strategy-example.js +331 -0
  47. package/dist/model/strategy/type.d.ts +228 -0
  48. package/dist/model/strategy/type.js +94 -0
  49. package/dist/modules/Cart/utils/cartProduct.js +1 -0
  50. package/dist/modules/OpenData/index.d.ts +23 -0
  51. package/dist/modules/OpenData/index.js +167 -0
  52. package/dist/modules/OpenData/types.d.ts +73 -0
  53. package/dist/modules/OpenData/types.js +1 -0
  54. package/dist/modules/OpenData/utils.d.ts +2 -0
  55. package/dist/modules/OpenData/utils.js +75 -0
  56. package/dist/modules/Order/index.d.ts +58 -1
  57. package/dist/modules/Order/index.js +780 -29
  58. package/dist/modules/Order/types.d.ts +144 -12
  59. package/dist/modules/Order/utils.d.ts +25 -0
  60. package/dist/modules/Order/utils.js +225 -1
  61. package/dist/modules/Product/index.d.ts +1 -1
  62. package/dist/modules/Product/utils.js +2 -2
  63. package/dist/modules/ProductList/index.d.ts +1 -1
  64. package/dist/modules/ProductList/index.js +2 -1
  65. package/dist/modules/Quotation/index.d.ts +48 -0
  66. package/dist/modules/Quotation/index.js +245 -0
  67. package/dist/modules/Quotation/types.d.ts +42 -0
  68. package/dist/modules/Quotation/types.js +1 -0
  69. package/dist/modules/Rules/index.js +4 -1
  70. package/dist/modules/SalesSummary/index.d.ts +63 -0
  71. package/dist/modules/SalesSummary/index.js +174 -0
  72. package/dist/modules/SalesSummary/types.d.ts +59 -0
  73. package/dist/modules/SalesSummary/types.js +1 -0
  74. package/dist/modules/SalesSummary/utils.d.ts +30 -0
  75. package/dist/modules/SalesSummary/utils.js +513 -0
  76. package/dist/modules/ScanOrderLogger/index.d.ts +21 -0
  77. package/dist/modules/ScanOrderLogger/index.js +161 -0
  78. package/dist/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
  79. package/dist/modules/ScanOrderLogger/providers/feishu.js +95 -0
  80. package/dist/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
  81. package/dist/modules/ScanOrderLogger/providers/grafana.js +50 -0
  82. package/dist/modules/ScanOrderLogger/types.d.ts +46 -0
  83. package/dist/modules/ScanOrderLogger/types.js +1 -0
  84. package/dist/modules/Schedule/getDateIsInSchedule.js +11 -18
  85. package/dist/modules/Summary/utils.d.ts +3 -3
  86. package/dist/modules/Summary/utils.js +4 -4
  87. package/dist/modules/index.d.ts +4 -0
  88. package/dist/modules/index.js +5 -1
  89. package/dist/solution/BookingByStep/index.d.ts +1 -1
  90. package/dist/solution/BookingByStep/types.d.ts +3 -1
  91. package/dist/solution/BookingByStep/types.js +5 -1
  92. package/dist/solution/BookingTicket/index.d.ts +1 -1
  93. package/dist/solution/ScanOrder/index.d.ts +90 -0
  94. package/dist/solution/ScanOrder/index.js +1853 -0
  95. package/dist/solution/ScanOrder/types.d.ts +210 -0
  96. package/dist/solution/ScanOrder/types.js +16 -0
  97. package/dist/solution/ScanOrder/utils.d.ts +93 -0
  98. package/dist/solution/ScanOrder/utils.js +397 -0
  99. package/dist/solution/VenueBooking/index.d.ts +158 -0
  100. package/dist/solution/VenueBooking/index.js +2873 -0
  101. package/dist/solution/VenueBooking/sales-section-4-annotated.json +343 -0
  102. package/dist/solution/VenueBooking/types.d.ts +130 -0
  103. package/dist/solution/VenueBooking/types.js +21 -0
  104. package/dist/solution/VenueBooking/utils/dateSummary.d.ts +10 -0
  105. package/dist/solution/VenueBooking/utils/dateSummary.js +102 -0
  106. package/dist/solution/VenueBooking/utils/resource.d.ts +4 -0
  107. package/dist/solution/VenueBooking/utils/resource.js +94 -0
  108. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +29 -0
  109. package/dist/solution/VenueBooking/utils/slotMerge.js +204 -0
  110. package/dist/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
  111. package/dist/solution/VenueBooking/utils/timeSlot.js +256 -0
  112. package/dist/solution/VenueBooking/utils.d.ts +1 -0
  113. package/dist/solution/VenueBooking/utils.js +1 -0
  114. package/dist/solution/index.d.ts +2 -0
  115. package/dist/solution/index.js +3 -1
  116. package/lib/apis/picoding.d.ts +0 -0
  117. package/lib/apis/picoding.js +0 -0
  118. package/lib/model/index.d.ts +1 -0
  119. package/lib/model/index.js +23 -0
  120. package/lib/model/strategy/adapter/index.d.ts +7 -0
  121. package/lib/model/strategy/adapter/index.js +57 -0
  122. package/lib/model/strategy/adapter/itemRule/adapter.d.ts +59 -0
  123. package/lib/model/strategy/adapter/itemRule/adapter.js +338 -0
  124. package/lib/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
  125. package/lib/model/strategy/adapter/itemRule/evaluator.js +124 -0
  126. package/lib/model/strategy/adapter/itemRule/examples.d.ts +64 -0
  127. package/lib/model/strategy/adapter/itemRule/examples.js +269 -0
  128. package/lib/model/strategy/adapter/itemRule/index.d.ts +5 -0
  129. package/lib/model/strategy/adapter/itemRule/index.js +58 -0
  130. package/lib/model/strategy/adapter/itemRule/type.d.ts +206 -0
  131. package/lib/model/strategy/adapter/itemRule/type.js +46 -0
  132. package/lib/model/strategy/adapter/promotion/adapter.d.ts +66 -0
  133. package/lib/model/strategy/adapter/promotion/adapter.js +217 -0
  134. package/lib/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
  135. package/lib/model/strategy/adapter/promotion/evaluator.js +844 -0
  136. package/lib/model/strategy/adapter/promotion/examples.d.ts +138 -0
  137. package/lib/model/strategy/adapter/promotion/examples.js +192 -0
  138. package/lib/model/strategy/adapter/promotion/index.d.ts +4 -0
  139. package/lib/model/strategy/adapter/promotion/index.js +0 -0
  140. package/lib/model/strategy/adapter/promotion/type.d.ts +447 -0
  141. package/lib/model/strategy/adapter/promotion/type.js +51 -0
  142. package/lib/model/strategy/adapter/type.d.ts +28 -0
  143. package/lib/model/strategy/adapter/type.js +17 -0
  144. package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +84 -0
  145. package/lib/model/strategy/adapter/walletPass/evaluator.js +424 -0
  146. package/lib/model/strategy/adapter/walletPass/example.d.ts +4 -0
  147. package/lib/model/strategy/adapter/walletPass/example.js +207 -0
  148. package/lib/model/strategy/adapter/walletPass/index.d.ts +32 -0
  149. package/lib/model/strategy/adapter/walletPass/index.js +142 -0
  150. package/lib/model/strategy/adapter/walletPass/locales.d.ts +1 -0
  151. package/lib/model/strategy/adapter/walletPass/locales.js +54 -0
  152. package/lib/model/strategy/adapter/walletPass/type.d.ts +187 -0
  153. package/lib/model/strategy/adapter/walletPass/type.js +17 -0
  154. package/lib/model/strategy/adapter/walletPass/utils.d.ts +50 -0
  155. package/lib/model/strategy/adapter/walletPass/utils.js +791 -0
  156. package/lib/model/strategy/engine.d.ts +106 -0
  157. package/lib/model/strategy/engine.js +450 -0
  158. package/lib/model/strategy/index.d.ts +3 -0
  159. package/lib/model/strategy/index.js +38 -0
  160. package/lib/model/strategy/strategy-example.d.ts +5 -0
  161. package/lib/model/strategy/strategy-example.js +318 -0
  162. package/lib/model/strategy/type.d.ts +228 -0
  163. package/lib/model/strategy/type.js +44 -0
  164. package/lib/modules/Cart/utils/cartProduct.js +1 -0
  165. package/lib/modules/OpenData/index.d.ts +23 -0
  166. package/lib/modules/OpenData/index.js +116 -0
  167. package/lib/modules/OpenData/types.d.ts +73 -0
  168. package/lib/modules/OpenData/types.js +17 -0
  169. package/lib/modules/OpenData/utils.d.ts +2 -0
  170. package/lib/modules/OpenData/utils.js +111 -0
  171. package/lib/modules/Order/index.d.ts +58 -1
  172. package/lib/modules/Order/index.js +423 -1
  173. package/lib/modules/Order/types.d.ts +144 -12
  174. package/lib/modules/Order/utils.d.ts +25 -0
  175. package/lib/modules/Order/utils.js +229 -0
  176. package/lib/modules/Product/index.d.ts +1 -1
  177. package/lib/modules/Product/utils.js +2 -2
  178. package/lib/modules/ProductList/index.d.ts +1 -1
  179. package/lib/modules/ProductList/index.js +2 -1
  180. package/lib/modules/Quotation/index.d.ts +48 -0
  181. package/lib/modules/Quotation/index.js +149 -0
  182. package/lib/modules/Quotation/types.d.ts +42 -0
  183. package/lib/modules/Quotation/types.js +17 -0
  184. package/lib/modules/Rules/index.js +4 -1
  185. package/lib/modules/SalesSummary/index.d.ts +63 -0
  186. package/lib/modules/SalesSummary/index.js +105 -0
  187. package/lib/modules/SalesSummary/types.d.ts +59 -0
  188. package/lib/modules/SalesSummary/types.js +17 -0
  189. package/lib/modules/SalesSummary/utils.d.ts +30 -0
  190. package/lib/modules/SalesSummary/utils.js +452 -0
  191. package/lib/modules/ScanOrderLogger/index.d.ts +21 -0
  192. package/lib/modules/ScanOrderLogger/index.js +135 -0
  193. package/lib/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
  194. package/lib/modules/ScanOrderLogger/providers/feishu.js +82 -0
  195. package/lib/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
  196. package/lib/modules/ScanOrderLogger/providers/grafana.js +52 -0
  197. package/lib/modules/ScanOrderLogger/types.d.ts +46 -0
  198. package/lib/modules/ScanOrderLogger/types.js +17 -0
  199. package/lib/modules/Schedule/getDateIsInSchedule.js +9 -11
  200. package/lib/modules/Summary/utils.d.ts +3 -3
  201. package/lib/modules/Summary/utils.js +4 -4
  202. package/lib/modules/index.d.ts +4 -0
  203. package/lib/modules/index.js +9 -1
  204. package/lib/solution/BookingByStep/index.d.ts +1 -1
  205. package/lib/solution/BookingByStep/types.d.ts +3 -1
  206. package/lib/solution/BookingByStep/types.js +10 -0
  207. package/lib/solution/BookingTicket/index.d.ts +1 -1
  208. package/lib/solution/ScanOrder/index.d.ts +90 -0
  209. package/lib/solution/ScanOrder/index.js +1071 -0
  210. package/lib/solution/ScanOrder/types.d.ts +210 -0
  211. package/lib/solution/ScanOrder/types.js +36 -0
  212. package/lib/solution/ScanOrder/utils.d.ts +93 -0
  213. package/lib/solution/ScanOrder/utils.js +359 -0
  214. package/lib/solution/VenueBooking/index.d.ts +158 -0
  215. package/lib/solution/VenueBooking/index.js +1545 -0
  216. package/lib/solution/VenueBooking/sales-section-4-annotated.json +343 -0
  217. package/lib/solution/VenueBooking/types.d.ts +130 -0
  218. package/lib/solution/VenueBooking/types.js +44 -0
  219. package/lib/solution/VenueBooking/utils/dateSummary.d.ts +10 -0
  220. package/lib/solution/VenueBooking/utils/dateSummary.js +101 -0
  221. package/lib/solution/VenueBooking/utils/resource.d.ts +4 -0
  222. package/lib/solution/VenueBooking/utils/resource.js +80 -0
  223. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +29 -0
  224. package/lib/solution/VenueBooking/utils/slotMerge.js +209 -0
  225. package/lib/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
  226. package/lib/solution/VenueBooking/utils/timeSlot.js +200 -0
  227. package/lib/solution/VenueBooking/utils.d.ts +1 -0
  228. package/lib/solution/VenueBooking/utils.js +69 -0
  229. package/lib/solution/index.d.ts +2 -0
  230. package/lib/solution/index.js +5 -1
  231. 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
+ };