@pisell/pisellos 2.1.118 → 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 (232) hide show
  1. package/dist/apis/picoding.d.ts +0 -0
  2. package/dist/apis/picoding.js +1 -0
  3. package/dist/index.d.ts +0 -1
  4. package/dist/index.js +0 -1
  5. package/dist/model/strategy/adapter/index.d.ts +4 -0
  6. package/dist/model/strategy/adapter/index.js +4 -1
  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/walletPass/evaluator.js +4 -1
  28. package/dist/model/strategy/engine.d.ts +106 -0
  29. package/dist/model/strategy/engine.js +611 -0
  30. package/dist/model/strategy/index.d.ts +2 -93
  31. package/dist/model/strategy/index.js +6 -549
  32. package/dist/modules/Cart/types.d.ts +0 -2
  33. package/dist/modules/Cart/utils/cartProduct.js +25 -56
  34. package/dist/modules/Discount/types.d.ts +0 -18
  35. package/dist/modules/OpenData/index.d.ts +23 -0
  36. package/dist/modules/OpenData/index.js +167 -0
  37. package/dist/modules/OpenData/types.d.ts +73 -0
  38. package/dist/modules/OpenData/types.js +1 -0
  39. package/dist/modules/OpenData/utils.d.ts +2 -0
  40. package/dist/modules/OpenData/utils.js +75 -0
  41. package/dist/modules/Order/index.d.ts +58 -1
  42. package/dist/modules/Order/index.js +780 -29
  43. package/dist/modules/Order/types.d.ts +144 -12
  44. package/dist/modules/Order/utils.d.ts +25 -0
  45. package/dist/modules/Order/utils.js +225 -1
  46. package/dist/modules/Payment/index.d.ts +1 -2
  47. package/dist/modules/Payment/index.js +7 -10
  48. package/dist/modules/Payment/utils.js +0 -3
  49. package/dist/modules/Payment/walletpass.d.ts +0 -23
  50. package/dist/modules/Payment/walletpass.js +95 -191
  51. package/dist/modules/Product/utils.js +2 -2
  52. package/dist/modules/ProductList/index.d.ts +1 -1
  53. package/dist/modules/ProductList/index.js +2 -1
  54. package/dist/modules/Quotation/index.d.ts +48 -0
  55. package/dist/modules/Quotation/index.js +245 -0
  56. package/dist/modules/Quotation/types.d.ts +42 -0
  57. package/dist/modules/Quotation/types.js +1 -0
  58. package/dist/modules/Rules/index.d.ts +5 -9
  59. package/dist/modules/Rules/index.js +164 -673
  60. package/dist/modules/Rules/types.d.ts +0 -2
  61. package/dist/modules/SalesSummary/index.d.ts +63 -0
  62. package/dist/modules/SalesSummary/index.js +174 -0
  63. package/dist/modules/SalesSummary/types.d.ts +59 -0
  64. package/dist/modules/SalesSummary/types.js +1 -0
  65. package/dist/modules/SalesSummary/utils.d.ts +30 -0
  66. package/dist/modules/SalesSummary/utils.js +513 -0
  67. package/dist/modules/ScanOrderLogger/index.d.ts +21 -0
  68. package/dist/modules/ScanOrderLogger/index.js +161 -0
  69. package/dist/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
  70. package/dist/modules/ScanOrderLogger/providers/feishu.js +95 -0
  71. package/dist/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
  72. package/dist/modules/ScanOrderLogger/providers/grafana.js +50 -0
  73. package/dist/modules/ScanOrderLogger/types.d.ts +46 -0
  74. package/dist/modules/ScanOrderLogger/types.js +1 -0
  75. package/dist/modules/Schedule/getDateIsInSchedule.js +11 -18
  76. package/dist/modules/Summary/types.d.ts +0 -2
  77. package/dist/modules/Summary/utils.d.ts +3 -9
  78. package/dist/modules/Summary/utils.js +4 -25
  79. package/dist/modules/index.d.ts +4 -0
  80. package/dist/modules/index.js +5 -1
  81. package/dist/plugins/window.d.ts +0 -2
  82. package/dist/solution/BookingByStep/index.d.ts +1 -2
  83. package/dist/solution/BookingByStep/index.js +44 -42
  84. package/dist/solution/BookingByStep/types.d.ts +3 -1
  85. package/dist/solution/BookingByStep/types.js +5 -1
  86. package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  87. package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
  88. package/dist/solution/Checkout/index.js +0 -2
  89. package/dist/solution/ScanOrder/index.d.ts +90 -0
  90. package/dist/solution/ScanOrder/index.js +1853 -0
  91. package/dist/solution/ScanOrder/types.d.ts +210 -0
  92. package/dist/solution/ScanOrder/types.js +16 -0
  93. package/dist/solution/ScanOrder/utils.d.ts +93 -0
  94. package/dist/solution/ScanOrder/utils.js +397 -0
  95. package/dist/solution/ShopDiscount/index.d.ts +0 -1
  96. package/dist/solution/ShopDiscount/index.js +7 -23
  97. package/dist/solution/ShopDiscount/types.d.ts +0 -1
  98. package/dist/solution/ShopDiscount/types.js +1 -2
  99. package/dist/solution/ShopDiscount/utils.js +12 -26
  100. package/dist/solution/VenueBooking/index.d.ts +158 -0
  101. package/dist/solution/VenueBooking/index.js +2873 -0
  102. package/dist/solution/VenueBooking/sales-section-4-annotated.json +343 -0
  103. package/dist/solution/VenueBooking/types.d.ts +130 -0
  104. package/dist/solution/VenueBooking/types.js +21 -0
  105. package/dist/solution/VenueBooking/utils/dateSummary.d.ts +10 -0
  106. package/dist/solution/VenueBooking/utils/dateSummary.js +102 -0
  107. package/dist/solution/VenueBooking/utils/resource.d.ts +4 -0
  108. package/dist/solution/VenueBooking/utils/resource.js +94 -0
  109. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +29 -0
  110. package/dist/solution/VenueBooking/utils/slotMerge.js +204 -0
  111. package/dist/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
  112. package/dist/solution/VenueBooking/utils/timeSlot.js +256 -0
  113. package/dist/solution/VenueBooking/utils.d.ts +1 -0
  114. package/dist/solution/VenueBooking/utils.js +1 -0
  115. package/dist/solution/index.d.ts +2 -0
  116. package/dist/solution/index.js +3 -1
  117. package/lib/apis/picoding.d.ts +0 -0
  118. package/lib/apis/picoding.js +0 -0
  119. package/lib/index.d.ts +0 -1
  120. package/lib/index.js +1 -3
  121. package/lib/model/strategy/adapter/index.d.ts +4 -0
  122. package/lib/model/strategy/adapter/index.js +12 -0
  123. package/lib/model/strategy/adapter/itemRule/adapter.d.ts +59 -0
  124. package/lib/model/strategy/adapter/itemRule/adapter.js +338 -0
  125. package/lib/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
  126. package/lib/model/strategy/adapter/itemRule/evaluator.js +124 -0
  127. package/lib/model/strategy/adapter/itemRule/examples.d.ts +64 -0
  128. package/lib/model/strategy/adapter/itemRule/examples.js +269 -0
  129. package/lib/model/strategy/adapter/itemRule/index.d.ts +5 -0
  130. package/lib/model/strategy/adapter/itemRule/index.js +58 -0
  131. package/lib/model/strategy/adapter/itemRule/type.d.ts +206 -0
  132. package/lib/model/strategy/adapter/itemRule/type.js +46 -0
  133. package/lib/model/strategy/adapter/promotion/adapter.d.ts +66 -0
  134. package/lib/model/strategy/adapter/promotion/adapter.js +217 -0
  135. package/lib/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
  136. package/lib/model/strategy/adapter/promotion/evaluator.js +844 -0
  137. package/lib/model/strategy/adapter/promotion/examples.d.ts +138 -0
  138. package/lib/model/strategy/adapter/promotion/examples.js +192 -0
  139. package/lib/model/strategy/adapter/promotion/index.d.ts +4 -0
  140. package/lib/model/strategy/adapter/promotion/index.js +0 -0
  141. package/lib/model/strategy/adapter/promotion/type.d.ts +447 -0
  142. package/lib/model/strategy/adapter/promotion/type.js +51 -0
  143. package/lib/model/strategy/adapter/walletPass/evaluator.js +2 -1
  144. package/lib/model/strategy/engine.d.ts +106 -0
  145. package/lib/model/strategy/engine.js +450 -0
  146. package/lib/model/strategy/index.d.ts +2 -93
  147. package/lib/model/strategy/index.js +6 -381
  148. package/lib/modules/Cart/types.d.ts +0 -2
  149. package/lib/modules/Cart/utils/cartProduct.js +12 -39
  150. package/lib/modules/Discount/types.d.ts +0 -18
  151. package/lib/modules/OpenData/index.d.ts +23 -0
  152. package/lib/modules/OpenData/index.js +116 -0
  153. package/lib/modules/OpenData/types.d.ts +73 -0
  154. package/lib/modules/OpenData/types.js +17 -0
  155. package/lib/modules/OpenData/utils.d.ts +2 -0
  156. package/lib/modules/OpenData/utils.js +111 -0
  157. package/lib/modules/Order/index.d.ts +58 -1
  158. package/lib/modules/Order/index.js +423 -1
  159. package/lib/modules/Order/types.d.ts +144 -12
  160. package/lib/modules/Order/utils.d.ts +25 -0
  161. package/lib/modules/Order/utils.js +229 -0
  162. package/lib/modules/Payment/index.d.ts +1 -2
  163. package/lib/modules/Payment/index.js +0 -1
  164. package/lib/modules/Payment/utils.js +0 -3
  165. package/lib/modules/Payment/walletpass.d.ts +0 -23
  166. package/lib/modules/Payment/walletpass.js +17 -94
  167. package/lib/modules/Product/utils.js +2 -2
  168. package/lib/modules/ProductList/index.d.ts +1 -1
  169. package/lib/modules/ProductList/index.js +2 -1
  170. package/lib/modules/Quotation/index.d.ts +48 -0
  171. package/lib/modules/Quotation/index.js +149 -0
  172. package/lib/modules/Quotation/types.d.ts +42 -0
  173. package/lib/modules/Quotation/types.js +17 -0
  174. package/lib/modules/Rules/index.d.ts +5 -9
  175. package/lib/modules/Rules/index.js +286 -778
  176. package/lib/modules/Rules/types.d.ts +0 -2
  177. package/lib/modules/SalesSummary/index.d.ts +63 -0
  178. package/lib/modules/SalesSummary/index.js +105 -0
  179. package/lib/modules/SalesSummary/types.d.ts +59 -0
  180. package/lib/modules/SalesSummary/types.js +17 -0
  181. package/lib/modules/SalesSummary/utils.d.ts +30 -0
  182. package/lib/modules/SalesSummary/utils.js +452 -0
  183. package/lib/modules/ScanOrderLogger/index.d.ts +21 -0
  184. package/lib/modules/ScanOrderLogger/index.js +135 -0
  185. package/lib/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
  186. package/lib/modules/ScanOrderLogger/providers/feishu.js +82 -0
  187. package/lib/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
  188. package/lib/modules/ScanOrderLogger/providers/grafana.js +52 -0
  189. package/lib/modules/ScanOrderLogger/types.d.ts +46 -0
  190. package/lib/modules/ScanOrderLogger/types.js +17 -0
  191. package/lib/modules/Schedule/getDateIsInSchedule.js +9 -11
  192. package/lib/modules/Summary/types.d.ts +0 -2
  193. package/lib/modules/Summary/utils.d.ts +3 -9
  194. package/lib/modules/Summary/utils.js +4 -19
  195. package/lib/modules/index.d.ts +4 -0
  196. package/lib/modules/index.js +9 -1
  197. package/lib/plugins/window.d.ts +0 -2
  198. package/lib/solution/BookingByStep/index.d.ts +1 -2
  199. package/lib/solution/BookingByStep/index.js +4 -2
  200. package/lib/solution/BookingByStep/types.d.ts +3 -1
  201. package/lib/solution/BookingByStep/types.js +10 -0
  202. package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  203. package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
  204. package/lib/solution/Checkout/index.js +0 -2
  205. package/lib/solution/ScanOrder/index.d.ts +90 -0
  206. package/lib/solution/ScanOrder/index.js +1071 -0
  207. package/lib/solution/ScanOrder/types.d.ts +210 -0
  208. package/lib/solution/ScanOrder/types.js +36 -0
  209. package/lib/solution/ScanOrder/utils.d.ts +93 -0
  210. package/lib/solution/ScanOrder/utils.js +359 -0
  211. package/lib/solution/ShopDiscount/index.d.ts +0 -1
  212. package/lib/solution/ShopDiscount/index.js +8 -22
  213. package/lib/solution/ShopDiscount/types.d.ts +0 -1
  214. package/lib/solution/ShopDiscount/utils.js +6 -10
  215. package/lib/solution/VenueBooking/index.d.ts +158 -0
  216. package/lib/solution/VenueBooking/index.js +1545 -0
  217. package/lib/solution/VenueBooking/sales-section-4-annotated.json +343 -0
  218. package/lib/solution/VenueBooking/types.d.ts +130 -0
  219. package/lib/solution/VenueBooking/types.js +44 -0
  220. package/lib/solution/VenueBooking/utils/dateSummary.d.ts +10 -0
  221. package/lib/solution/VenueBooking/utils/dateSummary.js +101 -0
  222. package/lib/solution/VenueBooking/utils/resource.d.ts +4 -0
  223. package/lib/solution/VenueBooking/utils/resource.js +80 -0
  224. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +29 -0
  225. package/lib/solution/VenueBooking/utils/slotMerge.js +209 -0
  226. package/lib/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
  227. package/lib/solution/VenueBooking/utils/timeSlot.js +200 -0
  228. package/lib/solution/VenueBooking/utils.d.ts +1 -0
  229. package/lib/solution/VenueBooking/utils.js +69 -0
  230. package/lib/solution/index.d.ts +2 -0
  231. package/lib/solution/index.js +5 -1
  232. package/package.json +1 -1
