@pisell/pisellos 0.0.567 → 0.0.568

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 (228) hide show
  1. package/dist/core/index.js +6 -9
  2. package/dist/model/strategy/adapter/walletPass/evaluator.js +0 -2
  3. package/dist/model/strategy/adapter/walletPass/example.js +3 -26
  4. package/dist/model/strategy/adapter/walletPass/utils.js +0 -3
  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 +1 -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 +14 -41
  13. package/dist/modules/Payment/index.js +142 -270
  14. package/dist/modules/Payment/walletpass.js +4 -5
  15. package/dist/modules/Rules/index.js +0 -7
  16. package/dist/modules/Schedule/utils.js +0 -1
  17. package/dist/modules/Step/index.js +0 -1
  18. package/dist/plugins/request.js +1 -4
  19. package/dist/plugins/window.js +2 -6
  20. package/dist/server/index.js +88 -121
  21. package/dist/server/modules/menu/index.js +32 -41
  22. package/dist/server/modules/products/index.js +29 -49
  23. package/dist/server/modules/quotation/index.js +29 -38
  24. package/dist/server/modules/resource/index.js +3 -4
  25. package/dist/server/modules/schedule/index.js +32 -40
  26. package/dist/server/utils/product.js +0 -1
  27. package/dist/solution/BookingByStep/index.d.ts +1 -1
  28. package/dist/solution/BookingByStep/index.js +7 -59
  29. package/dist/solution/BookingByStep/utils/capacity.js +1 -11
  30. package/dist/solution/BookingByStep/utils/resources.js +1 -3
  31. package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
  32. package/dist/solution/BookingTicket/index.d.ts +1 -1
  33. package/dist/solution/BookingTicket/index.js +5 -7
  34. package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
  35. package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
  36. package/dist/solution/BuyTickets/index.js +9 -12
  37. package/dist/solution/Checkout/index.js +177 -246
  38. package/dist/solution/Checkout/utils/index.js +4 -16
  39. package/dist/solution/RegisterAndLogin/index.js +30 -76
  40. package/dist/solution/ScanOrder/index.js +50 -60
  41. package/dist/solution/ShopDiscount/index.js +2 -7
  42. package/dist/solution/VenueBooking/index.d.ts +5 -0
  43. package/dist/solution/VenueBooking/index.js +364 -327
  44. package/dist/utils/task.js +15 -18
  45. package/dist/utils/watch.js +0 -1
  46. package/lib/apis/picoding.js +2 -0
  47. package/lib/core/index.js +130 -131
  48. package/lib/effects/index.js +46 -57
  49. package/lib/index.js +92 -53
  50. package/lib/model/index.js +14 -21
  51. package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
  52. package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
  53. package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
  54. package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
  55. package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
  56. package/lib/model/strategy/adapter/index.js +100 -64
  57. package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
  58. package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
  59. package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
  60. package/lib/model/strategy/adapter/itemRule/index.js +83 -57
  61. package/lib/model/strategy/adapter/itemRule/type.js +97 -36
  62. package/lib/model/strategy/adapter/promotion/adapter.js +84 -63
  63. package/lib/model/strategy/adapter/promotion/evaluator.js +381 -231
  64. package/lib/model/strategy/adapter/promotion/examples.js +139 -159
  65. package/lib/model/strategy/adapter/promotion/index.js +1 -49
  66. package/lib/model/strategy/adapter/promotion/type.js +199 -35
  67. package/lib/model/strategy/adapter/type.js +4 -16
  68. package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -152
  69. package/lib/model/strategy/adapter/walletPass/example.js +217 -190
  70. package/lib/model/strategy/adapter/walletPass/index.js +75 -51
  71. package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
  72. package/lib/model/strategy/adapter/walletPass/type.js +4 -16
  73. package/lib/model/strategy/adapter/walletPass/utils.js +652 -402
  74. package/lib/model/strategy/engine.js +270 -168
  75. package/lib/model/strategy/index.js +49 -34
  76. package/lib/model/strategy/strategy-example.js +243 -239
  77. package/lib/model/strategy/type.js +100 -40
  78. package/lib/modules/Account/index.js +39 -53
  79. package/lib/modules/Account/types.js +20 -33
  80. package/lib/modules/AccountList/index.js +116 -154
  81. package/lib/modules/AccountList/types.js +30 -31
  82. package/lib/modules/AccountList/utils.js +18 -30
  83. package/lib/modules/BaseModule.js +22 -45
  84. package/lib/modules/Cart/index.js +170 -124
  85. package/lib/modules/Cart/types.js +46 -51
  86. package/lib/modules/Cart/utils/cartAccount.js +40 -39
  87. package/lib/modules/Cart/utils/cartDate.js +56 -61
  88. package/lib/modules/Cart/utils/cartDiscount.js +28 -33
  89. package/lib/modules/Cart/utils/cartNote.js +27 -32
  90. package/lib/modules/Cart/utils/cartProduct.js +306 -241
  91. package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
  92. package/lib/modules/Cart/utils/cartResource.js +72 -78
  93. package/lib/modules/Cart/utils/changePrice.js +26 -62
  94. package/lib/modules/Cart/utils/index.js +106 -48
  95. package/lib/modules/Customer/constants.js +13 -34
  96. package/lib/modules/Customer/index.js +216 -153
  97. package/lib/modules/Customer/types.js +38 -35
  98. package/lib/modules/Date/index.js +116 -115
  99. package/lib/modules/Date/types.js +16 -28
  100. package/lib/modules/Date/utils.js +174 -123
  101. package/lib/modules/Discount/index.js +117 -113
  102. package/lib/modules/Discount/types.js +9 -31
  103. package/lib/modules/Guests/index.js +30 -56
  104. package/lib/modules/Guests/types.js +23 -33
  105. package/lib/modules/Holder/index.js +209 -189
  106. package/lib/modules/Holder/types.js +4 -16
  107. package/lib/modules/Holder/utils.js +20 -49
  108. package/lib/modules/OpenData/index.js +63 -74
  109. package/lib/modules/OpenData/types.js +4 -16
  110. package/lib/modules/OpenData/utils.js +44 -78
  111. package/lib/modules/Order/index.d.ts +1 -1
  112. package/lib/modules/Order/index.js +332 -320
  113. package/lib/modules/Order/types.js +24 -33
  114. package/lib/modules/Order/utils.js +350 -284
  115. package/lib/modules/Payment/cash.js +20 -33
  116. package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
  117. package/lib/modules/Payment/eftpos.js +16 -30
  118. package/lib/modules/Payment/index.js +566 -432
  119. package/lib/modules/Payment/mx51.js +1 -0
  120. package/lib/modules/Payment/types.js +216 -107
  121. package/lib/modules/Payment/utils.js +50 -47
  122. package/lib/modules/Payment/walletpass.js +221 -203
  123. package/lib/modules/Product/index.js +51 -46
  124. package/lib/modules/Product/types.js +4 -16
  125. package/lib/modules/Product/utils.js +32 -33
  126. package/lib/modules/ProductList/index.js +111 -110
  127. package/lib/modules/ProductList/types.js +9 -31
  128. package/lib/modules/Quotation/index.js +60 -82
  129. package/lib/modules/Quotation/types.js +4 -16
  130. package/lib/modules/Resource/index.js +27 -59
  131. package/lib/modules/Resource/types.js +22 -32
  132. package/lib/modules/Resource/utils.js +30 -38
  133. package/lib/modules/Rules/index.js +1172 -872
  134. package/lib/modules/Rules/types.js +17 -40
  135. package/lib/modules/SalesSummary/index.js +59 -68
  136. package/lib/modules/SalesSummary/types.js +4 -16
  137. package/lib/modules/SalesSummary/utils.js +176 -193
  138. package/lib/modules/ScanOrderLogger/index.js +59 -79
  139. package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
  140. package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
  141. package/lib/modules/ScanOrderLogger/types.js +4 -16
  142. package/lib/modules/Schedule/getDateIsInSchedule.js +334 -167
  143. package/lib/modules/Schedule/index.js +97 -107
  144. package/lib/modules/Schedule/type.js +4 -16
  145. package/lib/modules/Schedule/types.js +4 -16
  146. package/lib/modules/Schedule/utils.js +433 -291
  147. package/lib/modules/Step/index.js +40 -52
  148. package/lib/modules/Step/tyeps.js +4 -16
  149. package/lib/modules/Summary/index.js +66 -70
  150. package/lib/modules/Summary/types.js +4 -16
  151. package/lib/modules/Summary/utils.js +782 -429
  152. package/lib/modules/index.js +212 -57
  153. package/lib/plugins/app.js +4 -16
  154. package/lib/plugins/index.js +36 -25
  155. package/lib/plugins/request.js +137 -126
  156. package/lib/plugins/shopStore.js +4 -16
  157. package/lib/plugins/user.js +4 -16
  158. package/lib/plugins/window.js +171 -179
  159. package/lib/server/index.js +882 -623
  160. package/lib/server/modules/index.js +85 -59
  161. package/lib/server/modules/menu/index.js +146 -122
  162. package/lib/server/modules/menu/types.js +18 -31
  163. package/lib/server/modules/order/index.js +195 -231
  164. package/lib/server/modules/order/types.js +107 -32
  165. package/lib/server/modules/order/utils/filterBookings.js +174 -140
  166. package/lib/server/modules/order/utils/filterOrders.js +89 -60
  167. package/lib/server/modules/products/index.js +430 -335
  168. package/lib/server/modules/products/types.js +41 -34
  169. package/lib/server/modules/quotation/index.js +76 -77
  170. package/lib/server/modules/quotation/types.js +21 -31
  171. package/lib/server/modules/resource/index.js +216 -187
  172. package/lib/server/modules/resource/types.js +42 -33
  173. package/lib/server/modules/schedule/index.js +134 -119
  174. package/lib/server/modules/schedule/types.js +14 -21
  175. package/lib/server/modules/schedule/utils.js +334 -163
  176. package/lib/server/types.js +4 -16
  177. package/lib/server/utils/index.js +25 -23
  178. package/lib/server/utils/product.js +196 -139
  179. package/lib/server/utils/schedule.js +34 -41
  180. package/lib/server/utils/time.js +40 -49
  181. package/lib/solution/BookingByStep/index.d.ts +1 -1
  182. package/lib/solution/BookingByStep/index.js +1530 -1343
  183. package/lib/solution/BookingByStep/types.js +40 -99
  184. package/lib/solution/BookingByStep/utils/capacity.js +192 -160
  185. package/lib/solution/BookingByStep/utils/products.js +42 -52
  186. package/lib/solution/BookingByStep/utils/resources.js +527 -330
  187. package/lib/solution/BookingByStep/utils/stock.js +65 -44
  188. package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
  189. package/lib/solution/BookingTicket/index.d.ts +1 -1
  190. package/lib/solution/BookingTicket/index.js +147 -122
  191. package/lib/solution/BookingTicket/types.js +38 -64
  192. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +64 -80
  193. package/lib/solution/BookingTicket/utils/scan/handleScan.js +82 -80
  194. package/lib/solution/BookingTicket/utils/scan/index.js +90 -94
  195. package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
  196. package/lib/solution/BuyTickets/index.js +67 -70
  197. package/lib/solution/BuyTickets/types.js +22 -38
  198. package/lib/solution/Checkout/index.js +1451 -1158
  199. package/lib/solution/Checkout/types.js +91 -61
  200. package/lib/solution/Checkout/utils/index.js +227 -158
  201. package/lib/solution/PlaceOrder/index.js +55 -0
  202. package/lib/solution/RegisterAndLogin/config.js +493 -460
  203. package/lib/solution/RegisterAndLogin/index.js +633 -630
  204. package/lib/solution/RegisterAndLogin/types.js +189 -76
  205. package/lib/solution/RegisterAndLogin/utils.js +183 -125
  206. package/lib/solution/Sales/index.js +218 -200
  207. package/lib/solution/Sales/types.js +27 -33
  208. package/lib/solution/ScanOrder/index.js +803 -840
  209. package/lib/solution/ScanOrder/types.js +34 -34
  210. package/lib/solution/ScanOrder/utils.js +372 -331
  211. package/lib/solution/ShopDiscount/index.js +230 -236
  212. package/lib/solution/ShopDiscount/types.js +15 -37
  213. package/lib/solution/ShopDiscount/utils.js +309 -172
  214. package/lib/solution/VenueBooking/index.d.ts +5 -0
  215. package/lib/solution/VenueBooking/index.js +886 -929
  216. package/lib/solution/VenueBooking/types.js +20 -40
  217. package/lib/solution/VenueBooking/utils/dateSummary.js +22 -54
  218. package/lib/solution/VenueBooking/utils/resource.js +31 -54
  219. package/lib/solution/VenueBooking/utils/slotMerge.js +88 -106
  220. package/lib/solution/VenueBooking/utils/smartPricing.js +112 -100
  221. package/lib/solution/VenueBooking/utils/timeSlot.js +133 -132
  222. package/lib/solution/VenueBooking/utils.js +130 -67
  223. package/lib/solution/index.js +102 -37
  224. package/lib/store/createStore.js +32 -29
  225. package/lib/types/index.js +4 -16
  226. package/lib/utils/task.js +36 -36
  227. package/lib/utils/watch.js +81 -47
  228. 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 + (0, import_utils.getTaxAndFeeRoundingRemainder)(product, deductTaxAndFee) - (0, import_utils.getProductDiscountDifference)(product);
138
+ // 计算主商品价格(包含加减价子商品)= 单价 * 数量 + 舍入余数 - 商品差额
139
+ total += (0, _utils.getMainProductPrice)(product, deductTaxAndFee) * productQuantity + (0, _utils.getTaxAndFeeRoundingRemainder)(product, deductTaxAndFee) - (0, _utils.getProductDiscountDifference)(product);
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) + (0, import_utils.getBundleItemTaxAndFeeRoundingRemainder)(bundleItem, deductTaxAndFee) - (0, import_utils.getBundleItemDiscountDifference)(bundleItem);
153
+ total += (0, _utils.getBundleItemPrice)(bundleItem, productQuantity, deductTaxAndFee) + (0, _utils.getBundleItemTaxAndFeeRoundingRemainder)(bundleItem, deductTaxAndFee) - (0, _utils.getBundleItemDiscountDifference)(bundleItem);
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;