@pisell/pisellos 2.3.73 → 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 (296) hide show
  1. package/dist/core/index.d.ts +7 -0
  2. package/dist/core/index.js +111 -71
  3. package/dist/model/strategy/adapter/promotion/index.js +9 -0
  4. package/dist/model/strategy/adapter/walletPass/example.js +3 -26
  5. package/dist/model/strategy/strategy-example.js +5 -19
  6. package/dist/modules/Cart/index.js +0 -3
  7. package/dist/modules/Cart/utils/cartProduct.js +0 -1
  8. package/dist/modules/Date/index.js +1 -5
  9. package/dist/modules/Discount/index.js +2 -4
  10. package/dist/modules/OpenData/index.js +0 -2
  11. package/dist/modules/Order/index.d.ts +1 -1
  12. package/dist/modules/Order/index.js +36 -64
  13. package/dist/modules/Payment/index.js +97 -162
  14. package/dist/modules/Quotation/index.d.ts +6 -0
  15. package/dist/modules/Quotation/index.js +75 -19
  16. package/dist/modules/Rules/index.js +1 -4
  17. package/dist/modules/Schedule/index.js +0 -1
  18. package/dist/modules/Schedule/utils.js +0 -1
  19. package/dist/modules/Step/index.js +0 -1
  20. package/dist/plugins/request.d.ts +1 -0
  21. package/dist/plugins/request.js +1 -4
  22. package/dist/plugins/window.js +2 -6
  23. package/dist/server/index.d.ts +8 -2
  24. package/dist/server/index.js +303 -269
  25. package/dist/server/modules/floor-plan/index.d.ts +4 -0
  26. package/dist/server/modules/floor-plan/index.js +240 -98
  27. package/dist/server/modules/menu/index.js +75 -59
  28. package/dist/server/modules/order/index.d.ts +17 -7
  29. package/dist/server/modules/order/index.js +421 -211
  30. package/dist/server/modules/products/index.d.ts +8 -2
  31. package/dist/server/modules/products/index.js +191 -117
  32. package/dist/server/modules/quotation/index.js +29 -38
  33. package/dist/server/modules/resource/index.js +24 -17
  34. package/dist/server/modules/schedule/index.js +27 -35
  35. package/dist/server/utils/product.js +0 -1
  36. package/dist/solution/BaseSales/index.js +38 -41
  37. package/dist/solution/BookingByStep/index.d.ts +1 -1
  38. package/dist/solution/BookingByStep/index.js +7 -59
  39. package/dist/solution/BookingByStep/utils/capacity.js +1 -11
  40. package/dist/solution/BookingByStep/utils/resources.js +1 -3
  41. package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
  42. package/dist/solution/BookingTicket/index.js +0 -2
  43. package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
  44. package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
  45. package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
  46. package/dist/solution/BuyTickets/index.js +9 -12
  47. package/dist/solution/Checkout/index.js +177 -252
  48. package/dist/solution/Checkout/utils/index.js +4 -16
  49. package/dist/solution/RegisterAndLogin/index.js +30 -76
  50. package/dist/solution/ScanOrder/index.js +50 -60
  51. package/dist/solution/ShopDiscount/index.js +2 -7
  52. package/dist/solution/VenueBooking/index.js +45 -55
  53. package/dist/utils/task.js +15 -18
  54. package/dist/utils/watch.js +0 -1
  55. package/lib/apis/picoding.js +2 -0
  56. package/lib/core/index.d.ts +7 -0
  57. package/lib/core/index.js +149 -131
  58. package/lib/effects/index.js +46 -57
  59. package/lib/index.js +82 -49
  60. package/lib/model/index.js +14 -21
  61. package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
  62. package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
  63. package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
  64. package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
  65. package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
  66. package/lib/model/strategy/adapter/index.js +100 -64
  67. package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
  68. package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
  69. package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
  70. package/lib/model/strategy/adapter/itemRule/index.js +83 -57
  71. package/lib/model/strategy/adapter/itemRule/type.js +97 -36
  72. package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
  73. package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
  74. package/lib/model/strategy/adapter/promotion/examples.js +222 -234
  75. package/lib/model/strategy/adapter/promotion/index.js +1 -0
  76. package/lib/model/strategy/adapter/promotion/type.js +243 -36
  77. package/lib/model/strategy/adapter/type.js +4 -16
  78. package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
  79. package/lib/model/strategy/adapter/walletPass/example.js +217 -190
  80. package/lib/model/strategy/adapter/walletPass/index.js +75 -51
  81. package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
  82. package/lib/model/strategy/adapter/walletPass/type.js +4 -16
  83. package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
  84. package/lib/model/strategy/engine.js +270 -168
  85. package/lib/model/strategy/index.js +49 -34
  86. package/lib/model/strategy/strategy-example.js +243 -239
  87. package/lib/model/strategy/type.js +100 -40
  88. package/lib/modules/Account/index.js +39 -53
  89. package/lib/modules/Account/types.js +20 -33
  90. package/lib/modules/AccountList/index.js +116 -154
  91. package/lib/modules/AccountList/types.js +30 -31
  92. package/lib/modules/AccountList/utils.js +18 -30
  93. package/lib/modules/BaseModule.js +23 -42
  94. package/lib/modules/BookingContext/index.js +158 -136
  95. package/lib/modules/BookingContext/types.js +46 -32
  96. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
  97. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
  98. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
  99. package/lib/modules/BookingContext/utils/flexible.js +38 -55
  100. package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
  101. package/lib/modules/BookingContext/utils/index.js +124 -41
  102. package/lib/modules/BookingContext/utils/noResource.js +58 -70
  103. package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
  104. package/lib/modules/BookingContext/utils/productExtend.js +202 -155
  105. package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
  106. package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
  107. package/lib/modules/BookingContext/utils/resources.js +209 -167
  108. package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
  109. package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
  110. package/lib/modules/Cart/index.js +170 -124
  111. package/lib/modules/Cart/types.js +46 -51
  112. package/lib/modules/Cart/utils/cartAccount.js +40 -39
  113. package/lib/modules/Cart/utils/cartDate.js +56 -61
  114. package/lib/modules/Cart/utils/cartDiscount.js +28 -33
  115. package/lib/modules/Cart/utils/cartNote.js +27 -32
  116. package/lib/modules/Cart/utils/cartProduct.js +321 -251
  117. package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
  118. package/lib/modules/Cart/utils/cartResource.js +70 -78
  119. package/lib/modules/Cart/utils/changePrice.js +22 -50
  120. package/lib/modules/Cart/utils/index.js +106 -48
  121. package/lib/modules/Customer/constants.js +13 -34
  122. package/lib/modules/Customer/index.js +235 -172
  123. package/lib/modules/Customer/types.js +38 -35
  124. package/lib/modules/Date/index.js +116 -115
  125. package/lib/modules/Date/types.js +16 -28
  126. package/lib/modules/Date/utils.js +174 -123
  127. package/lib/modules/Discount/index.js +122 -127
  128. package/lib/modules/Discount/types.js +9 -31
  129. package/lib/modules/Guests/index.js +30 -56
  130. package/lib/modules/Guests/types.js +23 -33
  131. package/lib/modules/Holder/index.js +209 -189
  132. package/lib/modules/Holder/types.js +4 -16
  133. package/lib/modules/Holder/utils.js +20 -49
  134. package/lib/modules/OpenData/index.js +70 -76
  135. package/lib/modules/OpenData/types.js +4 -16
  136. package/lib/modules/OpenData/utils.js +44 -78
  137. package/lib/modules/Order/index.d.ts +1 -1
  138. package/lib/modules/Order/index.js +1713 -2118
  139. package/lib/modules/Order/payment-utils.js +77 -120
  140. package/lib/modules/Order/types.js +88 -35
  141. package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
  142. package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
  143. package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
  144. package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
  145. package/lib/modules/Order/utils.js +814 -647
  146. package/lib/modules/Payment/cash.js +20 -33
  147. package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
  148. package/lib/modules/Payment/eftpos.js +16 -30
  149. package/lib/modules/Payment/index.js +532 -399
  150. package/lib/modules/Payment/mx51.js +1 -0
  151. package/lib/modules/Payment/types.js +230 -108
  152. package/lib/modules/Payment/utils.js +52 -51
  153. package/lib/modules/Payment/walletpass.js +485 -660
  154. package/lib/modules/Product/index.js +51 -46
  155. package/lib/modules/Product/types.js +4 -16
  156. package/lib/modules/Product/utils.js +32 -33
  157. package/lib/modules/ProductList/index.js +113 -123
  158. package/lib/modules/ProductList/types.js +9 -31
  159. package/lib/modules/Quotation/index.d.ts +6 -0
  160. package/lib/modules/Quotation/index.js +110 -103
  161. package/lib/modules/Quotation/types.js +4 -16
  162. package/lib/modules/Resource/index.js +27 -59
  163. package/lib/modules/Resource/types.js +22 -32
  164. package/lib/modules/Resource/utils.js +30 -38
  165. package/lib/modules/ResourcePlanner/index.js +25 -23
  166. package/lib/modules/ResourcePlanner/localClock.js +54 -119
  167. package/lib/modules/ResourcePlanner/planner.js +589 -770
  168. package/lib/modules/ResourcePlanner/types.js +10 -29
  169. package/lib/modules/Rules/index.js +1218 -959
  170. package/lib/modules/Rules/types.js +17 -40
  171. package/lib/modules/SalesSummary/index.js +85 -90
  172. package/lib/modules/SalesSummary/types.js +4 -16
  173. package/lib/modules/SalesSummary/utils.js +355 -430
  174. package/lib/modules/ScanOrderLogger/index.js +59 -79
  175. package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
  176. package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
  177. package/lib/modules/ScanOrderLogger/types.js +4 -16
  178. package/lib/modules/Schedule/getDateIsInSchedule.js +334 -163
  179. package/lib/modules/Schedule/index.js +100 -114
  180. package/lib/modules/Schedule/type.js +4 -16
  181. package/lib/modules/Schedule/types.js +4 -16
  182. package/lib/modules/Schedule/utils.js +433 -291
  183. package/lib/modules/Step/index.js +40 -52
  184. package/lib/modules/Step/tyeps.js +4 -16
  185. package/lib/modules/Summary/index.js +66 -71
  186. package/lib/modules/Summary/types.js +4 -16
  187. package/lib/modules/Summary/utils.js +773 -418
  188. package/lib/modules/SurchargeList/index.js +46 -60
  189. package/lib/modules/SurchargeList/types.js +4 -16
  190. package/lib/modules/index.js +245 -63
  191. package/lib/plugins/app.js +4 -16
  192. package/lib/plugins/index.js +36 -25
  193. package/lib/plugins/request.d.ts +1 -0
  194. package/lib/plugins/request.js +137 -126
  195. package/lib/plugins/shopStore.js +4 -16
  196. package/lib/plugins/user.js +4 -16
  197. package/lib/plugins/window.js +171 -179
  198. package/lib/server/index.d.ts +8 -2
  199. package/lib/server/index.js +3083 -2663
  200. package/lib/server/modules/floor-plan/index.d.ts +4 -0
  201. package/lib/server/modules/floor-plan/index.js +159 -127
  202. package/lib/server/modules/floor-plan/types.js +15 -30
  203. package/lib/server/modules/index.js +106 -68
  204. package/lib/server/modules/menu/index.js +170 -124
  205. package/lib/server/modules/menu/types.js +18 -31
  206. package/lib/server/modules/order/index.d.ts +17 -7
  207. package/lib/server/modules/order/index.js +916 -977
  208. package/lib/server/modules/order/types.js +122 -33
  209. package/lib/server/modules/order/utils/filterBookings.js +219 -194
  210. package/lib/server/modules/order/utils/filterOrders.js +118 -92
  211. package/lib/server/modules/payment/index.js +59 -83
  212. package/lib/server/modules/payment/types.js +4 -16
  213. package/lib/server/modules/products/index.d.ts +8 -2
  214. package/lib/server/modules/products/index.js +656 -471
  215. package/lib/server/modules/products/types.js +44 -34
  216. package/lib/server/modules/quotation/index.js +137 -172
  217. package/lib/server/modules/quotation/types.js +21 -31
  218. package/lib/server/modules/resource/index.js +225 -186
  219. package/lib/server/modules/resource/types.js +42 -33
  220. package/lib/server/modules/schedule/index.js +135 -123
  221. package/lib/server/modules/schedule/types.js +14 -21
  222. package/lib/server/modules/schedule/utils.js +334 -163
  223. package/lib/server/types.js +4 -16
  224. package/lib/server/utils/index.js +25 -23
  225. package/lib/server/utils/product.js +196 -139
  226. package/lib/server/utils/schedule.js +34 -41
  227. package/lib/server/utils/small-ticket.js +479 -456
  228. package/lib/server/utils/time.js +40 -49
  229. package/lib/solution/BaseSales/index.js +1186 -1410
  230. package/lib/solution/BaseSales/types.js +42 -38
  231. package/lib/solution/BaseSales/utils/cartPromotion.js +642 -498
  232. package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
  233. package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
  234. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +108 -145
  235. package/lib/solution/BaseSales/utils.js +158 -143
  236. package/lib/solution/BookingByStep/index.d.ts +1 -1
  237. package/lib/solution/BookingByStep/index.js +1527 -1340
  238. package/lib/solution/BookingByStep/types.js +40 -99
  239. package/lib/solution/BookingByStep/utils/capacity.js +192 -160
  240. package/lib/solution/BookingByStep/utils/products.js +42 -52
  241. package/lib/solution/BookingByStep/utils/resources.js +527 -330
  242. package/lib/solution/BookingByStep/utils/stock.js +65 -44
  243. package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
  244. package/lib/solution/BookingTicket/index.js +607 -522
  245. package/lib/solution/BookingTicket/types.js +99 -77
  246. package/lib/solution/BookingTicket/utils/addProductDecision.js +226 -189
  247. package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
  248. package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
  249. package/lib/solution/BookingTicket/utils/cartView.js +114 -99
  250. package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
  251. package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
  252. package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
  253. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
  254. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
  255. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
  256. package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
  257. package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
  258. package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
  259. package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
  260. package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
  261. package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
  262. package/lib/solution/BuyTickets/index.js +67 -70
  263. package/lib/solution/BuyTickets/types.js +22 -38
  264. package/lib/solution/Checkout/index.js +1451 -1158
  265. package/lib/solution/Checkout/types.js +91 -61
  266. package/lib/solution/Checkout/utils/index.js +228 -156
  267. package/lib/solution/PlaceOrder/index.js +55 -0
  268. package/lib/solution/RegisterAndLogin/config.js +493 -460
  269. package/lib/solution/RegisterAndLogin/index.js +633 -630
  270. package/lib/solution/RegisterAndLogin/types.js +189 -76
  271. package/lib/solution/RegisterAndLogin/utils.js +183 -125
  272. package/lib/solution/Sales/index.js +328 -324
  273. package/lib/solution/Sales/types.js +27 -33
  274. package/lib/solution/ScanOrder/index.js +832 -864
  275. package/lib/solution/ScanOrder/types.js +33 -34
  276. package/lib/solution/ScanOrder/utils.js +409 -374
  277. package/lib/solution/ShopDiscount/index.js +226 -232
  278. package/lib/solution/ShopDiscount/types.js +15 -37
  279. package/lib/solution/ShopDiscount/utils.js +300 -172
  280. package/lib/solution/UnifiedBookingSales/index.js +1035 -1201
  281. package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +99 -159
  282. package/lib/solution/UnifiedBookingSales/types.js +10 -32
  283. package/lib/solution/VenueBooking/index.js +811 -879
  284. package/lib/solution/VenueBooking/types.js +19 -39
  285. package/lib/solution/VenueBooking/utils/dateSummary.js +27 -56
  286. package/lib/solution/VenueBooking/utils/resource.js +31 -54
  287. package/lib/solution/VenueBooking/utils/slotMerge.js +94 -107
  288. package/lib/solution/VenueBooking/utils/timeSlot.js +132 -132
  289. package/lib/solution/VenueBooking/utils.js +130 -67
  290. package/lib/solution/index.js +124 -41
  291. package/lib/store/createStore.js +32 -29
  292. package/lib/types/index.js +4 -16
  293. package/lib/utils/payment-number.js +26 -46
  294. package/lib/utils/task.js +36 -36
  295. package/lib/utils/watch.js +81 -47
  296. package/package.json +2 -1
