@pisell/pisellos 2.3.50 → 2.3.51
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.
- package/dist/modules/Order/index.d.ts +1 -1
- package/dist/modules/Payment/types.d.ts +8 -0
- package/dist/modules/Payment/walletpass.d.ts +7 -1
- package/dist/modules/Payment/walletpass.js +155 -45
- package/dist/server/modules/index.d.ts +1 -1
- package/dist/server/modules/order/index.d.ts +16 -0
- package/dist/server/modules/order/index.js +964 -776
- package/dist/server/modules/order/types.d.ts +14 -0
- package/dist/server/modules/order/types.js +6 -0
- package/dist/solution/BaseSales/index.d.ts +3 -1
- package/dist/solution/BaseSales/index.js +8 -0
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.d.ts +1 -1
- package/lib/modules/Order/index.d.ts +1 -1
- package/lib/modules/Payment/types.d.ts +8 -0
- package/lib/modules/Payment/walletpass.d.ts +7 -1
- package/lib/modules/Payment/walletpass.js +107 -9
- package/lib/server/modules/index.d.ts +1 -1
- package/lib/server/modules/order/index.d.ts +16 -0
- package/lib/server/modules/order/index.js +140 -4
- package/lib/server/modules/order/types.d.ts +14 -0
- package/lib/server/modules/order/types.js +1 -0
- package/lib/solution/BaseSales/index.d.ts +3 -1
- package/lib/solution/BaseSales/index.js +6 -0
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -487,7 +487,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
|
|
|
487
487
|
generateIdempotencyToken(): string;
|
|
488
488
|
syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
|
|
489
489
|
createOrder(params: CommitOrderParams['query']): {
|
|
490
|
-
type: "
|
|
490
|
+
type: "virtual" | "appointment_booking";
|
|
491
491
|
platform: string;
|
|
492
492
|
sales_channel: string;
|
|
493
493
|
order_sales_channel: string;
|
|
@@ -397,12 +397,18 @@ export interface WalletAssetsState {
|
|
|
397
397
|
export interface WalletAssetsSnapshot {
|
|
398
398
|
state: WalletAssetsState;
|
|
399
399
|
searchResults: SearchIdentificationCodeItem[];
|
|
400
|
+
/** 已搜索但尚未满足订单条件、等待首次可用后自动选中的 Wallet Asset code。 */
|
|
401
|
+
pendingAutoSelectSearchCodes?: string[];
|
|
400
402
|
walletParams: WalletDeductionRecommendParams | null;
|
|
401
403
|
calculationContext: {
|
|
402
404
|
orderTotalAmount: number;
|
|
403
405
|
products: any[];
|
|
404
406
|
};
|
|
405
407
|
}
|
|
408
|
+
export interface WalletAssetsBehaviorOptions {
|
|
409
|
+
/** 搜索到 Wallet Asset 后,当前或后续首次可用时是否自动选中。 */
|
|
410
|
+
autoSelectAfterSearch?: boolean;
|
|
411
|
+
}
|
|
406
412
|
export interface RefreshWalletAssetsOptions {
|
|
407
413
|
/** 商品/金额变化默认保留并重验选择;客户变化由实现层强制清空。 */
|
|
408
414
|
preserveSelection?: boolean;
|
|
@@ -472,6 +478,8 @@ export interface WalletPassPayment {
|
|
|
472
478
|
refreshWalletAssetsFromBusinessAsync: (businessData: WalletInitBusinessData, options?: RefreshWalletAssetsOptions) => Promise<WalletAssetsState>;
|
|
473
479
|
/** 获取共享钱包资产状态快照。 */
|
|
474
480
|
getWalletAssetsState: () => WalletAssetsState;
|
|
481
|
+
/** 配置仅影响 Wallet Assets 的交互行为。 */
|
|
482
|
+
configureWalletAssetsBehavior: (options: WalletAssetsBehaviorOptions) => void;
|
|
475
483
|
/** 导出供 Shared Checkout 跨运行时传递的 Wallet Assets 快照。 */
|
|
476
484
|
exportWalletAssetsSnapshot: () => WalletAssetsSnapshot;
|
|
477
485
|
/** 恢复 Shared Checkout 传回的 Wallet Assets 快照。 */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WalletPassPayment, WalletDeductionRecommendParams, WalletRecommendItem, UserIdentificationCodeParams, UserIdentificationCodeItem, SearchIdentificationCodeParams, SearchIdentificationCodeItem, SearchIdentificationCodeResult, WalletInitBusinessData, WalletAssetId, WalletAssetsSnapshot, WalletAssetsState, RefreshWalletAssetsOptions, SelectWalletAssetOptions, ScanWalletAssetResult } from './types';
|
|
1
|
+
import { WalletPassPayment, WalletDeductionRecommendParams, WalletRecommendItem, UserIdentificationCodeParams, UserIdentificationCodeItem, SearchIdentificationCodeParams, SearchIdentificationCodeItem, SearchIdentificationCodeResult, WalletInitBusinessData, WalletAssetId, WalletAssetsBehaviorOptions, WalletAssetsSnapshot, WalletAssetsState, RefreshWalletAssetsOptions, SelectWalletAssetOptions, ScanWalletAssetResult } from './types';
|
|
2
2
|
import type { PaymentModule } from './index';
|
|
3
3
|
/**
|
|
4
4
|
* 钱包支付实现
|
|
@@ -12,8 +12,11 @@ export declare class WalletPassPaymentImpl implements WalletPassPayment {
|
|
|
12
12
|
private walletInitData;
|
|
13
13
|
private walletAssetsState;
|
|
14
14
|
private walletAssetsRequestSequence;
|
|
15
|
+
private walletAssetsBehavior;
|
|
16
|
+
private pendingAutoSelectSearchCodes;
|
|
15
17
|
private walletAssetsCalculationContext;
|
|
16
18
|
constructor(paymentModule: PaymentModule);
|
|
19
|
+
configureWalletAssetsBehavior(options: WalletAssetsBehaviorOptions): void;
|
|
17
20
|
/**
|
|
18
21
|
* 发送事件的辅助方法
|
|
19
22
|
* 支持使用WalletPassHooks或PaymentHooks
|
|
@@ -28,6 +31,9 @@ export declare class WalletPassPaymentImpl implements WalletPassPayment {
|
|
|
28
31
|
* 接口暂时缺失某个扫码 code 时继续保留旧值,避免列表闪空。
|
|
29
32
|
*/
|
|
30
33
|
private syncSearchedWalletAssets;
|
|
34
|
+
private isPendingAutoSelectAsset;
|
|
35
|
+
private clearPendingAutoSelectForAsset;
|
|
36
|
+
private queuePendingAutoSelectForAssets;
|
|
31
37
|
/**
|
|
32
38
|
* 生成钱包API默认参数
|
|
33
39
|
* 根据业务数据生成标准的钱包API参数,并存储在模块中
|
|
@@ -39,6 +39,12 @@ function matchesWalletAssetCode(asset, normalizedCode) {
|
|
|
39
39
|
return String(identifier !== null && identifier !== void 0 ? identifier : '').trim() === normalizedCode;
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
|
+
function normalizeWalletAssetCode(code) {
|
|
43
|
+
return String(code !== null && code !== void 0 ? code : '').trim().toUpperCase();
|
|
44
|
+
}
|
|
45
|
+
function getWalletAssetCodeKeys(asset) {
|
|
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
|
+
}
|
|
42
48
|
function isWalletAssetAvailable(asset) {
|
|
43
49
|
if (!asset) return false;
|
|
44
50
|
if (asset.unified_available_status !== undefined && Number(asset.unified_available_status) !== 1) {
|
|
@@ -102,18 +108,31 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
102
108
|
_defineProperty(this, "walletInitData", null);
|
|
103
109
|
_defineProperty(this, "walletAssetsState", createInitialWalletAssetsState());
|
|
104
110
|
_defineProperty(this, "walletAssetsRequestSequence", 0);
|
|
111
|
+
_defineProperty(this, "walletAssetsBehavior", {
|
|
112
|
+
autoSelectAfterSearch: true
|
|
113
|
+
});
|
|
114
|
+
_defineProperty(this, "pendingAutoSelectSearchCodes", new Set());
|
|
105
115
|
_defineProperty(this, "walletAssetsCalculationContext", {
|
|
106
116
|
orderTotalAmount: 0,
|
|
107
117
|
products: []
|
|
108
118
|
});
|
|
109
119
|
this.paymentModule = paymentModule;
|
|
110
120
|
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* 发送事件的辅助方法
|
|
114
|
-
* 支持使用WalletPassHooks或PaymentHooks
|
|
115
|
-
*/
|
|
116
121
|
_createClass(WalletPassPaymentImpl, [{
|
|
122
|
+
key: "configureWalletAssetsBehavior",
|
|
123
|
+
value: function configureWalletAssetsBehavior(options) {
|
|
124
|
+
if (options.autoSelectAfterSearch === undefined) return;
|
|
125
|
+
this.walletAssetsBehavior.autoSelectAfterSearch = options.autoSelectAfterSearch;
|
|
126
|
+
if (!options.autoSelectAfterSearch) {
|
|
127
|
+
this.pendingAutoSelectSearchCodes.clear();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* 发送事件的辅助方法
|
|
133
|
+
* 支持使用WalletPassHooks或PaymentHooks
|
|
134
|
+
*/
|
|
135
|
+
}, {
|
|
117
136
|
key: "emitEvent",
|
|
118
137
|
value: function emitEvent(hook, data) {
|
|
119
138
|
try {
|
|
@@ -250,6 +269,33 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
250
269
|
}
|
|
251
270
|
return mergeWalletAssets(cachedAssets, refreshedAssets);
|
|
252
271
|
}
|
|
272
|
+
}, {
|
|
273
|
+
key: "isPendingAutoSelectAsset",
|
|
274
|
+
value: function isPendingAutoSelectAsset(asset) {
|
|
275
|
+
var _this = this;
|
|
276
|
+
return getWalletAssetCodeKeys(asset).some(function (code) {
|
|
277
|
+
return _this.pendingAutoSelectSearchCodes.has(code);
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}, {
|
|
281
|
+
key: "clearPendingAutoSelectForAsset",
|
|
282
|
+
value: function clearPendingAutoSelectForAsset(asset) {
|
|
283
|
+
var _this2 = this;
|
|
284
|
+
getWalletAssetCodeKeys(asset).forEach(function (code) {
|
|
285
|
+
_this2.pendingAutoSelectSearchCodes.delete(code);
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}, {
|
|
289
|
+
key: "queuePendingAutoSelectForAssets",
|
|
290
|
+
value: function queuePendingAutoSelectForAssets(assets) {
|
|
291
|
+
var _this3 = this;
|
|
292
|
+
if (!this.walletAssetsBehavior.autoSelectAfterSearch) return;
|
|
293
|
+
assets.forEach(function (asset) {
|
|
294
|
+
getWalletAssetCodeKeys(asset).forEach(function (code) {
|
|
295
|
+
_this3.pendingAutoSelectSearchCodes.add(code);
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
}
|
|
253
299
|
|
|
254
300
|
/**
|
|
255
301
|
* 生成钱包API默认参数
|
|
@@ -960,7 +1006,8 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
960
1006
|
key: "refreshWalletAssetsFromBusinessAsync",
|
|
961
1007
|
value: (function () {
|
|
962
1008
|
var _refreshWalletAssetsFromBusinessAsync = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(businessData) {
|
|
963
|
-
var _businessData$product2
|
|
1009
|
+
var _businessData$product2,
|
|
1010
|
+
_this4 = this;
|
|
964
1011
|
var options,
|
|
965
1012
|
requestSequence,
|
|
966
1013
|
nextCustomerId,
|
|
@@ -971,6 +1018,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
971
1018
|
committedItems,
|
|
972
1019
|
selectedIds,
|
|
973
1020
|
selectionSources,
|
|
1021
|
+
scanSelectedAssets,
|
|
974
1022
|
restoredSearchedAssets,
|
|
975
1023
|
searchedWalletAssetCodes,
|
|
976
1024
|
useAggregateRecalculate,
|
|
@@ -984,6 +1032,11 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
984
1032
|
items,
|
|
985
1033
|
latestSelectedIds,
|
|
986
1034
|
latestSelectionSources,
|
|
1035
|
+
pendingAutoSelectAssets,
|
|
1036
|
+
requestedKeySet,
|
|
1037
|
+
nextState,
|
|
1038
|
+
selectedKeySet,
|
|
1039
|
+
droppedScanSelectedAssets,
|
|
987
1040
|
_args8 = arguments;
|
|
988
1041
|
return _regeneratorRuntime().wrap(function _callee8$(_context8) {
|
|
989
1042
|
while (1) switch (_context8.prev = _context8.next) {
|
|
@@ -1004,12 +1057,18 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1004
1057
|
return committedKeys.has(getWalletAssetKey(item));
|
|
1005
1058
|
});
|
|
1006
1059
|
selectedIds = preserveSelection ? _toConsumableArray(this.walletAssetsState.selectedIds) : [];
|
|
1007
|
-
selectionSources = preserveSelection ? _objectSpread({}, this.walletAssetsState.selectionSources) : {};
|
|
1008
|
-
|
|
1060
|
+
selectionSources = preserveSelection ? _objectSpread({}, this.walletAssetsState.selectionSources) : {};
|
|
1061
|
+
scanSelectedAssets = preserveSelection ? this.walletAssetsState.selectedItems.filter(function (asset) {
|
|
1062
|
+
var assetId = getWalletAssetId(asset);
|
|
1063
|
+
return assetId !== undefined && assetId !== null && selectionSources[String(assetId)] === 'scan';
|
|
1064
|
+
}) : []; // aggregate-recalculate 不接受空商品列表。
|
|
1065
|
+
// 清空购物车时保留扫码资产供后续加购恢复;只有手动 Remove/Clear
|
|
1066
|
+
// 会取消自动应用资格,商品变化导致的自动失效需要重新进入待选队列。
|
|
1009
1067
|
if ((_businessData$product2 = businessData.products) !== null && _businessData$product2 !== void 0 && _businessData$product2.length) {
|
|
1010
|
-
_context8.next =
|
|
1068
|
+
_context8.next = 22;
|
|
1011
1069
|
break;
|
|
1012
1070
|
}
|
|
1071
|
+
this.queuePendingAutoSelectForAssets(scanSelectedAssets);
|
|
1013
1072
|
this.generateWalletParams(businessData);
|
|
1014
1073
|
restoredSearchedAssets = this.searchResults.filter(isWalletPaymentAsset).map(function (item) {
|
|
1015
1074
|
return _objectSpread(_objectSpread({}, item), {}, {
|
|
@@ -1044,7 +1103,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1044
1103
|
totalSelectedAmount: 0,
|
|
1045
1104
|
error: null
|
|
1046
1105
|
}));
|
|
1047
|
-
case
|
|
1106
|
+
case 22:
|
|
1048
1107
|
this.publishWalletAssetsState({
|
|
1049
1108
|
status: 'loading',
|
|
1050
1109
|
customerId: nextCustomerId,
|
|
@@ -1055,40 +1114,40 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1055
1114
|
totalSelectedAmount: preserveSelection ? this.walletAssetsState.totalSelectedAmount : 0,
|
|
1056
1115
|
error: null
|
|
1057
1116
|
});
|
|
1058
|
-
_context8.prev =
|
|
1117
|
+
_context8.prev = 23;
|
|
1059
1118
|
searchedWalletAssetCodes = preserveSelection ? this.getSearchedWalletAssetCodes() : [];
|
|
1060
1119
|
useAggregateRecalculate = preserveSelection && (selectedIds.length > 0 || searchedWalletAssetCodes.length > 0);
|
|
1061
1120
|
if (!useAggregateRecalculate) {
|
|
1062
|
-
_context8.next =
|
|
1121
|
+
_context8.next = 32;
|
|
1063
1122
|
break;
|
|
1064
1123
|
}
|
|
1065
|
-
_context8.next =
|
|
1124
|
+
_context8.next = 29;
|
|
1066
1125
|
return this.aggregateRecalculateWalletAssetsAsync(businessData, selectedIds);
|
|
1067
|
-
case
|
|
1126
|
+
case 29:
|
|
1068
1127
|
_context8.t0 = _context8.sent;
|
|
1069
|
-
_context8.next =
|
|
1128
|
+
_context8.next = 33;
|
|
1070
1129
|
break;
|
|
1071
|
-
case
|
|
1130
|
+
case 32:
|
|
1072
1131
|
_context8.t0 = null;
|
|
1073
|
-
case
|
|
1132
|
+
case 33:
|
|
1074
1133
|
aggregateResult = _context8.t0;
|
|
1075
1134
|
_context8.t1 = aggregateResult;
|
|
1076
1135
|
if (_context8.t1) {
|
|
1077
|
-
_context8.next =
|
|
1136
|
+
_context8.next = 39;
|
|
1078
1137
|
break;
|
|
1079
1138
|
}
|
|
1080
|
-
_context8.next =
|
|
1139
|
+
_context8.next = 38;
|
|
1081
1140
|
return this.initializeWalletDataFromBusinessAsync(businessData);
|
|
1082
|
-
case
|
|
1141
|
+
case 38:
|
|
1083
1142
|
_context8.t1 = _context8.sent;
|
|
1084
|
-
case
|
|
1143
|
+
case 39:
|
|
1085
1144
|
result = _context8.t1;
|
|
1086
1145
|
if (!(requestSequence !== this.walletAssetsRequestSequence)) {
|
|
1087
|
-
_context8.next =
|
|
1146
|
+
_context8.next = 42;
|
|
1088
1147
|
break;
|
|
1089
1148
|
}
|
|
1090
1149
|
return _context8.abrupt("return", this.getWalletAssetsState());
|
|
1091
|
-
case
|
|
1150
|
+
case 42:
|
|
1092
1151
|
this.walletAssetsCalculationContext = {
|
|
1093
1152
|
orderTotalAmount: Number(businessData.order_wait_pay_amount || 0),
|
|
1094
1153
|
products: result.products || businessData.products || []
|
|
@@ -1111,11 +1170,11 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1111
1170
|
}
|
|
1112
1171
|
searchedWalletAssets = preserveSelection ? this.syncSearchedWalletAssets([].concat(_toConsumableArray(result.transformList || []), _toConsumableArray(result.noApplicableVoucher || []))) : [];
|
|
1113
1172
|
if (!(requestSequence !== this.walletAssetsRequestSequence)) {
|
|
1114
|
-
_context8.next =
|
|
1173
|
+
_context8.next = 48;
|
|
1115
1174
|
break;
|
|
1116
1175
|
}
|
|
1117
1176
|
return _context8.abrupt("return", this.getWalletAssetsState());
|
|
1118
|
-
case
|
|
1177
|
+
case 48:
|
|
1119
1178
|
recommendedKeys = new Set((result.walletRecommendList || []).map(function (asset) {
|
|
1120
1179
|
return getWalletAssetKey(asset);
|
|
1121
1180
|
}));
|
|
@@ -1126,16 +1185,47 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1126
1185
|
});
|
|
1127
1186
|
latestSelectedIds = preserveSelection ? authoritativeSelectedIds : [];
|
|
1128
1187
|
latestSelectionSources = preserveSelection ? _objectSpread({}, this.walletAssetsState.selectionSources) : {};
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1188
|
+
pendingAutoSelectAssets = this.walletAssetsBehavior.autoSelectAfterSearch ? items.filter(function (asset) {
|
|
1189
|
+
return _this4.isPendingAutoSelectAsset(asset) && isWalletAssetAvailable(asset);
|
|
1190
|
+
}) : [];
|
|
1191
|
+
requestedKeySet = new Set(latestSelectedIds.map(function (id) {
|
|
1192
|
+
return String(id);
|
|
1193
|
+
}));
|
|
1194
|
+
pendingAutoSelectAssets.forEach(function (asset) {
|
|
1195
|
+
var assetId = getWalletAssetId(asset);
|
|
1196
|
+
if (assetId === undefined || assetId === null) return;
|
|
1197
|
+
var assetKey = String(assetId);
|
|
1198
|
+
if (!requestedKeySet.has(assetKey)) {
|
|
1199
|
+
requestedKeySet.add(assetKey);
|
|
1200
|
+
latestSelectedIds.push(assetId);
|
|
1201
|
+
}
|
|
1202
|
+
latestSelectionSources[assetKey] = 'scan';
|
|
1203
|
+
});
|
|
1204
|
+
nextState = this.recalculateWalletAssets(items, latestSelectedIds, latestSelectionSources);
|
|
1205
|
+
selectedKeySet = new Set(nextState.selectedIds.map(function (id) {
|
|
1206
|
+
return String(id);
|
|
1207
|
+
}));
|
|
1208
|
+
pendingAutoSelectAssets.forEach(function (asset) {
|
|
1209
|
+
var assetId = getWalletAssetId(asset);
|
|
1210
|
+
if (assetId !== undefined && assetId !== null && selectedKeySet.has(String(assetId))) {
|
|
1211
|
+
_this4.clearPendingAutoSelectForAsset(asset);
|
|
1212
|
+
}
|
|
1213
|
+
});
|
|
1214
|
+
droppedScanSelectedAssets = scanSelectedAssets.filter(function (asset) {
|
|
1215
|
+
var assetId = getWalletAssetId(asset);
|
|
1216
|
+
return assetId !== undefined && assetId !== null && !selectedKeySet.has(String(assetId));
|
|
1217
|
+
});
|
|
1218
|
+
this.queuePendingAutoSelectForAssets(droppedScanSelectedAssets);
|
|
1219
|
+
return _context8.abrupt("return", nextState);
|
|
1220
|
+
case 63:
|
|
1221
|
+
_context8.prev = 63;
|
|
1222
|
+
_context8.t2 = _context8["catch"](23);
|
|
1133
1223
|
if (!(requestSequence !== this.walletAssetsRequestSequence)) {
|
|
1134
|
-
_context8.next =
|
|
1224
|
+
_context8.next = 67;
|
|
1135
1225
|
break;
|
|
1136
1226
|
}
|
|
1137
1227
|
return _context8.abrupt("return", this.getWalletAssetsState());
|
|
1138
|
-
case
|
|
1228
|
+
case 67:
|
|
1139
1229
|
this.paymentModule.logError('[WalletPass] 刷新共享钱包资产失败,保留刷新前状态', _context8.t2, {
|
|
1140
1230
|
customer_id: businessData.customer_id,
|
|
1141
1231
|
selected_ids: selectedIds,
|
|
@@ -1151,11 +1241,11 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1151
1241
|
customerId: nextCustomerId,
|
|
1152
1242
|
error: _context8.t2 instanceof Error ? _context8.t2.message : String(_context8.t2)
|
|
1153
1243
|
}));
|
|
1154
|
-
case
|
|
1244
|
+
case 69:
|
|
1155
1245
|
case "end":
|
|
1156
1246
|
return _context8.stop();
|
|
1157
1247
|
}
|
|
1158
|
-
}, _callee8, this, [[
|
|
1248
|
+
}, _callee8, this, [[23, 63]]);
|
|
1159
1249
|
}));
|
|
1160
1250
|
function refreshWalletAssetsFromBusinessAsync(_x9) {
|
|
1161
1251
|
return _refreshWalletAssetsFromBusinessAsync.apply(this, arguments);
|
|
@@ -1179,6 +1269,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1179
1269
|
return {
|
|
1180
1270
|
state: this.getWalletAssetsState(),
|
|
1181
1271
|
searchResults: _toConsumableArray(this.searchResults),
|
|
1272
|
+
pendingAutoSelectSearchCodes: _toConsumableArray(this.pendingAutoSelectSearchCodes),
|
|
1182
1273
|
walletParams: this.walletParams ? _objectSpread({}, this.walletParams) : null,
|
|
1183
1274
|
calculationContext: {
|
|
1184
1275
|
orderTotalAmount: this.walletAssetsCalculationContext.orderTotalAmount,
|
|
@@ -1193,6 +1284,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1193
1284
|
if (!(snapshot !== null && snapshot !== void 0 && snapshot.state)) return this.getWalletAssetsState();
|
|
1194
1285
|
this.walletAssetsRequestSequence += 1;
|
|
1195
1286
|
this.searchResults = Array.isArray(snapshot.searchResults) ? _toConsumableArray(snapshot.searchResults) : [];
|
|
1287
|
+
this.pendingAutoSelectSearchCodes = this.walletAssetsBehavior.autoSelectAfterSearch && Array.isArray(snapshot.pendingAutoSelectSearchCodes) ? new Set(snapshot.pendingAutoSelectSearchCodes.map(normalizeWalletAssetCode).filter(Boolean)) : new Set();
|
|
1196
1288
|
this.walletParams = snapshot.walletParams ? _objectSpread({}, snapshot.walletParams) : null;
|
|
1197
1289
|
this.walletAssetsCalculationContext = {
|
|
1198
1290
|
orderTotalAmount: Number(((_snapshot$calculation = snapshot.calculationContext) === null || _snapshot$calculation === void 0 ? void 0 : _snapshot$calculation.orderTotalAmount) || 0),
|
|
@@ -1210,6 +1302,9 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1210
1302
|
key: "selectWalletAsset",
|
|
1211
1303
|
value: function selectWalletAsset(assetId, options) {
|
|
1212
1304
|
var assetKey = String(assetId);
|
|
1305
|
+
var asset = this.walletAssetsState.items.find(function (item) {
|
|
1306
|
+
return getWalletAssetKey(item) === assetKey;
|
|
1307
|
+
});
|
|
1213
1308
|
var committedKeys = new Set(this.walletAssetsState.committedIds.map(function (id) {
|
|
1214
1309
|
return String(id);
|
|
1215
1310
|
}));
|
|
@@ -1220,22 +1315,27 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1220
1315
|
var selectionSources = _objectSpread({}, this.walletAssetsState.selectionSources);
|
|
1221
1316
|
delete selectionSources[assetKey];
|
|
1222
1317
|
if (options.selected) {
|
|
1223
|
-
var asset = this.walletAssetsState.items.find(function (item) {
|
|
1224
|
-
return getWalletAssetKey(item) === assetKey;
|
|
1225
|
-
});
|
|
1226
1318
|
if (!asset || !isWalletAssetAvailable(asset)) {
|
|
1227
1319
|
return this.getWalletAssetsState();
|
|
1228
1320
|
}
|
|
1229
1321
|
selectedIds.push(assetId);
|
|
1230
1322
|
selectionSources[assetKey] = options.source || 'manual';
|
|
1323
|
+
} else if (asset) {
|
|
1324
|
+
this.clearPendingAutoSelectForAsset(asset);
|
|
1231
1325
|
}
|
|
1232
|
-
|
|
1326
|
+
var nextState = this.recalculateWalletAssets(this.walletAssetsState.items, selectedIds, selectionSources);
|
|
1327
|
+
if (options.selected && asset && nextState.selectedIds.some(function (id) {
|
|
1328
|
+
return String(id) === assetKey;
|
|
1329
|
+
})) {
|
|
1330
|
+
this.clearPendingAutoSelectForAsset(asset);
|
|
1331
|
+
}
|
|
1332
|
+
return nextState;
|
|
1233
1333
|
}
|
|
1234
1334
|
}, {
|
|
1235
1335
|
key: "scanWalletAssetAsync",
|
|
1236
1336
|
value: function () {
|
|
1237
1337
|
var _scanWalletAssetAsync = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(code) {
|
|
1238
|
-
var normalizedCode, selectedAsset, result, paymentAssets, asset, items, assetId, selected;
|
|
1338
|
+
var normalizedCode, selectedAsset, result, paymentAssets, asset, items, recalculatedState, assetId, selected, isSelected;
|
|
1239
1339
|
return _regeneratorRuntime().wrap(function _callee9$(_context9) {
|
|
1240
1340
|
while (1) switch (_context9.prev = _context9.next) {
|
|
1241
1341
|
case 0:
|
|
@@ -1288,21 +1388,28 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1288
1388
|
});
|
|
1289
1389
|
case 14:
|
|
1290
1390
|
items = mergeWalletAssets(this.walletAssetsState.items, [asset]);
|
|
1291
|
-
this.recalculateWalletAssets(items, this.walletAssetsState.selectedIds, this.walletAssetsState.selectionSources);
|
|
1391
|
+
recalculatedState = this.recalculateWalletAssets(items, this.walletAssetsState.selectedIds, this.walletAssetsState.selectionSources);
|
|
1292
1392
|
assetId = getWalletAssetId(asset);
|
|
1293
|
-
selected = assetId !== undefined && isWalletAssetAvailable(asset) ? this.selectWalletAsset(assetId, {
|
|
1393
|
+
selected = this.walletAssetsBehavior.autoSelectAfterSearch && assetId !== undefined && isWalletAssetAvailable(asset) ? this.selectWalletAsset(assetId, {
|
|
1294
1394
|
selected: true,
|
|
1295
1395
|
source: 'scan'
|
|
1296
|
-
}) :
|
|
1396
|
+
}) : recalculatedState;
|
|
1397
|
+
isSelected = assetId !== undefined && selected.selectedIds.some(function (id) {
|
|
1398
|
+
return String(id) === String(assetId);
|
|
1399
|
+
});
|
|
1400
|
+
if (isSelected) {
|
|
1401
|
+
this.clearPendingAutoSelectForAsset(asset);
|
|
1402
|
+
} else if (this.walletAssetsBehavior.autoSelectAfterSearch) {
|
|
1403
|
+
this.pendingAutoSelectSearchCodes.add(normalizeWalletAssetCode(normalizedCode));
|
|
1404
|
+
this.queuePendingAutoSelectForAssets([asset]);
|
|
1405
|
+
}
|
|
1297
1406
|
return _context9.abrupt("return", {
|
|
1298
1407
|
type: result.type,
|
|
1299
1408
|
asset: asset,
|
|
1300
|
-
selected:
|
|
1301
|
-
return String(id) === String(assetId);
|
|
1302
|
-
}),
|
|
1409
|
+
selected: isSelected,
|
|
1303
1410
|
state: selected
|
|
1304
1411
|
});
|
|
1305
|
-
case
|
|
1412
|
+
case 21:
|
|
1306
1413
|
case "end":
|
|
1307
1414
|
return _context9.stop();
|
|
1308
1415
|
}
|
|
@@ -1316,6 +1423,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1316
1423
|
}, {
|
|
1317
1424
|
key: "clearWalletAssetSelection",
|
|
1318
1425
|
value: function clearWalletAssetSelection() {
|
|
1426
|
+
this.pendingAutoSelectSearchCodes.clear();
|
|
1319
1427
|
return this.recalculateWalletAssets(this.walletAssetsState.items, [], {});
|
|
1320
1428
|
}
|
|
1321
1429
|
}, {
|
|
@@ -1491,6 +1599,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1491
1599
|
key: "clearSearchResults",
|
|
1492
1600
|
value: function clearSearchResults() {
|
|
1493
1601
|
this.searchResults = [];
|
|
1602
|
+
this.pendingAutoSelectSearchCodes.clear();
|
|
1494
1603
|
this.paymentModule.logInfo('[WalletPass] 搜索结果缓存已清除');
|
|
1495
1604
|
}
|
|
1496
1605
|
|
|
@@ -1522,6 +1631,7 @@ export var WalletPassPaymentImpl = /*#__PURE__*/function () {
|
|
|
1522
1631
|
this.walletRecommendList = [];
|
|
1523
1632
|
this.userIdentificationCodes = [];
|
|
1524
1633
|
this.searchResults = [];
|
|
1634
|
+
this.pendingAutoSelectSearchCodes.clear();
|
|
1525
1635
|
this.walletParams = null;
|
|
1526
1636
|
this.walletInitData = null;
|
|
1527
1637
|
this.walletAssetsRequestSequence += 1;
|
|
@@ -14,7 +14,7 @@ export { QuotationHooks } from './quotation/types';
|
|
|
14
14
|
export { ScheduleModuleEx } from './schedule';
|
|
15
15
|
export type { ScheduleState, ScheduleItem } from './schedule/types';
|
|
16
16
|
export { OrderModule } from './order';
|
|
17
|
-
export type { OrderState, OrderData, OrderId, OrderSummary, OrderBookingItem, OrderProductLineItem, OrderPaymentItem, OrderSurchargeItem, OrderProductDiscountItem, OrderWithoutBookings, BookingData, OrderFilters, BookingFilters, OrderFilterResult, OrderFilterRejectDetail, OrderFilterRejectedEntry, BookingFilterResult, OrderModulePagedResult, } from './order/types';
|
|
17
|
+
export type { OrderState, OrderData, OrderId, OrderSummary, OrderBookingItem, OrderProductLineItem, OrderPaymentItem, OrderSurchargeItem, OrderProductDiscountItem, OrderWithoutBookings, BookingData, OrderFilters, BookingFilters, OrderFilterResult, OrderFilterRejectDetail, OrderFilterRejectedEntry, BookingFilterResult, OrderModulePagedResult, RemoteProductMembershipChangedPayload, RemoteProductMembershipChangeSource, } from './order/types';
|
|
18
18
|
export { OrderHooks } from './order/types';
|
|
19
19
|
export { PaymentServerModule } from './payment';
|
|
20
20
|
export type { PaymentMethod, PaymentMethodsChangedEventData, PaymentServerState } from './payment/types';
|
|
@@ -30,6 +30,10 @@ export declare class OrderModule extends BaseModule implements Module {
|
|
|
30
30
|
* await this.emitOrdersChanged([freshOrder], 'pubsub.bodyUpsert')
|
|
31
31
|
*/
|
|
32
32
|
private emitOrdersChanged;
|
|
33
|
+
/**
|
|
34
|
+
* 广播远端商品成员增删。监听器异常必须与订单落库和原有订单广播隔离。
|
|
35
|
+
*/
|
|
36
|
+
private emitRemoteProductMembershipChanges;
|
|
33
37
|
initialize(core: PisellCore, options?: ModuleOptions): Promise<void>;
|
|
34
38
|
/**
|
|
35
39
|
* 记录信息日志
|
|
@@ -231,6 +235,18 @@ export declare class OrderModule extends BaseModule implements Module {
|
|
|
231
235
|
*/
|
|
232
236
|
private lookupOrderIndexByIdentityKeys;
|
|
233
237
|
private isRemoteEchoMergeSource;
|
|
238
|
+
private getProductMembershipKey;
|
|
239
|
+
private doProductsHaveStableMembershipIdentity;
|
|
240
|
+
/**
|
|
241
|
+
* 冲突提示关注逻辑商品行,而不是服务端 checkout 过程中可能被重建的 detail 记录。
|
|
242
|
+
* 通用集合合并仍以 order_detail_id 为事实主键;这里只允许相同稳定 UID 跨 detail id 对齐,
|
|
243
|
+
* 避免本机 checkout 回声被误判成“一删一增”。
|
|
244
|
+
*/
|
|
245
|
+
private isSameProductMembershipItem;
|
|
246
|
+
/**
|
|
247
|
+
* 对比合并前后的商品成员集合。商品字段修改与数组重排不会产生 diff。
|
|
248
|
+
*/
|
|
249
|
+
private getRemoteProductMembershipChange;
|
|
234
250
|
/**
|
|
235
251
|
* 将订单的全部身份键登记到索引并指向其在列表中的下标。
|
|
236
252
|
* 合并后订单新增的身份字段(如挂单同步后拿到 order_id)也会被登记。
|