@pisell/pisellos 2.3.60 → 2.3.61

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 (53) hide show
  1. package/dist/core/index.d.ts +0 -7
  2. package/dist/core/index.js +66 -109
  3. package/dist/model/strategy/adapter/promotion/index.js +0 -9
  4. package/dist/model/strategy/adapter/walletPass/evaluator.js +0 -1
  5. package/dist/model/strategy/adapter/walletPass/type.d.ts +5 -0
  6. package/dist/model/strategy/adapter/walletPass/utils.js +57 -24
  7. package/dist/modules/Payment/types.d.ts +2 -0
  8. package/dist/modules/Payment/utils.js +4 -1
  9. package/dist/modules/Payment/walletpass.d.ts +11 -0
  10. package/dist/modules/Payment/walletpass.js +204 -49
  11. package/dist/modules/ProductList/index.js +2 -1
  12. package/dist/modules/Quotation/index.d.ts +0 -6
  13. package/dist/modules/Quotation/index.js +19 -75
  14. package/dist/plugins/request.d.ts +0 -1
  15. package/dist/server/index.d.ts +2 -6
  16. package/dist/server/index.js +90 -130
  17. package/dist/server/modules/floor-plan/index.d.ts +0 -4
  18. package/dist/server/modules/floor-plan/index.js +98 -240
  19. package/dist/server/modules/menu/index.js +23 -48
  20. package/dist/server/modules/order/index.d.ts +7 -12
  21. package/dist/server/modules/order/index.js +96 -248
  22. package/dist/server/modules/products/index.d.ts +2 -8
  23. package/dist/server/modules/products/index.js +75 -167
  24. package/dist/server/modules/resource/index.js +13 -21
  25. package/dist/solution/BaseSales/index.d.ts +5 -0
  26. package/dist/solution/BaseSales/index.js +311 -281
  27. package/lib/core/index.d.ts +0 -7
  28. package/lib/core/index.js +3 -20
  29. package/lib/model/strategy/adapter/promotion/index.js +0 -51
  30. package/lib/model/strategy/adapter/walletPass/evaluator.js +0 -1
  31. package/lib/model/strategy/adapter/walletPass/type.d.ts +5 -0
  32. package/lib/model/strategy/adapter/walletPass/utils.js +62 -10
  33. package/lib/modules/Payment/types.d.ts +2 -0
  34. package/lib/modules/Payment/utils.js +5 -1
  35. package/lib/modules/Payment/walletpass.d.ts +11 -0
  36. package/lib/modules/Payment/walletpass.js +183 -15
  37. package/lib/modules/ProductList/index.js +2 -1
  38. package/lib/modules/Quotation/index.d.ts +0 -6
  39. package/lib/modules/Quotation/index.js +5 -49
  40. package/lib/plugins/request.d.ts +0 -1
  41. package/lib/server/index.d.ts +2 -6
  42. package/lib/server/index.js +8 -18
  43. package/lib/server/modules/floor-plan/index.d.ts +0 -4
  44. package/lib/server/modules/floor-plan/index.js +6 -54
  45. package/lib/server/modules/menu/index.js +5 -31
  46. package/lib/server/modules/order/index.d.ts +7 -12
  47. package/lib/server/modules/order/index.js +28 -143
  48. package/lib/server/modules/products/index.d.ts +2 -8
  49. package/lib/server/modules/products/index.js +24 -97
  50. package/lib/server/modules/resource/index.js +2 -7
  51. package/lib/solution/BaseSales/index.d.ts +5 -0
  52. package/lib/solution/BaseSales/index.js +11 -0
  53. package/package.json +1 -1
@@ -45,6 +45,29 @@ function normalizeWalletAssetCode(code) {
45
45
  function getWalletAssetCodeKeys(asset) {
46
46
  return [asset === null || asset === void 0 ? void 0 : asset.code, asset === null || asset === void 0 ? void 0 : asset.encoded].map(normalizeWalletAssetCode).filter(Boolean);
47
47
  }
48
+
49
+ /**
50
+ * 保存货币类扫码资产自身的可用余额,供后续前端策略重新计算。
51
+ * 搜索接口的 recommended_usage_amount 已扣除了搜索时的已选券,不能作为
52
+ * 取消勾选后的永久上限。积分卡的 balance_par_value 是积分值,不能直接
53
+ * 当作货币金额,因此继续沿用接口推荐金额。
54
+ */
55
+ function withWalletAssetRecalculationBaseAmount(asset) {
56
+ var existingBaseAmount = Number(asset === null || asset === void 0 ? void 0 : asset._wallet_asset_recalculation_base_amount);
57
+ if (Number.isFinite(existingBaseAmount) && existingBaseAmount >= 0) {
58
+ return asset;
59
+ }
60
+ if (!['product_voucher', 'gift_card'].includes(asset === null || asset === void 0 ? void 0 : asset.tag)) {
61
+ return asset;
62
+ }
63
+ var balanceParValue = Number(asset === null || asset === void 0 ? void 0 : asset.balance_par_value);
64
+ if (!Number.isFinite(balanceParValue) || balanceParValue < 0) {
65
+ return asset;
66
+ }
67
+ return _objectSpread(_objectSpread({}, asset), {}, {
68
+ _wallet_asset_recalculation_base_amount: balanceParValue
69
+ });
70
+ }
48
71
  function isWalletAssetAvailable(asset) {
49
72
  if (!asset) return false;
50
73
  if (asset.unified_available_status !== undefined && Number(asset.unified_available_status) !== 1) {
@@ -228,6 +251,36 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
228
251
  });
229
252
  }