@@ -1,207 +1,234 @@
1
- // src/model/strategy/adapter/walletPass/example.ts
2
- var import_evaluator = require("./evaluator");
3
- var products = [
4
- {
5
- product_id: 60734,
6
- price: 80,
7
- quantity: 1,
8
- name: "商品A"
1
+ "use strict";
2
+
3
+ var _evaluator = require("./evaluator");
4
+ /**
5
+ * WalletPass 评估器使用示例
6
+ */
7
+
8
+ // ============================================
9
+ // 准备测试数据
10
+ // ============================================
11
+
12
+ // 1. 商品列表
13
+ const products = [{
14
+ product_id: 60734,
15
+ price: 80,
16
+ quantity: 1,
17
+ name: '商品A'
18
+ }, {
19
+ product_id: 60735,
20
+ price: 50,
21
+ quantity: 2,
22
+ name: '商品B'
23
+ }];
24
+
25
+ // 订单总金额 = 80 + 50*2 = 180
26
+
27
+ // 2. Voucher 列表
28
+ const vouchers = [{
29
+ id: 'VOUCHER_001',
30
+ amount: 10,
31
+ balance: 10,
32
+ type: 'cash_voucher'
33
+ }, {
34
+ id: 'VOUCHER_002',
35
+ amount: 20,
36
+ balance: 20,
37
+ type: 'cash_voucher'
38
+ }, {
39
+ id: 'VOUCHER_003',
40
+ amount: 50,
41
+ balance: 50,
42
+ type: 'cash_voucher'
43
+ }];
44
+
45
+ // 3. 策略配置
46
+ const strategyConfigs = [
47
+ // 策略1: 满100减10,适用于 VOUCHER_001
48
+ {
49
+ metadata: {
50
+ id: 'STRATEGY_001',
51
+ name: '满100减10',
52
+ type: 'wallet_pass',
53
+ custom: {
54
+ maxDeductionAmount: 10,
55
+ // 最大抵扣10元
56
+ maxUsagePerOrder: 1,
57
+ // 每单最多用1张
58
+ deductTaxAndFee: true,
59
+ // 抵扣税费
60
+ applicableProductIds: [60734, 60735] // 适用于这两个商品
61
+ }
9
62
  },
10
- {
11
- product_id: 60735,
12
- price: 50,
13
- quantity: 2,
14
- name: "商品B"
15
- }
16
- ];
17
- var vouchers = [
18
- {
19
- id: "VOUCHER_001",
20
- amount: 10,
21
- balance: 10,
22
- type: "cash_voucher"
63
+ conditions: {
64
+ operator: 'and',
65
+ rules: [
66
+ // 匹配 voucher ID
67
+ {
68
+ type: 'operator',
69
+ field: 'voucherId',
70
+ operator: 'in',
71
+ value: ['VOUCHER_001']
72
+ },
73
+ // 适用商品总额需 >= 100
74
+ {
75
+ type: 'operator',
76
+ field: 'applicableProductTotal',
77
+ operator: '>=',
78
+ value: 100
79
+ }],
80
+ actionIds: ['deduct_10']
23
81
  },
24
- {
25
- id: "VOUCHER_002",
26
- amount: 20,
27
- balance: 20,
28
- type: "cash_voucher"
82
+ actions: [{
83
+ id: 'deduct_10',
84
+ type: 'DEDUCT_AMOUNT',
85
+ value: 10,
86
+ target: 'applicable_products',
87
+ priority: 1
88
+ }]
89
+ },
90
+ // 策略2: 满150减20,适用于 VOUCHER_002
91
+ {
92
+ metadata: {
93
+ id: 'STRATEGY_002',
94
+ name: '满150减20',
95
+ type: 'wallet_pass',
96
+ custom: {
97
+ maxDeductionAmount: 20,
98
+ maxUsagePerOrder: 1,
99
+ deductTaxAndFee: true,
100
+ applicableProductIds: [60734, 60735]
101
+ }
29
102
  },
30
- {
31
- id: "VOUCHER_003",
32
- amount: 50,
33
- balance: 50,
34
- type: "cash_voucher"
35
- }
36
- ];
37
- var strategyConfigs = [
38
- // 策略1: 满100减10,适用于 VOUCHER_001
39
- {
40
- metadata: {
41
- id: "STRATEGY_001",
42
- name: "满100减10",
43
- type: "wallet_pass",
44
- custom: {
45
- maxDeductionAmount: 10,
46
- // 最大抵扣10元
47
- maxUsagePerOrder: 1,
48
- // 每单最多用1张
49
- deductTaxAndFee: true,
50
- // 抵扣税费
51
- applicableProductIds: [60734, 60735]
52
- // 适用于这两个商品
53
- }
54
- },
55
- conditions: {
56
- operator: "and",
57
- rules: [
58
- // 匹配 voucher ID
59
- {
60
- type: "operator",
61
- field: "voucherId",
62
- operator: "in",
63
- value: ["VOUCHER_001"]
64
- },
65
- // 适用商品总额需 >= 100
66
- {
67
- type: "operator",
68
- field: "applicableProductTotal",
69
- operator: ">=",
70
- value: 100
71
- }
72
- ],
73
- actionIds: ["deduct_10"]
74
- },
75
- actions: [
76
- {
77
- id: "deduct_10",
78
- type: "DEDUCT_AMOUNT",
79
- value: 10,
80
- target: "applicable_products",
81
- priority: 1
82
- }
83
- ]
103
+ conditions: {
104
+ operator: 'and',
105
+ rules: [{
106
+ type: 'operator',
107
+ field: 'voucherId',
108
+ operator: 'in',
109
+ value: ['VOUCHER_002']
110
+ }, {
111
+ type: 'operator',
112
+ field: 'applicableProductTotal',
113
+ operator: '>=',
114
+ value: 150
115
+ }],
116
+ actionIds: ['deduct_20']
84
117
  },
85
- // 策略2: 满150减20,适用于 VOUCHER_002
86
- {
87
- metadata: {
88
- id: "STRATEGY_002",
89
- name: "满150减20",
90
- type: "wallet_pass",
91
- custom: {
92
- maxDeductionAmount: 20,
93
- maxUsagePerOrder: 1,
94
- deductTaxAndFee: true,
95
- applicableProductIds: [60734, 60735]
96
- }
97
- },
98
- conditions: {
99
- operator: "and",
100
- rules: [
101
- {
102
- type: "operator",
103
- field: "voucherId",
104
- operator: "in",
105
- value: ["VOUCHER_002"]
106
- },
107
- {
108
- type: "operator",
109
- field: "applicableProductTotal",
110
- operator: ">=",
111
- value: 150
112
- }
113
- ],
114
- actionIds: ["deduct_20"]
115
- },
116
- actions: [
117
- {
118
- id: "deduct_20",
119
- type: "DEDUCT_AMOUNT",
120
- value: 20,
121
- target: "applicable_products",
122
- priority: 1
123
- }
124
- ]
118
+ actions: [{
119
+ id: 'deduct_20',
120
+ type: 'DEDUCT_AMOUNT',
121
+ value: 20,
122
+ target: 'applicable_products',
123
+ priority: 1
124
+ }]
125
+ },
126
+ // 策略3: 满200减50,适用于 VOUCHER_003
127
+ {
128
+ metadata: {
129
+ id: 'STRATEGY_003',
130
+ name: '满200减50',
131
+ type: 'wallet_pass',
132
+ custom: {
133
+ maxDeductionAmount: 50,
134
+ maxUsagePerOrder: 2,
135
+ deductTaxAndFee: false,
136
+ applicableProductIds: [60734, 60735]
137
+ }
125
138
  },
126
- // 策略3: 满200减50,适用于 VOUCHER_003
127
- {
128
- metadata: {
129
- id: "STRATEGY_003",
130
- name: "满200减50",
131
- type: "wallet_pass",
132
- custom: {
133
- maxDeductionAmount: 50,
134
- maxUsagePerOrder: 2,
135
- deductTaxAndFee: false,
136
- applicableProductIds: [60734, 60735]
137
- }
138
- },
139
- conditions: {
140
- operator: "and",
141
- rules: [
142
- {
143
- type: "operator",
144
- field: "voucherId",
145
- operator: "in",
146
- value: ["VOUCHER_003"]
147
- },
148
- {
149
- type: "operator",
150
- field: "applicableProductTotal",
151
- operator: ">=",
152
- value: 200
153
- }
154
- ],
155
- actionIds: ["deduct_50"]
156
- },
157
- actions: [
158
- {
159
- id: "deduct_50",
160
- type: "DEDUCT_AMOUNT",
161
- value: 50,
162
- target: "applicable_products",
163
- priority: 1
164
- }
165
- ]
166
- }
167
- ];
139
+ conditions: {
140
+ operator: 'and',
141
+ rules: [{
142
+ type: 'operator',
143
+ field: 'voucherId',
144
+ operator: 'in',
145
+ value: ['VOUCHER_003']
146
+ }, {
147
+ type: 'operator',
148
+ field: 'applicableProductTotal',
149
+ operator: '>=',
150
+ value: 200
151
+ }],
152
+ actionIds: ['deduct_50']
153
+ },
154
+ actions: [{
155
+ id: 'deduct_50',
156
+ type: 'DEDUCT_AMOUNT',
157
+ value: 50,
158
+ target: 'applicable_products',
159
+ priority: 1
160
+ }]
161
+ }];
162
+
163
+ // ============================================
164
+ // 执行评估
165
+ // ============================================
166
+
168
167
  function runExample() {
169
- console.log("========== WalletPass 评估器示例 ==========\n");
170
- const evaluator = new import_evaluator.WalletPassEvaluator();
168
+ // 创建评估器实例
169
+ const evaluator = new _evaluator.WalletPassEvaluator();
170
+
171
+ // 执行评估
171
172
  const results = evaluator.evaluate({
172
173
  orderTotalAmount: 180,
173
174
  products,
174
175
  vouchers,
175
- strategyConfigs
176
+ strategyConfigs: strategyConfigs
176
177
  });
177
- console.log("订单信息:");
178
- console.log(`- 总金额: ${180} 元`);
179
- console.log(`- 商品: ${products.map((p) => `${p.name}(${p.quantity}件)`).join(", ")}
180
- `);
181
- console.log("评估结果:\n");
178
+
179
+ // 输出结果
180
+
182
181
  results.forEach((result, index) => {
183
- console.log(`Voucher ${index + 1}: ${result.voucher.id}`);
184
- console.log(` 面额: ${result.voucher.amount} 元`);
185
- console.log(` 可用: ${result.isApplicable ? "✅ 是" : "❌ 否"}`);
186
- if (result.isApplicable) {
187
- console.log(` 最大抵扣: ${result.maxDeduction} 元`);
188
- console.log(` 每单可用: ${result.canUseCount} 张`);
189
- console.log(` 抵扣税费: ${result.deductTaxAndFee ? "是" : "否"}`);
190
- console.log(` 适用商品: ${result.applicableProductIds.join(", ")}`);
191
- } else {
192
- console.log(` 原因: ${result.reason}`);
193
- console.log(` 原因码: ${result.reasonCode}`);
194
- }
195
- console.log("");
182
+ if (result.isApplicable) {} else {}
196
183
  });
197
- const availableVouchers = results.filter((r) => r.isApplicable);
198
- console.log(`
199
- ${availableVouchers.length} 张可用`);
184
+
185
+ // 筛选可用的 vouchers
186
+ const availableVouchers = results.filter(r => r.isApplicable);
200
187
  if (availableVouchers.length > 0) {
201
- console.log("可用 voucher ID:");
202
- availableVouchers.forEach((v) => {
203
- console.log(` - ${v.voucher.id}: 最多抵扣 ${v.maxDeduction} 元`);
204
- });
188
+ availableVouchers.forEach(v => {});
205
189
  }
206
190
  }
191
+
192
+ // 运行示例
207
193
  runExample();
194
+
195
+ // ============================================
196
+ // 预期输出
197
+ // ============================================
198
+ /*
199
+ ========== WalletPass 评估器示例 ==========
200
+
201
+ 订单信息:
202
+ - 总金额: 180 元
203
+ - 商品: 商品A(1件), 商品B(2件)
204
+
205
+ 评估结果:
206
+
207
+ Voucher 1: VOUCHER_001
208
+ 面额: 10 元
209
+ 可用: ✅ 是
210
+ 最大抵扣: 10 元
211
+ 每单可用: 1 张
212
+ 抵扣税费: 是
213
+ 适用商品: 60734, 60735
214
+
215
+ Voucher 2: VOUCHER_002
216
+ 面额: 20 元
217
+ 可用: ✅ 是
218
+ 最大抵扣: 20 元
219
+ 每单可用: 1 张
220
+ 抵扣税费: 是
221
+ 适用商品: 60734, 60735
222
+
223
+ Voucher 3: VOUCHER_003
224
+ 面额: 50 元
225
+ 可用: ❌ 否
226
+ 原因: Conditions not met
227
+ 原因码: CONDITION_NOT_MET
228
+
229
+
230
+ 共 2 张可用
231
+ 可用 voucher ID:
232
+ - VOUCHER_001: 最多抵扣 10 元
233
+ - VOUCHER_002: 最多抵扣 20 元
234
+ */
@@ -1,48 +1,44 @@
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/walletPass/index.ts
20
- var walletPass_exports = {};
21
- __export(walletPass_exports, {
22
- default: () => WalletPassAdapter
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
23
5
  });
24
- module.exports = __toCommonJS(walletPass_exports);
25
- var import_utils = require("./utils");
26
- var WalletPassAdapter = class {
27
- constructor() {
28
- this.name = "WalletPassAdapter";
29
- this.version = "1.0.0";
30
- }
6
+ exports.default = void 0;
7
+ var _utils = require("./utils");
8
+ /**
9
+ * Wallet Pass 适配器
10
+ * 用于将 wallet pass 业务数据转换为策略引擎可识别的格式
11
+ */
12
+ class WalletPassAdapter {
13
+ name = 'WalletPassAdapter';
14
+ version = '1.0.0';
15
+
31
16
  /**
32
17
  * 准备运行时上下文
33
18
  * 将业务数据转换为策略引擎可识别的 RuntimeContext
34
19
  */
35
20
  prepareContext(businessData) {
36
- var _a, _b;
37
- const { orderTotalAmount, products, voucher, strategyConfig } = businessData;
38
- const productIds = products.map((p) => p.product_id);
39
- const applicableProductIds = (0, import_utils.getApplicableProductIds)(voucher);
40
- const deductTaxAndFee = ((_b = (_a = strategyConfig == null ? void 0 : strategyConfig.metadata) == null ? void 0 : _a.custom) == null ? void 0 : _b.deductTaxAndFee) ?? true;
41
- const { applicableTotal, applicableCount } = this.calculateApplicableProducts(
21
+ const {
22
+ orderTotalAmount,
42
23
  products,
43
- applicableProductIds,
44
- deductTaxAndFee
45
- );
24
+ voucher,
25
+ strategyConfig
26
+ } = businessData;
27
+
28
+ // 提取订单中的商品ID
29
+ const productIds = products.map(p => p.product_id);
30
+
31
+ // 从 voucher 中获取适用商品ID
32
+ const applicableProductIds = (0, _utils.getApplicableProductIds)(voucher);
33
+
34
+ // 获取 deductTaxAndFee 配置
35
+ const deductTaxAndFee = strategyConfig?.metadata?.custom?.deductTaxAndFee ?? true;
36
+
37
+ // 计算适用商品的总金额和数量
38
+ const {
39
+ applicableTotal,
40
+ applicableCount
41
+ } = this.calculateApplicableProducts(products, applicableProductIds, deductTaxAndFee);
46
42
  return {
47
43
  entities: {
48
44
  voucher,
@@ -69,15 +65,19 @@ var WalletPassAdapter = class {
69
65
  }
70
66
  };
71
67
  }
68
+
72
69
  /**
73
70
  * 转换执行结果
74
71
  * 将策略引擎的通用结果转换为业务层需要的格式
75
72
  */
76
73
  transformResult(result, businessData) {
77
- const strategyConfig = businessData == null ? void 0 : businessData.strategyConfig;
78
- const businessConfig = (strategyConfig == null ? void 0 : strategyConfig.metadata.custom) || {};
79
- const voucher = businessData == null ? void 0 : businessData.voucher;
80
- const applicableProductIds = voucher ? (0, import_utils.getApplicableProductIds)(voucher) : null;
74
+ // 从策略配置中获取业务配置
75
+ const strategyConfig = businessData?.strategyConfig;
76
+ const businessConfig = strategyConfig?.metadata.custom || {};
77
+
78
+ // 从 voucher 中获取适用商品ID
79
+ const voucher = businessData?.voucher;
80
+ const applicableProductIds = voucher ? (0, _utils.getApplicableProductIds)(voucher) : null;
81
81
  if (!result.applicable) {
82
82
  return {
83
83
  isApplicable: false,
@@ -90,6 +90,8 @@ var WalletPassAdapter = class {
90
90
  strategyResult: result
91
91
  };
92
92
  }
93
+
94
+ // 从配置中获取业务字段(不需要计算)
93
95
  const maxDeduction = businessConfig.maxDeductionAmount || 0;
94
96
  const canUseCount = businessConfig.maxUsagePerOrder || 0;
95
97
  const deductTaxAndFee = businessConfig.deductTaxAndFee || false;
@@ -102,41 +104,63 @@ var WalletPassAdapter = class {
102
104
  strategyResult: result
103
105
  };
104
106
  }
107
+
105
108
  /**
106
109
  * 格式化配置
107
110
  */
108
111
  formatConfig(result, businessData) {
109
- return { result, businessData };
112
+ return {
113
+ result,
114
+ businessData
115
+ };
110
116
  }
117
+
111
118
  /**
112
119
  * 计算适用商品的总金额和数量
113
120
  */
114
121
  calculateApplicableProducts(products, applicableProductIds, deductTaxAndFee = true) {
115
122
  let total = 0;
116
123
  let count = 0;
124
+
125
+ // 如果为空数组,不适用任何商品
117
126
  if (applicableProductIds !== null && applicableProductIds.length === 0) {
118
- return { applicableTotal: 0, applicableCount: 0 };
127
+ return {
128
+ applicableTotal: 0,
129
+ applicableCount: 0
130
+ };
119
131
  }
120
- products.forEach((product) => {
121
- const productQuantity = (0, import_utils.getProductQuantity)(product);
132
+ products.forEach(product => {
133
+ const productQuantity = (0, _utils.getProductQuantity)(product);
134
+
135
+ // 检查主商品是否适用
122
136
  const isMainProductApplicable = applicableProductIds === null || applicableProductIds.includes(product.product_id);
123
137
  if (isMainProductApplicable) {
124
- total += (0, import_utils.getMainProductPrice)(product, deductTaxAndFee) * productQuantity;
138
+ // 计算主商品价格(包含加减价子商品)
139
+ total += (0, _utils.getMainProductPrice)(product, deductTaxAndFee) * productQuantity;
125
140
  count += productQuantity;
126
141
  }
142
+
143
+ // 检查原价子商品(需要单独判断适用性)
127
144
  if (product.product_bundle && product.product_bundle.length > 0) {
128
- product.product_bundle.forEach((bundleItem) => {
129
- if ((0, import_utils.getBundleItemIsOriginalPrice)(bundleItem)) {
145
+ product.product_bundle.forEach(bundleItem => {
146
+ // 只处理原价子商品,加减价子商品已包含在主商品价格中
147
+ if ((0, _utils.getBundleItemIsOriginalPrice)(bundleItem)) {
148
+ // 检查子商品是否适用
130
149
  const isBundleItemApplicable = applicableProductIds === null || applicableProductIds.includes(bundleItem.bundle_product_id);
131
150
  if (isBundleItemApplicable) {
151
+ // 计算原价子商品价格
132
152
  const bundleItemQuantity = bundleItem.num * productQuantity;
133
- total += (0, import_utils.getBundleItemPrice)(bundleItem, productQuantity, deductTaxAndFee);
153
+ total += (0, _utils.getBundleItemPrice)(bundleItem, productQuantity, deductTaxAndFee);
134
154
  count += bundleItemQuantity;
135
155
  }
136
156
  }
137
157
  });
138
158
  }
139
159
  });
140
- return { applicableTotal: total, applicableCount: count };
160
+ return {
161
+ applicableTotal: total,
162
+ applicableCount: count
163
+ };
141
164
  }
142
- };
165
+ }
166
+ exports.default = WalletPassAdapter;