@pisell/pisellos 2.3.74 → 2.3.76

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/promotion/index.js +9 -0
  3. package/dist/model/strategy/adapter/walletPass/example.js +3 -26
  4. package/dist/model/strategy/strategy-example.js +5 -19
  5. package/dist/modules/Cart/index.js +0 -3
  6. package/dist/modules/Cart/utils/cartProduct.js +0 -1
  7. package/dist/modules/Date/index.js +1 -5
  8. package/dist/modules/Discount/index.js +2 -4
  9. package/dist/modules/OpenData/index.js +0 -2
  10. package/dist/modules/Order/index.d.ts +1 -1
  11. package/dist/modules/Order/index.js +75 -91
  12. package/dist/modules/Order/types.d.ts +3 -1
  13. package/dist/modules/Payment/index.js +97 -162
  14. package/dist/modules/Rules/index.js +1 -4
  15. package/dist/modules/Schedule/index.js +0 -1
  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 +97 -129
  21. package/dist/server/modules/menu/index.js +32 -41
  22. package/dist/server/modules/order/index.js +2 -4
  23. package/dist/server/modules/products/index.js +24 -42
  24. package/dist/server/modules/quotation/index.js +29 -38
  25. package/dist/server/modules/resource/index.js +3 -4
  26. package/dist/server/modules/schedule/index.js +27 -35
  27. package/dist/server/utils/product.js +0 -1
  28. package/dist/solution/BaseSales/index.js +100 -72
  29. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
  30. package/dist/solution/BaseSales/utils/cartPromotion.js +15 -6
  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.js +0 -2
  36. package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
  37. package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
  38. package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
  39. package/dist/solution/BuyTickets/index.js +9 -12
  40. package/dist/solution/Checkout/index.js +177 -252
  41. package/dist/solution/Checkout/utils/index.js +4 -16
  42. package/dist/solution/RegisterAndLogin/index.js +30 -76
  43. package/dist/solution/ScanOrder/index.js +50 -60
  44. package/dist/solution/ShopDiscount/index.js +2 -7
  45. package/dist/solution/VenueBooking/index.js +45 -55
  46. package/dist/utils/task.js +15 -18
  47. package/dist/utils/watch.js +0 -1
  48. package/lib/apis/picoding.js +2 -0
  49. package/lib/core/index.js +134 -134
  50. package/lib/effects/index.js +46 -57
  51. package/lib/index.js +82 -49
  52. package/lib/model/index.js +14 -21
  53. package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
  54. package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
  55. package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
  56. package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
  57. package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
  58. package/lib/model/strategy/adapter/index.js +100 -64
  59. package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
  60. package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
  61. package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
  62. package/lib/model/strategy/adapter/itemRule/index.js +83 -57
  63. package/lib/model/strategy/adapter/itemRule/type.js +97 -36
  64. package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
  65. package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
  66. package/lib/model/strategy/adapter/promotion/examples.js +222 -234
  67. package/lib/model/strategy/adapter/promotion/index.js +1 -0
  68. package/lib/model/strategy/adapter/promotion/type.js +243 -36
  69. package/lib/model/strategy/adapter/type.js +4 -16
  70. package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
  71. package/lib/model/strategy/adapter/walletPass/example.js +217 -190
  72. package/lib/model/strategy/adapter/walletPass/index.js +75 -51
  73. package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
  74. package/lib/model/strategy/adapter/walletPass/type.js +4 -16
  75. package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
  76. package/lib/model/strategy/engine.js +270 -168
  77. package/lib/model/strategy/index.js +49 -34
  78. package/lib/model/strategy/strategy-example.js +243 -239
  79. package/lib/model/strategy/type.js +100 -40
  80. package/lib/modules/Account/index.js +39 -53
  81. package/lib/modules/Account/types.js +20 -33
  82. package/lib/modules/AccountList/index.js +116 -154
  83. package/lib/modules/AccountList/types.js +30 -31
  84. package/lib/modules/AccountList/utils.js +18 -30
  85. package/lib/modules/BaseModule.js +23 -42
  86. package/lib/modules/BookingContext/index.js +158 -136
  87. package/lib/modules/BookingContext/types.js +46 -32
  88. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
  89. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
  90. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
  91. package/lib/modules/BookingContext/utils/flexible.js +38 -55
  92. package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
  93. package/lib/modules/BookingContext/utils/index.js +124 -41
  94. package/lib/modules/BookingContext/utils/noResource.js +58 -70
  95. package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
  96. package/lib/modules/BookingContext/utils/productExtend.js +202 -155
  97. package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
  98. package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
  99. package/lib/modules/BookingContext/utils/resources.js +209 -167
  100. package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
  101. package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
  102. package/lib/modules/Cart/index.js +170 -124
  103. package/lib/modules/Cart/types.js +46 -51
  104. package/lib/modules/Cart/utils/cartAccount.js +40 -39
  105. package/lib/modules/Cart/utils/cartDate.js +56 -61
  106. package/lib/modules/Cart/utils/cartDiscount.js +28 -33
  107. package/lib/modules/Cart/utils/cartNote.js +27 -32
  108. package/lib/modules/Cart/utils/cartProduct.js +321 -251
  109. package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
  110. package/lib/modules/Cart/utils/cartResource.js +70 -78
  111. package/lib/modules/Cart/utils/changePrice.js +22 -50
  112. package/lib/modules/Cart/utils/index.js +106 -48
  113. package/lib/modules/Customer/constants.js +13 -34
  114. package/lib/modules/Customer/index.js +235 -172
  115. package/lib/modules/Customer/types.js +38 -35
  116. package/lib/modules/Date/index.js +116 -115
  117. package/lib/modules/Date/types.js +16 -28
  118. package/lib/modules/Date/utils.js +174 -123
  119. package/lib/modules/Discount/index.js +122 -127
  120. package/lib/modules/Discount/types.js +9 -31
  121. package/lib/modules/Guests/index.js +30 -56
  122. package/lib/modules/Guests/types.js +23 -33
  123. package/lib/modules/Holder/index.js +209 -189
  124. package/lib/modules/Holder/types.js +4 -16
  125. package/lib/modules/Holder/utils.js +20 -49
  126. package/lib/modules/OpenData/index.js +70 -76
  127. package/lib/modules/OpenData/types.js +4 -16
  128. package/lib/modules/OpenData/utils.js +44 -78
  129. package/lib/modules/Order/index.d.ts +1 -1
  130. package/lib/modules/Order/index.js +1733 -2121
  131. package/lib/modules/Order/payment-utils.js +77 -120
  132. package/lib/modules/Order/types.d.ts +3 -1
  133. package/lib/modules/Order/types.js +88 -35
  134. package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
  135. package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
  136. package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
  137. package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
  138. package/lib/modules/Order/utils.js +814 -647
  139. package/lib/modules/Payment/cash.js +20 -33
  140. package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
  141. package/lib/modules/Payment/eftpos.js +16 -30
  142. package/lib/modules/Payment/index.js +532 -399
  143. package/lib/modules/Payment/mx51.js +1 -0
  144. package/lib/modules/Payment/types.js +230 -108
  145. package/lib/modules/Payment/utils.js +52 -51
  146. package/lib/modules/Payment/walletpass.js +485 -660
  147. package/lib/modules/Product/index.js +51 -46
  148. package/lib/modules/Product/types.js +4 -16
  149. package/lib/modules/Product/utils.js +32 -33
  150. package/lib/modules/ProductList/index.js +113 -123
  151. package/lib/modules/ProductList/types.js +9 -31
  152. package/lib/modules/Quotation/index.js +81 -118
  153. package/lib/modules/Quotation/types.js +4 -16
  154. package/lib/modules/Resource/index.js +27 -59
  155. package/lib/modules/Resource/types.js +22 -32
  156. package/lib/modules/Resource/utils.js +30 -38
  157. package/lib/modules/ResourcePlanner/index.js +25 -23
  158. package/lib/modules/ResourcePlanner/localClock.js +54 -119
  159. package/lib/modules/ResourcePlanner/planner.js +589 -770
  160. package/lib/modules/ResourcePlanner/types.js +10 -29
  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 +3050 -2665
  190. package/lib/server/modules/floor-plan/index.js +118 -134
  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 +142 -122
  194. package/lib/server/modules/menu/types.js +18 -31
  195. package/lib/server/modules/order/index.js +784 -1002
  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 +583 -471
  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 +220 -186
  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.d.ts +5 -0
  219. package/lib/solution/BaseSales/utils/cartPromotion.js +652 -498
  220. package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
  221. package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
  222. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +108 -145
  223. package/lib/solution/BaseSales/utils.js +158 -143
  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.js +607 -522
  232. package/lib/solution/BookingTicket/types.js +99 -77
  233. package/lib/solution/BookingTicket/utils/addProductDecision.js +226 -189
  234. package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
  235. package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
  236. package/lib/solution/BookingTicket/utils/cartView.js +114 -99
  237. package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
  238. package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
  239. package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
  240. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
  241. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
  242. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
  243. package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
  244. package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
  245. package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
  246. package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
  247. package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
  248. package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
  249. package/lib/solution/BuyTickets/index.js +67 -70
  250. package/lib/solution/BuyTickets/types.js +22 -38
  251. package/lib/solution/Checkout/index.js +1451 -1158
  252. package/lib/solution/Checkout/types.js +91 -61
  253. package/lib/solution/Checkout/utils/index.js +228 -156
  254. package/lib/solution/PlaceOrder/index.js +55 -0
  255. package/lib/solution/RegisterAndLogin/config.js +493 -460
  256. package/lib/solution/RegisterAndLogin/index.js +633 -630
  257. package/lib/solution/RegisterAndLogin/types.js +189 -76
  258. package/lib/solution/RegisterAndLogin/utils.js +183 -125
  259. package/lib/solution/Sales/index.js +328 -324
  260. package/lib/solution/Sales/types.js +27 -33
  261. package/lib/solution/ScanOrder/index.js +832 -864
  262. package/lib/solution/ScanOrder/types.js +33 -34
  263. package/lib/solution/ScanOrder/utils.js +409 -374
  264. package/lib/solution/ShopDiscount/index.js +226 -232
  265. package/lib/solution/ShopDiscount/types.js +15 -37
  266. package/lib/solution/ShopDiscount/utils.js +300 -172
  267. package/lib/solution/UnifiedBookingSales/index.js +1035 -1201
  268. package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +99 -159
  269. package/lib/solution/UnifiedBookingSales/types.js +10 -32
  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;