@pisell/pisellos 0.10.14 → 0.10.16

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 (301) hide show
  1. package/dist/core/index.js +6 -9
  2. package/dist/model/strategy/adapter/walletPass/example.js +3 -26
  3. package/dist/model/strategy/strategy-example.js +5 -19
  4. package/dist/modules/Cart/index.js +0 -3
  5. package/dist/modules/Cart/utils/cartProduct.js +0 -1
  6. package/dist/modules/Date/index.js +1 -5
  7. package/dist/modules/Discount/index.js +2 -4
  8. package/dist/modules/OpenData/index.js +0 -2
  9. package/dist/modules/Order/index.d.ts +1 -1
  10. package/dist/modules/Order/index.js +75 -91
  11. package/dist/modules/Order/types.d.ts +5 -1
  12. package/dist/modules/Order/utils/virtualSettlement.d.ts +8 -1
  13. package/dist/modules/Order/utils/virtualSettlement.js +15 -2
  14. package/dist/modules/Order/utils.js +7 -1
  15. package/dist/modules/Payment/index.js +97 -162
  16. package/dist/modules/Product/types.d.ts +2 -0
  17. package/dist/modules/Rules/index.js +1 -4
  18. package/dist/modules/Schedule/index.js +0 -1
  19. package/dist/modules/Schedule/utils.js +0 -1
  20. package/dist/modules/Step/index.js +0 -1
  21. package/dist/plugins/request.js +1 -4
  22. package/dist/plugins/window.js +2 -6
  23. package/dist/server/index.js +97 -129
  24. package/dist/server/modules/menu/index.js +32 -41
  25. package/dist/server/modules/order/index.js +2 -4
  26. package/dist/server/modules/products/index.js +24 -42
  27. package/dist/server/modules/quotation/index.js +29 -38
  28. package/dist/server/modules/resource/index.js +3 -4
  29. package/dist/server/modules/schedule/index.js +27 -35
  30. package/dist/server/utils/product.js +0 -1
  31. package/dist/solution/BaseSales/index.js +107 -76
  32. package/dist/solution/BaseSales/types.d.ts +2 -0
  33. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
  34. package/dist/solution/BaseSales/utils/cartPromotion.js +15 -6
  35. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.d.ts +3 -0
  36. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +7 -1
  37. package/dist/solution/BaseSales/utils.js +6 -3
  38. package/dist/solution/BookingByStep/index.d.ts +2 -2
  39. package/dist/solution/BookingByStep/index.js +7 -59
  40. package/dist/solution/BookingByStep/utils/capacity.js +1 -11
  41. package/dist/solution/BookingByStep/utils/resources.js +1 -3
  42. package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
  43. package/dist/solution/BookingTicket/index.js +8 -4
  44. package/dist/solution/BookingTicket/utils/addProductDecision.js +3 -1
  45. package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
  46. package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
  47. package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
  48. package/dist/solution/BuyTickets/index.js +9 -12
  49. package/dist/solution/Checkout/index.js +177 -252
  50. package/dist/solution/Checkout/utils/index.js +4 -16
  51. package/dist/solution/RegisterAndLogin/index.js +30 -76
  52. package/dist/solution/ScanOrder/index.js +50 -60
  53. package/dist/solution/ScanOrder/types.d.ts +2 -0
  54. package/dist/solution/ScanOrder/utils.js +6 -3
  55. package/dist/solution/ShopDiscount/index.js +2 -7
  56. package/dist/solution/VenueBooking/index.js +45 -55
  57. package/dist/utils/task.js +15 -18
  58. package/dist/utils/watch.js +0 -1
  59. package/lib/apis/picoding.js +2 -0
  60. package/lib/core/index.js +131 -131
  61. package/lib/effects/index.js +46 -57
  62. package/lib/index.js +82 -49
  63. package/lib/model/index.js +14 -21
  64. package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
  65. package/lib/model/strategy/adapter/dataVariant/evaluator.js +209 -315
  66. package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
  67. package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
  68. package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
  69. package/lib/model/strategy/adapter/index.js +100 -64
  70. package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
  71. package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
  72. package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
  73. package/lib/model/strategy/adapter/itemRule/index.js +83 -57
  74. package/lib/model/strategy/adapter/itemRule/type.js +97 -36
  75. package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
  76. package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
  77. package/lib/model/strategy/adapter/promotion/examples.js +222 -234
  78. package/lib/model/strategy/adapter/promotion/index.js +43 -48
  79. package/lib/model/strategy/adapter/promotion/type.js +243 -36
  80. package/lib/model/strategy/adapter/type.js +4 -16
  81. package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
  82. package/lib/model/strategy/adapter/walletPass/example.js +217 -190
  83. package/lib/model/strategy/adapter/walletPass/index.js +75 -51
  84. package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
  85. package/lib/model/strategy/adapter/walletPass/type.js +4 -16
  86. package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
  87. package/lib/model/strategy/engine.js +270 -168
  88. package/lib/model/strategy/index.js +49 -34
  89. package/lib/model/strategy/strategy-example.js +243 -239
  90. package/lib/model/strategy/type.js +100 -40
  91. package/lib/modules/Account/index.js +39 -53
  92. package/lib/modules/Account/types.js +20 -33
  93. package/lib/modules/AccountList/index.js +116 -154
  94. package/lib/modules/AccountList/types.js +30 -31
  95. package/lib/modules/AccountList/utils.js +18 -30
  96. package/lib/modules/BaseModule.js +23 -42
  97. package/lib/modules/BookingContext/index.js +158 -136
  98. package/lib/modules/BookingContext/types.js +46 -32
  99. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
  100. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
  101. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
  102. package/lib/modules/BookingContext/utils/flexible.js +38 -55
  103. package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
  104. package/lib/modules/BookingContext/utils/index.js +124 -41
  105. package/lib/modules/BookingContext/utils/noResource.js +58 -70
  106. package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
  107. package/lib/modules/BookingContext/utils/productExtend.js +202 -155
  108. package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
  109. package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
  110. package/lib/modules/BookingContext/utils/resources.js +209 -167
  111. package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
  112. package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
  113. package/lib/modules/Cart/index.js +170 -124
  114. package/lib/modules/Cart/types.js +46 -51
  115. package/lib/modules/Cart/utils/cartAccount.js +40 -39
  116. package/lib/modules/Cart/utils/cartDate.js +56 -61
  117. package/lib/modules/Cart/utils/cartDiscount.js +28 -33
  118. package/lib/modules/Cart/utils/cartNote.js +27 -32
  119. package/lib/modules/Cart/utils/cartProduct.js +321 -251
  120. package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
  121. package/lib/modules/Cart/utils/cartResource.js +70 -78
  122. package/lib/modules/Cart/utils/changePrice.js +22 -50
  123. package/lib/modules/Cart/utils/index.js +106 -48
  124. package/lib/modules/Customer/constants.js +13 -34
  125. package/lib/modules/Customer/index.js +235 -172
  126. package/lib/modules/Customer/types.js +38 -35
  127. package/lib/modules/Date/index.js +116 -115
  128. package/lib/modules/Date/types.js +16 -28
  129. package/lib/modules/Date/utils.js +174 -123
  130. package/lib/modules/Discount/index.js +133 -143
  131. package/lib/modules/Discount/types.js +9 -31
  132. package/lib/modules/Guests/index.js +30 -56
  133. package/lib/modules/Guests/types.js +23 -33
  134. package/lib/modules/Holder/index.js +209 -189
  135. package/lib/modules/Holder/types.js +4 -16
  136. package/lib/modules/Holder/utils.js +20 -49
  137. package/lib/modules/OpenData/index.js +70 -76
  138. package/lib/modules/OpenData/types.js +4 -16
  139. package/lib/modules/OpenData/utils.js +44 -78
  140. package/lib/modules/Order/index.d.ts +1 -1
  141. package/lib/modules/Order/index.js +1810 -2238
  142. package/lib/modules/Order/payment-utils.js +77 -120
  143. package/lib/modules/Order/types.d.ts +5 -1
  144. package/lib/modules/Order/types.js +87 -35
  145. package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
  146. package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
  147. package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
  148. package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
  149. package/lib/modules/Order/utils/virtualSettlement.d.ts +8 -1
  150. package/lib/modules/Order/utils/virtualSettlement.js +126 -164
  151. package/lib/modules/Order/utils.js +834 -668
  152. package/lib/modules/Payment/cash.js +20 -33
  153. package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
  154. package/lib/modules/Payment/eftpos.js +16 -30
  155. package/lib/modules/Payment/index.js +532 -399
  156. package/lib/modules/Payment/mx51.js +1 -0
  157. package/lib/modules/Payment/types.js +230 -108
  158. package/lib/modules/Payment/utils.js +52 -51
  159. package/lib/modules/Payment/walletpass.js +485 -660
  160. package/lib/modules/Product/index.js +51 -46
  161. package/lib/modules/Product/types.d.ts +2 -0
  162. package/lib/modules/Product/types.js +4 -16
  163. package/lib/modules/Product/utils.js +32 -33
  164. package/lib/modules/ProductList/index.js +138 -161
  165. package/lib/modules/ProductList/types.js +9 -31
  166. package/lib/modules/Quotation/index.js +66 -100
  167. package/lib/modules/Quotation/types.js +4 -16
  168. package/lib/modules/Resource/index.js +27 -59
  169. package/lib/modules/Resource/types.js +22 -32
  170. package/lib/modules/Resource/utils.js +30 -38
  171. package/lib/modules/ResourcePlanner/index.js +25 -23
  172. package/lib/modules/ResourcePlanner/localClock.js +54 -119
  173. package/lib/modules/ResourcePlanner/planner.js +591 -772
  174. package/lib/modules/ResourcePlanner/types.js +10 -29
  175. package/lib/modules/Rules/index.js +1218 -959
  176. package/lib/modules/Rules/types.js +17 -40
  177. package/lib/modules/SalesSummary/index.js +78 -89
  178. package/lib/modules/SalesSummary/types.js +4 -16
  179. package/lib/modules/SalesSummary/utils.js +359 -442
  180. package/lib/modules/ScanOrderLogger/index.js +59 -79
  181. package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
  182. package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
  183. package/lib/modules/ScanOrderLogger/types.js +4 -16
  184. package/lib/modules/Schedule/getDateIsInSchedule.js +334 -163
  185. package/lib/modules/Schedule/index.js +100 -114
  186. package/lib/modules/Schedule/type.js +4 -16
  187. package/lib/modules/Schedule/types.js +4 -16
  188. package/lib/modules/Schedule/utils.js +433 -291
  189. package/lib/modules/Step/index.js +40 -52
  190. package/lib/modules/Step/tyeps.js +4 -16
  191. package/lib/modules/Summary/index.js +66 -71
  192. package/lib/modules/Summary/types.js +4 -16
  193. package/lib/modules/Summary/utils.js +773 -418
  194. package/lib/modules/SurchargeList/index.js +46 -60
  195. package/lib/modules/SurchargeList/types.js +4 -16
  196. package/lib/modules/index.js +245 -63
  197. package/lib/plugins/app.js +4 -16
  198. package/lib/plugins/index.js +36 -25
  199. package/lib/plugins/request.js +137 -126
  200. package/lib/plugins/shopStore.js +4 -16
  201. package/lib/plugins/user.js +4 -16
  202. package/lib/plugins/window.js +171 -179
  203. package/lib/server/index.js +3027 -2655
  204. package/lib/server/modules/floor-plan/index.js +102 -123
  205. package/lib/server/modules/floor-plan/types.js +15 -30
  206. package/lib/server/modules/index.js +106 -68
  207. package/lib/server/modules/menu/index.js +146 -122
  208. package/lib/server/modules/menu/types.js +18 -31
  209. package/lib/server/modules/order/index.js +758 -956
  210. package/lib/server/modules/order/types.js +122 -33
  211. package/lib/server/modules/order/utils/filterBookings.js +219 -194
  212. package/lib/server/modules/order/utils/filterOrders.js +118 -92
  213. package/lib/server/modules/payment/index.js +59 -83
  214. package/lib/server/modules/payment/types.js +4 -16
  215. package/lib/server/modules/products/index.js +575 -459
  216. package/lib/server/modules/products/types.js +44 -34
  217. package/lib/server/modules/quotation/index.js +137 -172
  218. package/lib/server/modules/quotation/types.js +21 -31
  219. package/lib/server/modules/resource/index.js +213 -184
  220. package/lib/server/modules/resource/types.js +42 -33
  221. package/lib/server/modules/schedule/index.js +135 -123
  222. package/lib/server/modules/schedule/types.js +14 -21
  223. package/lib/server/modules/schedule/utils.js +334 -163
  224. package/lib/server/types.js +4 -16
  225. package/lib/server/utils/index.js +25 -23
  226. package/lib/server/utils/product.js +196 -139
  227. package/lib/server/utils/schedule.js +34 -41
  228. package/lib/server/utils/small-ticket.js +479 -456
  229. package/lib/server/utils/time.js +40 -49
  230. package/lib/solution/BaseSales/index.js +1276 -1485
  231. package/lib/solution/BaseSales/types.d.ts +2 -0
  232. package/lib/solution/BaseSales/types.js +42 -38
  233. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
  234. package/lib/solution/BaseSales/utils/cartPromotion.js +652 -498
  235. package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
  236. package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
  237. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.d.ts +3 -0
  238. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +138 -180
  239. package/lib/solution/BaseSales/utils.js +161 -143
  240. package/lib/solution/BookingByStep/index.d.ts +2 -2
  241. package/lib/solution/BookingByStep/index.js +1527 -1340
  242. package/lib/solution/BookingByStep/types.js +40 -99
  243. package/lib/solution/BookingByStep/utils/capacity.js +192 -160
  244. package/lib/solution/BookingByStep/utils/products.js +42 -52
  245. package/lib/solution/BookingByStep/utils/resources.js +527 -330
  246. package/lib/solution/BookingByStep/utils/stock.js +65 -44
  247. package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
  248. package/lib/solution/BookingTicket/index.js +598 -514
  249. package/lib/solution/BookingTicket/types.js +99 -77
  250. package/lib/solution/BookingTicket/utils/addProductDecision.js +229 -190
  251. package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
  252. package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
  253. package/lib/solution/BookingTicket/utils/cartView.js +114 -99
  254. package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
  255. package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
  256. package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
  257. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
  258. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
  259. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
  260. package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
  261. package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
  262. package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
  263. package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
  264. package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
  265. package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
  266. package/lib/solution/BuyTickets/index.js +67 -70
  267. package/lib/solution/BuyTickets/types.js +22 -38
  268. package/lib/solution/Checkout/index.js +1451 -1158
  269. package/lib/solution/Checkout/types.js +91 -61
  270. package/lib/solution/Checkout/utils/index.js +228 -156
  271. package/lib/solution/PlaceOrder/index.js +55 -0
  272. package/lib/solution/RegisterAndLogin/config.js +493 -460
  273. package/lib/solution/RegisterAndLogin/index.js +633 -630
  274. package/lib/solution/RegisterAndLogin/types.js +189 -76
  275. package/lib/solution/RegisterAndLogin/utils.js +183 -125
  276. package/lib/solution/Sales/index.js +328 -324
  277. package/lib/solution/Sales/types.js +27 -33
  278. package/lib/solution/ScanOrder/index.js +822 -852
  279. package/lib/solution/ScanOrder/types.d.ts +2 -0
  280. package/lib/solution/ScanOrder/types.js +33 -34
  281. package/lib/solution/ScanOrder/utils.js +412 -374
  282. package/lib/solution/ShopDiscount/index.js +226 -232
  283. package/lib/solution/ShopDiscount/types.js +15 -37
  284. package/lib/solution/ShopDiscount/utils.js +300 -172
  285. package/lib/solution/UnifiedBookingSales/index.js +1052 -1213
  286. package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +99 -159
  287. package/lib/solution/UnifiedBookingSales/types.js +10 -32
  288. package/lib/solution/VenueBooking/index.js +811 -879
  289. package/lib/solution/VenueBooking/types.js +19 -39
  290. package/lib/solution/VenueBooking/utils/dateSummary.js +27 -56
  291. package/lib/solution/VenueBooking/utils/resource.js +31 -54
  292. package/lib/solution/VenueBooking/utils/slotMerge.js +94 -107
  293. package/lib/solution/VenueBooking/utils/timeSlot.js +132 -132
  294. package/lib/solution/VenueBooking/utils.js +130 -67
  295. package/lib/solution/index.js +124 -41
  296. package/lib/store/createStore.js +32 -29
  297. package/lib/types/index.js +4 -16
  298. package/lib/utils/payment-number.js +26 -46
  299. package/lib/utils/task.js +36 -36
  300. package/lib/utils/watch.js +81 -47
  301. package/package.json +2 -1