@@ -0,0 +1,169 @@
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
10
+ 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); } }
11
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
12
+ 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; }
13
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
14
+ 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); }
15
+ import { StrategyEngine } from "../../engine";
16
+ import { ItemRuleAdapter } from "./adapter";
17
+ import { ITEM_RULE_ACTION_TYPES } from "./type";
18
+
19
+ /**
20
+ * ItemRule 评估器
21
+ *
22
+ * 组合 StrategyEngine + ItemRuleAdapter,提供面向业务的高层 API。
23
+ * 支持批量评估多条 item_rule 策略配置,聚合数量校验和预填购物车结果。
24
+ */
25
+ export var ItemRuleEvaluator = /*#__PURE__*/function () {
26
+ function ItemRuleEvaluator() {
27
+ _classCallCheck(this, ItemRuleEvaluator);
28
+ _defineProperty(this, "engine", void 0);
29
+ _defineProperty(this, "adapter", void 0);
30
+ _defineProperty(this, "strategyConfigs", []);
31
+ this.engine = new StrategyEngine({
32
+ debug: false,
33
+ enableTrace: false
34
+ });
35
+ this.adapter = new ItemRuleAdapter();
36
+ }
37
+
38
+ /**
39
+ * 设置策略配置列表
40
+ * 自动过滤 metadata.type === 'item_rule' 的配置
41
+ */
42
+ _createClass(ItemRuleEvaluator, [{
43
+ key: "setStrategyConfigs",
44
+ value: function setStrategyConfigs(configs) {
45
+ this.strategyConfigs = configs.filter(function (c) {
46
+ return c.metadata.type === 'item_rule';
47
+ });
48
+ }
49
+ }, {
50
+ key: "getStrategyConfigs",
51
+ value: function getStrategyConfigs() {
52
+ return this.strategyConfigs;
53
+ }
54
+
55
+ /**
56
+ * 完整评估:数量校验 + 预填购物车
57
+ */
58
+ }, {
59
+ key: "evaluate",
60
+ value: function evaluate(businessData) {
61
+ var configs = businessData.strategyConfigs ? businessData.strategyConfigs.filter(function (c) {
62
+ return c.metadata.type === 'item_rule';
63
+ }) : this.strategyConfigs;
64
+ var allQuantityChecks = [];
65
+ var allPrefillItems = [];
66
+ var rawResults = [];
67
+ var context = this.adapter.prepareContext(businessData);
68
+ var _iterator = _createForOfIteratorHelper(configs),
69
+ _step;
70
+ try {
71
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
72
+ var config = _step.value;
73
+ var evalResult = this.engine.evaluate(config, context);
74
+ rawResults.push(evalResult);
75
+ var _this$adapter$transfo = this.adapter.transformResult(evalResult, businessData),
76
+ quantityChecks = _this$adapter$transfo.quantityChecks,
77
+ prefillItems = _this$adapter$transfo.prefillItems;
78
+ allQuantityChecks.push.apply(allQuantityChecks, _toConsumableArray(quantityChecks));
79
+ allPrefillItems.push.apply(allPrefillItems, _toConsumableArray(prefillItems));
80
+ }
81
+ } catch (err) {
82
+ _iterator.e(err);
83
+ } finally {
84
+ _iterator.f();
85
+ }
86
+ var failedChecks = allQuantityChecks.filter(function (c) {
87
+ return !c.passed;
88
+ });
89
+ return {
90
+ quantityChecks: allQuantityChecks,
91
+ prefillItems: allPrefillItems,
92
+ allPassed: failedChecks.length === 0,
93
+ failedChecks: failedChecks,
94
+ rawResults: rawResults
95
+ };
96
+ }
97
+
98
+ /**
99
+ * 获取当前配置中各商品的数量限制
100
+ *
101
+ * 不做购物车校验,仅从策略配置中提取 QUANTITY_CHECK 规则的
102
+ * min / max / exact / mustInclude 限制值。
103
+ * 会评估条件是否满足、根据 scope + submissionIndex 过滤。
104
+ */
105
+ }, {
106
+ key: "getQuantityLimits",
107
+ value: function getQuantityLimits(businessData) {
108
+ var configs = businessData.strategyConfigs ? businessData.strategyConfigs.filter(function (c) {
109
+ return c.metadata.type === 'item_rule';
110
+ }) : this.strategyConfigs;
111
+ var results = [];
112
+ var context = this.adapter.prepareContext(businessData);
113
+ var _iterator2 = _createForOfIteratorHelper(configs),
114
+ _step2;
115
+ try {
116
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
117
+ var config = _step2.value;
118
+ var evalResult = this.engine.evaluate(config, context);
119
+ if (!evalResult.applicable) continue;
120
+ var _iterator3 = _createForOfIteratorHelper(evalResult.matchedActions),
121
+ _step3;
122
+ try {
123
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
124
+ var action = _step3.value;
125
+ if (action.type !== ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK) continue;
126
+ var limit = this.adapter.extractQuantityLimits(action, businessData);
127
+ if (limit) {
128
+ results.push(limit);
129
+ }
130
+ }
131
+ } catch (err) {
132
+ _iterator3.e(err);
133
+ } finally {
134
+ _iterator3.f();
135
+ }
136
+ }
137
+ } catch (err) {
138
+ _iterator2.e(err);
139
+ } finally {
140
+ _iterator2.f();
141
+ }
142
+ return results;
143
+ }
144
+
145
+ /**
146
+ * 便捷方法:仅做数量校验,返回是否全部通过及失败详情
147
+ */
148
+ }, {
149
+ key: "validateCart",
150
+ value: function validateCart(businessData) {
151
+ var result = this.evaluate(businessData);
152
+ return {
153
+ passed: result.allPassed,
154
+ failures: result.failedChecks
155
+ };
156
+ }
157
+
158
+ /**
159
+ * 便捷方法:仅获取需要预填到购物车的商品
160
+ */
161
+ }, {
162
+ key: "getPrefillItems",
163
+ value: function getPrefillItems(businessData) {
164
+ var result = this.evaluate(businessData);
165
+ return result.prefillItems;
166
+ }
167
+ }]);
168
+ return ItemRuleEvaluator;
169
+ }();
@@ -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
+ };
@@ -0,0 +1,315 @@
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 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; }
3
+ 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; }
4
+ 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; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
+ 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); }
7
+ import { ItemRuleEvaluator } from "./evaluator";
8
+ import { ITEM_RULE_ACTION_TYPES } from "./type";
9
+ // ============================================
10
+ // 示例 1:每人至少一份小料 (Minimum Per Person)
11
+ // ============================================
12
+
13
+ /**
14
+ * 场景:火锅店扫码点餐,要求小料数量 >= 成人人数,自动添加到购物车
15
+ *
16
+ * WHEN: Always active
17
+ * THEN:
18
+ * - Quantity Check: 小料最少数量 = Adult Pax
19
+ * - Prefill Cart: 自动添加小料 x Adult Pax
20
+ */
21
+ export var MIN_CONDIMENT_PER_PERSON_STRATEGY = {
22
+ metadata: {
23
+ id: 'RULE_MIN_CONDIMENT_PER_PERSON',
24
+ name: {
25
+ 'zh-CN': '每人至少一份小料',
26
+ en: 'Min 1 Condiment per person'
27
+ },
28
+ type: 'item_rule',
29
+ description: {
30
+ 'zh-CN': '火锅小料数量不少于成人人数,自动添加',
31
+ en: 'Condiment count must be at least adult pax, auto-added to cart'
32
+ }
33
+ },
34
+ conditions: {
35
+ operator: 'and',
36
+ rules: [],
37
+ actionIds: ['quantity_check_condiment', 'prefill_condiment']
38
+ },
39
+ actions: [{
40
+ id: 'quantity_check_condiment',
41
+ type: ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK,
42
+ value: null,
43
+ target: 'cart',
44
+ priority: 10,
45
+ config: {
46
+ targetType: 'product',
47
+ targets: [{
48
+ product_id: 10001
49
+ }, {
50
+ product_id: 10002
51
+ }],
52
+ quantityRules: [{
53
+ comparison: 'minimum',
54
+ source: 'total_pax'
55
+ }],
56
+ scope: 'first_submission_only',
57
+ validationMessage: {
58
+ 'zh-CN': '小料至少需要 {min} 份(每位成人一份)',
59
+ en: 'Condiment requires at least {min} items (one per adult)'
60
+ }
61
+ }
62
+ }, {
63
+ id: 'prefill_condiment',
64
+ type: ITEM_RULE_ACTION_TYPES.PREFILL_CART,
65
+ value: null,
66
+ target: 'cart',
67
+ priority: 5,
68
+ config: {
69
+ products: [{
70
+ product_id: 10001,
71
+ quantityFrom: 'total_pax'
72
+ }]
73
+ }
74
+ }]
75
+ };
76
+
77
+ // ============================================
78
+ // 示例 2:每桌限量3份包子 (Maximum Per Table)
79
+ // ============================================
80
+
81
+ /**
82
+ * 场景:包子限量供应,每桌最多3份(含加单累计),肉包和菜包合计
83
+ *
84
+ * WHEN: Always active
85
+ * THEN:
86
+ * - Quantity Check: 肉包 + 菜包 合计 <= 3,scope=cumulative
87
+ */
88
+ export var MAX_BUNS_PER_TABLE_STRATEGY = {
89
+ metadata: {
90
+ id: 'RULE_MAX_BUNS_PER_TABLE',
91
+ name: {
92
+ 'zh-CN': '每桌限量供应3份包子',
93
+ en: '3 Buns limit per table'
94
+ },
95
+ type: 'item_rule',
96
+ description: {
97
+ 'zh-CN': '肉包和菜包合计每桌不超过3份,含加单累计',
98
+ en: 'Max 3 buns per table (pork + veggie combined, cumulative)'
99
+ }
100
+ },
101
+ conditions: {
102
+ operator: 'and',
103
+ rules: [],
104
+ actionIds: ['quantity_check_buns']
105
+ },
106
+ actions: [{
107
+ id: 'quantity_check_buns',
108
+ type: ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK,
109
+ value: null,
110
+ target: 'cart',
111
+ priority: 10,
112
+ config: {
113
+ targetType: 'product',
114
+ targets: [{
115
+ product_id: 20001
116
+ }, {
117
+ product_id: 20002
118
+ }],
119
+ quantityRules: [{
120
+ comparison: 'maximum',
121
+ source: 'fixed',
122
+ value: 3
123
+ }],
124
+ scope: 'cumulative',
125
+ validationMessage: {
126
+ 'zh-CN': '包子每桌限量 {max} 份(含加单累计)',
127
+ en: 'Buns are limited to {max} per table (cumulative)'
128
+ }
129
+ }
130
+ }]
131
+ };
132
+
133
+ // ============================================
134
+ // 示例 3:锅底必选 (Must Include - Conditional)
135
+ // ============================================
136
+
137
+ /**
138
+ * 场景:堂食必须选择一个锅底(按商品匹配),自动预填默认锅底
139
+ *
140
+ * WHEN: Service Type = Dine-in
141
+ * THEN:
142
+ * - Quantity Check: 指定锅底商品精确1份
143
+ * - Prefill Cart: 自动添加默认锅底 x 1
144
+ */
145
+ export var HOTPOT_BASE_REQUIRED_STRATEGY = {
146
+ metadata: {
147
+ id: 'RULE_HOTPOT_BASE_REQUIRED',
148
+ name: {
149
+ 'zh-CN': '锅底必选',
150
+ en: 'Hotpot base required'
151
+ },
152
+ type: 'item_rule',
153
+ description: {
154
+ 'zh-CN': '堂食必须选择一个锅底',
155
+ en: 'Hotpot base is mandatory for dine-in'
156
+ }
157
+ },
158
+ conditions: {
159
+ operator: 'and',
160
+ rules: [{
161
+ type: 'operator',
162
+ dimension: 'context',
163
+ field: 'serviceType',
164
+ operator: '=',
165
+ value: 'dine-in'
166
+ }],
167
+ actionIds: ['quantity_check_base', 'prefill_base']
168
+ },
169
+ actions: [{
170
+ id: 'quantity_check_base',
171
+ type: ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK,
172
+ value: null,
173
+ target: 'cart',
174
+ priority: 10,
175
+ config: {
176
+ targetType: 'product',
177
+ targets: [{
178
+ product_id: 30001
179
+ }],
180
+ quantityRules: [{
181
+ comparison: 'exact',
182
+ source: 'fixed',
183
+ value: 1
184
+ }],
185
+ scope: 'first_submission_only',
186
+ validationMessage: {
187
+ 'zh-CN': '请选择 {exact} 个锅底',
188
+ en: 'Please select exactly {exact} hotpot base'
189
+ }
190
+ }
191
+ }, {
192
+ id: 'prefill_base',
193
+ type: ITEM_RULE_ACTION_TYPES.PREFILL_CART,
194
+ value: null,
195
+ target: 'cart',
196
+ priority: 5,
197
+ config: {
198
+ products: [{
199
+ product_id: 30001,
200
+ quantityFrom: 'fixed',
201
+ quantity: 1
202
+ }]
203
+ }
204
+ }]
205
+ };
206
+
207
+ // ============================================
208
+ // 示例 4:ItemRuleEvaluator 用法(简洁调用 + 完整 Demo)
209
+ // ============================================
210
+
211
+ /**
212
+ * ItemRuleEvaluator 简洁调用示例
213
+ *
214
+ * 覆盖方法:
215
+ * - setStrategyConfigs
216
+ * - getStrategyConfigs
217
+ * - evaluate
218
+ * - getQuantityLimits
219
+ * - validateCart
220
+ * - getPrefillItems
221
+ */
222
+ export function quickUseItemRuleEvaluator() {
223
+ var evaluator = new ItemRuleEvaluator();
224
+ evaluator.setStrategyConfigs([MIN_CONDIMENT_PER_PERSON_STRATEGY, MAX_BUNS_PER_TABLE_STRATEGY, HOTPOT_BASE_REQUIRED_STRATEGY]);
225
+ var businessData = {
226
+ pax: {
227
+ total: 3,
228
+ adult: 3,
229
+ child: 0
230
+ },
231
+ serviceType: 'dine-in',
232
+ cartItems: [{
233
+ product_id: 10001,
234
+ quantity: 1
235
+ }, {
236
+ product_id: 20001,
237
+ quantity: 2
238
+ }, {
239
+ product_id: 20002,
240
+ quantity: 1
241
+ }],
242
+ historicalItems: [{
243
+ product_id: 20001,
244
+ quantity: 1
245
+ }],
246
+ submissionIndex: 0
247
+ };
248
+ return {
249
+ configCount: evaluator.getStrategyConfigs().length,
250
+ evaluation: evaluator.evaluate(businessData),
251
+ quantityLimits: evaluator.getQuantityLimits(businessData),
252
+ validation: evaluator.validateCart(businessData),
253
+ prefillItems: evaluator.getPrefillItems(businessData)
254
+ };
255
+ }
256
+
257
+ /**
258
+ * ItemRuleEvaluator 完整可运行 Demo
259
+ *
260
+ * 说明:
261
+ * 1) 首次提交:触发 first_submission_only + cumulative + 条件规则
262
+ * 2) 追加提交:演示 first_submission_only 不再触发
263
+ * 3) 覆盖 strategyConfigs 临时传入:演示按需仅评估部分规则
264
+ */
265
+ export function runItemRuleEvaluatorDemo() {
266
+ var evaluator = new ItemRuleEvaluator();
267
+ evaluator.setStrategyConfigs([MIN_CONDIMENT_PER_PERSON_STRATEGY
268
+ // MAX_BUNS_PER_TABLE_STRATEGY,
269
+ // HOTPOT_BASE_REQUIRED_STRATEGY,
270
+ ]);
271
+ var firstSubmissionData = {
272
+ pax: {
273
+ total: 4,
274
+ adult: 3,
275
+ child: 1
276
+ },
277
+ serviceType: 'dine-in',
278
+ submissionIndex: 0,
279
+ cartItems: [{
280
+ product_id: 10001,
281
+ quantity: 3
282
+ }
283
+ // { product_id: 20001, quantity: 2 },
284
+ // { product_id: 20002, quantity: 1 },
285
+ ],
286
+ historicalItems: [{
287
+ product_id: 20001,
288
+ quantity: 1
289
+ }]
290
+ };
291
+ var additionalSubmissionData = _objectSpread(_objectSpread({}, firstSubmissionData), {}, {
292
+ submissionIndex: 1
293
+ });
294
+ var firstEvaluation = evaluator.evaluate(firstSubmissionData);
295
+ var additionalEvaluation = evaluator.evaluate(additionalSubmissionData);
296
+ var quantityLimits = evaluator.getQuantityLimits(firstSubmissionData);
297
+ var validateResult = evaluator.validateCart(firstSubmissionData);
298
+ var prefillItems = evaluator.getPrefillItems(firstSubmissionData);
299
+
300
+ // 按需覆盖策略:仅评估“锅底必选”规则
301
+ var baseOnlyEvaluation = evaluator.evaluate(_objectSpread(_objectSpread({}, firstSubmissionData), {}, {
302
+ strategyConfigs: [HOTPOT_BASE_REQUIRED_STRATEGY]
303
+ }));
304
+ return {
305
+ // configuredRuleIds: evaluator
306
+ // .getStrategyConfigs()
307
+ // .map((config) => config.metadata.id),
308
+ firstEvaluation: firstEvaluation,
309
+ // additionalEvaluation,
310
+ // quantityLimits,
311
+ validateResult: validateResult,
312
+ prefillItems: prefillItems
313
+ // baseOnlyEvaluation,
314
+ };
315
+ }
@@ -0,0 +1,5 @@
1
+ export { ItemRuleEvaluator } from './evaluator';
2
+ export { ItemRuleAdapter } from './adapter';
3
+ export { default } from './adapter';
4
+ export { MIN_CONDIMENT_PER_PERSON_STRATEGY, MAX_BUNS_PER_TABLE_STRATEGY, HOTPOT_BASE_REQUIRED_STRATEGY, quickUseItemRuleEvaluator, runItemRuleEvaluatorDemo, } from './examples';
5
+ export * from './type';
@@ -0,0 +1,5 @@
1
+ export { ItemRuleEvaluator } from "./evaluator";
2
+ export { ItemRuleAdapter } from "./adapter";
3
+ export { default } from "./adapter";
4
+ export { MIN_CONDIMENT_PER_PERSON_STRATEGY, MAX_BUNS_PER_TABLE_STRATEGY, HOTPOT_BASE_REQUIRED_STRATEGY, quickUseItemRuleEvaluator, runItemRuleEvaluatorDemo } from "./examples";
5
+ export * from "./type";