@pisell/pisellos 2.3.74 → 2.3.75

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 (276) hide show
  1. package/dist/core/index.js +6 -10
  2. package/dist/model/strategy/adapter/promotion/index.js +9 -0
  3. package/dist/model/strategy/adapter/walletPass/example.js +3 -26
  4. package/dist/model/strategy/strategy-example.js +5 -19
  5. package/dist/modules/Cart/index.js +0 -3
  6. package/dist/modules/Cart/utils/cartProduct.js +0 -1
  7. package/dist/modules/Date/index.js +1 -5
  8. package/dist/modules/Discount/index.js +2 -4
  9. package/dist/modules/OpenData/index.js +0 -2
  10. package/dist/modules/Order/index.js +36 -64
  11. package/dist/modules/Payment/index.js +97 -162
  12. package/dist/modules/Rules/index.js +1 -4
  13. package/dist/modules/Schedule/index.js +0 -1
  14. package/dist/modules/Schedule/utils.js +0 -1
  15. package/dist/modules/Step/index.js +0 -1
  16. package/dist/plugins/request.js +1 -4
  17. package/dist/plugins/window.js +2 -6
  18. package/dist/server/index.js +97 -129
  19. package/dist/server/modules/menu/index.js +32 -41
  20. package/dist/server/modules/order/index.js +2 -4
  21. package/dist/server/modules/products/index.js +24 -42
  22. package/dist/server/modules/quotation/index.js +29 -38
  23. package/dist/server/modules/resource/index.js +3 -4
  24. package/dist/server/modules/schedule/index.js +27 -35
  25. package/dist/server/utils/product.js +0 -1
  26. package/dist/solution/BaseSales/index.js +38 -41
  27. package/dist/solution/BookingByStep/index.js +7 -59
  28. package/dist/solution/BookingByStep/utils/capacity.js +1 -11
  29. package/dist/solution/BookingByStep/utils/resources.js +1 -3
  30. package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
  31. package/dist/solution/BookingTicket/index.js +0 -2
  32. package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
  33. package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
  34. package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
  35. package/dist/solution/BuyTickets/index.js +9 -12
  36. package/dist/solution/Checkout/index.js +177 -252
  37. package/dist/solution/Checkout/utils/index.js +4 -16
  38. package/dist/solution/RegisterAndLogin/index.js +30 -76
  39. package/dist/solution/ScanOrder/index.js +50 -60
  40. package/dist/solution/ShopDiscount/index.js +2 -7
  41. package/dist/solution/VenueBooking/index.js +45 -55
  42. package/dist/utils/task.js +15 -18
  43. package/dist/utils/watch.js +0 -1
  44. package/lib/apis/picoding.js +2 -0
  45. package/lib/core/index.js +134 -134
  46. package/lib/effects/index.js +46 -57
  47. package/lib/index.js +82 -49
  48. package/lib/model/index.js +14 -21
  49. package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
  50. package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
  51. package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
  52. package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
  53. package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
  54. package/lib/model/strategy/adapter/index.js +100 -64
  55. package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
  56. package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
  57. package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
  58. package/lib/model/strategy/adapter/itemRule/index.js +83 -57
  59. package/lib/model/strategy/adapter/itemRule/type.js +97 -36
  60. package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
  61. package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
  62. package/lib/model/strategy/adapter/promotion/examples.js +222 -234
  63. package/lib/model/strategy/adapter/promotion/index.js +1 -0
  64. package/lib/model/strategy/adapter/promotion/type.js +243 -36
  65. package/lib/model/strategy/adapter/type.js +4 -16
  66. package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
  67. package/lib/model/strategy/adapter/walletPass/example.js +217 -190
  68. package/lib/model/strategy/adapter/walletPass/index.js +75 -51
  69. package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
  70. package/lib/model/strategy/adapter/walletPass/type.js +4 -16
  71. package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
  72. package/lib/model/strategy/engine.js +270 -168
  73. package/lib/model/strategy/index.js +49 -34
  74. package/lib/model/strategy/strategy-example.js +243 -239
  75. package/lib/model/strategy/type.js +100 -40
  76. package/lib/modules/Account/index.js +39 -53
  77. package/lib/modules/Account/types.js +20 -33
  78. package/lib/modules/AccountList/index.js +116 -154
  79. package/lib/modules/AccountList/types.js +30 -31
  80. package/lib/modules/AccountList/utils.js +18 -30
  81. package/lib/modules/BaseModule.js +23 -42
  82. package/lib/modules/BookingContext/index.js +158 -136
  83. package/lib/modules/BookingContext/types.js +46 -32
  84. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
  85. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
  86. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
  87. package/lib/modules/BookingContext/utils/flexible.js +38 -55
  88. package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
  89. package/lib/modules/BookingContext/utils/index.js +124 -41
  90. package/lib/modules/BookingContext/utils/noResource.js +58 -70
  91. package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
  92. package/lib/modules/BookingContext/utils/productExtend.js +202 -155
  93. package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
  94. package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
  95. package/lib/modules/BookingContext/utils/resources.js +209 -167
  96. package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
  97. package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
  98. package/lib/modules/Cart/index.js +170 -124
  99. package/lib/modules/Cart/types.js +46 -51
  100. package/lib/modules/Cart/utils/cartAccount.js +40 -39
  101. package/lib/modules/Cart/utils/cartDate.js +56 -61
  102. package/lib/modules/Cart/utils/cartDiscount.js +28 -33
  103. package/lib/modules/Cart/utils/cartNote.js +27 -32
  104. package/lib/modules/Cart/utils/cartProduct.js +321 -251
  105. package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
  106. package/lib/modules/Cart/utils/cartResource.js +70 -78
  107. package/lib/modules/Cart/utils/changePrice.js +22 -50
  108. package/lib/modules/Cart/utils/index.js +106 -48
  109. package/lib/modules/Customer/constants.js +13 -34
  110. package/lib/modules/Customer/index.js +235 -172
  111. package/lib/modules/Customer/types.js +38 -35
  112. package/lib/modules/Date/index.js +116 -115
  113. package/lib/modules/Date/types.js +16 -28
  114. package/lib/modules/Date/utils.js +174 -123
  115. package/lib/modules/Discount/index.js +122 -127
  116. package/lib/modules/Discount/types.js +9 -31
  117. package/lib/modules/Guests/index.js +30 -56
  118. package/lib/modules/Guests/types.js +23 -33
  119. package/lib/modules/Holder/index.js +209 -189
  120. package/lib/modules/Holder/types.js +4 -16
  121. package/lib/modules/Holder/utils.js +20 -49
  122. package/lib/modules/OpenData/index.js +70 -76
  123. package/lib/modules/OpenData/types.js +4 -16
  124. package/lib/modules/OpenData/utils.js +44 -78
  125. package/lib/modules/Order/index.js +1713 -2118
  126. package/lib/modules/Order/payment-utils.js +77 -120
  127. package/lib/modules/Order/types.js +88 -35
  128. package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
  129. package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
  130. package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
  131. package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
  132. package/lib/modules/Order/utils.js +814 -647
  133. package/lib/modules/Payment/cash.js +20 -33
  134. package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
  135. package/lib/modules/Payment/eftpos.js +16 -30
  136. package/lib/modules/Payment/index.js +532 -399
  137. package/lib/modules/Payment/mx51.js +1 -0
  138. package/lib/modules/Payment/types.js +230 -108
  139. package/lib/modules/Payment/utils.js +52 -51
  140. package/lib/modules/Payment/walletpass.js +485 -660
  141. package/lib/modules/Product/index.js +51 -46
  142. package/lib/modules/Product/types.js +4 -16
  143. package/lib/modules/Product/utils.js +32 -33
  144. package/lib/modules/ProductList/index.js +113 -123
  145. package/lib/modules/ProductList/types.js +9 -31
  146. package/lib/modules/Quotation/index.js +81 -118
  147. package/lib/modules/Quotation/types.js +4 -16
  148. package/lib/modules/Resource/index.js +27 -59
  149. package/lib/modules/Resource/types.js +22 -32
  150. package/lib/modules/Resource/utils.js +30 -38
  151. package/lib/modules/ResourcePlanner/index.js +25 -23
  152. package/lib/modules/ResourcePlanner/localClock.js +54 -119
  153. package/lib/modules/ResourcePlanner/planner.js +589 -770
  154. package/lib/modules/ResourcePlanner/types.js +10 -29
  155. package/lib/modules/Rules/index.js +1218 -959
  156. package/lib/modules/Rules/types.js +17 -40
  157. package/lib/modules/SalesSummary/index.js +85 -90
  158. package/lib/modules/SalesSummary/types.js +4 -16
  159. package/lib/modules/SalesSummary/utils.js +355 -430
  160. package/lib/modules/ScanOrderLogger/index.js +59 -79
  161. package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
  162. package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
  163. package/lib/modules/ScanOrderLogger/types.js +4 -16
  164. package/lib/modules/Schedule/getDateIsInSchedule.js +334 -163
  165. package/lib/modules/Schedule/index.js +100 -114
  166. package/lib/modules/Schedule/type.js +4 -16
  167. package/lib/modules/Schedule/types.js +4 -16
  168. package/lib/modules/Schedule/utils.js +433 -291
  169. package/lib/modules/Step/index.js +40 -52
  170. package/lib/modules/Step/tyeps.js +4 -16
  171. package/lib/modules/Summary/index.js +66 -71
  172. package/lib/modules/Summary/types.js +4 -16
  173. package/lib/modules/Summary/utils.js +773 -418
  174. package/lib/modules/SurchargeList/index.js +46 -60
  175. package/lib/modules/SurchargeList/types.js +4 -16
  176. package/lib/modules/index.js +245 -63
  177. package/lib/plugins/app.js +4 -16
  178. package/lib/plugins/index.js +36 -25
  179. package/lib/plugins/request.js +137 -126
  180. package/lib/plugins/shopStore.js +4 -16
  181. package/lib/plugins/user.js +4 -16
  182. package/lib/plugins/window.js +171 -179
  183. package/lib/server/index.js +3050 -2665
  184. package/lib/server/modules/floor-plan/index.js +118 -134
  185. package/lib/server/modules/floor-plan/types.js +15 -30
  186. package/lib/server/modules/index.js +106 -68
  187. package/lib/server/modules/menu/index.js +142 -122
  188. package/lib/server/modules/menu/types.js +18 -31
  189. package/lib/server/modules/order/index.js +784 -1002
  190. package/lib/server/modules/order/types.js +122 -33
  191. package/lib/server/modules/order/utils/filterBookings.js +219 -194
  192. package/lib/server/modules/order/utils/filterOrders.js +118 -92
  193. package/lib/server/modules/payment/index.js +59 -83
  194. package/lib/server/modules/payment/types.js +4 -16
  195. package/lib/server/modules/products/index.js +583 -471
  196. package/lib/server/modules/products/types.js +44 -34
  197. package/lib/server/modules/quotation/index.js +137 -172
  198. package/lib/server/modules/quotation/types.js +21 -31
  199. package/lib/server/modules/resource/index.js +220 -186
  200. package/lib/server/modules/resource/types.js +42 -33
  201. package/lib/server/modules/schedule/index.js +135 -123
  202. package/lib/server/modules/schedule/types.js +14 -21
  203. package/lib/server/modules/schedule/utils.js +334 -163
  204. package/lib/server/types.js +4 -16
  205. package/lib/server/utils/index.js +25 -23
  206. package/lib/server/utils/product.js +196 -139
  207. package/lib/server/utils/schedule.js +34 -41
  208. package/lib/server/utils/small-ticket.js +479 -456
  209. package/lib/server/utils/time.js +40 -49
  210. package/lib/solution/BaseSales/index.js +1186 -1410
  211. package/lib/solution/BaseSales/types.js +42 -38
  212. package/lib/solution/BaseSales/utils/cartPromotion.js +642 -498
  213. package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
  214. package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
  215. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +108 -145
  216. package/lib/solution/BaseSales/utils.js +158 -143
  217. package/lib/solution/BookingByStep/index.js +1527 -1340
  218. package/lib/solution/BookingByStep/types.js +40 -99
  219. package/lib/solution/BookingByStep/utils/capacity.js +192 -160
  220. package/lib/solution/BookingByStep/utils/products.js +42 -52
  221. package/lib/solution/BookingByStep/utils/resources.js +527 -330
  222. package/lib/solution/BookingByStep/utils/stock.js +65 -44
  223. package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
  224. package/lib/solution/BookingTicket/index.js +607 -522
  225. package/lib/solution/BookingTicket/types.js +99 -77
  226. package/lib/solution/BookingTicket/utils/addProductDecision.js +226 -189
  227. package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
  228. package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
  229. package/lib/solution/BookingTicket/utils/cartView.js +114 -99
  230. package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
  231. package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
  232. package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
  233. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
  234. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
  235. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
  236. package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
  237. package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
  238. package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
  239. package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
  240. package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
  241. package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
  242. package/lib/solution/BuyTickets/index.js +67 -70
  243. package/lib/solution/BuyTickets/types.js +22 -38
  244. package/lib/solution/Checkout/index.js +1451 -1158
  245. package/lib/solution/Checkout/types.js +91 -61
  246. package/lib/solution/Checkout/utils/index.js +228 -156
  247. package/lib/solution/PlaceOrder/index.js +55 -0
  248. package/lib/solution/RegisterAndLogin/config.js +493 -460
  249. package/lib/solution/RegisterAndLogin/index.js +633 -630
  250. package/lib/solution/RegisterAndLogin/types.js +189 -76
  251. package/lib/solution/RegisterAndLogin/utils.js +183 -125
  252. package/lib/solution/Sales/index.js +328 -324
  253. package/lib/solution/Sales/types.js +27 -33
  254. package/lib/solution/ScanOrder/index.js +832 -864
  255. package/lib/solution/ScanOrder/types.js +33 -34
  256. package/lib/solution/ScanOrder/utils.js +409 -374
  257. package/lib/solution/ShopDiscount/index.js +226 -232
  258. package/lib/solution/ShopDiscount/types.js +15 -37
  259. package/lib/solution/ShopDiscount/utils.js +300 -172
  260. package/lib/solution/UnifiedBookingSales/index.js +1035 -1201
  261. package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +99 -159
  262. package/lib/solution/UnifiedBookingSales/types.js +10 -32
  263. package/lib/solution/VenueBooking/index.js +811 -879
  264. package/lib/solution/VenueBooking/types.js +19 -39
  265. package/lib/solution/VenueBooking/utils/dateSummary.js +27 -56
  266. package/lib/solution/VenueBooking/utils/resource.js +31 -54
  267. package/lib/solution/VenueBooking/utils/slotMerge.js +94 -107
  268. package/lib/solution/VenueBooking/utils/timeSlot.js +132 -132
  269. package/lib/solution/VenueBooking/utils.js +130 -67
  270. package/lib/solution/index.js +124 -41
  271. package/lib/store/createStore.js +32 -29
  272. package/lib/types/index.js +4 -16
  273. package/lib/utils/payment-number.js +26 -46
  274. package/lib/utils/task.js +36 -36
  275. package/lib/utils/watch.js +81 -47
  276. package/package.json +2 -1
