@pisell/pisellos 2.2.283 → 2.2.285

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 (283) hide show
  1. package/dist/core/index.js +6 -10
  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 +64 -86
  11. package/dist/modules/Order/types.d.ts +3 -1
  12. package/dist/modules/Order/types.js +1 -0
  13. package/dist/modules/Payment/index.js +97 -162
  14. package/dist/modules/ProductList/index.js +91 -65
  15. package/dist/modules/Rules/index.js +1 -4
  16. package/dist/modules/Schedule/index.js +0 -1
  17. package/dist/modules/Schedule/utils.js +0 -1
  18. package/dist/modules/Step/index.js +0 -1
  19. package/dist/plugins/request.js +1 -4
  20. package/dist/plugins/window.js +2 -6
  21. package/dist/server/index.js +97 -129
  22. package/dist/server/modules/menu/index.js +32 -41
  23. package/dist/server/modules/order/index.js +2 -4
  24. package/dist/server/modules/products/index.js +24 -42
  25. package/dist/server/modules/quotation/index.js +29 -38
  26. package/dist/server/modules/resource/index.js +3 -4
  27. package/dist/server/modules/schedule/index.js +27 -35
  28. package/dist/server/utils/product.js +0 -1
  29. package/dist/solution/BaseSales/index.js +115 -76
  30. package/dist/solution/BookingByStep/index.d.ts +1 -1
  31. package/dist/solution/BookingByStep/index.js +7 -59
  32. package/dist/solution/BookingByStep/utils/capacity.js +1 -11
  33. package/dist/solution/BookingByStep/utils/resources.js +1 -3
  34. package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
  35. package/dist/solution/BookingTicket/index.d.ts +6 -16
  36. package/dist/solution/BookingTicket/index.js +13 -6
  37. package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
  38. package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
  39. package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
  40. package/dist/solution/BuyTickets/index.js +9 -12
  41. package/dist/solution/Checkout/index.js +177 -252
  42. package/dist/solution/Checkout/utils/index.js +4 -16
  43. package/dist/solution/RegisterAndLogin/index.js +30 -76
  44. package/dist/solution/ScanOrder/index.js +50 -60
  45. package/dist/solution/ShopDiscount/index.js +2 -7
  46. package/dist/solution/VenueBooking/index.js +45 -55
  47. package/dist/utils/task.js +15 -18
  48. package/dist/utils/watch.js +0 -1
  49. package/lib/apis/picoding.js +2 -0
  50. package/lib/core/index.js +131 -132
  51. package/lib/effects/index.js +46 -57
  52. package/lib/index.js +82 -49
  53. package/lib/model/index.js +14 -21
  54. package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
  55. package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
  56. package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
  57. package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
  58. package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
  59. package/lib/model/strategy/adapter/index.js +100 -64
  60. package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
  61. package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
  62. package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
  63. package/lib/model/strategy/adapter/itemRule/index.js +83 -57
  64. package/lib/model/strategy/adapter/itemRule/type.js +97 -36
  65. package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
  66. package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
  67. package/lib/model/strategy/adapter/promotion/examples.js +222 -234
  68. package/lib/model/strategy/adapter/promotion/index.js +46 -0
  69. package/lib/model/strategy/adapter/promotion/type.js +243 -36
  70. package/lib/model/strategy/adapter/type.js +4 -16
  71. package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
  72. package/lib/model/strategy/adapter/walletPass/example.js +217 -190
  73. package/lib/model/strategy/adapter/walletPass/index.js +75 -51
  74. package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
  75. package/lib/model/strategy/adapter/walletPass/type.js +4 -16
  76. package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
  77. package/lib/model/strategy/engine.js +270 -168
  78. package/lib/model/strategy/index.js +49 -34
  79. package/lib/model/strategy/strategy-example.js +243 -239
  80. package/lib/model/strategy/type.js +100 -40
  81. package/lib/modules/Account/index.js +39 -53
  82. package/lib/modules/Account/types.js +20 -33
  83. package/lib/modules/AccountList/index.js +116 -154
  84. package/lib/modules/AccountList/types.js +30 -31
  85. package/lib/modules/AccountList/utils.js +18 -30
  86. package/lib/modules/BaseModule.js +23 -42
  87. package/lib/modules/BookingContext/index.js +158 -136
  88. package/lib/modules/BookingContext/types.js +46 -32
  89. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
  90. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
  91. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
  92. package/lib/modules/BookingContext/utils/flexible.js +38 -55
  93. package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
  94. package/lib/modules/BookingContext/utils/index.js +124 -41
  95. package/lib/modules/BookingContext/utils/noResource.js +58 -70
  96. package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
  97. package/lib/modules/BookingContext/utils/productExtend.js +202 -155
  98. package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
  99. package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
  100. package/lib/modules/BookingContext/utils/resources.js +209 -167
  101. package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
  102. package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
  103. package/lib/modules/Cart/index.js +170 -124
  104. package/lib/modules/Cart/types.js +46 -51
  105. package/lib/modules/Cart/utils/cartAccount.js +40 -39
  106. package/lib/modules/Cart/utils/cartDate.js +56 -61
  107. package/lib/modules/Cart/utils/cartDiscount.js +28 -33
  108. package/lib/modules/Cart/utils/cartNote.js +27 -32
  109. package/lib/modules/Cart/utils/cartProduct.js +321 -251
  110. package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
  111. package/lib/modules/Cart/utils/cartResource.js +70 -78
  112. package/lib/modules/Cart/utils/changePrice.js +22 -50
  113. package/lib/modules/Cart/utils/index.js +106 -48
  114. package/lib/modules/Customer/constants.js +13 -34
  115. package/lib/modules/Customer/index.js +235 -172
  116. package/lib/modules/Customer/types.js +38 -35
  117. package/lib/modules/Date/index.js +116 -115
  118. package/lib/modules/Date/types.js +16 -28
  119. package/lib/modules/Date/utils.js +174 -123
  120. package/lib/modules/Discount/index.js +122 -127
  121. package/lib/modules/Discount/types.js +9 -31
  122. package/lib/modules/Guests/index.js +30 -56
  123. package/lib/modules/Guests/types.js +23 -33
  124. package/lib/modules/Holder/index.js +209 -189
  125. package/lib/modules/Holder/types.js +4 -16
  126. package/lib/modules/Holder/utils.js +20 -49
  127. package/lib/modules/OpenData/index.js +70 -76
  128. package/lib/modules/OpenData/types.js +4 -16
  129. package/lib/modules/OpenData/utils.js +44 -78
  130. package/lib/modules/Order/index.d.ts +1 -1
  131. package/lib/modules/Order/index.js +1728 -2123
  132. package/lib/modules/Order/payment-utils.js +77 -120
  133. package/lib/modules/Order/types.d.ts +3 -1
  134. package/lib/modules/Order/types.js +88 -35
  135. package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
  136. package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
  137. package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
  138. package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
  139. package/lib/modules/Order/utils.js +814 -647
  140. package/lib/modules/Payment/cash.js +20 -33
  141. package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
  142. package/lib/modules/Payment/eftpos.js +16 -30
  143. package/lib/modules/Payment/index.js +532 -399
  144. package/lib/modules/Payment/mx51.js +1 -0
  145. package/lib/modules/Payment/types.js +230 -108
  146. package/lib/modules/Payment/utils.js +52 -51
  147. package/lib/modules/Payment/walletpass.js +485 -660
  148. package/lib/modules/Product/index.js +51 -46
  149. package/lib/modules/Product/types.js +4 -16
  150. package/lib/modules/Product/utils.js +32 -33
  151. package/lib/modules/ProductList/index.js +119 -123
  152. package/lib/modules/ProductList/types.js +9 -31
  153. package/lib/modules/Quotation/index.js +66 -100
  154. package/lib/modules/Quotation/types.js +4 -16
  155. package/lib/modules/Resource/index.js +27 -59
  156. package/lib/modules/Resource/types.js +22 -32
  157. package/lib/modules/Resource/utils.js +30 -38
  158. package/lib/modules/ResourcePlanner/index.js +60 -61
  159. package/lib/modules/ResourcePlanner/planner.js +346 -384
  160. package/lib/modules/ResourcePlanner/types.js +4 -16
  161. package/lib/modules/Rules/index.js +1218 -959
  162. package/lib/modules/Rules/types.js +17 -40
  163. package/lib/modules/SalesSummary/index.js +85 -90
  164. package/lib/modules/SalesSummary/types.js +4 -16
  165. package/lib/modules/SalesSummary/utils.js +355 -430
  166. package/lib/modules/ScanOrderLogger/index.js +59 -79
  167. package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
  168. package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
  169. package/lib/modules/ScanOrderLogger/types.js +4 -16
  170. package/lib/modules/Schedule/getDateIsInSchedule.js +334 -163
  171. package/lib/modules/Schedule/index.js +100 -114
  172. package/lib/modules/Schedule/type.js +4 -16
  173. package/lib/modules/Schedule/types.js +4 -16
  174. package/lib/modules/Schedule/utils.js +433 -291
  175. package/lib/modules/Step/index.js +40 -52
  176. package/lib/modules/Step/tyeps.js +4 -16
  177. package/lib/modules/Summary/index.js +66 -71
  178. package/lib/modules/Summary/types.js +4 -16
  179. package/lib/modules/Summary/utils.js +773 -418
  180. package/lib/modules/SurchargeList/index.js +46 -60
  181. package/lib/modules/SurchargeList/types.js +4 -16
  182. package/lib/modules/index.js +245 -63
  183. package/lib/plugins/app.js +4 -16
  184. package/lib/plugins/index.js +36 -25
  185. package/lib/plugins/request.js +137 -126
  186. package/lib/plugins/shopStore.js +4 -16
  187. package/lib/plugins/user.js +4 -16
  188. package/lib/plugins/window.js +171 -179
  189. package/lib/server/index.js +3027 -2655
  190. package/lib/server/modules/floor-plan/index.js +102 -123
  191. package/lib/server/modules/floor-plan/types.js +15 -30
  192. package/lib/server/modules/index.js +106 -68
  193. package/lib/server/modules/menu/index.js +146 -122
  194. package/lib/server/modules/menu/types.js +18 -31
  195. package/lib/server/modules/order/index.js +758 -956
  196. package/lib/server/modules/order/types.js +122 -33
  197. package/lib/server/modules/order/utils/filterBookings.js +219 -194
  198. package/lib/server/modules/order/utils/filterOrders.js +118 -92
  199. package/lib/server/modules/payment/index.js +59 -83
  200. package/lib/server/modules/payment/types.js +4 -16
  201. package/lib/server/modules/products/index.js +575 -459
  202. package/lib/server/modules/products/types.js +44 -34
  203. package/lib/server/modules/quotation/index.js +137 -172
  204. package/lib/server/modules/quotation/types.js +21 -31
  205. package/lib/server/modules/resource/index.js +213 -184
  206. package/lib/server/modules/resource/types.js +42 -33
  207. package/lib/server/modules/schedule/index.js +135 -123
  208. package/lib/server/modules/schedule/types.js +14 -21
  209. package/lib/server/modules/schedule/utils.js +334 -163
  210. package/lib/server/types.js +4 -16
  211. package/lib/server/utils/index.js +25 -23
  212. package/lib/server/utils/product.js +196 -139
  213. package/lib/server/utils/schedule.js +34 -41
  214. package/lib/server/utils/small-ticket.js +479 -456
  215. package/lib/server/utils/time.js +40 -49
  216. package/lib/solution/BaseSales/index.js +1220 -1412
  217. package/lib/solution/BaseSales/types.js +42 -38
  218. package/lib/solution/BaseSales/utils/cartPromotion.js +650 -502
  219. package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
  220. package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
  221. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +108 -145
  222. package/lib/solution/BaseSales/utils.js +158 -143
  223. package/lib/solution/BookingByStep/index.d.ts +1 -1
  224. package/lib/solution/BookingByStep/index.js +1527 -1340
  225. package/lib/solution/BookingByStep/types.js +40 -99
  226. package/lib/solution/BookingByStep/utils/capacity.js +192 -160
  227. package/lib/solution/BookingByStep/utils/products.js +42 -52
  228. package/lib/solution/BookingByStep/utils/resources.js +527 -330
  229. package/lib/solution/BookingByStep/utils/stock.js +65 -44
  230. package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
  231. package/lib/solution/BookingTicket/index.d.ts +6 -16
  232. package/lib/solution/BookingTicket/index.js +608 -517
  233. package/lib/solution/BookingTicket/types.js +99 -77
  234. package/lib/solution/BookingTicket/utils/addProductDecision.js +225 -187
  235. package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
  236. package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
  237. package/lib/solution/BookingTicket/utils/cartView.js +114 -99
  238. package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
  239. package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
  240. package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
  241. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
  242. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
  243. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
  244. package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
  245. package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
  246. package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
  247. package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
  248. package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
  249. package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
  250. package/lib/solution/BuyTickets/index.js +67 -70
  251. package/lib/solution/BuyTickets/types.js +22 -38
  252. package/lib/solution/Checkout/index.js +1451 -1158
  253. package/lib/solution/Checkout/types.js +91 -61
  254. package/lib/solution/Checkout/utils/index.js +228 -156
  255. package/lib/solution/PlaceOrder/index.js +55 -0
  256. package/lib/solution/RegisterAndLogin/config.js +493 -460
  257. package/lib/solution/RegisterAndLogin/index.js +633 -630
  258. package/lib/solution/RegisterAndLogin/types.js +189 -76
  259. package/lib/solution/RegisterAndLogin/utils.js +183 -125
  260. package/lib/solution/Sales/index.js +328 -324
  261. package/lib/solution/Sales/types.js +27 -33
  262. package/lib/solution/ScanOrder/index.js +832 -864
  263. package/lib/solution/ScanOrder/types.js +33 -34
  264. package/lib/solution/ScanOrder/utils.js +409 -374
  265. package/lib/solution/ShopDiscount/index.js +226 -232
  266. package/lib/solution/ShopDiscount/types.js +15 -37
  267. package/lib/solution/ShopDiscount/utils.js +300 -172
  268. package/lib/solution/UnifiedBookingSales/index.js +437 -487
  269. package/lib/solution/UnifiedBookingSales/types.js +12 -31
  270. package/lib/solution/VenueBooking/index.js +811 -879
  271. package/lib/solution/VenueBooking/types.js +19 -39
  272. package/lib/solution/VenueBooking/utils/dateSummary.js +27 -56
  273. package/lib/solution/VenueBooking/utils/resource.js +31 -54
  274. package/lib/solution/VenueBooking/utils/slotMerge.js +94 -107
  275. package/lib/solution/VenueBooking/utils/timeSlot.js +132 -132
  276. package/lib/solution/VenueBooking/utils.js +130 -67
  277. package/lib/solution/index.js +124 -41
  278. package/lib/store/createStore.js +32 -29
  279. package/lib/types/index.js +4 -16
  280. package/lib/utils/payment-number.js +26 -46
  281. package/lib/utils/task.js +36 -36
  282. package/lib/utils/watch.js +81 -47
  283. 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;