230
253
 
254
+ /**
255
+ * 搜索接口只返回后端 Wallet Pass 数据,不包含前端策略 config。
256
+ * 在资产进入共享选择状态前补齐策略结果,避免增量重算回退到接口状态。
257
+ */
258
+ }, {
259
+ key: "formatSearchedWalletPaymentAssets",
260
+ value: function formatSearchedWalletPaymentAssets(assets) {
261
+ var _this$paymentModule$w3, _this$paymentModule$w4, _this$walletParams, _this$walletParams2;
262
+ if (!assets.length) return assets;
263
+ var assetsWithRecalculationBase = assets.map(withWalletAssetRecalculationBaseAmount);
264
+ var evaluator = (_this$paymentModule$w3 = this.paymentModule.window) === null || _this$paymentModule$w3 === void 0 || (_this$paymentModule$w4 = _this$paymentModule$w3.getWalletPassEvaluator) === null || _this$paymentModule$w4 === void 0 ? void 0 : _this$paymentModule$w4.call(_this$paymentModule$w3);
265
+ if (!(evaluator !== null && evaluator !== void 0 && evaluator.searchVoucherFormat)) return assetsWithRecalculationBase;
266
+ var hasCalculationProducts = this.walletAssetsCalculationContext.products.length > 0;
267
+ var products = hasCalculationProducts ? this.walletAssetsCalculationContext.products : ((_this$walletParams = this.walletParams) === null || _this$walletParams === void 0 ? void 0 : _this$walletParams.products) || [];
268
+ var orderTotalAmount = Number(hasCalculationProducts ? this.walletAssetsCalculationContext.orderTotalAmount : ((_this$walletParams2 = this.walletParams) === null || _this$walletParams2 === void 0 ? void 0 : _this$walletParams2.order_wait_pay_amount) || 0);
269
+ try {
270
+ var formattedAssets = evaluator.searchVoucherFormat({
271
+ orderTotalAmount: orderTotalAmount,
272
+ products: products,
273
+ vouchers: assetsWithRecalculationBase
274
+ });
275
+ return formattedAssets;
276
+ } catch (error) {
277
+ this.paymentModule.logWarning('[WalletPass] 搜索资产策略格式化失败,保留接口结果', {
278
+ error: error instanceof Error ? error.message : String(error)
279
+ });
280
+ return assetsWithRecalculationBase;
281
+ }
282
+ }
283
+
231
284
  /** 获取当前缓存中所有支付类 Wallet 资产的扫码 code。 */
232
285
  }, {
233
286
  key: "getSearchedWalletAssetCodes",
@@ -256,8 +309,19 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
256
309
  return code.toUpperCase();
257
310
  }));
258
311
  if (searchedCodeKeys.size === 0) return cachedAssets;
312
+ var cachedAssetByCode = new Map();
313
+ cachedAssets.forEach(function (item) {
314
+ getWalletAssetCodeKeys(item).forEach(function (code) {
315
+ cachedAssetByCode.set(code, item);
316
+ });
317
+ });
259
318
  var refreshedAssets = refreshedCandidates.filter(function (item) {
260
319
  return isWalletPaymentAsset(item) && searchedCodeKeys.has(String((item === null || item === void 0 ? void 0 : item.code) || '').trim().toUpperCase());
320
+ }).map(function (item) {
321
+ var cachedAsset = getWalletAssetCodeKeys(item).map(function (code) {
322
+ return cachedAssetByCode.get(code);
323
+ }).find(Boolean);
324
+ return withWalletAssetRecalculationBaseAmount(_objectSpread(_objectSpread({}, cachedAsset), item));
261
325
  });