@@ -1,283 +1,271 @@
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/promotion/examples.ts
20
- var examples_exports = {};
21
- __export(examples_exports, {
22
- BUY_X_GET_Y_FREE_STRATEGY: () => BUY_X_GET_Y_FREE_STRATEGY,
23
- ITEM_REWARD_STRATEGY: () => ITEM_REWARD_STRATEGY,
24
- X_ITEMS_FOR_Y_PRICE_STRATEGY: () => X_ITEMS_FOR_Y_PRICE_STRATEGY
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
25
5
  });
26
- module.exports = __toCommonJS(examples_exports);
27
- var X_ITEMS_FOR_Y_PRICE_STRATEGY = {
6
+ exports.X_ITEMS_FOR_Y_PRICE_STRATEGY = exports.ITEM_REWARD_STRATEGY = exports.BUY_X_GET_Y_FREE_STRATEGY = void 0;
7
+ /**
8
+ * X件Y元策略配置示例
9
+ *
10
+ * 业务规则:
11
+ * - 每X件商品固定价格Y元(可累计)
12
+ * - 支持跨商品组合(A+B可以凑成一组)
13
+ * - 买5件 = 2组优惠 + 1件原价
14
+ *
15
+ * 商品匹配规则:
16
+ * - product_variant_id = 0 表示匹配任意变体
17
+ * - product_variant_id != 0 表示精确匹配该变体
18
+ */
19
+ const X_ITEMS_FOR_Y_PRICE_STRATEGY = exports.X_ITEMS_FOR_Y_PRICE_STRATEGY = {
28
20
  metadata: {
29
- id: "STRATEGY_001",
21
+ id: 'STRATEGY_001',
30
22
  name: {
31
- en: "2 items for $10",
32
- "zh-CN": "2杯10元",
33
- "zh-HK": "2杯10元"
23
+ en: '2 items for $10',
24
+ 'zh-CN': '2杯10元',
25
+ 'zh-HK': '2杯10元'
34
26
  },
35
- type: "promotion",
27
+ type: 'promotion',
36
28
  custom: {
37
29
  display: {
38
30
  product_card: {
39
31
  text: {
40
- en: "2 for $10",
41
- "zh-CN": "2杯10元",
42
- "zh-HK": "2杯10元"
32
+ en: '2 for $10',
33
+ 'zh-CN': '2杯10元',
34
+ 'zh-HK': '2杯10元'
43
35
  },
44
- type: "tag"
36
+ type: 'tag'
45
37
  }
46
38
  }
47
39
  }
48
40
  },
49
41
  conditions: {
50
- operator: "and",
51
- rules: [
52
- {
53
- type: "operator",
54
- field: "currentDateTime",
55
- value: "2023-01-01 00:00:00",
56
- operator: ">="
57
- },
58
- {
59
- type: "operator",
60
- field: "currentDateTime",
61
- value: "2027-01-01 00:00:00",
62
- operator: "<="
63
- },
64
- {
65
- type: "operator",
66
- field: "productIdAndVariantId",
67
- value: [
68
- {
69
- product_id: 60736,
70
- product_variant_id: 0
71
- // 0 = 匹配任意变体
72
- },
73
- {
74
- product_id: 60737,
75
- product_variant_id: 0
76
- // 0 = 匹配任意变体
77
- }
78
- ],
79
- operator: "product_match"
80
- }
81
- ],
82
- actionIds: ["1"]
42
+ operator: 'and',
43
+ rules: [{
44
+ type: 'operator',
45
+ field: 'currentDateTime',
46
+ value: '2023-01-01 00:00:00',
47
+ operator: '>='
48
+ }, {
49
+ type: 'operator',
50
+ field: 'currentDateTime',
51
+ value: '2027-01-01 00:00:00',
52
+ operator: '<='
53
+ }, {
54
+ type: 'operator',
55
+ field: 'productIdAndVariantId',
56
+ value: [{
57
+ product_id: 60736,
58
+ product_variant_id: 0 // 0 = 匹配任意变体
59
+ }, {
60
+ product_id: 60737,
61
+ product_variant_id: 0 // 0 = 匹配任意变体
62
+ }],
63
+ operator: 'product_match'
64
+ }],
65
+ actionIds: ['1']
83
66
  },
84
- actions: [
85
- {
86
- id: "1",
87
- type: "X_ITEMS_FOR_Y_PRICE",
88
- value: {
89
- x: 2,
90
- // 每X件
91
- price: 10
92
- // 固定价格Y元
93
- },
94
- valueType: "object",
95
- target: "product",
96
- priority: 1,
97
- config: {
98
- allowCrossProduct: true,
99
- // 允许跨商品组合(A+B可以凑成一组)
100
- cumulative: true
101
- // 可累计(买5件 = 2组优惠 + 1件原价)
102
- }
67
+ actions: [{
68
+ id: '1',
69
+ type: 'X_ITEMS_FOR_Y_PRICE',
70
+ value: {
71
+ x: 2,
72
+ // 每X件
73
+ price: 10 // 固定价格Y元
74
+ },
75
+ valueType: 'object',
76
+ target: 'product',
77
+ priority: 1,
78
+ config: {
79
+ allowCrossProduct: true,
80
+ // 允许跨商品组合(A+B可以凑成一组)
81
+ cumulative: true // 可累计(买5件 = 2组优惠 + 1件原价)
103
82
  }
104
- ]
83
+ }]
105
84
  };
106
- var BUY_X_GET_Y_FREE_STRATEGY = {
85
+
86
+ /**
87
+ * 买X送Y策略配置示例
88
+ *
89
+ * 业务规则:
90
+ * - 买X件送Y件(可累计:买2送2、买3送3...)
91
+ * - 赠品由用户从列表中选择
92
+ *
93
+ * 商品匹配规则:
94
+ * - product_variant_id = 0 表示匹配任意变体
95
+ * - product_variant_id != 0 表示精确匹配该变体
96
+ */
97
+ const BUY_X_GET_Y_FREE_STRATEGY = exports.BUY_X_GET_Y_FREE_STRATEGY = {
107
98
  metadata: {
108
- id: "STRATEGY_002",
99
+ id: 'STRATEGY_002',
109
100
  name: {
110
- en: "Buy 1 Get 1 Free",
111
- "zh-CN": "买1送1",
112
- "zh-HK": "買1送1"
101
+ en: 'Buy 1 Get 1 Free',
102
+ 'zh-CN': '买1送1',
103
+ 'zh-HK': '買1送1'
113
104
  },
114
- type: "promotion",
105
+ type: 'promotion',
115
106
  custom: {
116
107
  display: {
117
108
  product_card: {
118
109
  text: {
119
- en: "Buy 1 Get 1",
120
- "zh-CN": "买1送1",
121
- "zh-HK": "買1送1"
110
+ en: 'Buy 1 Get 1',
111
+ 'zh-CN': '买1送1',
112
+ 'zh-HK': '買1送1'
122
113
  },
123
- type: "tag"
114
+ type: 'tag'
124
115
  }
125
116
  }
126
117
  }
127
118
  },
128
119
  conditions: {
129
- operator: "and",
130
- rules: [
131
- {
132
- type: "operator",
133
- field: "currentDateTime",
134
- value: "2023-01-01 00:00:00",
135
- operator: ">="
136
- },
137
- {
138
- type: "operator",
139
- field: "currentDateTime",
140
- value: "2027-01-01 00:00:00",
141
- operator: "<="
142
- },
143
- {
144
- type: "operator",
145
- field: "productIdAndVariantId",
146
- value: [
147
- {
148
- product_id: 60736,
149
- product_variant_id: 0
150
- // 0 = 匹配任意变体
151
- },
152
- {
153
- product_id: 60737,
154
- product_variant_id: 0
155
- // 0 = 匹配任意变体
156
- }
157
- ],
158
- operator: "product_match"
159
- }
160
- ],
161
- actionIds: ["1"]
120
+ operator: 'and',
121
+ rules: [{
122
+ type: 'operator',
123
+ field: 'currentDateTime',
124
+ value: '2023-01-01 00:00:00',
125
+ operator: '>='
126
+ }, {
127
+ type: 'operator',
128
+ field: 'currentDateTime',
129
+ value: '2027-01-01 00:00:00',
130
+ operator: '<='
131
+ }, {
132
+ type: 'operator',
133
+ field: 'productIdAndVariantId',
134
+ value: [{
135
+ product_id: 60736,
136
+ product_variant_id: 0 // 0 = 匹配任意变体
137
+ }, {
138
+ product_id: 60737,
139
+ product_variant_id: 0 // 0 = 匹配任意变体
140
+ }],
141
+ operator: 'product_match'
142
+ }],
143
+ actionIds: ['1']
162
144
  },
163
- actions: [
164
- {
165
- id: "1",
166
- type: "BUY_X_GET_Y_FREE",
167
- value: {
168
- buyQuantity: 1,
169
- // 买X
170
- freeQuantity: 1
171
- // 送Y件
172
- },
173
- valueType: "object",
174
- target: "product",
175
- priority: 1,
176
- config: {
177
- // 可累计(买2送2、买3送3...)
178
- cumulative: true,
179
- // 可选的赠品列表
180
- giftProducts: [
181
- { product_id: 60757, product_variant_id: 0 },
182
- { product_id: 38782, product_variant_id: 0 },
183
- { product_id: 60749, product_variant_id: 27267 }
184
- ]
185
- }
145
+ actions: [{
146
+ id: '1',
147
+ type: 'BUY_X_GET_Y_FREE',
148
+ value: {
149
+ buyQuantity: 1,
150
+ // 买X件
151
+ freeQuantity: 1 // 送Y
152
+ },
153
+ valueType: 'object',
154
+ target: 'product',
155
+ priority: 1,
156
+ config: {
157
+ // 可累计(买2送2、买3送3...)
158
+ cumulative: true,
159
+ // 可选的赠品列表
160
+ giftProducts: [{
161
+ product_id: 60757,
162
+ product_variant_id: 0
163
+ }, {
164
+ product_id: 38782,
165
+ product_variant_id: 0
166
+ }, {
167
+ product_id: 60749,
168
+ product_variant_id: 27267
169
+ }]
186
170
  }
187
- ]
171
+ }]
188
172
  };
189
- var ITEM_REWARD_STRATEGY = {
173
+
174
+ /**
175
+ * ITEM_REWARD 策略配置示例:儿童票触发婴儿票免费
176
+ *
177
+ * 业务规则:
178
+ * - 条件商品:儿童票(conditions.rules.productIdAndVariantId)
179
+ * - 奖励商品:购物车/订单内已经存在的婴儿票(actions[0].config.rewardTargets)
180
+ * - 本 action 不自动新增婴儿票;每次购物车变更后由统一促销链路重算
181
+ *
182
+ * 字段说明:
183
+ * - type: "ITEM_REWARD" 表示商品奖励 action
184
+ * - target: "product" 表示本期只奖励商品行
185
+ * - config.rewardTargets: 奖励对象数组,支持 { product_id, product_variant_id }
186
+ * - config.targetSelection: "consumer_best" 表示目标商品超额时选择节省金额最高的商品
187
+ * - value.rewardMethod:
188
+ * - "free": 目标商品最终价为 0
189
+ * - "percent_off": 百分比折扣,rewardValue 为 0-100
190
+ * - "amount_off": 每个目标商品固定减免 rewardValue
191
+ * - "fixed_price": 目标商品最终单价为 rewardValue
192
+ * - value.quantityRule:
193
+ * - "per_condition_quantity": 每满足 triggerQuantity 个条件商品,奖励 rewardQuantity 个目标商品
194
+ * - "all_targets": 满足条件后奖励全部目标商品
195
+ * - "max_per_order": 满足条件后每单最多奖励 maxRewardQuantity 个目标商品
196
+ */
197
+ const ITEM_REWARD_STRATEGY = exports.ITEM_REWARD_STRATEGY = {
190
198
  metadata: {
191
- id: "STRATEGY_003",
199
+ id: 'STRATEGY_003',
192
200
  name: {
193
- en: "Infant ticket free with child ticket",
194
- "zh-CN": "儿童票触发婴儿票免费",
195
- "zh-HK": "兒童票觸發嬰兒票免費"
201
+ en: 'Infant ticket free with child ticket',
202
+ 'zh-CN': '儿童票触发婴儿票免费',
203
+ 'zh-HK': '兒童票觸發嬰兒票免費'
196
204
  },
197
- type: "promotion",
205
+ type: 'promotion',
198
206
  custom: {
199
207
  display: {
200
208
  product_card: {
201
209
  text: {
202
- en: "Infant ticket free",
203
- "zh-CN": "婴儿票免费",
204
- "zh-HK": "嬰兒票免費"
210
+ en: 'Infant ticket free',
211
+ 'zh-CN': '婴儿票免费',
212
+ 'zh-HK': '嬰兒票免費'
205
213
  },
206
- type: "tag"
214
+ type: 'tag'
207
215
  }
208
216
  }
209
217
  }
210
218
  },
211
219
  conditions: {
212
- operator: "and",
213
- rules: [
214
- {
215
- type: "operator",
216
- field: "currentDateTime",
217
- value: "2023-01-01 00:00:00",
218
- operator: ">="
219
- },
220
- {
221
- type: "operator",
222
- field: "currentDateTime",
223
- value: "2030-01-01 00:00:00",
224
- operator: "<="
225
- },
226
- {
227
- type: "operator",
228
- field: "productIdAndVariantId",
229
- value: [
230
- {
231
- product_id: 1001,
232
- // 条件商品:儿童票
233
- product_variant_id: 0
234
- // 0 = 匹配任意变体
235
- }
236
- ],
237
- operator: "product_match"
238
- }
239
- ],
240
- actionIds: ["1"]
220
+ operator: 'and',
221
+ rules: [{
222
+ type: 'operator',
223
+ field: 'currentDateTime',
224
+ value: '2023-01-01 00:00:00',
225
+ operator: '>='
226
+ }, {
227
+ type: 'operator',
228
+ field: 'currentDateTime',
229
+ value: '2030-01-01 00:00:00',
230
+ operator: '<='
231
+ }, {
232
+ type: 'operator',
233
+ field: 'productIdAndVariantId',
234
+ value: [{
235
+ product_id: 1001,
236
+ // 条件商品:儿童票
237
+ product_variant_id: 0 // 0 = 匹配任意变体
238
+ }],
239
+ operator: 'product_match'
240
+ }],
241
+ actionIds: ['1']
241
242
  },
242
- actions: [
243
- {
244
- id: "1",
245
- type: "ITEM_REWARD",
246
- value: {
247
- rewardMethod: "free",
248
- // free | percent_off | amount_off | fixed_price
249
- rewardValue: 0,
250
- // free 可省略;其他 rewardMethod 使用
251
- quantityRule: "per_condition_quantity",
252
- // per_condition_quantity | all_targets | max_per_order
253
- triggerQuantity: 1,
254
- // N:每满足 N 个条件商品
255
- rewardQuantity: 1,
256
- // Y:奖励 Y 个目标商品
257
- maxRewardQuantity: 1
258
- // max_per_order 使用;本例保留为配置示意
259
- },
260
- valueType: "object",
261
- target: "product",
262
- priority: 1,
263
- config: {
264
- rewardTargets: [
265
- {
266
- product_id: 2001,
267
- // 奖励对象:婴儿票
268
- product_variant_id: 0
269
- // 0 = 匹配任意变体
270
- }
271
- ],
272
- targetSelection: "consumer_best"
273
- // consumer_best = 按可节省金额从高到低选择
274
- }
243
+ actions: [{
244
+ id: '1',
245
+ type: 'ITEM_REWARD',
246
+ value: {
247
+ rewardMethod: 'free',
248
+ // free | percent_off | amount_off | fixed_price
249
+ rewardValue: 0,
250
+ // free 可省略;其他 rewardMethod 使用
251
+ quantityRule: 'per_condition_quantity',
252
+ // per_condition_quantity | all_targets | max_per_order
253
+ triggerQuantity: 1,
254
+ // N:每满足 N 个条件商品
255
+ rewardQuantity: 1,
256
+ // Y:奖励 Y 个目标商品
257
+ maxRewardQuantity: 1 // max_per_order 使用;本例保留为配置示意
258
+ },
259
+ valueType: 'object',
260
+ target: 'product',
261
+ priority: 1,
262
+ config: {
263
+ rewardTargets: [{
264
+ product_id: 2001,
265
+ // 奖励对象:婴儿票
266
+ product_variant_id: 0 // 0 = 匹配任意变体
267
+ }],
268
+ targetSelection: 'consumer_best' // consumer_best = 按可节省金额从高到低选择
275
269
  }
276
- ]
277
- };
278
- // Annotate the CommonJS export names for ESM import in node:
279
- 0 && (module.exports = {
280
- BUY_X_GET_Y_FREE_STRATEGY,
281
- ITEM_REWARD_STRATEGY,
282
- X_ITEMS_FOR_Y_PRICE_STRATEGY
283
- });
270
+ }]
271
+ };
@@ -0,0 +1 @@
1
+ "use strict";