@pisell/pisellos 2.3.39 → 2.3.41

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 (226) hide show
  1. package/dist/core/index.d.ts +2 -0
  2. package/dist/core/index.js +7 -0
  3. package/dist/model/strategy/adapter/promotion/adapter.d.ts +4 -0
  4. package/dist/model/strategy/adapter/promotion/adapter.js +23 -0
  5. package/dist/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
  6. package/dist/model/strategy/adapter/promotion/evaluator.js +279 -6
  7. package/dist/model/strategy/adapter/promotion/examples.d.ts +86 -0
  8. package/dist/model/strategy/adapter/promotion/examples.js +99 -0
  9. package/dist/model/strategy/adapter/promotion/index.d.ts +1 -1
  10. package/dist/model/strategy/adapter/promotion/index.js +9 -0
  11. package/dist/model/strategy/adapter/promotion/type.d.ts +90 -2
  12. package/dist/model/strategy/adapter/promotion/type.js +45 -0
  13. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +5 -3
  14. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +6 -3
  15. package/dist/modules/Discount/index.d.ts +0 -1
  16. package/dist/modules/Discount/index.js +11 -40
  17. package/dist/modules/Discount/types.d.ts +0 -1
  18. package/dist/modules/OpenData/index.d.ts +2 -0
  19. package/dist/modules/OpenData/index.js +10 -2
  20. package/dist/modules/Order/index.d.ts +29 -12
  21. package/dist/modules/Order/index.js +750 -509
  22. package/dist/modules/Order/payment-utils.d.ts +26 -0
  23. package/dist/modules/Order/payment-utils.js +225 -0
  24. package/dist/modules/Order/types.d.ts +33 -10
  25. package/dist/modules/Order/utils/orderCollectionIdentity.js +7 -2
  26. package/dist/modules/Order/utils.d.ts +0 -10
  27. package/dist/modules/Order/utils.js +13 -41
  28. package/dist/modules/Payment/index.d.ts +2 -0
  29. package/dist/modules/Payment/index.js +79 -50
  30. package/dist/modules/Payment/types.d.ts +99 -28
  31. package/dist/modules/Payment/types.js +20 -3
  32. package/dist/modules/Payment/walletpass.d.ts +25 -1
  33. package/dist/modules/Payment/walletpass.js +707 -157
  34. package/dist/modules/Product/types.d.ts +0 -1
  35. package/dist/modules/ProductList/index.js +14 -33
  36. package/dist/modules/Quotation/index.d.ts +1 -1
  37. package/dist/modules/Quotation/index.js +2 -2
  38. package/dist/modules/Rules/index.d.ts +1 -0
  39. package/dist/modules/Rules/index.js +89 -96
  40. package/dist/modules/SalesSummary/index.js +13 -12
  41. package/dist/modules/ScanOrderLogger/index.d.ts +0 -2
  42. package/dist/modules/ScanOrderLogger/index.js +2 -15
  43. package/dist/modules/ScanOrderLogger/providers/feishu.js +27 -45
  44. package/dist/modules/ScanOrderLogger/types.d.ts +0 -1
  45. package/dist/modules/Schedule/index.d.ts +1 -3
  46. package/dist/modules/Schedule/index.js +16 -21
  47. package/dist/modules/Summary/utils.js +13 -38
  48. package/dist/modules/index.d.ts +0 -2
  49. package/dist/modules/index.js +1 -3
  50. package/dist/plugins/window.d.ts +0 -1
  51. package/dist/server/index.d.ts +16 -14
  52. package/dist/server/index.js +1925 -1143
  53. package/dist/server/modules/order/index.d.ts +54 -4
  54. package/dist/server/modules/order/index.js +1600 -700
  55. package/dist/server/modules/order/types.d.ts +11 -3
  56. package/dist/server/modules/order/types.js +1 -1
  57. package/dist/solution/BaseSales/index.d.ts +109 -20
  58. package/dist/solution/BaseSales/index.js +1800 -480
  59. package/dist/solution/BaseSales/types.d.ts +52 -0
  60. package/dist/solution/BaseSales/types.js +2 -1
  61. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
  62. package/dist/solution/BaseSales/utils/cartPromotion.js +90 -31
  63. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +6 -1
  64. package/dist/solution/BookingByStep/index.d.ts +2 -17
  65. package/dist/solution/BookingByStep/index.js +215 -294
  66. package/dist/solution/BookingByStep/types.d.ts +1 -2
  67. package/dist/solution/BookingByStep/types.js +1 -3
  68. package/dist/solution/BookingByStep/utils/capacity.js +1 -17
  69. package/dist/solution/BookingByStep/utils/timeslots.d.ts +1 -3
  70. package/dist/solution/BookingByStep/utils/timeslots.js +12 -19
  71. package/dist/solution/BookingTicket/index.d.ts +7 -3
  72. package/dist/solution/BookingTicket/index.js +132 -49
  73. package/dist/solution/BookingTicket/utils/addProductDecision.js +6 -0
  74. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +8 -0
  75. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +172 -82
  76. package/dist/solution/BookingTicket/utils/weighingProductSku.d.ts +5 -0
  77. package/dist/solution/BookingTicket/utils/weighingProductSku.js +45 -0
  78. package/dist/solution/Sales/index.d.ts +1 -0
  79. package/dist/solution/Sales/index.js +10 -2
  80. package/dist/solution/ScanOrder/index.d.ts +14 -26
  81. package/dist/solution/ScanOrder/index.js +756 -1148
  82. package/dist/solution/ScanOrder/types.d.ts +1 -21
  83. package/dist/solution/ScanOrder/utils.d.ts +0 -8
  84. package/dist/solution/ScanOrder/utils.js +25 -66
  85. package/dist/solution/ShopDiscount/index.d.ts +0 -1
  86. package/dist/solution/ShopDiscount/index.js +87 -125
  87. package/dist/solution/VenueBooking/index.d.ts +11 -39
  88. package/dist/solution/VenueBooking/index.js +860 -1176
  89. package/dist/solution/VenueBooking/types.d.ts +0 -3
  90. package/dist/solution/VenueBooking/utils/resource.js +0 -1
  91. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  92. package/dist/solution/VenueBooking/utils/slotMerge.js +5 -10
  93. package/dist/solution/index.d.ts +0 -1
  94. package/dist/solution/index.js +1 -2
  95. package/dist/types/index.d.ts +1 -1
  96. package/dist/utils/payment-number.d.ts +9 -0
  97. package/dist/utils/payment-number.js +69 -0
  98. package/lib/core/index.d.ts +2 -0
  99. package/lib/core/index.js +4 -0
  100. package/lib/model/strategy/adapter/promotion/adapter.d.ts +4 -0
  101. package/lib/model/strategy/adapter/promotion/adapter.js +20 -0
  102. package/lib/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
  103. package/lib/model/strategy/adapter/promotion/evaluator.js +235 -0
  104. package/lib/model/strategy/adapter/promotion/examples.d.ts +86 -0
  105. package/lib/model/strategy/adapter/promotion/examples.js +91 -0
  106. package/lib/model/strategy/adapter/promotion/index.d.ts +1 -1
  107. package/lib/model/strategy/adapter/promotion/index.js +51 -0
  108. package/lib/model/strategy/adapter/promotion/type.d.ts +90 -2
  109. package/lib/model/strategy/adapter/promotion/type.js +2 -0
  110. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +2 -1
  111. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +2 -1
  112. package/lib/modules/Discount/index.d.ts +0 -1
  113. package/lib/modules/Discount/index.js +0 -9
  114. package/lib/modules/Discount/types.d.ts +0 -1
  115. package/lib/modules/OpenData/index.d.ts +2 -0
  116. package/lib/modules/OpenData/index.js +6 -1
  117. package/lib/modules/Order/index.d.ts +29 -12
  118. package/lib/modules/Order/index.js +196 -86
  119. package/lib/modules/Order/payment-utils.d.ts +26 -0
  120. package/lib/modules/Order/payment-utils.js +224 -0
  121. package/lib/modules/Order/types.d.ts +33 -10
  122. package/lib/modules/Order/utils/orderCollectionIdentity.js +3 -0
  123. package/lib/modules/Order/utils.d.ts +0 -10
  124. package/lib/modules/Order/utils.js +16 -40
  125. package/lib/modules/Payment/index.d.ts +2 -0
  126. package/lib/modules/Payment/index.js +34 -13
  127. package/lib/modules/Payment/types.d.ts +99 -28
  128. package/lib/modules/Payment/types.js +4 -3
  129. package/lib/modules/Payment/walletpass.d.ts +25 -1
  130. package/lib/modules/Payment/walletpass.js +470 -21
  131. package/lib/modules/Product/types.d.ts +0 -1
  132. package/lib/modules/ProductList/index.js +31 -40
  133. package/lib/modules/Quotation/index.d.ts +1 -1
  134. package/lib/modules/Quotation/index.js +2 -2
  135. package/lib/modules/Rules/index.d.ts +1 -0
  136. package/lib/modules/Rules/index.js +47 -40
  137. package/lib/modules/SalesSummary/index.js +7 -6
  138. package/lib/modules/ScanOrderLogger/index.d.ts +0 -2
  139. package/lib/modules/ScanOrderLogger/index.js +1 -13
  140. package/lib/modules/ScanOrderLogger/providers/feishu.js +6 -15
  141. package/lib/modules/ScanOrderLogger/types.d.ts +0 -1
  142. package/lib/modules/Schedule/index.d.ts +1 -3
  143. package/lib/modules/Schedule/index.js +8 -10
  144. package/lib/modules/Summary/utils.js +1 -21
  145. package/lib/modules/index.d.ts +0 -2
  146. package/lib/modules/index.js +1 -5
  147. package/lib/plugins/window.d.ts +0 -1
  148. package/lib/server/index.d.ts +16 -14
  149. package/lib/server/index.js +675 -83
  150. package/lib/server/modules/order/index.d.ts +54 -4
  151. package/lib/server/modules/order/index.js +679 -66
  152. package/lib/server/modules/order/types.d.ts +11 -3
  153. package/lib/solution/BaseSales/index.d.ts +109 -20
  154. package/lib/solution/BaseSales/index.js +883 -70
  155. package/lib/solution/BaseSales/types.d.ts +52 -0
  156. package/lib/solution/BaseSales/types.js +2 -1
  157. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
  158. package/lib/solution/BaseSales/utils/cartPromotion.js +63 -12
  159. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +6 -1
  160. package/lib/solution/BookingByStep/index.d.ts +2 -17
  161. package/lib/solution/BookingByStep/index.js +18 -60
  162. package/lib/solution/BookingByStep/types.d.ts +1 -2
  163. package/lib/solution/BookingByStep/types.js +0 -5
  164. package/lib/solution/BookingByStep/utils/capacity.js +1 -20
  165. package/lib/solution/BookingByStep/utils/timeslots.d.ts +1 -3
  166. package/lib/solution/BookingByStep/utils/timeslots.js +11 -19
  167. package/lib/solution/BookingTicket/index.d.ts +7 -3
  168. package/lib/solution/BookingTicket/index.js +62 -9
  169. package/lib/solution/BookingTicket/utils/addProductDecision.js +4 -0
  170. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +8 -0
  171. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +36 -4
  172. package/lib/solution/BookingTicket/utils/weighingProductSku.d.ts +5 -0
  173. package/lib/solution/BookingTicket/utils/weighingProductSku.js +63 -0
  174. package/lib/solution/Sales/index.d.ts +1 -0
  175. package/lib/solution/Sales/index.js +5 -3
  176. package/lib/solution/ScanOrder/index.d.ts +14 -26
  177. package/lib/solution/ScanOrder/index.js +190 -449
  178. package/lib/solution/ScanOrder/types.d.ts +1 -21
  179. package/lib/solution/ScanOrder/utils.d.ts +0 -8
  180. package/lib/solution/ScanOrder/utils.js +0 -31
  181. package/lib/solution/ShopDiscount/index.d.ts +0 -1
  182. package/lib/solution/ShopDiscount/index.js +0 -14
  183. package/lib/solution/VenueBooking/index.d.ts +11 -39
  184. package/lib/solution/VenueBooking/index.js +123 -328
  185. package/lib/solution/VenueBooking/types.d.ts +0 -3
  186. package/lib/solution/VenueBooking/utils/resource.js +0 -1
  187. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  188. package/lib/solution/VenueBooking/utils/slotMerge.js +4 -6
  189. package/lib/solution/index.d.ts +0 -1
  190. package/lib/solution/index.js +1 -3
  191. package/lib/types/index.d.ts +1 -1
  192. package/lib/utils/payment-number.d.ts +9 -0
  193. package/lib/utils/payment-number.js +64 -0
  194. package/package.json +1 -1
  195. package/dist/modules/Holder/index.d.ts +0 -48
  196. package/dist/modules/Holder/index.js +0 -640
  197. package/dist/modules/Holder/types.d.ts +0 -123
  198. package/dist/modules/Holder/types.js +0 -1
  199. package/dist/modules/Holder/utils.d.ts +0 -13
  200. package/dist/modules/Holder/utils.js +0 -34
  201. package/dist/modules/ResourcePlanner/index.d.ts +0 -24
  202. package/dist/modules/ResourcePlanner/index.js +0 -181
  203. package/dist/modules/ResourcePlanner/planner.d.ts +0 -14
  204. package/dist/modules/ResourcePlanner/planner.js +0 -1069
  205. package/dist/modules/ResourcePlanner/types.d.ts +0 -227
  206. package/dist/modules/ResourcePlanner/types.js +0 -1
  207. package/dist/solution/UnifiedBookingSales/index.d.ts +0 -183
  208. package/dist/solution/UnifiedBookingSales/index.js +0 -1871
  209. package/dist/solution/UnifiedBookingSales/types.d.ts +0 -143
  210. package/dist/solution/UnifiedBookingSales/types.js +0 -11
  211. package/lib/modules/Holder/index.d.ts +0 -48
  212. package/lib/modules/Holder/index.js +0 -402
  213. package/lib/modules/Holder/types.d.ts +0 -123
  214. package/lib/modules/Holder/types.js +0 -17
  215. package/lib/modules/Holder/utils.d.ts +0 -13
  216. package/lib/modules/Holder/utils.js +0 -71
  217. package/lib/modules/ResourcePlanner/index.d.ts +0 -24
  218. package/lib/modules/ResourcePlanner/index.js +0 -148
  219. package/lib/modules/ResourcePlanner/planner.d.ts +0 -14
  220. package/lib/modules/ResourcePlanner/planner.js +0 -933
  221. package/lib/modules/ResourcePlanner/types.d.ts +0 -227
  222. package/lib/modules/ResourcePlanner/types.js +0 -17
  223. package/lib/solution/UnifiedBookingSales/index.d.ts +0 -183
  224. package/lib/solution/UnifiedBookingSales/index.js +0 -1076
  225. package/lib/solution/UnifiedBookingSales/types.d.ts +0 -143
  226. package/lib/solution/UnifiedBookingSales/types.js +0 -33