262
326
  if (refreshedAssets.length > 0) {
263
327
  var replacedCodes = new Set(refreshedAssets.map(function (item) {
@@ -333,8 +397,14 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
333
397
  payment_order_id: payment_order_id
334
398
  };
335
399
 
336
- // 存储生成的参数到模块中
400
+ // 扫码可能早于异步 Wallet 初始化完成。walletParams 与前端增量重算
401
+ // 必须使用同一份当前购物车上下文,避免搜索按真实金额判断可用,
402
+ // 随后的 recalculateVouchers 却仍读取初始的 0 元/空商品上下文。
337
403
  this.walletParams = walletParams;
404
+ this.walletAssetsCalculationContext = {
405
+ orderTotalAmount: Number(walletParams.order_wait_pay_amount || 0),
406
+ products: Array.isArray(walletParams.products) ? walletParams.products : []
407
+ };
338
408
  this.paymentModule.logInfo('[WalletPass] 钱包默认参数已生成并存储', {
339
409
  customer_id: walletParams.customer_id,
340
410
  holder_id: walletParams.holder_id,
@@ -511,7 +581,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
511
581
  key: "initializeWalletDataAsync",
512
582
  value: (function () {
513
583
  var _initializeWalletDataAsync = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(baseParams) {
514
- var _this$paymentModule$w3, _this$paymentModule$w4, identificationParams, _yield$Promise$all, _yield$Promise$all2, allList, orderBasicDetail, walletPassEvaluator, products, res, recommended, transformList, noApplicableVoucher, recommendedAmount;
584
+ var _this$paymentModule$w5, _this$paymentModule$w6, identificationParams, _yield$Promise$all, _yield$Promise$all2, allList, orderBasicDetail, walletPassEvaluator, products, res, recommended, transformList, noApplicableVoucher, recommendedAmount;
515
585
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
516
586
  while (1) switch (_context3.prev = _context3.next) {
517
587
  case 0:
@@ -530,7 +600,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
530
600
  _yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2);
531
601
  allList = _yield$Promise$all2[0];
532
602
  orderBasicDetail = _yield$Promise$all2[1];
533
- walletPassEvaluator = (_this$paymentModule$w3 = this.paymentModule.window) === null || _this$paymentModule$w3 === void 0 || (_this$paymentModule$w4 = _this$paymentModule$w3.getWalletPassEvaluator) === null || _this$paymentModule$w4 === void 0 ? void 0 : _this$paymentModule$w4.call(_this$paymentModule$w3);
603
+ walletPassEvaluator = (_this$paymentModule$w5 = this.paymentModule.window) === null || _this$paymentModule$w5 === void 0 || (_this$paymentModule$w6 = _this$paymentModule$w5.getWalletPassEvaluator) === null || _this$paymentModule$w6 === void 0 ? void 0 : _this$paymentModule$w6.call(_this$paymentModule$w5);
534
604
  if (walletPassEvaluator) {
535
605
  _context3.next = 11;
536
606
  break;
@@ -598,7 +668,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
598
668
  key: "aggregateRecalculateWalletAssetsAsync",
599
669
  value: (function () {
600
670
  var _aggregateRecalculateWalletAssetsAsync = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(businessData, selectedIds) {
601
- var _this$paymentModule$w5, _this$paymentModule$w6;
671
+ var _this$paymentModule$w7, _this$paymentModule$w8;
602
672
  var walletParams, customerId, requestParams, response, responseData, hasAggregateLists, recalculateList, customerWalletPassList, allList, walletPassEvaluator, evaluated, returnedSelectedKeys, authoritativeSelectedIds;
603
673
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
604
674
  while (1) switch (_context4.prev = _context4.next) {
@@ -636,7 +706,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
636
706
  recalculateList = Array.isArray(responseData === null || responseData === void 0 ? void 0 : responseData.recalculate_list) ? responseData.recalculate_list : [];
637
707
  customerWalletPassList = Array.isArray(responseData === null || responseData === void 0 ? void 0 : responseData.customer_wallet_pass_list) ? responseData.customer_wallet_pass_list : [];
638
708
  allList = mergeWalletAssets(recalculateList, customerWalletPassList);
639
- walletPassEvaluator = (_this$paymentModule$w5 = this.paymentModule.window) === null || _this$paymentModule$w5 === void 0 || (_this$paymentModule$w6 = _this$paymentModule$w5.getWalletPassEvaluator) === null || _this$paymentModule$w6 === void 0 ? void 0 : _this$paymentModule$w6.call(_this$paymentModule$w5);
709
+ walletPassEvaluator = (_this$paymentModule$w7 = this.paymentModule.window) === null || _this$paymentModule$w7 === void 0 || (_this$paymentModule$w8 = _this$paymentModule$w7.getWalletPassEvaluator) === null || _this$paymentModule$w8 === void 0 ? void 0 : _this$paymentModule$w8.call(_this$paymentModule$w7);
640
710
  evaluated = walletPassEvaluator !== null && walletPassEvaluator !== void 0 && walletPassEvaluator.getRecommendedVouchers ? walletPassEvaluator.getRecommendedVouchers({
641
711
  orderTotalAmount: walletParams.order_wait_pay_amount,
642
712
  products: walletParams.products,
@@ -647,8 +717,10 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
647
717
  noApplicableVoucher: allList.filter(function (item) {
648
718
  return !isWalletAssetAvailable(item);
649
719
  })
650
- };
651
- returnedSelectedKeys = new Set(recalculateList.filter(isWalletAssetAvailable).map(function (item) {
720
+ }; // 聚合接口只负责刷新资产数据;选中资格最终由前端 evaluator 重算。
721
+ // 这里仅移除接口完全未返回的资产,不能把 recalculate_list 当作
722
+ // 策略选中结果,否则 customer_wallet_pass_list 中的可用券会被误取消。
723
+ returnedSelectedKeys = new Set(allList.map(function (item) {
652
724
  return getWalletAssetKey(item);
653
725
  }));
654
726
  authoritativeSelectedIds = selectedIds.filter(function (id) {
@@ -692,7 +764,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
692
764
  key: "getWalletPassRecommendListAsync",
693
765
  value: function () {
694
766
  var _getWalletPassRecommendListAsync = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(params) {
695
- var _this$walletParams, response;
767
+ var _this$walletParams3, response;
696
768
  return _regeneratorRuntime().wrap(function _callee5$(_context5) {
697
769
  while (1) switch (_context5.prev = _context5.next) {
698
770
  case 0:
@@ -701,7 +773,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
701
773
  customer_id: params.customer_id,
702
774
  order_expect_amount: params.order_expect_amount,
703
775
  sale_channel: params.sale_channel,
704
- payment_order_id: (_this$walletParams = this.walletParams) === null || _this$walletParams === void 0 ? void 0 : _this$walletParams.payment_order_id
776
+ payment_order_id: (_this$walletParams3 = this.walletParams) === null || _this$walletParams3 === void 0 ? void 0 : _this$walletParams3.payment_order_id
705
777
  });
706
778
  if (typeof params.payment_order_id === 'string' && params.payment_order_id.startsWith('LOCAL_')) {
707
779
  params.payment_order_id = undefined;
@@ -759,7 +831,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
759
831
  key: "getUserIdentificationCodeListAsync",
760
832
  value: function () {
761
833
  var _getUserIdentificationCodeListAsync = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(params) {
762
- var _newParams$products, _newParams$prepare_pa, _this$walletParams2, newParams, response, sortedData;
834
+ var _newParams$products, _newParams$prepare_pa, _this$walletParams4, newParams, response, sortedData;
763
835
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
764
836
  while (1) switch (_context6.prev = _context6.next) {
765
837
  case 0:
@@ -780,7 +852,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
780
852
  available: newParams.available,
781
853
  prepare_payments_count: ((_newParams$prepare_pa = newParams.prepare_payments) === null || _newParams$prepare_pa === void 0 ? void 0 : _newParams$prepare_pa.length) || 0,
782
854
  filter_prepare_wallet_pass: newParams.filter_prepare_wallet_pass,
783
- payment_order_id: (_this$walletParams2 = this.walletParams) === null || _this$walletParams2 === void 0 ? void 0 : _this$walletParams2.payment_order_id
855
+ payment_order_id: (_this$walletParams4 = this.walletParams) === null || _this$walletParams4 === void 0 ? void 0 : _this$walletParams4.payment_order_id
784
856
  });
785
857
  _context6.next = 9;
786
858
  return this.paymentModule.request.post('/machinecode/prepare/deduction', newParams);
@@ -1019,6 +1091,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1019
1091
  selectedIds,
1020
1092
  selectionSources,
1021
1093
  scanSelectedAssets,
1094
+ manualEditAmountByKey,
1022
1095
  restoredSearchedAssets,
1023
1096
  searchedWalletAssetCodes,
1024
1097
  useAggregateRecalculate,
@@ -1061,11 +1134,20 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1061
1134
  scanSelectedAssets = preserveSelection ? this.walletAssetsState.selectedItems.filter(function (asset) {
1062
1135
  var assetId = getWalletAssetId(asset);
1063
1136
  return assetId !== undefined && assetId !== null && selectionSources[String(assetId)] === 'scan';
1064
- }) : []; // aggregate-recalculate 不接受空商品列表。
1137
+ }) : [];
1138
+ manualEditAmountByKey = new Map();
1139
+ if (preserveSelection) {
1140
+ this.walletAssetsState.selectedItems.forEach(function (asset) {
1141
+ if (typeof (asset === null || asset === void 0 ? void 0 : asset.edit_current_amount) !== 'number') return;
1142
+ manualEditAmountByKey.set(getWalletAssetKey(asset), asset.edit_current_amount);
1143
+ });
1144
+ }
1145
+
1146
+ // aggregate-recalculate 不接受空商品列表。
1065
1147
  // 清空购物车时保留扫码资产供后续加购恢复;只有手动 Remove/Clear
1066
1148
  // 会取消自动应用资格,商品变化导致的自动失效需要重新进入待选队列。
1067
1149
  if ((_businessData$product2 = businessData.products) !== null && _businessData$product2 !== void 0 && _businessData$product2.length) {
1068
- _context8.next = 22;
1150
+ _context8.next = 24;
1069
1151
  break;
1070
1152
  }
1071
1153
  this.queuePendingAutoSelectForAssets(scanSelectedAssets);
@@ -1103,7 +1185,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1103
1185
  totalSelectedAmount: 0,
1104
1186
  error: null
1105
1187
  }));
1106
- case 22:
1188
+ case 24:
1107
1189
  this.publishWalletAssetsState({
1108
1190
  status: 'loading',
1109
1191
  customerId: nextCustomerId,
@@ -1114,40 +1196,40 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1114
1196
  totalSelectedAmount: preserveSelection ? this.walletAssetsState.totalSelectedAmount : 0,
1115
1197
  error: null
1116
1198
  });
1117
- _context8.prev = 23;
1199
+ _context8.prev = 25;
1118
1200
  searchedWalletAssetCodes = preserveSelection ? this.getSearchedWalletAssetCodes() : [];
1119
1201
  useAggregateRecalculate = preserveSelection && (selectedIds.length > 0 || searchedWalletAssetCodes.length > 0);
1120
1202
  if (!useAggregateRecalculate) {
1121
- _context8.next = 32;
1203
+ _context8.next = 34;
1122
1204
  break;
1123
1205
  }
1124
- _context8.next = 29;
1206
+ _context8.next = 31;
1125
1207
  return this.aggregateRecalculateWalletAssetsAsync(businessData, selectedIds);
1126
- case 29:
1208
+ case 31:
1127
1209
  _context8.t0 = _context8.sent;
1128
- _context8.next = 33;
1210
+ _context8.next = 35;
1129
1211
  break;
1130
- case 32:
1212
+ case 34:
1131
1213
  _context8.t0 = null;
1132
- case 33:
1214
+ case 35:
1133
1215
  aggregateResult = _context8.t0;
1134
1216
  _context8.t1 = aggregateResult;
1135
1217
  if (_context8.t1) {
1136
- _context8.next = 39;
1218
+ _context8.next = 41;
1137
1219
  break;
1138
1220
  }
1139
- _context8.next = 38;
1221
+ _context8.next = 40;
1140
1222
  return this.initializeWalletDataFromBusinessAsync(businessData);
1141
- case 38:
1223
+ case 40:
1142
1224
  _context8.t1 = _context8.sent;
1143
- case 39:
1225
+ case 41:
1144
1226
  result = _context8.t1;
1145
1227
  if (!(requestSequence !== this.walletAssetsRequestSequence)) {
1146
- _context8.next = 42;
1228
+ _context8.next = 44;
1147
1229
  break;
1148
1230
  }
1149
1231
  return _context8.abrupt("return", this.getWalletAssetsState());
1150
- case 42:
1232
+ case 44:
1151
1233
  this.walletAssetsCalculationContext = {
1152
1234
  orderTotalAmount: Number(businessData.order_wait_pay_amount || 0),
1153
1235
  products: result.products || businessData.products || []
@@ -1170,17 +1252,20 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1170
1252
  }
1171
1253
  searchedWalletAssets = preserveSelection ? this.syncSearchedWalletAssets([].concat(_toConsumableArray(result.transformList || []), _toConsumableArray(result.noApplicableVoucher || []))) : [];
1172
1254
  if (!(requestSequence !== this.walletAssetsRequestSequence)) {
1173
- _context8.next = 48;
1255
+ _context8.next = 50;
1174
1256
  break;
1175
1257
  }
1176
1258
  return _context8.abrupt("return", this.getWalletAssetsState());
1177
- case 48:
1259
+ case 50:
1178
1260
  recommendedKeys = new Set((result.walletRecommendList || []).map(function (asset) {
1179
1261
  return getWalletAssetKey(asset);
1180
1262
  }));
1181
1263
  items = mergeWalletAssets(preserveSelection && !aggregateResult ? this.walletAssetsState.selectedItems : [], searchedWalletAssets, result.transformList || [], result.noApplicableVoucher || []).map(function (asset) {
1182
- return _objectSpread(_objectSpread({}, asset), {}, {
1183
- _wallet_asset_recommended: recommendedKeys.has(getWalletAssetKey(asset))
1264
+ var assetKey = getWalletAssetKey(asset);
1265
+ return _objectSpread(_objectSpread(_objectSpread({}, asset), manualEditAmountByKey.has(assetKey) ? {
1266
+ edit_current_amount: manualEditAmountByKey.get(assetKey)
1267
+ } : {}), {}, {
1268
+ _wallet_asset_recommended: recommendedKeys.has(assetKey)
1184
1269
  });
1185
1270
  });
1186
1271
  latestSelectedIds = preserveSelection ? authoritativeSelectedIds : [];
@@ -1217,15 +1302,15 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1217
1302
  });
1218
1303
  this.queuePendingAutoSelectForAssets(droppedScanSelectedAssets);
1219
1304
  return _context8.abrupt("return", nextState);
1220
- case 63:
1221
- _context8.prev = 63;
1222
- _context8.t2 = _context8["catch"](23);
1305
+ case 65:
1306
+ _context8.prev = 65;
1307
+ _context8.t2 = _context8["catch"](25);
1223
1308
  if (!(requestSequence !== this.walletAssetsRequestSequence)) {
1224
- _context8.next = 67;
1309
+ _context8.next = 69;
1225
1310
  break;
1226
1311
  }
1227
1312
  return _context8.abrupt("return", this.getWalletAssetsState());
1228
- case 67:
1313
+ case 69:
1229
1314
  this.paymentModule.logError('[WalletPass] 刷新共享钱包资产失败,保留刷新前状态', _context8.t2, {
1230
1315
  customer_id: businessData.customer_id,
1231
1316
  selected_ids: selectedIds,
@@ -1241,11 +1326,11 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1241
1326
  customerId: nextCustomerId,
1242
1327
  error: _context8.t2 instanceof Error ? _context8.t2.message : String(_context8.t2)
1243
1328
  }));
1244
- case 69:
1329
+ case 71:
1245
1330
  case "end":
1246
1331
  return _context8.stop();
1247
1332
  }
1248
- }, _callee8, this, [[23, 63]]);
1333
+ }, _callee8, this, [[25, 65]]);
1249
1334
  }));
1250
1335
  function refreshWalletAssetsFromBusinessAsync(_x9) {
1251
1336
  return _refreshWalletAssetsFromBusinessAsync.apply(this, arguments);
@@ -1298,6 +1383,17 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1298
1383
  selectionSources: snapshot.state.selectionSources || {}
1299
1384
  }));
1300
1385
  }
1386
+ }, {
1387
+ key: "updateWalletAssetEditAmountInCaches",
1388
+ value: function updateWalletAssetEditAmountInCaches(assetKey, amount) {
1389
+ var updateAsset = function updateAsset(asset) {
1390
+ return getWalletAssetKey(asset) === assetKey ? _objectSpread(_objectSpread({}, asset), {}, {
1391
+ edit_current_amount: amount
1392
+ }) : asset;
1393
+ };
1394
+ this.searchResults = this.searchResults.map(updateAsset);
1395
+ return this.walletAssetsState.items.map(updateAsset);
1396
+ }
1301
1397
  }, {
1302
1398
  key: "selectWalletAsset",
1303
1399
  value: function selectWalletAsset(assetId, options) {
@@ -1314,6 +1410,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1314
1410
  });
1315
1411
  var selectionSources = _objectSpread({}, this.walletAssetsState.selectionSources);
1316
1412
  delete selectionSources[assetKey];
1413
+ var nextItems = this.walletAssetsState.items;
1317
1414
  if (options.selected) {
1318
1415
  if (!asset || !isWalletAssetAvailable(asset)) {
1319
1416
  return this.getWalletAssetsState();
@@ -1322,8 +1419,9 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1322
1419
  selectionSources[assetKey] = options.source || 'manual';
1323
1420
  } else if (asset) {
1324
1421
  this.clearPendingAutoSelectForAsset(asset);
1422
+ nextItems = this.updateWalletAssetEditAmountInCaches(assetKey, undefined);
1325
1423
  }
1326
- var nextState = this.recalculateWalletAssets(this.walletAssetsState.items, selectedIds, selectionSources);
1424
+ var nextState = this.recalculateWalletAssets(nextItems, selectedIds, selectionSources);
1327
1425
  if (options.selected && asset && nextState.selectedIds.some(function (id) {
1328
1426
  return String(id) === assetKey;
1329
1427
  })) {
@@ -1331,11 +1429,49 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1331
1429
  }
1332
1430
  return nextState;
1333
1431
  }
1432
+
1433
+ /**
1434
+ * 更新已选资产的手动金额。只允许在当前实际抵扣额内向下调整,
1435
+ * 金额为 0 时沿用 legacy 行为取消选择。
1436
+ */
1437
+ }, {
1438
+ key: "updateWalletAssetAmount",
1439
+ value: function updateWalletAssetAmount(assetId, amount) {
1440
+ var assetKey = String(assetId);
1441
+ var committedKeys = new Set(this.walletAssetsState.committedIds.map(function (id) {
1442
+ return String(id);
1443
+ }));
1444
+ var selectedKeys = new Set(this.walletAssetsState.selectedIds.map(function (id) {
1445
+ return String(id);
1446
+ }));
1447
+ var asset = this.walletAssetsState.items.find(function (item) {
1448
+ return getWalletAssetKey(item) === assetKey;
1449
+ });
1450
+ var requestedAmount = Number(amount);
1451
+ if (!asset || committedKeys.has(assetKey) || !selectedKeys.has(assetKey) || !Number.isFinite(requestedAmount) || requestedAmount < 0) {
1452
+ return this.getWalletAssetsState();
1453
+ }
1454
+ var selectedIds = _toConsumableArray(this.walletAssetsState.selectedIds);
1455
+ var selectionSources = _objectSpread({}, this.walletAssetsState.selectionSources);
1456
+ if (requestedAmount === 0) {
1457
+ var _nextItems = this.updateWalletAssetEditAmountInCaches(assetKey, undefined);
1458
+ delete selectionSources[assetKey];
1459
+ this.clearPendingAutoSelectForAsset(asset);
1460
+ return this.recalculateWalletAssets(_nextItems, selectedIds.filter(function (id) {
1461
+ return String(id) !== assetKey;
1462
+ }), selectionSources);
1463
+ }
1464
+ var currentDeductionAmount = getWalletAssetDeductionAmount(asset);
1465
+ var editAmount = Math.min(requestedAmount, currentDeductionAmount);
1466
+ if (editAmount <= 0) return this.getWalletAssetsState();
1467
+ var nextItems = this.updateWalletAssetEditAmountInCaches(assetKey, editAmount);
1468
+ return this.recalculateWalletAssets(nextItems, selectedIds, selectionSources);
1469
+ }
1334
1470
  }, {
1335
1471
  key: "scanWalletAssetAsync",
1336
1472
  value: function () {
1337
1473
  var _scanWalletAssetAsync = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(code) {
1338
- var normalizedCode, selectedAsset, result, paymentAssets, asset, items, recalculatedState, assetId, selected, isSelected;
1474
+ var normalizedCode, selectedAsset, result, paymentAssets, asset, items, recalculatedState, assetId, recalculatedAsset, selected, isSelected, selectedStateAsset, resolvedAsset;
1339
1475
  return _regeneratorRuntime().wrap(function _callee9$(_context9) {
1340
1476
  while (1) switch (_context9.prev = _context9.next) {
1341
1477
  case 0:
@@ -1372,12 +1508,15 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1372
1508
  }));
1373
1509
  case 9:
1374
1510
  result = _context9.sent;
1375
- paymentAssets = result.data.filter(isWalletPaymentAsset);
1511
+ paymentAssets = this.formatSearchedWalletPaymentAssets(result.data.filter(isWalletPaymentAsset));
1512
+ if (paymentAssets.length > 0) {
1513
+ this.searchResults = mergeWalletAssets(this.searchResults, paymentAssets);
1514
+ }
1376
1515
  asset = paymentAssets.find(function (item) {
1377
1516
  return String((item === null || item === void 0 ? void 0 : item.code) || '') === normalizedCode;
1378
1517
  }) || paymentAssets[0];
1379
1518
  if (!(!asset || result.type === 'walletCode')) {
1380
- _context9.next = 14;
1519
+ _context9.next = 15;
1381
1520
  break;
1382
1521
  }
1383
1522
  return _context9.abrupt("return", {
@@ -1386,30 +1525,37 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1386
1525
  selected: false,
1387
1526
  state: this.getWalletAssetsState()
1388
1527
  });
1389
- case 14:
1528
+ case 15:
1390
1529
  items = mergeWalletAssets(this.walletAssetsState.items, [asset]);
1391
1530
  recalculatedState = this.recalculateWalletAssets(items, this.walletAssetsState.selectedIds, this.walletAssetsState.selectionSources);
1392
1531
  assetId = getWalletAssetId(asset);
1393
- selected = this.walletAssetsBehavior.autoSelectAfterSearch && assetId !== undefined && isWalletAssetAvailable(asset) ? this.selectWalletAsset(assetId, {
1532
+ recalculatedAsset = assetId === undefined ? undefined : recalculatedState.items.find(function (item) {
1533
+ return getWalletAssetKey(item) === String(assetId);
1534
+ });
1535
+ selected = this.walletAssetsBehavior.autoSelectAfterSearch && assetId !== undefined && isWalletAssetAvailable(recalculatedAsset) ? this.selectWalletAsset(assetId, {
1394
1536
  selected: true,
1395
1537
  source: 'scan'
1396
1538
  }) : recalculatedState;
1397
1539
  isSelected = assetId !== undefined && selected.selectedIds.some(function (id) {
1398
1540
  return String(id) === String(assetId);
1399
1541
  });
1542
+ selectedStateAsset = assetId === undefined ? undefined : selected.items.find(function (item) {
1543
+ return getWalletAssetKey(item) === String(assetId);
1544
+ });
1545
+ resolvedAsset = selectedStateAsset || recalculatedAsset || asset;
1400
1546
  if (isSelected) {
1401
- this.clearPendingAutoSelectForAsset(asset);
1547
+ this.clearPendingAutoSelectForAsset(resolvedAsset);
1402
1548
  } else if (this.walletAssetsBehavior.autoSelectAfterSearch) {
1403
1549
  this.pendingAutoSelectSearchCodes.add(normalizeWalletAssetCode(normalizedCode));
1404
- this.queuePendingAutoSelectForAssets([asset]);
1550
+ this.queuePendingAutoSelectForAssets([resolvedAsset]);
1405
1551
  }
1406
1552
  return _context9.abrupt("return", {
1407
1553
  type: result.type,
1408
- asset: asset,
1554
+ asset: resolvedAsset,
1409
1555
  selected: isSelected,
1410
1556
  state: selected
1411
1557
  });
1412
- case 21:
1558
+ case 25:
1413
1559
  case "end":
1414
1560
  return _context9.stop();
1415
1561
  }
@@ -1424,7 +1570,16 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
1424
1570
  key: "clearWalletAssetSelection",
1425
1571
  value: function clearWalletAssetSelection() {
1426
1572
  this.pendingAutoSelectSearchCodes.clear();
1427
- return this.recalculateWalletAssets(this.walletAssetsState.items, [], {});
1573
+ var selectedKeys = new Set(this.walletAssetsState.selectedIds.map(function (id) {
1574
+ return String(id);
1575
+ }));
1576
+ var clearSelectedEditAmount = function clearSelectedEditAmount(asset) {
1577
+ return selectedKeys.has(getWalletAssetKey(asset)) ? _objectSpread(_objectSpread({}, asset), {}, {
1578
+ edit_current_amount: undefined
1579
+ }) : asset;
1580
+ };
1581
+ this.searchResults = this.searchResults.map(clearSelectedEditAmount);
1582
+ return this.recalculateWalletAssets(this.walletAssetsState.items.map(clearSelectedEditAmount), [], {});
1428
1583
  }
1429
1584
  }, {
1430
1585
  key: "setCommittedWalletAssets",
@@ -225,7 +225,8 @@ export var ProductList = /*#__PURE__*/function (_BaseModule) {
225
225
  is_eject: 1,
226
226
  with_schedule: with_schedule,
227
227
  schedule_datetime: schedule_datetime,
228
- extension_type: extension_type
228
+ extension_type: extension_type,
229
+ strategy_context: strategy_context
229
230
  });
230
231
  _context4.next = 11;
231
232
  return this.request.post("/product/query", queryPayload, {
@@ -9,8 +9,6 @@ export declare class QuotationModule extends BaseModule implements Module {
9
9
  private request;
10
10
  private store;
11
11
  private scheduleResolver?;
12
- private app;
13
- private quotationListUpdatedListener?;
14
12
  constructor(name?: string, version?: string);
15
13
  initialize(core: PisellCore, options: ModuleOptions): Promise<void>;
16
14
  loadQuotations(params?: {
@@ -18,7 +16,6 @@ export declare class QuotationModule extends BaseModule implements Module {
18
16
  customer_id?: number | string;
19
17
  }): Promise<void>;
20
18
  getQuotationList(): QuotationItem[];
21
- setQuotationListUpdatedListener(listener?: () => void): void;
22
19
  getQuotationCustomerScopeInfo(): QuotationCustomerScopeInfo;
23
20
  /**
24
21
  * Look up the quotation price for a specific product (+ optional variant) at a given datetime.
@@ -63,9 +60,6 @@ export declare class QuotationModule extends BaseModule implements Module {
63
60
  customer_id?: number | string;
64
61
  }): Map<string, string | null>;
65
62
  setScheduleResolver(resolver: (id: number) => ScheduleItem | undefined): void;
66
- private applyQuotationResponse;
67
- private notifyQuotationListUpdated;
68
- private getQuotationCacheKeyData;
69
63
  private isQuotationVisibleForCustomer;
70
64
  private hasValidCustomerId;
71
65
  private normalizeCustomerId;