@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
File without changes
@@ -0,0 +1 @@
1
+ // picoding 相关公共 api
@@ -0,0 +1 @@
1
+ export * from './strategy';
@@ -0,0 +1 @@
1
+ export * from "./strategy";
@@ -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,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,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,439 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
3
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
5
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
6
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
7
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
8
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
9
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
12
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
13
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
14
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
16
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
17
+ import { ITEM_RULE_ACTION_TYPES } from "./type";
18
+
19
+ /**
20
+ * ItemRule 适配器
21
+ *
22
+ * 将堂食扫码点餐的商品规则业务数据转换为策略引擎格式,
23
+ * 并将引擎结果转换为数量校验和预填购物车的业务结果。
24
+ */
25
+ export var ItemRuleAdapter = /*#__PURE__*/function () {
26
+ function ItemRuleAdapter() {
27
+ _classCallCheck(this, ItemRuleAdapter);
28
+ _defineProperty(this, "name", 'ItemRuleAdapter');
29
+ _defineProperty(this, "version", '1.0.0');
30
+ }
31
+ _createClass(ItemRuleAdapter, [{
32
+ key: "prepareContext",
33
+ value: function prepareContext(businessData) {
34
+ var pax = businessData.pax,
35
+ cartItems = businessData.cartItems,
36
+ serviceType = businessData.serviceType,
37
+ submissionIndex = businessData.submissionIndex,
38
+ custom = businessData.custom;
39
+ return {
40
+ entities: {
41
+ cartItems: cartItems,
42
+ historicalItems: businessData.historicalItems || [],
43
+ pax: pax
44
+ },
45
+ attributes: _objectSpread({
46
+ serviceType: serviceType || '',
47
+ totalPax: pax.total,
48
+ adultPax: pax.adult,
49
+ childPax: pax.child,
50
+ submissionIndex: submissionIndex !== null && submissionIndex !== void 0 ? submissionIndex : 0,
51
+ cartItemCount: cartItems.length,
52
+ cartTotalQuantity: cartItems.reduce(function (sum, item) {
53
+ return sum + item.quantity;
54
+ }, 0)
55
+ }, custom),
56
+ metadata: {
57
+ timestamp: Date.now()
58
+ }
59
+ };
60
+ }
61
+ }, {
62
+ key: "transformResult",
63
+ value: function transformResult(result, businessData) {
64
+ var quantityChecks = [];
65
+ var prefillItems = [];
66
+ if (!result.applicable || !businessData) {
67
+ return {
68
+ quantityChecks: quantityChecks,
69
+ prefillItems: prefillItems
70
+ };
71
+ }
72
+ var _iterator = _createForOfIteratorHelper(result.matchedActions),
73
+ _step;
74
+ try {
75
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
76
+ var action = _step.value;
77
+ if (action.type === ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK) {
78
+ var checkResult = this.processQuantityCheck(action, businessData);
79
+ if (checkResult) {
80
+ quantityChecks.push(checkResult);
81
+ }
82
+ } else if (action.type === ITEM_RULE_ACTION_TYPES.PREFILL_CART) {
83
+ var items = this.processPrefillCart(action, businessData);
84
+ prefillItems.push.apply(prefillItems, _toConsumableArray(items));
85
+ }
86
+ }
87
+ } catch (err) {
88
+ _iterator.e(err);
89
+ } finally {
90
+ _iterator.f();
91
+ }
92
+ return {
93
+ quantityChecks: quantityChecks,
94
+ prefillItems: prefillItems
95
+ };
96
+ }
97
+ }, {
98
+ key: "formatConfig",
99
+ value: function formatConfig(result, businessData) {
100
+ return {
101
+ result: result,
102
+ businessData: businessData
103
+ };
104
+ }
105
+
106
+ // ============================================
107
+ // Quantity Check 处理
108
+ // ============================================
109
+ }, {
110
+ key: "processQuantityCheck",
111
+ value: function processQuantityCheck(action, businessData) {
112
+ var _businessData$submiss;
113
+ var config = action.config;
114
+ if (!config) return null;
115
+ var scope = config.scope,
116
+ quantityRules = config.quantityRules,
117
+ targetType = config.targetType,
118
+ targets = config.targets,
119
+ validationMessage = config.validationMessage;
120
+ if (!this.shouldEvaluateForScope(scope, (_businessData$submiss = businessData.submissionIndex) !== null && _businessData$submiss !== void 0 ? _businessData$submiss : 0)) {
121
+ return null;
122
+ }
123
+ var actualQuantity = this.calculateActualQuantity(targets, scope, businessData);
124
+ var _this$evaluateQuantit = this.evaluateQuantityRules(quantityRules, actualQuantity, businessData),
125
+ passed = _this$evaluateQuantit.passed,
126
+ failedRules = _this$evaluateQuantit.failedRules,
127
+ requiredMin = _this$evaluateQuantit.requiredMin,
128
+ requiredMax = _this$evaluateQuantit.requiredMax,
129
+ requiredExact = _this$evaluateQuantit.requiredExact,
130
+ mustInclude = _this$evaluateQuantit.mustInclude;
131
+ var message = this.formatValidationMessage(validationMessage, requiredMin, requiredMax, requiredExact);
132
+ return {
133
+ ruleId: action.id,
134
+ passed: passed,
135
+ targetType: targetType,
136
+ targets: targets,
137
+ actualQuantity: actualQuantity,
138
+ requiredMin: requiredMin,
139
+ requiredMax: requiredMax,
140
+ requiredExact: requiredExact,
141
+ mustInclude: mustInclude,
142
+ validationMessage: message,
143
+ scope: scope,
144
+ failedRules: passed ? undefined : failedRules
145
+ };
146
+ }
147
+
148
+ /**
149
+ * 根据 scope 判断当前提交是否需要评估此规则
150
+ */
151
+ }, {
152
+ key: "shouldEvaluateForScope",
153
+ value: function shouldEvaluateForScope(scope, submissionIndex) {
154
+ switch (scope) {
155
+ case 'each_submission':
156
+ return true;
157
+ case 'first_submission_only':
158
+ return submissionIndex === 0;
159
+ case 'subsequent_only':
160
+ return submissionIndex > 0;
161
+ case 'cumulative':
162
+ return true;
163
+ default:
164
+ return true;
165
+ }
166
+ }
167
+
168
+ /**
169
+ * 计算目标商品在购物车中的实际数量
170
+ *
171
+ * cumulative scope 时还会加上历史订单数量。
172
+ */
173
+ }, {
174
+ key: "calculateActualQuantity",
175
+ value: function calculateActualQuantity(targets, scope, businessData) {
176
+ var targetIds = new Set(targets.map(function (t) {
177
+ return t.product_id;
178
+ }));
179
+ var quantity = 0;
180
+ var countFromItems = function countFromItems(items) {
181
+ var _iterator2 = _createForOfIteratorHelper(items),
182
+ _step2;
183
+ try {
184
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
185
+ var item = _step2.value;
186
+ if (targetIds.has(item.product_id)) {
187
+ quantity += item.quantity;
188
+ }
189
+ }
190
+ } catch (err) {
191
+ _iterator2.e(err);
192
+ } finally {
193
+ _iterator2.f();
194
+ }
195
+ };
196
+ if (scope === 'cumulative') {
197
+ if (businessData.historicalItems) {
198
+ countFromItems(businessData.historicalItems);
199
+ }
200
+ countFromItems(businessData.cartItems);
201
+ } else {
202
+ countFromItems(businessData.cartItems);
203
+ }
204
+ return quantity;
205
+ }
206
+ /**
207
+ * 逐条评估数量规则
208
+ */
209
+ }, {
210
+ key: "evaluateQuantityRules",
211
+ value: function evaluateQuantityRules(rules, actualQuantity, businessData) {
212
+ var failedRules = [];
213
+ var requiredMin;
214
+ var requiredMax;
215
+ var requiredExact;
216
+ var mustInclude;
217
+ var _iterator3 = _createForOfIteratorHelper(rules),
218
+ _step3;
219
+ try {
220
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
221
+ var rule = _step3.value;
222
+ var resolvedValue = this.resolveQuantityValue(rule, businessData);
223
+ switch (rule.comparison) {
224
+ case 'minimum':
225
+ {
226
+ if (requiredMin === undefined || resolvedValue > requiredMin) {
227
+ requiredMin = resolvedValue;
228
+ }
229
+ if (actualQuantity < resolvedValue) {
230
+ failedRules.push(rule);
231
+ }
232
+ break;
233
+ }
234
+ case 'maximum':
235
+ {
236
+ if (requiredMax === undefined || resolvedValue < requiredMax) {
237
+ requiredMax = resolvedValue;
238
+ }
239
+ if (actualQuantity > resolvedValue) {
240
+ failedRules.push(rule);
241
+ }
242
+ break;
243
+ }
244
+ case 'exact':
245
+ {
246
+ requiredExact = resolvedValue;
247
+ if (actualQuantity !== resolvedValue) {
248
+ failedRules.push(rule);
249
+ }
250
+ break;
251
+ }
252
+ case 'must_include':
253
+ {
254
+ mustInclude = true;
255
+ if (actualQuantity < 1) {
256
+ failedRules.push(rule);
257
+ }
258
+ break;
259
+ }
260
+ }
261
+ }
262
+ } catch (err) {
263
+ _iterator3.e(err);
264
+ } finally {
265
+ _iterator3.f();
266
+ }
267
+ return {
268
+ passed: failedRules.length === 0,
269
+ failedRules: failedRules,
270
+ requiredMin: requiredMin,
271
+ requiredMax: requiredMax,
272
+ requiredExact: requiredExact,
273
+ mustInclude: mustInclude
274
+ };
275
+ }
276
+
277
+ /**
278
+ * 根据 source 解析出数量规则的实际数值
279
+ */
280
+ }, {
281
+ key: "resolveQuantityValue",
282
+ value: function resolveQuantityValue(rule, businessData) {
283
+ var _rule$value, _rule$value2;
284
+ switch (rule.source) {
285
+ case 'total_pax':
286
+ return businessData.pax.total;
287
+ case 'adult_pax':
288
+ return businessData.pax.adult;
289
+ case 'fixed':
290
+ return (_rule$value = rule.value) !== null && _rule$value !== void 0 ? _rule$value : 0;
291
+ default:
292
+ return (_rule$value2 = rule.value) !== null && _rule$value2 !== void 0 ? _rule$value2 : 0;
293
+ }
294
+ }
295
+
296
+ /**
297
+ * 格式化校验提示语,替换 {min} {max} 占位符
298
+ */
299
+ }, {
300
+ key: "formatValidationMessage",
301
+ value: function formatValidationMessage(template, min, max, exact, locale) {
302
+ if (!template) return undefined;
303
+ var text = typeof template === 'string' ? template : template[locale || 'en'] || Object.values(template)[0] || '';
304
+ text = text.replace(/\{min\}/g, String(min !== null && min !== void 0 ? min : ''));
305
+ text = text.replace(/\{max\}/g, String(max !== null && max !== void 0 ? max : ''));
306
+ text = text.replace(/\{exact\}/g, String(exact !== null && exact !== void 0 ? exact : ''));
307
+ return text;
308
+ }
309
+
310
+ // ============================================
311
+ // Quantity Limit 提取(仅读取配置,不做校验)
312
+ // ============================================
313
+
314
+ /**
315
+ * 从单个 QUANTITY_CHECK action 中提取数量限制配置。
316
+ *
317
+ * 根据 scope + submissionIndex 判断是否适用,
318
+ * 解析动态数量来源(pax)后返回 min/max/exact/mustInclude。
319
+ * 不适用或无配置时返回 null。
320
+ */
321
+ }, {
322
+ key: "extractQuantityLimits",
323
+ value: function extractQuantityLimits(action, businessData) {
324
+ var _businessData$submiss2;
325
+ var config = action.config;
326
+ if (!config) return null;
327
+ var scope = config.scope,
328
+ quantityRules = config.quantityRules,
329
+ targetType = config.targetType,
330
+ targets = config.targets;
331
+ if (!this.shouldEvaluateForScope(scope, (_businessData$submiss2 = businessData.submissionIndex) !== null && _businessData$submiss2 !== void 0 ? _businessData$submiss2 : 0)) {
332
+ return null;
333
+ }
334
+ var requiredMin;
335
+ var requiredMax;
336
+ var requiredExact;
337
+ var mustInclude;
338
+ var _iterator4 = _createForOfIteratorHelper(quantityRules),
339
+ _step4;
340
+ try {
341
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
342
+ var rule = _step4.value;
343
+ var resolvedValue = this.resolveQuantityValue(rule, businessData);
344
+ switch (rule.comparison) {
345
+ case 'minimum':
346
+ {
347
+ if (requiredMin === undefined || resolvedValue > requiredMin) {
348
+ requiredMin = resolvedValue;
349
+ }
350
+ break;
351
+ }
352
+ case 'maximum':
353
+ {
354
+ if (requiredMax === undefined || resolvedValue < requiredMax) {
355
+ requiredMax = resolvedValue;
356
+ }
357
+ break;
358
+ }
359
+ case 'exact':
360
+ {
361
+ requiredExact = resolvedValue;
362
+ break;
363
+ }
364
+ case 'must_include':
365
+ {
366
+ mustInclude = true;
367
+ break;
368
+ }
369
+ }
370
+ }
371
+ } catch (err) {
372
+ _iterator4.e(err);
373
+ } finally {
374
+ _iterator4.f();
375
+ }
376
+ return {
377
+ ruleId: action.id,
378
+ targetType: targetType,
379
+ targets: targets,
380
+ requiredMin: requiredMin,
381
+ requiredMax: requiredMax,
382
+ requiredExact: requiredExact,
383
+ mustInclude: mustInclude,
384
+ scope: scope
385
+ };
386
+ }
387
+
388
+ // ============================================
389
+ // Prefill Cart 处理
390
+ // ============================================
391
+ }, {
392
+ key: "processPrefillCart",
393
+ value: function processPrefillCart(action, businessData) {
394
+ var config = action.config;
395
+ if (!(config !== null && config !== void 0 && config.products)) return [];
396
+ var results = [];
397
+ var _iterator5 = _createForOfIteratorHelper(config.products),
398
+ _step5;
399
+ try {
400
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
401
+ var prefillProduct = _step5.value;
402
+ var quantity = this.resolvePrefillQuantity(prefillProduct.quantityFrom, prefillProduct.quantity, businessData);
403
+ if (quantity <= 0) continue;
404
+ results.push({
405
+ ruleId: action.id,
406
+ product_id: prefillProduct.product_id,
407
+ product_variant_id: prefillProduct.product_variant_id,
408
+ quantity: quantity
409
+ });
410
+ }
411
+ } catch (err) {
412
+ _iterator5.e(err);
413
+ } finally {
414
+ _iterator5.f();
415
+ }
416
+ return results;
417
+ }
418
+
419
+ /**
420
+ * 根据 quantityFrom 计算预填数量
421
+ */
422
+ }, {
423
+ key: "resolvePrefillQuantity",
424
+ value: function resolvePrefillQuantity(quantityFrom, fixedValue, businessData) {
425
+ switch (quantityFrom) {
426
+ case 'total_pax':
427
+ return businessData.pax.total;
428
+ case 'adult_pax':
429
+ return businessData.pax.adult;
430
+ case 'fixed':
431
+ return fixedValue !== null && fixedValue !== void 0 ? fixedValue : 0;
432
+ default:
433
+ return fixedValue !== null && fixedValue !== void 0 ? fixedValue : 0;
434
+ }
435
+ }
436
+ }]);
437
+ return ItemRuleAdapter;
438
+ }();
439
+ export default ItemRuleAdapter;
@@ -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
+ }