@@ -1,257 +1,317 @@
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);
1
+ "use strict";
18
2
 
19
- // src/model/strategy/adapter/itemRule/examples.ts
20
- var examples_exports = {};
21
- __export(examples_exports, {
22
- HOTPOT_BASE_PICK_ONE_STRATEGY: () => HOTPOT_BASE_PICK_ONE_STRATEGY,
23
- HOTPOT_BASE_REQUIRED_STRATEGY: () => HOTPOT_BASE_REQUIRED_STRATEGY,
24
- MAX_BUNS_PER_TABLE_STRATEGY: () => MAX_BUNS_PER_TABLE_STRATEGY,
25
- MIN_CONDIMENT_PER_PERSON_STRATEGY: () => MIN_CONDIMENT_PER_PERSON_STRATEGY,
26
- quickUseItemRuleEvaluator: () => quickUseItemRuleEvaluator,
27
- runItemRuleEvaluatorDemo: () => runItemRuleEvaluatorDemo
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
28
5
  });
29
- module.exports = __toCommonJS(examples_exports);
30
- var import_evaluator = require("./evaluator");
31
- var import_type = require("./type");
32
- var MIN_CONDIMENT_PER_PERSON_STRATEGY = {
6
+ exports.MIN_CONDIMENT_PER_PERSON_STRATEGY = exports.MAX_BUNS_PER_TABLE_STRATEGY = exports.HOTPOT_BASE_REQUIRED_STRATEGY = exports.HOTPOT_BASE_PICK_ONE_STRATEGY = void 0;
7
+ exports.quickUseItemRuleEvaluator = quickUseItemRuleEvaluator;
8
+ exports.runItemRuleEvaluatorDemo = runItemRuleEvaluatorDemo;
9
+ var _evaluator = require("./evaluator");
10
+ var _type = require("./type");
11
+ // ============================================
12
+ // 示例 1:每人至少一份小料 (Minimum Per Person)
13
+ // ============================================
14
+
15
+ /**
16
+ * 场景:火锅店扫码点餐,要求小料数量 >= 成人人数,自动添加到购物车
17
+ *
18
+ * WHEN: Always active
19
+ * THEN:
20
+ * - Quantity Check: 小料最少数量 = Adult Pax
21
+ * - Prefill Cart: 自动添加小料 x Adult Pax
22
+ */
23
+ const MIN_CONDIMENT_PER_PERSON_STRATEGY = exports.MIN_CONDIMENT_PER_PERSON_STRATEGY = {
33
24
  metadata: {
34
- id: "RULE_MIN_CONDIMENT_PER_PERSON",
25
+ id: 'RULE_MIN_CONDIMENT_PER_PERSON',
35
26
  name: {
36
- "zh-CN": "每人至少一份小料",
37
- en: "Min 1 Condiment per person"
27
+ 'zh-CN': '每人至少一份小料',
28
+ en: 'Min 1 Condiment per person'
38
29
  },
39
- type: "item_rule",
30
+ type: 'item_rule',
40
31
  description: {
41
- "zh-CN": "火锅小料数量不少于成人人数,自动添加",
42
- en: "Condiment count must be at least adult pax, auto-added to cart"
32
+ 'zh-CN': '火锅小料数量不少于成人人数,自动添加',
33
+ en: 'Condiment count must be at least adult pax, auto-added to cart'
43
34
  }
44
35
  },
45
36
  conditions: {
46
- operator: "and",
37
+ operator: 'and',
47
38
  rules: [],
48
- actionIds: ["quantity_check_condiment", "prefill_condiment"]
39
+ actionIds: ['quantity_check_condiment', 'prefill_condiment']
49
40
  },
50
- actions: [
51
- {
52
- id: "quantity_check_condiment",
53
- type: import_type.ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK,
54
- value: null,
55
- target: "cart",
56
- priority: 10,
57
- config: {
58
- targetType: "product",
59
- targets: [{ product_id: 10001 }, { product_id: 10002 }],
60
- quantityRules: [
61
- { comparison: "minimum", source: "total_pax" }
62
- ],
63
- scope: "first_submission_only",
64
- validationMessage: {
65
- "zh-CN": "小料至少需要 {min} 份(每位成人一份)",
66
- en: "Condiment requires at least {min} items (one per adult)"
67
- }
68
- }
69
- },
70
- {
71
- id: "prefill_condiment",
72
- type: import_type.ITEM_RULE_ACTION_TYPES.PREFILL_CART,
73
- value: null,
74
- target: "cart",
75
- priority: 5,
76
- config: {
77
- products: [
78
- {
79
- product_id: 10001,
80
- quantityFrom: "total_pax"
81
- }
82
- ]
41
+ actions: [{
42
+ id: 'quantity_check_condiment',
43
+ type: _type.ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK,
44
+ value: null,
45
+ target: 'cart',
46
+ priority: 10,
47
+ config: {
48
+ targetType: 'product',
49
+ targets: [{
50
+ product_id: 10001
51
+ }, {
52
+ product_id: 10002
53
+ }],
54
+ quantityRules: [{
55
+ comparison: 'minimum',
56
+ source: 'total_pax'
57
+ }],
58
+ scope: 'first_submission_only',
59
+ validationMessage: {
60
+ 'zh-CN': '小料至少需要 {min} 份(每位成人一份)',
61
+ en: 'Condiment requires at least {min} items (one per adult)'
83
62
  }
84
63
  }
85
- ]
64
+ }, {
65
+ id: 'prefill_condiment',
66
+ type: _type.ITEM_RULE_ACTION_TYPES.PREFILL_CART,
67
+ value: null,
68
+ target: 'cart',
69
+ priority: 5,
70
+ config: {
71
+ products: [{
72
+ product_id: 10001,
73
+ quantityFrom: 'total_pax'
74
+ }]
75
+ }
76
+ }]
86
77
  };
87
- var MAX_BUNS_PER_TABLE_STRATEGY = {
78
+
79
+ // ============================================
80
+ // 示例 2:每桌限量3份包子 (Maximum Per Table)
81
+ // ============================================
82
+
83
+ /**
84
+ * 场景:包子限量供应,每桌最多3份(含加单累计),肉包和菜包合计
85
+ *
86
+ * WHEN: Always active
87
+ * THEN:
88
+ * - Quantity Check: 肉包 + 菜包 合计 <= 3,scope=cumulative
89
+ */
90
+ const MAX_BUNS_PER_TABLE_STRATEGY = exports.MAX_BUNS_PER_TABLE_STRATEGY = {
88
91
  metadata: {
89
- id: "RULE_MAX_BUNS_PER_TABLE",
92
+ id: 'RULE_MAX_BUNS_PER_TABLE',
90
93
  name: {
91
- "zh-CN": "每桌限量供应3份包子",
92
- en: "3 Buns limit per table"
94
+ 'zh-CN': '每桌限量供应3份包子',
95
+ en: '3 Buns limit per table'
93
96
  },
94
- type: "item_rule",
97
+ type: 'item_rule',
95
98
  description: {
96
- "zh-CN": "肉包和菜包合计每桌不超过3份,含加单累计",
97
- en: "Max 3 buns per table (pork + veggie combined, cumulative)"
99
+ 'zh-CN': '肉包和菜包合计每桌不超过3份,含加单累计',
100
+ en: 'Max 3 buns per table (pork + veggie combined, cumulative)'
98
101
  }
99
102
  },
100
103
  conditions: {
101
- operator: "and",
104
+ operator: 'and',
102
105
  rules: [],
103
- actionIds: ["quantity_check_buns"]
106
+ actionIds: ['quantity_check_buns']
104
107
  },
105
- actions: [
106
- {
107
- id: "quantity_check_buns",
108
- type: import_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
- { product_id: 20002 }
117
- ],
118
- quantityRules: [
119
- { comparison: "maximum", source: "fixed", value: 3 }
120
- ],
121
- scope: "cumulative",
122
- validationMessage: {
123
- "zh-CN": "包子每桌限量 {max} 份(含加单累计)",
124
- en: "Buns are limited to {max} per table (cumulative)"
125
- }
108
+ actions: [{
109
+ id: 'quantity_check_buns',
110
+ type: _type.ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK,
111
+ value: null,
112
+ target: 'cart',
113
+ priority: 10,
114
+ config: {
115
+ targetType: 'product',
116
+ targets: [{
117
+ product_id: 20001
118
+ }, {
119
+ product_id: 20002
120
+ }],
121
+ quantityRules: [{
122
+ comparison: 'maximum',
123
+ source: 'fixed',
124
+ value: 3
125
+ }],
126
+ scope: 'cumulative',
127
+ validationMessage: {
128
+ 'zh-CN': '包子每桌限量 {max} 份(含加单累计)',
129
+ en: 'Buns are limited to {max} per table (cumulative)'
126
130
  }
127
131
  }
128
- ]
132
+ }]
129
133
  };
130
- var HOTPOT_BASE_REQUIRED_STRATEGY = {
134
+
135
+ // ============================================
136
+ // 示例 3:锅底必选 (Must Include - Conditional)
137
+ // ============================================
138
+
139
+ /**
140
+ * 场景:堂食必须选择一个锅底(按商品匹配),自动预填默认锅底
141
+ *
142
+ * WHEN: Service Type = Dine-in
143
+ * THEN:
144
+ * - Quantity Check: 指定锅底商品精确1份
145
+ * - Prefill Cart: 自动添加默认锅底 x 1
146
+ */
147
+ const HOTPOT_BASE_REQUIRED_STRATEGY = exports.HOTPOT_BASE_REQUIRED_STRATEGY = {
131
148
  metadata: {
132
- id: "RULE_HOTPOT_BASE_REQUIRED",
149
+ id: 'RULE_HOTPOT_BASE_REQUIRED',
133
150
  name: {
134
- "zh-CN": "锅底必选",
135
- en: "Hotpot base required"
151
+ 'zh-CN': '锅底必选',
152
+ en: 'Hotpot base required'
136
153
  },
137
- type: "item_rule",
154
+ type: 'item_rule',
138
155
  description: {
139
- "zh-CN": "堂食必须选择一个锅底",
140
- en: "Hotpot base is mandatory for dine-in"
156
+ 'zh-CN': '堂食必须选择一个锅底',
157
+ en: 'Hotpot base is mandatory for dine-in'
141
158
  }
142
159
  },
143
160
  conditions: {
144
- operator: "and",
145
- rules: [
146
- {
147
- type: "operator",
148
- dimension: "context",
149
- field: "serviceType",
150
- operator: "=",
151
- value: "dine-in"
152
- }
153
- ],
154
- actionIds: ["quantity_check_base", "prefill_base"]
161
+ operator: 'and',
162
+ rules: [{
163
+ type: 'operator',
164
+ dimension: 'context',
165
+ field: 'serviceType',
166
+ operator: '=',
167
+ value: 'dine-in'
168
+ }],
169
+ actionIds: ['quantity_check_base', 'prefill_base']
155
170
  },
156
- actions: [
157
- {
158
- id: "quantity_check_base",
159
- type: import_type.ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK,
160
- value: null,
161
- target: "cart",
162
- priority: 10,
163
- config: {
164
- targetType: "product",
165
- targets: [{ product_id: 30001 }],
166
- quantityRules: [
167
- { comparison: "exact", source: "fixed", value: 1 }
168
- ],
169
- scope: "first_submission_only",
170
- validationMessage: {
171
- "zh-CN": "请选择 {exact} 个锅底",
172
- en: "Please select exactly {exact} hotpot base"
173
- }
174
- }
175
- },
176
- {
177
- id: "prefill_base",
178
- type: import_type.ITEM_RULE_ACTION_TYPES.PREFILL_CART,
179
- value: null,
180
- target: "cart",
181
- priority: 5,
182
- config: {
183
- products: [
184
- {
185
- product_id: 30001,
186
- quantityFrom: "fixed",
187
- quantity: 1
188
- }
189
- ]
171
+ actions: [{
172
+ id: 'quantity_check_base',
173
+ type: _type.ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK,
174
+ value: null,
175
+ target: 'cart',
176
+ priority: 10,
177
+ config: {
178
+ targetType: 'product',
179
+ targets: [{
180
+ product_id: 30001
181
+ }],
182
+ quantityRules: [{
183
+ comparison: 'exact',
184
+ source: 'fixed',
185
+ value: 1
186
+ }],
187
+ scope: 'first_submission_only',
188
+ validationMessage: {
189
+ 'zh-CN': '请选择 {exact} 个锅底',
190
+ en: 'Please select exactly {exact} hotpot base'
190
191
  }
191
192
  }
192
- ]
193
+ }, {
194
+ id: 'prefill_base',
195
+ type: _type.ITEM_RULE_ACTION_TYPES.PREFILL_CART,
196
+ value: null,
197
+ target: 'cart',
198
+ priority: 5,
199
+ config: {
200
+ products: [{
201
+ product_id: 30001,
202
+ quantityFrom: 'fixed',
203
+ quantity: 1
204
+ }]
205
+ }
206
+ }]
193
207
  };
194
- var HOTPOT_BASE_PICK_ONE_STRATEGY = {
208
+
209
+ // ============================================
210
+ // 示例 4:锅底四选一(Multi-target OR 组至少 1 份)
211
+ // ============================================
212
+
213
+ /**
214
+ * 场景:4 款锅底里任选至少 1 款,不自动预填,不限制多选上限
215
+ *
216
+ * WHEN: Always active
217
+ * THEN:
218
+ * - Quantity Check: 4 个锅底商品合计数量 >= 1 (OR 组语义)
219
+ *
220
+ * 说明:
221
+ * - targets 里放多个 product_id 时,ItemRuleAdapter 会把它们视为 OR 组,
222
+ * 仅校验「合计数量」,不会要求每款各自满足 min。
223
+ * - ScanOrder 工具层 buildQuantityLimitIndex 会跳过多目标规则的
224
+ * 单品索引,避免 UI 把组级 min 误当作每张商品卡的减号下限,
225
+ * 锁死用户切换锅底的操作。
226
+ */
227
+ const HOTPOT_BASE_PICK_ONE_STRATEGY = exports.HOTPOT_BASE_PICK_ONE_STRATEGY = {
195
228
  metadata: {
196
- id: "RULE_HOTPOT_BASE_PICK_ONE",
229
+ id: 'RULE_HOTPOT_BASE_PICK_ONE',
197
230
  name: {
198
- "zh-CN": "锅底必选(四选一)",
199
- en: "Hotpot base required (pick any)"
231
+ 'zh-CN': '锅底必选(四选一)',
232
+ en: 'Hotpot base required (pick any)'
200
233
  },
201
- type: "item_rule",
234
+ type: 'item_rule',
202
235
  description: {
203
- "zh-CN": "4 款锅底任选至少 1 份",
204
- en: "Pick at least 1 hotpot base from the available options"
236
+ 'zh-CN': '4 款锅底任选至少 1 份',
237
+ en: 'Pick at least 1 hotpot base from the available options'
205
238
  }
206
239
  },
207
240
  conditions: {
208
- operator: "and",
241
+ operator: 'and',
209
242
  rules: [],
210
- actionIds: ["quantity_check_hotpot_base_group"]
243
+ actionIds: ['quantity_check_hotpot_base_group']
211
244
  },
212
- actions: [
213
- {
214
- id: "quantity_check_hotpot_base_group",
215
- type: import_type.ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK,
216
- value: null,
217
- target: "cart",
218
- priority: 10,
219
- config: {
220
- targetType: "product",
221
- targets: [
222
- { product_id: 30001 },
223
- { product_id: 30002 },
224
- { product_id: 30003 },
225
- { product_id: 30004 }
226
- ],
227
- quantityRules: [
228
- { comparison: "minimum", source: "fixed", value: 1 }
229
- ],
230
- scope: "first_submission_only",
231
- validationMessage: {
232
- "zh-CN": "请至少选择 {min} 款锅底",
233
- en: "Please select at least {min} hotpot base"
234
- }
245
+ actions: [{
246
+ id: 'quantity_check_hotpot_base_group',
247
+ type: _type.ITEM_RULE_ACTION_TYPES.QUANTITY_CHECK,
248
+ value: null,
249
+ target: 'cart',
250
+ priority: 10,
251
+ config: {
252
+ targetType: 'product',
253
+ targets: [{
254
+ product_id: 30001
255
+ }, {
256
+ product_id: 30002
257
+ }, {
258
+ product_id: 30003
259
+ }, {
260
+ product_id: 30004
261
+ }],
262
+ quantityRules: [{
263
+ comparison: 'minimum',
264
+ source: 'fixed',
265
+ value: 1
266
+ }],
267
+ scope: 'first_submission_only',
268
+ validationMessage: {
269
+ 'zh-CN': '请至少选择 {min} 款锅底',
270
+ en: 'Please select at least {min} hotpot base'
235
271
  }
236
272
  }
237
- ]
273
+ }]
238
274
  };
275
+
276
+ // ============================================
277
+ // 示例 5:ItemRuleEvaluator 用法(简洁调用 + 完整 Demo)
278
+ // ============================================
279
+
280
+ /**
281
+ * ItemRuleEvaluator 简洁调用示例
282
+ *
283
+ * 覆盖方法:
284
+ * - setStrategyConfigs
285
+ * - getStrategyConfigs
286
+ * - evaluate
287
+ * - getQuantityLimits
288
+ * - validateCart
289
+ * - getPrefillItems
290
+ */
239
291
  function quickUseItemRuleEvaluator() {
240
- const evaluator = new import_evaluator.ItemRuleEvaluator();
241
- evaluator.setStrategyConfigs([
242
- MIN_CONDIMENT_PER_PERSON_STRATEGY,
243
- MAX_BUNS_PER_TABLE_STRATEGY,
244
- HOTPOT_BASE_REQUIRED_STRATEGY
245
- ]);
292
+ const evaluator = new _evaluator.ItemRuleEvaluator();
293
+ evaluator.setStrategyConfigs([MIN_CONDIMENT_PER_PERSON_STRATEGY, MAX_BUNS_PER_TABLE_STRATEGY, HOTPOT_BASE_REQUIRED_STRATEGY]);
246
294
  const businessData = {
247
- pax: { total: 3, adult: 3, child: 0 },
248
- serviceType: "dine-in",
249
- cartItems: [
250
- { product_id: 10001, quantity: 1 },
251
- { product_id: 20001, quantity: 2 },
252
- { product_id: 20002, quantity: 1 }
253
- ],
254
- historicalItems: [{ product_id: 20001, quantity: 1 }],
295
+ pax: {
296
+ total: 3,
297
+ adult: 3,
298
+ child: 0
299
+ },
300
+ serviceType: 'dine-in',
301
+ cartItems: [{
302
+ product_id: 10001,
303
+ quantity: 1
304
+ }, {
305
+ product_id: 20001,
306
+ quantity: 2
307
+ }, {
308
+ product_id: 20002,
309
+ quantity: 1
310
+ }],
311
+ historicalItems: [{
312
+ product_id: 20001,
313
+ quantity: 1
314
+ }],
255
315
  submissionIndex: 0
256
316
  };
257
317
  return {
@@ -262,23 +322,40 @@ function quickUseItemRuleEvaluator() {
262
322
  prefillItems: evaluator.getPrefillItems(businessData)
263
323
  };
264
324
  }
325
+
326
+ /**
327
+ * ItemRuleEvaluator 完整可运行 Demo
328
+ *
329
+ * 说明:
330
+ * 1) 首次提交:触发 first_submission_only + cumulative + 条件规则
331
+ * 2) 追加提交:演示 first_submission_only 不再触发
332
+ * 3) 覆盖 strategyConfigs 临时传入:演示按需仅评估部分规则
333
+ */
265
334
  function runItemRuleEvaluatorDemo() {
266
- const evaluator = new import_evaluator.ItemRuleEvaluator();
267
- evaluator.setStrategyConfigs([
268
- MIN_CONDIMENT_PER_PERSON_STRATEGY
269
- // MAX_BUNS_PER_TABLE_STRATEGY,
270
- // HOTPOT_BASE_REQUIRED_STRATEGY,
335
+ const evaluator = new _evaluator.ItemRuleEvaluator();
336
+ evaluator.setStrategyConfigs([MIN_CONDIMENT_PER_PERSON_STRATEGY
337
+ // MAX_BUNS_PER_TABLE_STRATEGY,
338
+ // HOTPOT_BASE_REQUIRED_STRATEGY,
271
339
  ]);
272
340
  const firstSubmissionData = {
273
- pax: { total: 4, adult: 3, child: 1 },
274
- serviceType: "dine-in",
341
+ pax: {
342
+ total: 4,
343
+ adult: 3,
344
+ child: 1
345
+ },
346
+ serviceType: 'dine-in',
275
347
  submissionIndex: 0,
276
- cartItems: [
277
- { product_id: 10001, quantity: 3 }
278
- // { product_id: 20001, quantity: 2 },
279
- // { product_id: 20002, quantity: 1 },
348
+ cartItems: [{
349
+ product_id: 10001,
350
+ quantity: 3
351
+ }
352
+ // { product_id: 20001, quantity: 2 },
353
+ // { product_id: 20002, quantity: 1 },
280
354
  ],
281
- historicalItems: [{ product_id: 20001, quantity: 1 }]
355
+ historicalItems: [{
356
+ product_id: 20001,
357
+ quantity: 1
358
+ }]
282
359
  };
283
360
  const additionalSubmissionData = {
284
361
  ...firstSubmissionData,
@@ -289,6 +366,8 @@ function runItemRuleEvaluatorDemo() {
289
366
  const quantityLimits = evaluator.getQuantityLimits(firstSubmissionData);
290
367
  const validateResult = evaluator.validateCart(firstSubmissionData);
291
368
  const prefillItems = evaluator.getPrefillItems(firstSubmissionData);
369
+
370
+ // 按需覆盖策略:仅评估“锅底必选”规则
292
371
  const baseOnlyEvaluation = evaluator.evaluate({
293
372
  ...firstSubmissionData,
294
373
  strategyConfigs: [HOTPOT_BASE_REQUIRED_STRATEGY]
@@ -304,13 +383,4 @@ function runItemRuleEvaluatorDemo() {
304
383
  prefillItems
305
384
  // baseOnlyEvaluation,
306
385
  };
307
- }
308
- // Annotate the CommonJS export names for ESM import in node:
309
- 0 && (module.exports = {
310
- HOTPOT_BASE_PICK_ONE_STRATEGY,
311
- HOTPOT_BASE_REQUIRED_STRATEGY,
312
- MAX_BUNS_PER_TABLE_STRATEGY,
313
- MIN_CONDIMENT_PER_PERSON_STRATEGY,
314
- quickUseItemRuleEvaluator,
315
- runItemRuleEvaluatorDemo
316
- });
386
+ }