@@ -24,6 +24,74 @@ __export(walletpass_exports, {
24
24
  module.exports = __toCommonJS(walletpass_exports);
25
25
  var import_types = require("./types");
26
26
  var import_utils = require("./utils");
27
+ var WALLET_PAYMENT_ASSET_TAGS = /* @__PURE__ */ new Set([
28
+ "product_voucher",
29
+ "gift_card",
30
+ "point_card"
31
+ ]);
32
+ function isWalletPaymentAsset(asset) {
33
+ return WALLET_PAYMENT_ASSET_TAGS.has(
34
+ String((asset == null ? void 0 : asset.tag) || "").toLowerCase()
35
+ );
36
+ }
37
+ function getWalletAssetId(asset) {
38
+ return (asset == null ? void 0 : asset.id) ?? (asset == null ? void 0 : asset.voucher_id) ?? (asset == null ? void 0 : asset.code);
39
+ }
40
+ function getWalletAssetKey(assetOrId) {
41
+ const id = assetOrId && typeof assetOrId === "object" ? getWalletAssetId(assetOrId) : assetOrId;
42
+ return id === void 0 || id === null ? "" : String(id);
43
+ }
44
+ function isWalletAssetAvailable(asset) {
45
+ if (!asset)
46
+ return false;
47
+ if (asset.unified_available_status !== void 0 && Number(asset.unified_available_status) !== 1) {
48
+ return false;
49
+ }
50
+ if (asset._unified_available_status !== void 0 && Number(asset._unified_available_status) !== 1) {
51
+ return false;
52
+ }
53
+ if (asset.available === false || asset.isDisabled === true)
54
+ return false;
55
+ return true;
56
+ }
57
+ function getWalletAssetDeductionAmount(asset) {
58
+ const value = (asset == null ? void 0 : asset.actualDeduction) ?? (asset == null ? void 0 : asset._available_max_amount) ?? (asset == null ? void 0 : asset.edit_current_amount) ?? (asset == null ? void 0 : asset.recommended_usage_amount) ?? (asset == null ? void 0 : asset.available_max_amount) ?? (asset == null ? void 0 : asset.amount) ?? 0;
59
+ const amount = Number(value);
60
+ return Number.isFinite(amount) && amount > 0 ? amount : 0;
61
+ }
62
+ function mergeWalletAssets(...groups) {
63
+ const merged = [];
64
+ const indexByKey = /* @__PURE__ */ new Map();
65
+ groups.flat().forEach((asset) => {
66
+ const key = getWalletAssetKey(asset);
67
+ if (!key)
68
+ return;
69
+ const existedIndex = indexByKey.get(key);
70
+ if (existedIndex === void 0) {
71
+ indexByKey.set(key, merged.length);
72
+ merged.push(asset);
73
+ return;
74
+ }
75
+ merged[existedIndex] = {
76
+ ...merged[existedIndex],
77
+ ...asset
78
+ };
79
+ });
80
+ return merged;
81
+ }
82
+ function createInitialWalletAssetsState() {
83
+ return {
84
+ status: "idle",
85
+ items: [],
86
+ selectedIds: [],
87
+ selectedItems: [],
88
+ committedIds: [],
89
+ selectionSources: {},
90
+ totalSelectedAmount: 0,
91
+ error: null,
92
+ revision: 0
93
+ };
94
+ }
27
95
  var WalletPassPaymentImpl = class {
28
96
  constructor(paymentModule) {
29
97
  this.paymentModule = paymentModule;
@@ -32,6 +100,12 @@ var WalletPassPaymentImpl = class {
32
100
  this.searchResults = [];
33
101
  this.walletParams = null;
34
102
  this.walletInitData = null;
103
+ this.walletAssetsState = createInitialWalletAssetsState();
104
+ this.walletAssetsRequestSequence = 0;
105
+ this.walletAssetsCalculationContext = {
106
+ orderTotalAmount: 0,
107
+ products: []
108
+ };
35
109
  }
36
110
  /**
37
111
  * 发送事件的辅助方法
@@ -48,6 +122,145 @@ var WalletPassPaymentImpl = class {
48
122
  });
49
123
  }
50
124
  }
125
+ publishWalletAssetsState(patch) {
126
+ this.walletAssetsState = {
127
+ ...this.walletAssetsState,
128
+ ...patch,
129
+ items: [...patch.items ?? this.walletAssetsState.items],
130
+ selectedIds: [
131
+ ...patch.selectedIds ?? this.walletAssetsState.selectedIds
132
+ ],
133
+ selectedItems: [
134
+ ...patch.selectedItems ?? this.walletAssetsState.selectedItems
135
+ ],
136
+ committedIds: [
137
+ ...patch.committedIds ?? this.walletAssetsState.committedIds
138
+ ],
139
+ selectionSources: {
140
+ ...patch.selectionSources ?? this.walletAssetsState.selectionSources
141
+ },
142
+ revision: this.walletAssetsState.revision + 1
143
+ };
144
+ const state = this.getWalletAssetsState();
145
+ this.emitEvent(import_types.WalletPassHooks.OnWalletAssetsStateChanged, { state });
146
+ return state;
147
+ }
148
+ recalculateWalletAssets(items, requestedIds, selectionSources) {
149
+ var _a, _b;
150
+ const committedKeys = new Set(
151
+ this.walletAssetsState.committedIds.map((id) => String(id))
152
+ );
153
+ const requestedKeys = new Set(
154
+ requestedIds.map((id) => String(id)).filter((id) => !committedKeys.has(id))
155
+ );
156
+ const requested = items.filter(
157
+ (item) => requestedKeys.has(getWalletAssetKey(item)) && isWalletAssetAvailable(item)
158
+ );
159
+ let nextItems = items;
160
+ let selectedItems = requested;
161
+ const evaluator = (_b = (_a = this.paymentModule.window) == null ? void 0 : _a.getWalletPassEvaluator) == null ? void 0 : _b.call(_a);
162
+ if (evaluator == null ? void 0 : evaluator.recalculateVouchers) {
163
+ try {
164
+ const result = evaluator.recalculateVouchers(
165
+ items,
166
+ requested,
167
+ this.walletAssetsCalculationContext.orderTotalAmount,
168
+ this.walletAssetsCalculationContext.products
169
+ );
170
+ nextItems = mergeWalletAssets(items, (result == null ? void 0 : result.allWithUpdatedStatus) || []);
171
+ selectedItems = ((result == null ? void 0 : result.selectedWithDetails) || []).filter(
172
+ (item) => isWalletAssetAvailable(item) && getWalletAssetDeductionAmount(item) > 0
173
+ );
174
+ } catch (error) {
175
+ this.paymentModule.logWarning(
176
+ "[WalletPass] 共享钱包资产重新计算失败,回退接口可用状态",
177
+ {
178
+ error: error instanceof Error ? error.message : String(error)
179
+ }
180
+ );
181
+ }
182
+ }
183
+ const selectedIds = selectedItems.map((item) => getWalletAssetId(item)).filter((id) => id !== void 0 && id !== null);
184
+ const selectedKeys = new Set(selectedIds.map((id) => String(id)));
185
+ const nextSources = Object.entries(selectionSources).reduce((result, [key, source]) => {
186
+ if (selectedKeys.has(key))
187
+ result[key] = source;
188
+ return result;
189
+ }, {});
190
+ const totalSelectedAmount = selectedItems.reduce(
191
+ (total, item) => total + getWalletAssetDeductionAmount(item),
192
+ 0
193
+ );
194
+ return this.publishWalletAssetsState({
195
+ status: "ready",
196
+ items: nextItems,
197
+ selectedIds,
198
+ selectedItems,
199
+ selectionSources: nextSources,
200
+ totalSelectedAmount,
201
+ error: null
202
+ });
203
+ }
204
+ /**
205
+ * 使用最新订单参数重验扫码搜索过的支付类 Wallet 资产。
206
+ * 请求失败或暂时无匹配结果时保留旧资产,避免商品变化造成列表闪空。
207
+ */
208
+ async revalidateSearchedWalletAssets(requestSequence) {
209
+ const cachedAssets = this.searchResults.filter(isWalletPaymentAsset);
210
+ const searchCodes = [
211
+ ...new Set(
212
+ cachedAssets.map((item) => String((item == null ? void 0 : item.code) || "").trim()).filter(Boolean)
213
+ )
214
+ ];
215
+ if (searchCodes.length === 0)
216
+ return cachedAssets;
217
+ const preparePayments = this.formatWalletPassList2PreparePayments(
218
+ this.walletAssetsState.selectedItems
219
+ );
220
+ const refreshedGroups = await Promise.all(
221
+ searchCodes.map(async (searchCode) => {
222
+ try {
223
+ const result = await this.searchIdentificationCodeAsync(
224
+ {
225
+ ...this.walletParams || {},
226
+ code: searchCode,
227
+ prepare_payments: preparePayments
228
+ },
229
+ { noCache: true }
230
+ );
231
+ return {
232
+ searchCode,
233
+ items: result.type === "normalCode" ? result.data.filter(isWalletPaymentAsset) : []
234
+ };
235
+ } catch (error) {
236
+ this.paymentModule.logWarning(
237
+ "[WalletPass] 重验扫码 Wallet 资产失败,保留旧结果",
238
+ {
239
+ code: searchCode,
240
+ error: error instanceof Error ? error.message : String(error)
241
+ }
242
+ );
243
+ return { searchCode, items: [] };
244
+ }
245
+ })
246
+ );
247
+ if (requestSequence !== this.walletAssetsRequestSequence) {
248
+ return cachedAssets;
249
+ }
250
+ const replacedCodes = new Set(
251
+ refreshedGroups.filter((group) => group.items.length > 0).map((group) => group.searchCode.toUpperCase())
252
+ );
253
+ const refreshedAssets = refreshedGroups.flatMap((group) => group.items);
254
+ if (refreshedAssets.length > 0) {
255
+ this.searchResults = [
256
+ ...this.searchResults.filter(
257
+ (item) => !replacedCodes.has(String((item == null ? void 0 : item.code) || "").trim().toUpperCase())
258
+ ),
259
+ ...refreshedAssets
260
+ ];
261
+ }
262
+ return mergeWalletAssets(cachedAssets, refreshedAssets);
263
+ }
51
264
  /**
52
265
  * 生成钱包API默认参数
53
266
  * 根据业务数据生成标准的钱包API参数,并存储在模块中
@@ -75,7 +288,7 @@ var WalletPassPaymentImpl = class {
75
288
  // 订单小计金额
76
289
  order_product_amount: subTotal,
77
290
  // 订单待支付金额
78
- order_wait_pay_amount: order_wait_pay_amount || ((amountInfo == null ? void 0 : amountInfo.isDeposit) ? Number(amountInfo == null ? void 0 : amountInfo.depositAmount) : totalAmount),
291
+ order_wait_pay_amount: order_wait_pay_amount ?? ((amountInfo == null ? void 0 : amountInfo.isDeposit) ? Number(amountInfo == null ? void 0 : amountInfo.depositAmount) : totalAmount),
79
292
  // order_behavior_count_customer_id: 1,
80
293
  products,
81
294
  prepare_payments: [],
@@ -356,7 +569,6 @@ var WalletPassPaymentImpl = class {
356
569
  * 特殊逻辑:当识别码长度为9位且前3位为"000"时,调用 /wallet/detail/search 接口
357
570
  */
358
571
  async searchIdentificationCodeAsync(params, config = {}) {
359
- var _a;
360
572
  try {
361
573
  const { code } = params;
362
574
  this.paymentModule.logInfo("[WalletPass] 开始搜索识别码", {
@@ -394,14 +606,14 @@ var WalletPassPaymentImpl = class {
394
606
  const baseWalletParams = this.walletParams;
395
607
  const searchParams = {
396
608
  // 基础钱包参数
397
- sale_channel: params.sale_channel || (baseWalletParams == null ? void 0 : baseWalletParams.sale_channel) || "pos",
398
- customer_id: params.customer_id || (baseWalletParams == null ? void 0 : baseWalletParams.customer_id),
399
- order_expect_amount: params.order_expect_amount || (baseWalletParams == null ? void 0 : baseWalletParams.order_expect_amount),
400
- order_product_amount: params.order_product_amount || (baseWalletParams == null ? void 0 : baseWalletParams.order_product_amount),
401
- order_wait_pay_amount: params.order_wait_pay_amount || (baseWalletParams == null ? void 0 : baseWalletParams.order_wait_pay_amount),
402
- order_behavior_count_customer_id: params.order_behavior_count_customer_id || (baseWalletParams == null ? void 0 : baseWalletParams.order_behavior_count_customer_id) || params.customer_id || (baseWalletParams == null ? void 0 : baseWalletParams.customer_id),
403
- products: params.products || (baseWalletParams == null ? void 0 : baseWalletParams.products),
404
- prepare_payments: params.prepare_payments || (baseWalletParams == null ? void 0 : baseWalletParams.prepare_payments),
609
+ sale_channel: params.sale_channel ?? (baseWalletParams == null ? void 0 : baseWalletParams.sale_channel) ?? "pos",
610
+ customer_id: params.customer_id ?? (baseWalletParams == null ? void 0 : baseWalletParams.customer_id),
611
+ order_expect_amount: params.order_expect_amount ?? (baseWalletParams == null ? void 0 : baseWalletParams.order_expect_amount),
612
+ order_product_amount: params.order_product_amount ?? (baseWalletParams == null ? void 0 : baseWalletParams.order_product_amount),
613
+ order_wait_pay_amount: params.order_wait_pay_amount ?? (baseWalletParams == null ? void 0 : baseWalletParams.order_wait_pay_amount),
614
+ order_behavior_count_customer_id: params.order_behavior_count_customer_id ?? (baseWalletParams == null ? void 0 : baseWalletParams.order_behavior_count_customer_id) ?? params.customer_id ?? (baseWalletParams == null ? void 0 : baseWalletParams.customer_id),
615
+ products: params.products ?? (baseWalletParams == null ? void 0 : baseWalletParams.products) ?? [],
616
+ prepare_payments: params.prepare_payments ?? (baseWalletParams == null ? void 0 : baseWalletParams.prepare_payments) ?? [],
405
617
  multiple: 1,
406
618
  // 搜索特有参数
407
619
  code: params.code,
@@ -417,17 +629,10 @@ var WalletPassPaymentImpl = class {
417
629
  if (typeof searchParams.payment_order_id === "string" && searchParams.payment_order_id.startsWith("LOCAL_")) {
418
630
  searchParams.payment_order_id = void 0;
419
631
  }
420
- let response;
421
- if (!searchParams.products || ((_a = searchParams.products || []) == null ? void 0 : _a.length) === 0) {
422
- response = {
423
- data: []
424
- };
425
- } else {
426
- response = await this.paymentModule.request.post(
427
- "/machinecode/prepare/deduction/search",
428
- searchParams
429
- );
430
- }
632
+ const response = await this.paymentModule.request.post(
633
+ "/machinecode/prepare/deduction/search",
634
+ searchParams
635
+ );
431
636
  const searchResults = (response == null ? void 0 : response.data) || [];
432
637
  if (config.noCache) {
433
638
  return {
@@ -469,6 +674,243 @@ var WalletPassPaymentImpl = class {
469
674
  throw error;
470
675
  }
471
676
  }
677
+ /**
678
+ * 刷新购物车与结账共享的钱包资产。
679
+ *
680
+ * 与 legacy initializeWalletDataFromBusinessAsync 不同,这里维护选择状态;
681
+ * 推荐结果只作为可用性/金额计算输入,不会自动成为 selectedIds。
682
+ */
683
+ async refreshWalletAssetsFromBusinessAsync(businessData, options = {}) {
684
+ const requestSequence = ++this.walletAssetsRequestSequence;
685
+ const nextCustomerId = businessData.customer_id;
686
+ const previousCustomerId = this.walletAssetsState.customerId;
687
+ const customerChanged = String(previousCustomerId ?? "") !== String(nextCustomerId ?? "");
688
+ const preserveSelection = options.preserveSelection !== false && !customerChanged;
689
+ if (customerChanged) {
690
+ this.clearSearchResults();
691
+ }
692
+ const committedKeys = new Set(
693
+ this.walletAssetsState.committedIds.map((id) => String(id))
694
+ );
695
+ const committedItems = this.walletAssetsState.items.filter(
696
+ (item) => committedKeys.has(getWalletAssetKey(item))
697
+ );
698
+ const selectedIds = preserveSelection ? [...this.walletAssetsState.selectedIds] : [];
699
+ const selectionSources = preserveSelection ? { ...this.walletAssetsState.selectionSources } : {};
700
+ this.publishWalletAssetsState({
701
+ status: "loading",
702
+ customerId: nextCustomerId,
703
+ items: preserveSelection ? this.walletAssetsState.items : committedItems,
704
+ selectedIds,
705
+ selectedItems: preserveSelection ? this.walletAssetsState.selectedItems : [],
706
+ selectionSources,
707
+ totalSelectedAmount: preserveSelection ? this.walletAssetsState.totalSelectedAmount : 0,
708
+ error: null
709
+ });
710
+ try {
711
+ const result = await this.initializeWalletDataFromBusinessAsync(
712
+ businessData
713
+ );
714
+ if (requestSequence !== this.walletAssetsRequestSequence) {
715
+ return this.getWalletAssetsState();
716
+ }
717
+ this.walletAssetsCalculationContext = {
718
+ orderTotalAmount: Number(businessData.order_wait_pay_amount || 0),
719
+ products: result.products || businessData.products || []
720
+ };
721
+ const searchedWalletAssets = preserveSelection ? await this.revalidateSearchedWalletAssets(requestSequence) : [];
722
+ if (requestSequence !== this.walletAssetsRequestSequence) {
723
+ return this.getWalletAssetsState();
724
+ }
725
+ const recommendedKeys = new Set(
726
+ (result.walletRecommendList || []).map(
727
+ (asset) => getWalletAssetKey(asset)
728
+ )
729
+ );
730
+ const items = mergeWalletAssets(
731
+ preserveSelection ? this.walletAssetsState.selectedItems : [],
732
+ searchedWalletAssets,
733
+ result.transformList || [],
734
+ result.noApplicableVoucher || []
735
+ ).map((asset) => ({
736
+ ...asset,
737
+ _wallet_asset_recommended: recommendedKeys.has(
738
+ getWalletAssetKey(asset)
739
+ )
740
+ }));
741
+ const latestSelectedIds = preserveSelection ? [...this.walletAssetsState.selectedIds] : [];
742
+ const latestSelectionSources = preserveSelection ? { ...this.walletAssetsState.selectionSources } : {};
743
+ return this.recalculateWalletAssets(
744
+ items,
745
+ latestSelectedIds,
746
+ latestSelectionSources
747
+ );
748
+ } catch (error) {
749
+ if (requestSequence !== this.walletAssetsRequestSequence) {
750
+ return this.getWalletAssetsState();
751
+ }
752
+ return this.publishWalletAssetsState({
753
+ status: "error",
754
+ items: preserveSelection ? this.walletAssetsState.items : committedItems,
755
+ selectedIds: preserveSelection ? this.walletAssetsState.selectedIds : [],
756
+ selectedItems: preserveSelection ? this.walletAssetsState.selectedItems : [],
757
+ selectionSources: preserveSelection ? this.walletAssetsState.selectionSources : {},
758
+ totalSelectedAmount: preserveSelection ? this.walletAssetsState.totalSelectedAmount : 0,
759
+ customerId: nextCustomerId,
760
+ error: error instanceof Error ? error.message : String(error)
761
+ });
762
+ }
763
+ }
764
+ getWalletAssetsState() {
765
+ return {
766
+ ...this.walletAssetsState,
767
+ items: [...this.walletAssetsState.items],
768
+ selectedIds: [...this.walletAssetsState.selectedIds],
769
+ selectedItems: [...this.walletAssetsState.selectedItems],
770
+ committedIds: [...this.walletAssetsState.committedIds],
771
+ selectionSources: { ...this.walletAssetsState.selectionSources }
772
+ };
773
+ }
774
+ exportWalletAssetsSnapshot() {
775
+ return {
776
+ state: this.getWalletAssetsState(),
777
+ searchResults: [...this.searchResults],
778
+ walletParams: this.walletParams ? { ...this.walletParams } : null,
779
+ calculationContext: {
780
+ orderTotalAmount: this.walletAssetsCalculationContext.orderTotalAmount,
781
+ products: [...this.walletAssetsCalculationContext.products]
782
+ }
783
+ };
784
+ }
785
+ importWalletAssetsSnapshot(snapshot) {
786
+ var _a, _b;
787
+ if (!(snapshot == null ? void 0 : snapshot.state))
788
+ return this.getWalletAssetsState();
789
+ this.walletAssetsRequestSequence += 1;
790
+ this.searchResults = Array.isArray(snapshot.searchResults) ? [...snapshot.searchResults] : [];
791
+ this.walletParams = snapshot.walletParams ? { ...snapshot.walletParams } : null;
792
+ this.walletAssetsCalculationContext = {
793
+ orderTotalAmount: Number(
794
+ ((_a = snapshot.calculationContext) == null ? void 0 : _a.orderTotalAmount) || 0
795
+ ),
796
+ products: Array.isArray((_b = snapshot.calculationContext) == null ? void 0 : _b.products) ? [...snapshot.calculationContext.products] : []
797
+ };
798
+ return this.publishWalletAssetsState({
799
+ ...snapshot.state,
800
+ items: Array.isArray(snapshot.state.items) ? snapshot.state.items : [],
801
+ selectedIds: Array.isArray(snapshot.state.selectedIds) ? snapshot.state.selectedIds : [],
802
+ selectedItems: Array.isArray(snapshot.state.selectedItems) ? snapshot.state.selectedItems : [],
803
+ committedIds: Array.isArray(snapshot.state.committedIds) ? snapshot.state.committedIds : [],
804
+ selectionSources: snapshot.state.selectionSources || {}
805
+ });
806
+ }
807
+ selectWalletAsset(assetId, options) {
808
+ const assetKey = String(assetId);
809
+ const committedKeys = new Set(
810
+ this.walletAssetsState.committedIds.map((id) => String(id))
811
+ );
812
+ if (committedKeys.has(assetKey))
813
+ return this.getWalletAssetsState();
814
+ const selectedIds = this.walletAssetsState.selectedIds.filter(
815
+ (id) => String(id) !== assetKey
816
+ );
817
+ const selectionSources = { ...this.walletAssetsState.selectionSources };
818
+ delete selectionSources[assetKey];
819
+ if (options.selected) {
820
+ const asset = this.walletAssetsState.items.find(
821
+ (item) => getWalletAssetKey(item) === assetKey
822
+ );
823
+ if (!asset || !isWalletAssetAvailable(asset)) {
824
+ return this.getWalletAssetsState();
825
+ }
826
+ selectedIds.push(assetId);
827
+ selectionSources[assetKey] = options.source || "manual";
828
+ }
829
+ return this.recalculateWalletAssets(
830
+ this.walletAssetsState.items,
831
+ selectedIds,
832
+ selectionSources
833
+ );
834
+ }
835
+ async scanWalletAssetAsync(code) {
836
+ const normalizedCode = String(code || "").trim();
837
+ if (!normalizedCode) {
838
+ return {
839
+ type: "normalCode",
840
+ selected: false,
841
+ state: this.getWalletAssetsState()
842
+ };
843
+ }
844
+ this.walletAssetsRequestSequence += 1;
845
+ const result = await this.searchIdentificationCodeAsync({
846
+ ...this.walletParams || {},
847
+ code: normalizedCode,
848
+ prepare_payments: this.formatWalletPassList2PreparePayments(
849
+ this.walletAssetsState.selectedItems
850
+ )
851
+ });
852
+ const paymentAssets = result.data.filter(isWalletPaymentAsset);
853
+ const asset = paymentAssets.find(
854
+ (item) => String((item == null ? void 0 : item.code) || "") === normalizedCode
855
+ ) || paymentAssets[0];
856
+ if (!asset || result.type === "walletCode") {
857
+ return {
858
+ type: result.type,
859
+ asset,
860
+ selected: false,
861
+ state: this.getWalletAssetsState()
862
+ };
863
+ }
864
+ const items = mergeWalletAssets(this.walletAssetsState.items, [asset]);
865
+ this.recalculateWalletAssets(
866
+ items,
867
+ this.walletAssetsState.selectedIds,
868
+ this.walletAssetsState.selectionSources
869
+ );
870
+ const assetId = getWalletAssetId(asset);
871
+ const selected = assetId !== void 0 && isWalletAssetAvailable(asset) ? this.selectWalletAsset(assetId, {
872
+ selected: true,
873
+ source: "scan"
874
+ }) : this.getWalletAssetsState();
875
+ return {
876
+ type: result.type,
877
+ asset,
878
+ selected: assetId !== void 0 && selected.selectedIds.some((id) => String(id) === String(assetId)),
879
+ state: selected
880
+ };
881
+ }
882
+ clearWalletAssetSelection() {
883
+ return this.recalculateWalletAssets(
884
+ this.walletAssetsState.items,
885
+ [],
886
+ {}
887
+ );
888
+ }
889
+ setCommittedWalletAssets(committedIds, committedAssets = []) {
890
+ const committedKeys = new Set(committedIds.map((id) => String(id)));
891
+ const selectedIds = this.walletAssetsState.selectedIds.filter(
892
+ (id) => !committedKeys.has(String(id))
893
+ );
894
+ const selectionSources = Object.entries(
895
+ this.walletAssetsState.selectionSources
896
+ ).reduce(
897
+ (result, [key, source]) => {
898
+ if (!committedKeys.has(key))
899
+ result[key] = source;
900
+ return result;
901
+ },
902
+ {}
903
+ );
904
+ this.publishWalletAssetsState({
905
+ items: mergeWalletAssets(this.walletAssetsState.items, committedAssets),
906
+ committedIds
907
+ });
908
+ return this.recalculateWalletAssets(
909
+ this.walletAssetsState.items,
910
+ selectedIds,
911
+ selectionSources
912
+ );
913
+ }
472
914
  async processWalletPayment(amount, orderUuid, voucherId) {
473
915
  this.paymentModule.logInfo("[WalletPass] 开始处理钱包支付", {
474
916
  amount,
@@ -576,6 +1018,13 @@ var WalletPassPaymentImpl = class {
576
1018
  this.searchResults = [];
577
1019
  this.walletParams = null;
578
1020
  this.walletInitData = null;
1021
+ this.walletAssetsRequestSequence += 1;
1022
+ this.walletAssetsCalculationContext = {
1023
+ orderTotalAmount: 0,
1024
+ products: []
1025
+ };
1026
+ this.walletAssetsState = createInitialWalletAssetsState();
1027
+ this.publishWalletAssetsState({});
579
1028
  this.emitEvent(import_types.WalletPassHooks.OnWalletCacheCleared, {
580
1029
  clearedTypes: ["all"]
581
1030
  });
@@ -193,7 +193,6 @@ export interface ProductData {
193
193
  status?: string;
194
194
  required?: number | string | boolean;
195
195
  resource_id?: number | string | null;
196
- [key: string]: any;
197
196
  };
198
197
  /** 组合商品id,动态附加 */
199
198
  product_variant_id?: number;
@@ -106,48 +106,39 @@ var ProductList = class extends import_BaseModule.BaseModule {
106
106
  } catch (error) {
107
107
  console.error(error);
108
108
  }
109
- const channelMap = {
110
- online_store: "online-store",
111
- scan_to_order: "online-store",
112
- "scan-to-order": "online-store",
113
- scan_to_order_2: "mobile_order",
114
- scan_to_order_3: "scantoorder3"
115
- };
116
- const rawApplicationCode = (_b = this.otherParams) == null ? void 0 : _b.channel;
117
- const mappedApplicationCode = typeof rawApplicationCode === "string" ? channelMap[rawApplicationCode] || rawApplicationCode : rawApplicationCode;
118
- const queryPayload = {
119
- open_quotation: 1,
120
- open_bundle: 0,
121
- exclude_extension_type: [
122
- "product_party",
123
- "product_event",
124
- "product_series_event",
125
- "product_package_ticket",
126
- "ticket",
127
- "event_item"
128
- ],
129
- with: ["category", "collection", "resourceRelation"],
130
- status,
131
- num: 500,
132
- skip: 1,
133
- customer_id,
134
- ...Array.isArray(category_ids) && category_ids.length ? { category_ids } : {},
135
- ...Array.isArray(product_ids) && product_ids.length ? { ids: product_ids } : {},
136
- ...Array.isArray(collection) && collection.length ? { collection } : {},
137
- front_end_cache_id: cacheId,
138
- ...Array.isArray(menu_list_ids) && menu_list_ids.length ? { menu_list_ids } : {},
139
- with_count,
140
- // client_schedule_ids: schedule_ids,
141
- schedule_date,
142
- application_code: mappedApplicationCode,
143
- is_eject: 1,
144
- with_schedule,
145
- schedule_datetime,
146
- extension_type
147
- };
148
109
  const productsData = await this.request.post(
149
110
  `/product/query`,
150
- queryPayload,
111
+ {
112
+ open_quotation: 1,
113
+ open_bundle: 0,
114
+ exclude_extension_type: [
115
+ "product_party",
116
+ "product_event",
117
+ "product_series_event",
118
+ "product_package_ticket",
119
+ "ticket",
120
+ "event_item"
121
+ ],
122
+ with: ["category", "collection", "resourceRelation"],
123
+ status,
124
+ num: 500,
125
+ skip: 1,
126
+ customer_id,
127
+ category_ids,
128
+ ids: product_ids,
129
+ collection,
130
+ front_end_cache_id: cacheId,
131
+ menu_list_ids,
132
+ with_count,
133
+ // client_schedule_ids: schedule_ids,
134
+ schedule_date,
135
+ application_code: (_b = this.otherParams) == null ? void 0 : _b.channel,
136
+ is_eject: 1,
137
+ with_schedule,
138
+ schedule_datetime,
139
+ extension_type,
140
+ strategy_context
141
+ },
151
142
  { osServer: true, callback: options == null ? void 0 : options.callback, subscriberId: options == null ? void 0 : options.subscriberId, customToast: () => {
152
143
  } }
153
144
  );
@@ -21,7 +21,7 @@ export declare class QuotationModule extends BaseModule implements Module {
21
21
  * Look up the quotation price for a specific product (+ optional variant) at a given datetime.
22
22
  * Returns the price as a string (e.g. "300.00"), or null if no quotation applies.
23
23
  *
24
- * Priority: iterates quotations already sorted by `sort` descending (highest = highest priority).
24
+ * Priority: iterates quotations already sorted by `sort` ascending (lowest = highest priority).
25
25
  * First matching quotation whose schedule covers `datetime` and whose product_data contains
26
26
  * the requested productId wins.
27
27
  */
@@ -52,7 +52,7 @@ var QuotationModule = class extends import_BaseModule.BaseModule {
52
52
  { useCache: false, osServer: true }
53
53
  );
54
54
  const list = ((_a = res == null ? void 0 : res.data) == null ? void 0 : _a.list) || (res == null ? void 0 : res.list) || [];
55
- list.sort((a, b) => b.sort - a.sort);
55
+ list.sort((a, b) => a.sort - b.sort);
56
56
  this.store.list = list;
57
57
  }
58
58
  getQuotationList() {
@@ -96,7 +96,7 @@ var QuotationModule = class extends import_BaseModule.BaseModule {
96
96
  * Look up the quotation price for a specific product (+ optional variant) at a given datetime.
97
97
  * Returns the price as a string (e.g. "300.00"), or null if no quotation applies.
98
98
  *
99
- * Priority: iterates quotations already sorted by `sort` descending (highest = highest priority).
99
+ * Priority: iterates quotations already sorted by `sort` ascending (lowest = highest priority).
100
100
  * First matching quotation whose schedule covers `datetime` and whose product_data contains
101
101
  * the requested productId wins.
102
102
  */
@@ -35,6 +35,7 @@ export declare class RulesModule extends BaseModule implements Module, RulesModu
35
35
  excludeDiscountListByType(discountList: Discount[], type: string): Discount[];
36
36
  /** 手动改价场景:去掉 promotion,保留 type=product 等行内折扣 */
37
37
  resolveDiscountListForManualOverride(discountList: Discount[]): Discount[];
38
+ private isItemRewardProductDiscount;
38
39
  private getUnavailableReason;
39
40
  calcDiscount({ discountList, productList, holders, isFormSubject, orderTotalAmount }: {
40
41
  discountList: Discount[];