@pisell/pisellos 2.2.263 → 2.2.264
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/model/strategy/adapter/index.d.ts +0 -4
- package/dist/model/strategy/adapter/index.js +1 -5
- package/dist/model/strategy/adapter/promotion/adapter.d.ts +4 -0
- package/dist/model/strategy/adapter/promotion/adapter.js +23 -0
- package/dist/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
- package/dist/model/strategy/adapter/promotion/evaluator.js +279 -6
- package/dist/model/strategy/adapter/promotion/examples.d.ts +86 -0
- package/dist/model/strategy/adapter/promotion/examples.js +99 -0
- package/dist/model/strategy/adapter/promotion/index.d.ts +1 -1
- package/dist/model/strategy/adapter/promotion/index.js +0 -9
- package/dist/model/strategy/adapter/promotion/type.d.ts +90 -2
- package/dist/model/strategy/adapter/promotion/type.js +45 -0
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +10 -16
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +1 -2
- package/dist/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +1 -1
- package/dist/modules/BookingContext/utils/cacheItemToBookingInput.js +1 -32
- package/dist/modules/Discount/index.d.ts +2 -5
- package/dist/modules/Discount/index.js +7 -30
- package/dist/modules/Discount/types.d.ts +0 -4
- package/dist/modules/Order/index.d.ts +2 -14
- package/dist/modules/Order/index.js +736 -1035
- package/dist/modules/Order/types.d.ts +0 -16
- package/dist/modules/Order/utils.d.ts +3 -4
- package/dist/modules/Order/utils.js +61 -54
- package/dist/modules/Product/types.d.ts +0 -22
- package/dist/modules/ProductList/index.d.ts +1 -1
- package/dist/modules/ProductList/index.js +2 -4
- package/dist/modules/ProductList/types.d.ts +0 -2
- package/dist/modules/Rules/index.d.ts +9 -2
- package/dist/modules/Rules/index.js +43 -69
- package/dist/modules/Rules/types.d.ts +1 -10
- package/dist/server/index.d.ts +0 -55
- package/dist/server/index.js +753 -1173
- package/dist/server/modules/order/index.d.ts +4 -10
- package/dist/server/modules/order/index.js +399 -404
- package/dist/server/modules/order/types.d.ts +0 -4
- package/dist/server/modules/products/index.d.ts +8 -31
- package/dist/server/modules/products/index.js +390 -549
- package/dist/server/modules/products/types.d.ts +0 -18
- package/dist/solution/BaseSales/index.d.ts +1 -21
- package/dist/solution/BaseSales/index.js +789 -1136
- package/dist/solution/BaseSales/types.d.ts +1 -6
- package/dist/solution/BaseSales/types.js +1 -1
- package/dist/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
- package/dist/solution/BaseSales/utils/cartPromotion.js +97 -50
- package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -3
- package/dist/solution/BaseSales/utils/parseSalesResponse.js +8 -6
- package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +1 -14
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.js +25 -59
- package/dist/solution/BookingTicket/types.d.ts +0 -2
- package/dist/solution/ScanOrder/index.js +31 -20
- package/dist/solution/ShopDiscount/index.js +14 -15
- package/dist/solution/VenueBooking/index.js +30 -19
- package/lib/model/strategy/adapter/index.d.ts +0 -4
- package/lib/model/strategy/adapter/index.js +2 -13
- package/lib/model/strategy/adapter/promotion/adapter.d.ts +4 -0
- package/lib/model/strategy/adapter/promotion/adapter.js +20 -0
- package/lib/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
- package/lib/model/strategy/adapter/promotion/evaluator.js +235 -0
- package/lib/model/strategy/adapter/promotion/examples.d.ts +86 -0
- package/lib/model/strategy/adapter/promotion/examples.js +91 -0
- package/lib/model/strategy/adapter/promotion/index.d.ts +1 -1
- package/lib/model/strategy/adapter/promotion/index.js +51 -0
- package/lib/model/strategy/adapter/promotion/type.d.ts +90 -2
- package/lib/model/strategy/adapter/promotion/type.js +2 -0
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +0 -5
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +0 -1
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +1 -1
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +2 -23
- package/lib/modules/Discount/index.d.ts +2 -5
- package/lib/modules/Discount/index.js +3 -23
- package/lib/modules/Discount/types.d.ts +0 -4
- package/lib/modules/Order/index.d.ts +2 -14
- package/lib/modules/Order/index.js +60 -326
- package/lib/modules/Order/types.d.ts +0 -16
- package/lib/modules/Order/utils.d.ts +3 -4
- package/lib/modules/Order/utils.js +23 -22
- package/lib/modules/Product/types.d.ts +0 -22
- package/lib/modules/ProductList/index.d.ts +1 -1
- package/lib/modules/ProductList/index.js +2 -4
- package/lib/modules/ProductList/types.d.ts +0 -2
- package/lib/modules/Rules/index.d.ts +9 -2
- package/lib/modules/Rules/index.js +29 -61
- package/lib/modules/Rules/types.d.ts +1 -10
- package/lib/server/index.d.ts +0 -55
- package/lib/server/index.js +34 -332
- package/lib/server/modules/order/index.d.ts +4 -10
- package/lib/server/modules/order/index.js +139 -198
- package/lib/server/modules/order/types.d.ts +0 -4
- package/lib/server/modules/products/index.d.ts +8 -31
- package/lib/server/modules/products/index.js +35 -134
- package/lib/server/modules/products/types.d.ts +0 -18
- package/lib/solution/BaseSales/index.d.ts +1 -21
- package/lib/solution/BaseSales/index.js +72 -313
- package/lib/solution/BaseSales/types.d.ts +1 -6
- package/lib/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
- package/lib/solution/BaseSales/utils/cartPromotion.js +64 -25
- package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -3
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +5 -4
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +0 -8
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.js +8 -33
- package/lib/solution/BookingTicket/types.d.ts +0 -2
- package/lib/solution/ScanOrder/index.js +8 -0
- package/lib/solution/ShopDiscount/index.js +1 -2
- package/lib/solution/VenueBooking/index.js +8 -0
- package/package.json +1 -1
- package/dist/model/strategy/adapter/dataVariant/adapter.d.ts +0 -50
- package/dist/model/strategy/adapter/dataVariant/adapter.js +0 -167
- package/dist/model/strategy/adapter/dataVariant/evaluator.d.ts +0 -89
- package/dist/model/strategy/adapter/dataVariant/evaluator.js +0 -780
- package/dist/model/strategy/adapter/dataVariant/examples.d.ts +0 -39
- package/dist/model/strategy/adapter/dataVariant/examples.js +0 -277
- package/dist/model/strategy/adapter/dataVariant/index.d.ts +0 -4
- package/dist/model/strategy/adapter/dataVariant/index.js +0 -4
- package/dist/model/strategy/adapter/dataVariant/type.d.ts +0 -148
- package/dist/model/strategy/adapter/dataVariant/type.js +0 -54
- package/dist/modules/Order/utils/orderCollectionIdentity.d.ts +0 -53
- package/dist/modules/Order/utils/orderCollectionIdentity.js +0 -405
- package/lib/model/strategy/adapter/dataVariant/adapter.d.ts +0 -50
- package/lib/model/strategy/adapter/dataVariant/adapter.js +0 -149
- package/lib/model/strategy/adapter/dataVariant/evaluator.d.ts +0 -89
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +0 -583
- package/lib/model/strategy/adapter/dataVariant/examples.d.ts +0 -39
- package/lib/model/strategy/adapter/dataVariant/examples.js +0 -293
- package/lib/model/strategy/adapter/dataVariant/index.d.ts +0 -4
- package/lib/model/strategy/adapter/dataVariant/index.js +0 -38
- package/lib/model/strategy/adapter/dataVariant/type.d.ts +0 -148
- package/lib/model/strategy/adapter/dataVariant/type.js +0 -31
- package/lib/modules/Order/utils/orderCollectionIdentity.d.ts +0 -53
- package/lib/modules/Order/utils/orderCollectionIdentity.js +0 -415
|
@@ -35,7 +35,6 @@ module.exports = __toCommonJS(order_exports);
|
|
|
35
35
|
var import_lodash_es = require("lodash-es");
|
|
36
36
|
var import_dayjs = __toESM(require("dayjs"));
|
|
37
37
|
var import_BaseModule = require("../../../modules/BaseModule");
|
|
38
|
-
var import_orderCollectionIdentity = require("../../../modules/Order/utils/orderCollectionIdentity");
|
|
39
38
|
var import_types = require("./types");
|
|
40
39
|
var INDEXDB_STORE_NAME = "orders";
|
|
41
40
|
var ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY = "server_order_last_full_fetch_at";
|
|
@@ -50,12 +49,6 @@ var ORDER_BUSINESS_WRITE_SOURCES = /* @__PURE__ */ new Set([
|
|
|
50
49
|
"markOrderSyncedByExternalSaleNumber"
|
|
51
50
|
]);
|
|
52
51
|
var ORDER_MERGE_SELF_CHECK = false;
|
|
53
|
-
var ORDER_AUTHORITATIVE_COLLECTION_FIELDS = ["products", "bookings", "payments"];
|
|
54
|
-
var ORDER_COLLECTION_KIND_BY_FIELD = {
|
|
55
|
-
products: "product",
|
|
56
|
-
bookings: "booking",
|
|
57
|
-
payments: "payment"
|
|
58
|
-
};
|
|
59
52
|
var OrderModule = class extends import_BaseModule.BaseModule {
|
|
60
53
|
constructor(name, version) {
|
|
61
54
|
super(name, version);
|
|
@@ -161,96 +154,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
161
154
|
} catch {
|
|
162
155
|
}
|
|
163
156
|
}
|
|
164
|
-
/**
|
|
165
|
-
* 在订单进入内存或 SQLite 前统一压缩子项强身份重复并补齐协议 UID。
|
|
166
|
-
* 仅记录计数与订单标识,不输出商品、预约、支付或客户明细。
|
|
167
|
-
*/
|
|
168
|
-
normalizeOrderCollectionsForIngress(order, source) {
|
|
169
|
-
const result = (0, import_orderCollectionIdentity.normalizeOrderCollections)(order);
|
|
170
|
-
const kinds = ["product", "booking", "payment"];
|
|
171
|
-
const hasChanges = kinds.some((kind) => {
|
|
172
|
-
const stats = result.stats[kind];
|
|
173
|
-
return stats.backfilledUidCount > 0 || stats.collapsedDuplicateCount > 0 || stats.uidConflictCount > 0 || stats.anonymousRowCount > 0;
|
|
174
|
-
});
|
|
175
|
-
if (hasChanges) {
|
|
176
|
-
const summarize = (stats) => ({
|
|
177
|
-
backfilled_uid_count: stats.backfilledUidCount,
|
|
178
|
-
collapsed_duplicate_count: stats.collapsedDuplicateCount,
|
|
179
|
-
uid_conflict_count: stats.uidConflictCount,
|
|
180
|
-
anonymous_row_count: stats.anonymousRowCount
|
|
181
|
-
});
|
|
182
|
-
const context = {
|
|
183
|
-
source,
|
|
184
|
-
order_id: (order == null ? void 0 : order.order_id) ?? null,
|
|
185
|
-
external_sale_number: (order == null ? void 0 : order.external_sale_number) ?? null,
|
|
186
|
-
products: summarize(result.stats.product),
|
|
187
|
-
bookings: summarize(result.stats.booking),
|
|
188
|
-
payments: summarize(result.stats.payment)
|
|
189
|
-
};
|
|
190
|
-
const hasUnsafeIdentity = kinds.some((kind) => {
|
|
191
|
-
const stats = result.stats[kind];
|
|
192
|
-
return stats.uidConflictCount > 0 || stats.anonymousRowCount > 0;
|
|
193
|
-
});
|
|
194
|
-
if (hasUnsafeIdentity) {
|
|
195
|
-
this.logWarning("订单子项身份存在冲突或匿名行", context);
|
|
196
|
-
} else {
|
|
197
|
-
this.logInfo("订单子项身份已规范化", context);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
return result.order;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* incoming 决定权威成员集合;同一持久化行仍从 existing 补齐 incoming 省略的本地展示字段。
|
|
204
|
-
*/
|
|
205
|
-
mergeAuthoritativeOrderCollection(field, existing, incoming, uidRemaps = []) {
|
|
206
|
-
const kind = ORDER_COLLECTION_KIND_BY_FIELD[field];
|
|
207
|
-
const existingItems = Array.isArray(existing) ? existing : [];
|
|
208
|
-
return incoming.map((incomingItem) => {
|
|
209
|
-
const existingItem = existingItems.find(
|
|
210
|
-
(item) => (0, import_orderCollectionIdentity.isSameOrderCollectionItem)(kind, item, incomingItem)
|
|
211
|
-
);
|
|
212
|
-
if (!existingItem)
|
|
213
|
-
return (0, import_lodash_es.cloneDeep)(incomingItem);
|
|
214
|
-
const mergedItem = (0, import_orderCollectionIdentity.mergeOrderCollectionItems)(kind, existingItem, incomingItem);
|
|
215
|
-
const mergedUid = (0, import_orderCollectionIdentity.getOrderCollectionUid)(kind, mergedItem);
|
|
216
|
-
if (mergedUid) {
|
|
217
|
-
for (const from of /* @__PURE__ */ new Set([
|
|
218
|
-
(0, import_orderCollectionIdentity.getOrderCollectionReferenceUid)(kind, existingItem),
|
|
219
|
-
(0, import_orderCollectionIdentity.getOrderCollectionReferenceUid)(kind, incomingItem)
|
|
220
|
-
])) {
|
|
221
|
-
if (!from || from === mergedUid)
|
|
222
|
-
continue;
|
|
223
|
-
uidRemaps.push({
|
|
224
|
-
kind,
|
|
225
|
-
from,
|
|
226
|
-
to: mergedUid,
|
|
227
|
-
persistentId: (0, import_orderCollectionIdentity.getOrderCollectionPersistentId)(kind, incomingItem) || (0, import_orderCollectionIdentity.getOrderCollectionPersistentId)(kind, existingItem)
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return mergedItem;
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
reconcileOverwriteOrderCollections(existing, incoming) {
|
|
235
|
-
const reconciled = (0, import_lodash_es.cloneDeep)(incoming);
|
|
236
|
-
const existingRecord = existing;
|
|
237
|
-
const incomingRecord = incoming;
|
|
238
|
-
const uidRemaps = [];
|
|
239
|
-
for (const field of ORDER_AUTHORITATIVE_COLLECTION_FIELDS) {
|
|
240
|
-
if (!Array.isArray(incomingRecord[field]))
|
|
241
|
-
continue;
|
|
242
|
-
reconciled[field] = this.mergeAuthoritativeOrderCollection(
|
|
243
|
-
field,
|
|
244
|
-
existingRecord[field],
|
|
245
|
-
incomingRecord[field],
|
|
246
|
-
uidRemaps
|
|
247
|
-
);
|
|
248
|
-
}
|
|
249
|
-
return this.normalizeOrderCollectionsForIngress(
|
|
250
|
-
(0, import_orderCollectionIdentity.applyOrderCollectionUidRemaps)(reconciled, uidRemaps),
|
|
251
|
-
"overwriteExistingOrder.reconciled"
|
|
252
|
-
);
|
|
253
|
-
}
|
|
254
157
|
/**
|
|
255
158
|
* 记录订单最近一次 SQLite 写入,供 pubsub 回声去重使用。
|
|
256
159
|
*
|
|
@@ -576,17 +479,16 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
576
479
|
return this.store.list;
|
|
577
480
|
}
|
|
578
481
|
}
|
|
579
|
-
normalizeOrderForMemoryList(order
|
|
580
|
-
const
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
return normalizedOrder;
|
|
482
|
+
normalizeOrderForMemoryList(order) {
|
|
483
|
+
const externalSaleNumber = order == null ? void 0 : order.external_sale_number;
|
|
484
|
+
if ((order == null ? void 0 : order.order_id) !== void 0 && (order == null ? void 0 : order.order_id) !== null && (order == null ? void 0 : order.order_id) !== "") {
|
|
485
|
+
return order;
|
|
584
486
|
}
|
|
585
487
|
if (externalSaleNumber === void 0 || externalSaleNumber === null || externalSaleNumber === "") {
|
|
586
|
-
return
|
|
488
|
+
return order;
|
|
587
489
|
}
|
|
588
490
|
return {
|
|
589
|
-
...
|
|
491
|
+
...order,
|
|
590
492
|
order_id: externalSaleNumber
|
|
591
493
|
};
|
|
592
494
|
}
|
|
@@ -609,29 +511,19 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
609
511
|
orderId,
|
|
610
512
|
storeOrderCountBefore: this.store.list.length
|
|
611
513
|
});
|
|
612
|
-
const normalizedFresh = this.normalizeOrderForMemoryList(
|
|
613
|
-
fresh,
|
|
614
|
-
"overwriteExistingOrder.incoming"
|
|
615
|
-
);
|
|
616
|
-
const existingOrder = this.store.map.get(key);
|
|
617
|
-
const reconciledFresh = this.reconcileOverwriteOrderCollections(
|
|
618
|
-
existingOrder,
|
|
619
|
-
normalizedFresh
|
|
620
|
-
);
|
|
621
514
|
this.store.list = this.store.list.map((order) => {
|
|
622
515
|
const id = order == null ? void 0 : order.order_id;
|
|
623
|
-
if (id === void 0 || id === null)
|
|
624
|
-
return
|
|
625
|
-
|
|
626
|
-
return this.getIdKey(id) === key ? reconciledFresh : this.normalizeOrderForMemoryList(order, "overwriteExistingOrder.existingMemory");
|
|
516
|
+
if (id === void 0 || id === null)
|
|
517
|
+
return order;
|
|
518
|
+
return this.getIdKey(id) === key ? fresh : order;
|
|
627
519
|
});
|
|
628
520
|
this.syncOrdersMap();
|
|
629
|
-
await this.updateOrderInSQLite(
|
|
521
|
+
await this.updateOrderInSQLite(fresh, "overwriteExistingOrder");
|
|
630
522
|
this.logInfo("overwriteExistingOrder-结束", {
|
|
631
523
|
orderId,
|
|
632
524
|
storeOrderCountAfter: this.store.list.length
|
|
633
525
|
});
|
|
634
|
-
await this.emitOrdersChanged([
|
|
526
|
+
await this.emitOrdersChanged([fresh], "overwriteExistingOrder");
|
|
635
527
|
return { overwritten: true };
|
|
636
528
|
}
|
|
637
529
|
/**
|
|
@@ -703,21 +595,11 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
703
595
|
const pendingMap = /* @__PURE__ */ new Map();
|
|
704
596
|
const memoryPendingMap = /* @__PURE__ */ new Map();
|
|
705
597
|
for (const order of pendingOrders) {
|
|
706
|
-
const
|
|
707
|
-
order,
|
|
708
|
-
"upsertPendingSyncOrders.incoming"
|
|
709
|
-
);
|
|
710
|
-
const storageKey = this.getOrderStorageKey(normalizedOrder);
|
|
598
|
+
const storageKey = this.getOrderStorageKey(order);
|
|
711
599
|
if (!storageKey)
|
|
712
600
|
continue;
|
|
713
|
-
pendingMap.set(storageKey,
|
|
714
|
-
memoryPendingMap.set(
|
|
715
|
-
storageKey,
|
|
716
|
-
this.normalizeOrderForMemoryList(
|
|
717
|
-
normalizedOrder,
|
|
718
|
-
"upsertPendingSyncOrders.memory"
|
|
719
|
-
)
|
|
720
|
-
);
|
|
601
|
+
pendingMap.set(storageKey, order);
|
|
602
|
+
memoryPendingMap.set(storageKey, this.normalizeOrderForMemoryList(order));
|
|
721
603
|
}
|
|
722
604
|
if (pendingMap.size === 0) {
|
|
723
605
|
this.logError("upsertPendingSyncOrders-订单缺少可落库标识", {
|
|
@@ -726,10 +608,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
726
608
|
return;
|
|
727
609
|
}
|
|
728
610
|
this.logInfo("upsertPendingSyncOrders-开始", { count: pendingMap.size });
|
|
611
|
+
const patchedOrders = [...pendingMap.values()];
|
|
729
612
|
const mergeActions = {};
|
|
730
|
-
const updatedList = this.store.list
|
|
731
|
-
(order) => this.normalizeOrderForMemoryList(order, "upsertPendingSyncOrders.existingMemory")
|
|
732
|
-
);
|
|
613
|
+
const updatedList = [...this.store.list];
|
|
733
614
|
const identityKeyToIndex = /* @__PURE__ */ new Map();
|
|
734
615
|
for (let index = 0; index < updatedList.length; index += 1) {
|
|
735
616
|
for (const key of this.getOrderIdentityMatchKeys(updatedList[index])) {
|
|
@@ -743,16 +624,10 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
743
624
|
this.getOrderIdentityMatchKeys(pendingOrder)
|
|
744
625
|
);
|
|
745
626
|
if (matchIndex >= 0) {
|
|
746
|
-
const
|
|
747
|
-
|
|
627
|
+
const mergedOrder = this.mergeOrderRecords(updatedList[matchIndex], pendingOrder, {
|
|
628
|
+
preferIncomingProducts: true
|
|
629
|
+
});
|
|
748
630
|
updatedList[matchIndex] = mergedOrder;
|
|
749
|
-
const pendingSnapshot = pendingMap.get(storageKey);
|
|
750
|
-
if (pendingSnapshot) {
|
|
751
|
-
pendingMap.set(
|
|
752
|
-
storageKey,
|
|
753
|
-
this.reconcileOverwriteOrderCollections(existingOrder, pendingSnapshot)
|
|
754
|
-
);
|
|
755
|
-
}
|
|
756
631
|
this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, matchIndex);
|
|
757
632
|
mergeActions[storageKey] = "update";
|
|
758
633
|
continue;
|
|
@@ -762,7 +637,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
762
637
|
this.registerOrderIdentityKeys(identityKeyToIndex, pendingOrder, insertIndex);
|
|
763
638
|
mergeActions[storageKey] = "insert";
|
|
764
639
|
}
|
|
765
|
-
const patchedOrders = [...pendingMap.values()];
|
|
766
640
|
this.store.list = this.runOrderStoreSelfCheck(updatedList, "upsertPendingSyncOrders.store");
|
|
767
641
|
this.syncOrdersMap();
|
|
768
642
|
await this.patchOrdersInSQLite(patchedOrders, "upsertPendingSyncOrders", mergeActions);
|
|
@@ -1095,9 +969,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1095
969
|
const uniqueFreshCount = uniqueFreshOrders.length;
|
|
1096
970
|
const patchedOrders = [];
|
|
1097
971
|
const mergeActions = {};
|
|
1098
|
-
const updatedList = this.store.list
|
|
1099
|
-
(order) => this.normalizeOrderForMemoryList(order, `${source}.existingMemory`)
|
|
1100
|
-
);
|
|
972
|
+
const updatedList = [...this.store.list];
|
|
1101
973
|
const identityKeyToIndex = /* @__PURE__ */ new Map();
|
|
1102
974
|
for (let index = 0; index < updatedList.length; index += 1) {
|
|
1103
975
|
const identityKeys = this.getOrderIdentityMatchKeys(updatedList[index]);
|
|
@@ -1320,7 +1192,100 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1320
1192
|
return right;
|
|
1321
1193
|
return left;
|
|
1322
1194
|
}
|
|
1323
|
-
|
|
1195
|
+
getProductIdentityKeys(product) {
|
|
1196
|
+
var _a;
|
|
1197
|
+
const record = product;
|
|
1198
|
+
if (!record)
|
|
1199
|
+
return [];
|
|
1200
|
+
const keys = [];
|
|
1201
|
+
const metadataUid = (_a = record.metadata) == null ? void 0 : _a.unique_identification_number;
|
|
1202
|
+
if (!this.isBlankIdentityValue(metadataUid))
|
|
1203
|
+
keys.push(`uid:${String(metadataUid)}`);
|
|
1204
|
+
const topLevelUid = record.unique_identification_number;
|
|
1205
|
+
if (!this.isBlankIdentityValue(topLevelUid))
|
|
1206
|
+
keys.push(`uid:${String(topLevelUid)}`);
|
|
1207
|
+
const orderDetailId = record.order_detail_id;
|
|
1208
|
+
if (!this.isBlankIdentityValue(orderDetailId))
|
|
1209
|
+
keys.push(`detail:${String(orderDetailId)}`);
|
|
1210
|
+
const bookingUid = record.booking_uid;
|
|
1211
|
+
if (!this.isBlankIdentityValue(bookingUid))
|
|
1212
|
+
keys.push(`booking:${String(bookingUid)}`);
|
|
1213
|
+
return keys;
|
|
1214
|
+
}
|
|
1215
|
+
mergeOrderProductLists(preferred, secondary) {
|
|
1216
|
+
const preferredList = Array.isArray(preferred) ? preferred : [];
|
|
1217
|
+
const secondaryList = Array.isArray(secondary) ? secondary : [];
|
|
1218
|
+
if (secondaryList.length === 0)
|
|
1219
|
+
return preferredList;
|
|
1220
|
+
if (preferredList.length === 0)
|
|
1221
|
+
return secondaryList;
|
|
1222
|
+
const seenKeys = /* @__PURE__ */ new Set();
|
|
1223
|
+
for (const item of preferredList) {
|
|
1224
|
+
const keys = this.getProductIdentityKeys(item);
|
|
1225
|
+
for (const key of keys)
|
|
1226
|
+
seenKeys.add(key);
|
|
1227
|
+
}
|
|
1228
|
+
const result = [...preferredList];
|
|
1229
|
+
for (const item of secondaryList) {
|
|
1230
|
+
const keys = this.getProductIdentityKeys(item);
|
|
1231
|
+
if (keys.length === 0 || keys.some((key) => seenKeys.has(key)))
|
|
1232
|
+
continue;
|
|
1233
|
+
for (const key of keys)
|
|
1234
|
+
seenKeys.add(key);
|
|
1235
|
+
result.push((0, import_lodash_es.cloneDeep)(item));
|
|
1236
|
+
}
|
|
1237
|
+
return result;
|
|
1238
|
+
}
|
|
1239
|
+
getPaymentMergeKey(payment) {
|
|
1240
|
+
var _a;
|
|
1241
|
+
const record = payment;
|
|
1242
|
+
if (!record)
|
|
1243
|
+
return "";
|
|
1244
|
+
const uniquePaymentNumber = (_a = record.metadata) == null ? void 0 : _a.unique_payment_number;
|
|
1245
|
+
if (!this.isBlankIdentityValue(uniquePaymentNumber)) {
|
|
1246
|
+
return `unique:${String(uniquePaymentNumber)}`;
|
|
1247
|
+
}
|
|
1248
|
+
const orderPaymentId = record.order_payment_id;
|
|
1249
|
+
if (!this.isBlankIdentityValue(orderPaymentId))
|
|
1250
|
+
return `order_payment:${String(orderPaymentId)}`;
|
|
1251
|
+
const code = record.code;
|
|
1252
|
+
const customPaymentId = record.custom_payment_id;
|
|
1253
|
+
if (!this.isBlankIdentityValue(code) && !this.isBlankIdentityValue(customPaymentId)) {
|
|
1254
|
+
return `custom:${String(code)}#${String(customPaymentId)}`;
|
|
1255
|
+
}
|
|
1256
|
+
return "";
|
|
1257
|
+
}
|
|
1258
|
+
mergeOrderPaymentLists(existing, incoming) {
|
|
1259
|
+
const existingList = Array.isArray(existing) ? existing : [];
|
|
1260
|
+
const incomingList = Array.isArray(incoming) ? incoming : [];
|
|
1261
|
+
if (incomingList.length === 0)
|
|
1262
|
+
return (0, import_lodash_es.cloneDeep)(existingList);
|
|
1263
|
+
if (existingList.length === 0)
|
|
1264
|
+
return (0, import_lodash_es.cloneDeep)(incomingList);
|
|
1265
|
+
const existingByKey = /* @__PURE__ */ new Map();
|
|
1266
|
+
for (const payment of existingList) {
|
|
1267
|
+
const key = this.getPaymentMergeKey(payment);
|
|
1268
|
+
if (!key)
|
|
1269
|
+
continue;
|
|
1270
|
+
existingByKey.set(key, payment);
|
|
1271
|
+
}
|
|
1272
|
+
return incomingList.map((payment) => {
|
|
1273
|
+
const incomingPayment = payment;
|
|
1274
|
+
const key = this.getPaymentMergeKey(incomingPayment);
|
|
1275
|
+
const existingPayment = key ? existingByKey.get(key) : void 0;
|
|
1276
|
+
if (!existingPayment)
|
|
1277
|
+
return (0, import_lodash_es.cloneDeep)(incomingPayment);
|
|
1278
|
+
return {
|
|
1279
|
+
...(0, import_lodash_es.cloneDeep)(existingPayment),
|
|
1280
|
+
...(0, import_lodash_es.cloneDeep)(incomingPayment),
|
|
1281
|
+
metadata: {
|
|
1282
|
+
...(0, import_lodash_es.cloneDeep)(existingPayment.metadata || {}),
|
|
1283
|
+
...(0, import_lodash_es.cloneDeep)(incomingPayment.metadata || {})
|
|
1284
|
+
}
|
|
1285
|
+
};
|
|
1286
|
+
});
|
|
1287
|
+
}
|
|
1288
|
+
mergeOrderRecords(existing, incoming, options) {
|
|
1324
1289
|
const preferred = this.pickPreferredOrder(existing, incoming);
|
|
1325
1290
|
const secondary = preferred === existing ? incoming : existing;
|
|
1326
1291
|
const merged = {
|
|
@@ -1341,6 +1306,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1341
1306
|
"updated_at",
|
|
1342
1307
|
"shop_discount",
|
|
1343
1308
|
"summary",
|
|
1309
|
+
"products",
|
|
1310
|
+
"bookings",
|
|
1344
1311
|
"note",
|
|
1345
1312
|
"customer_id",
|
|
1346
1313
|
"customer_name",
|
|
@@ -1354,9 +1321,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1354
1321
|
const mergedRecord = merged;
|
|
1355
1322
|
const preferredRecord = preferred;
|
|
1356
1323
|
const secondaryRecord = secondary;
|
|
1357
|
-
const existingRecord = existing;
|
|
1358
1324
|
const incomingRecord = incoming;
|
|
1359
|
-
const
|
|
1325
|
+
const previousRecord = preferred === incoming ? secondaryRecord : preferredRecord;
|
|
1360
1326
|
for (const field of fieldsToPreserve) {
|
|
1361
1327
|
if (!this.isBlankIdentityValue(preferredRecord[field])) {
|
|
1362
1328
|
mergedRecord[field] = preferredRecord[field];
|
|
@@ -1366,6 +1332,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1366
1332
|
mergedRecord[field] = secondaryRecord[field];
|
|
1367
1333
|
}
|
|
1368
1334
|
}
|
|
1335
|
+
const hasIncomingProducts = Object.prototype.hasOwnProperty.call(incomingRecord, "products");
|
|
1336
|
+
const shouldUseIncomingProductsSnapshot = (options == null ? void 0 : options.preferIncomingProducts) === true && hasIncomingProducts && incomingRecord.products !== void 0 && incomingRecord.products !== null;
|
|
1369
1337
|
for (const field of incomingPatchFields) {
|
|
1370
1338
|
if (!Object.prototype.hasOwnProperty.call(incomingRecord, field))
|
|
1371
1339
|
continue;
|
|
@@ -1375,29 +1343,21 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1375
1343
|
continue;
|
|
1376
1344
|
mergedRecord[field] = (0, import_lodash_es.cloneDeep)(incomingRecord[field]);
|
|
1377
1345
|
}
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
incomingRecord
|
|
1384
|
-
childUidRemaps
|
|
1346
|
+
mergedRecord.products = shouldUseIncomingProductsSnapshot ? (0, import_lodash_es.cloneDeep)(incomingRecord.products) : this.mergeOrderProductLists(preferredRecord.products, secondaryRecord.products);
|
|
1347
|
+
if (Object.prototype.hasOwnProperty.call(incomingRecord, "payments")) {
|
|
1348
|
+
if (Array.isArray(incomingRecord.payments)) {
|
|
1349
|
+
mergedRecord.payments = this.mergeOrderPaymentLists(
|
|
1350
|
+
previousRecord.payments,
|
|
1351
|
+
incomingRecord.payments
|
|
1385
1352
|
);
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
if (Object.prototype.hasOwnProperty.call(existingRecord, field)) {
|
|
1389
|
-
mergedRecord[field] = (0, import_lodash_es.cloneDeep)(existingRecord[field]);
|
|
1390
|
-
} else {
|
|
1391
|
-
delete mergedRecord[field];
|
|
1353
|
+
} else if (incomingRecord.payments !== void 0 && incomingRecord.payments !== null) {
|
|
1354
|
+
mergedRecord.payments = (0, import_lodash_es.cloneDeep)(incomingRecord.payments);
|
|
1392
1355
|
}
|
|
1393
1356
|
}
|
|
1394
1357
|
if (!this.isPendingSyncOrder(preferred) || !this.isPendingSyncOrder(secondary)) {
|
|
1395
1358
|
merged.need_sync = 0;
|
|
1396
1359
|
}
|
|
1397
|
-
return
|
|
1398
|
-
(0, import_orderCollectionIdentity.applyOrderCollectionUidRemaps)(merged, childUidRemaps),
|
|
1399
|
-
"mergeOrderRecords"
|
|
1400
|
-
);
|
|
1360
|
+
return merged;
|
|
1401
1361
|
}
|
|
1402
1362
|
summarizeDuplicateOrders(orders) {
|
|
1403
1363
|
const groups = /* @__PURE__ */ new Map();
|
|
@@ -1434,16 +1394,12 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1434
1394
|
const list = [];
|
|
1435
1395
|
let removedCount = 0;
|
|
1436
1396
|
for (const order of orders) {
|
|
1437
|
-
const
|
|
1438
|
-
order,
|
|
1439
|
-
`${source}.order`
|
|
1440
|
-
);
|
|
1441
|
-
const matchIndex = this.findOrderIndexByIdentity(list, normalizedOrder);
|
|
1397
|
+
const matchIndex = this.findOrderIndexByIdentity(list, order);
|
|
1442
1398
|
if (matchIndex < 0) {
|
|
1443
|
-
list.push(
|
|
1399
|
+
list.push(order);
|
|
1444
1400
|
continue;
|
|
1445
1401
|
}
|
|
1446
|
-
list[matchIndex] = this.mergeOrderRecords(list[matchIndex],
|
|
1402
|
+
list[matchIndex] = this.mergeOrderRecords(list[matchIndex], order);
|
|
1447
1403
|
removedCount += 1;
|
|
1448
1404
|
}
|
|
1449
1405
|
if (removedCount > 0) {
|
|
@@ -1523,9 +1479,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1523
1479
|
return [];
|
|
1524
1480
|
try {
|
|
1525
1481
|
const orders = await this.dbManager.getAll(INDEXDB_STORE_NAME);
|
|
1526
|
-
return
|
|
1527
|
-
(order) => this.normalizeOrderCollectionsForIngress(order, "loadOrdersFromSQLite")
|
|
1528
|
-
);
|
|
1482
|
+
return orders || [];
|
|
1529
1483
|
} catch {
|
|
1530
1484
|
return [];
|
|
1531
1485
|
}
|
|
@@ -1534,24 +1488,16 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1534
1488
|
return Number(order == null ? void 0 : order.need_sync) === 1;
|
|
1535
1489
|
}
|
|
1536
1490
|
normalizeRemoteSyncedOrder(order) {
|
|
1537
|
-
|
|
1538
|
-
order
|
|
1539
|
-
"normalizeRemoteSyncedOrder"
|
|
1540
|
-
);
|
|
1541
|
-
if (this.isPendingSyncOrder(normalizedOrder))
|
|
1542
|
-
return normalizedOrder;
|
|
1491
|
+
if (this.isPendingSyncOrder(order))
|
|
1492
|
+
return order;
|
|
1543
1493
|
return {
|
|
1544
|
-
...
|
|
1494
|
+
...order,
|
|
1545
1495
|
need_sync: 0
|
|
1546
1496
|
};
|
|
1547
1497
|
}
|
|
1548
1498
|
mergeRemoteSnapshotWithPendingOrders(remoteOrders, existingOrders) {
|
|
1549
1499
|
const merged = remoteOrders.map((order) => this.normalizeRemoteSyncedOrder(order));
|
|
1550
|
-
for (const
|
|
1551
|
-
const order = this.normalizeOrderCollectionsForIngress(
|
|
1552
|
-
rawOrder,
|
|
1553
|
-
"mergeRemoteSnapshotWithPendingOrders.existingSQLite"
|
|
1554
|
-
);
|
|
1500
|
+
for (const order of existingOrders) {
|
|
1555
1501
|
if (!this.isPendingSyncOrder(order))
|
|
1556
1502
|
continue;
|
|
1557
1503
|
const matchIndex = this.findOrderIndexByIdentity(merged, order);
|
|
@@ -1588,7 +1534,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1588
1534
|
if (!this.dbManager || orders.length === 0) {
|
|
1589
1535
|
return;
|
|
1590
1536
|
}
|
|
1591
|
-
const ordersSnapshot = (0, import_lodash_es.cloneDeep)(orders).
|
|
1537
|
+
const ordersSnapshot = (0, import_lodash_es.cloneDeep)(orders).filter((order) => this.getOrderStorageKey(order));
|
|
1592
1538
|
if (ordersSnapshot.length === 0) {
|
|
1593
1539
|
return;
|
|
1594
1540
|
}
|
|
@@ -1649,10 +1595,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1649
1595
|
if (!this.dbManager || !this.getOrderStorageKey(order)) {
|
|
1650
1596
|
return;
|
|
1651
1597
|
}
|
|
1652
|
-
const orderSnapshot =
|
|
1653
|
-
(0, import_lodash_es.cloneDeep)(order),
|
|
1654
|
-
`${source}.sqliteIngress`
|
|
1655
|
-
);
|
|
1598
|
+
const orderSnapshot = (0, import_lodash_es.cloneDeep)(order);
|
|
1656
1599
|
try {
|
|
1657
1600
|
await this.runInOrderSQLiteSaveQueue(async () => {
|
|
1658
1601
|
let writeMethod = "none";
|
|
@@ -1698,9 +1641,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1698
1641
|
`${source}.snapshotNoDb`
|
|
1699
1642
|
).list;
|
|
1700
1643
|
}
|
|
1701
|
-
const remoteSnapshot = (0, import_lodash_es.cloneDeep)(orderList)
|
|
1702
|
-
(order) => this.normalizeOrderCollectionsForIngress(order, `${source}.remoteIngress`)
|
|
1703
|
-
);
|
|
1644
|
+
const remoteSnapshot = (0, import_lodash_es.cloneDeep)(orderList);
|
|
1704
1645
|
let mergedSnapshot = this.compactOrderListByIdentity(
|
|
1705
1646
|
remoteSnapshot.map((order) => this.normalizeRemoteSyncedOrder(order)),
|
|
1706
1647
|
`${source}.remoteSnapshot`
|
|
@@ -63,8 +63,6 @@ export interface OrderProductBundleItem {
|
|
|
63
63
|
bundle_group_id?: number;
|
|
64
64
|
/** 套餐商品 ID */
|
|
65
65
|
bundle_id?: number;
|
|
66
|
-
/** 套餐子商品封面图 */
|
|
67
|
-
cover?: string | null;
|
|
68
66
|
/** 套餐商品规格 ID */
|
|
69
67
|
bundle_variant_id?: number;
|
|
70
68
|
/** 数量 */
|
|
@@ -106,8 +104,6 @@ export interface OrderProductLineItem {
|
|
|
106
104
|
num: number;
|
|
107
105
|
/** 商品标题快照;本地待同步订单会补齐为多语言对象。 */
|
|
108
106
|
product_title?: OrderProductTitleSnapshot | string | null;
|
|
109
|
-
/** 商品封面图 */
|
|
110
|
-
product_cover?: string | null;
|
|
111
107
|
/** 多规格 ID。来源:Detail.product_variant_id */
|
|
112
108
|
product_variant_id?: number;
|
|
113
109
|
/**
|
|
@@ -2,7 +2,7 @@ import { Module, PisellCore } from '../../../types';
|
|
|
2
2
|
import { BaseModule } from '../../../modules/BaseModule';
|
|
3
3
|
import { ProductData } from '../../../modules/Product/types';
|
|
4
4
|
import type { RouteDefinition } from '../../types';
|
|
5
|
-
import { ProductIdScope,
|
|
5
|
+
import { ProductIdScope, ProductFormatter, ProductFormatterContext } from './types';
|
|
6
6
|
/**
|
|
7
7
|
* Products 模块 - 用于获取和管理完整的商品详细数据
|
|
8
8
|
* 相比 ProductList 模块,Products 会获取所有详细信息并缓存
|
|
@@ -18,8 +18,7 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
18
18
|
private productsPriceCache;
|
|
19
19
|
private readonly CACHE_MAX_DAYS;
|
|
20
20
|
private formatters;
|
|
21
|
-
private
|
|
22
|
-
private isLegacyPriceFormatterEnabled;
|
|
21
|
+
private isPriceFormatterRegistered;
|
|
23
22
|
private quotationPriceBridge?;
|
|
24
23
|
private quotationBridgeChannel?;
|
|
25
24
|
private quotationBridgeLoadedKey?;
|
|
@@ -37,8 +36,6 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
37
36
|
private lastPreloadCompletedAtMs;
|
|
38
37
|
/** IndexDB 写入串行队列,避免快照与 patch 并发交错 */
|
|
39
38
|
private productIndexDBSaveQueue;
|
|
40
|
-
/** 最近一次智能定价评估提取的 schedule 变价时间点(HH:mm),供 Server 订阅定时刷新使用 */
|
|
41
|
-
private lastScheduleTimePoints;
|
|
42
39
|
constructor(name?: string, version?: string);
|
|
43
40
|
initialize(core: PisellCore, options: any): Promise<void>;
|
|
44
41
|
/**
|
|
@@ -111,10 +108,6 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
111
108
|
*/
|
|
112
109
|
private prepareProductsWithPrice;
|
|
113
110
|
private getProductsPriceCacheKey;
|
|
114
|
-
/**
|
|
115
|
-
* 稳定序列化策略上下文,避免对象 key 顺序不同导致缓存 key 抖动。
|
|
116
|
-
*/
|
|
117
|
-
private stringifyStable;
|
|
118
111
|
private normalizeProductIds;
|
|
119
112
|
/**
|
|
120
113
|
* 按轻量范围返回商品 ID,不做 structuredClone。
|
|
@@ -129,26 +122,14 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
129
122
|
*/
|
|
130
123
|
private applyFormatters;
|
|
131
124
|
/**
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* 智能定价默认替代报价单逻辑;报价单 formatter 仅在 enableLegacyPriceFormatter=true 时启用。
|
|
125
|
+
* 注册内置的价格格式化器
|
|
126
|
+
* 这个格式化器负责将价格数据应用到商品上
|
|
135
127
|
* @private
|
|
136
128
|
*/
|
|
137
|
-
private
|
|
138
|
-
/**
|
|
139
|
-
* 是否启用旧报价单价格 formatter。
|
|
140
|
-
*
|
|
141
|
-
* 默认关闭,避免报价单逻辑覆盖智能定价结果。
|
|
142
|
-
*/
|
|
143
|
-
private shouldEnableLegacyPriceFormatter;
|
|
144
|
-
/**
|
|
145
|
-
* 返回最近一次 prepareProductsWithPrice / DataVariant 评估提取的变价时间点(HH:mm)。
|
|
146
|
-
* 供 OS Server 商品 query 订阅定时刷新使用。
|
|
147
|
-
*/
|
|
148
|
-
getLastScheduleTimePoints(): string[];
|
|
129
|
+
private registerBuiltinPriceFormatter;
|
|
149
130
|
/**
|
|
150
131
|
* 注册商品格式化器
|
|
151
|
-
*
|
|
132
|
+
* 格式化器会按注册顺序依次执行(内置价格格式化器始终是第一个)
|
|
152
133
|
* @param formatter 格式化函数
|
|
153
134
|
* @param prepend 是否插入到队列开头(默认 false,追加到末尾)
|
|
154
135
|
* @example
|
|
@@ -163,8 +144,8 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
163
144
|
*/
|
|
164
145
|
registerFormatter(formatter: ProductFormatter, prepend?: boolean): void;
|
|
165
146
|
/**
|
|
166
|
-
*
|
|
167
|
-
* @param keepBuiltin
|
|
147
|
+
* 清空所有格式化器(包括内置价格格式化器)
|
|
148
|
+
* @param keepBuiltin 是否保留内置价格格式化器(默认 true)
|
|
168
149
|
*/
|
|
169
150
|
clearFormatters(keepBuiltin?: boolean): void;
|
|
170
151
|
/**
|
|
@@ -204,10 +185,6 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
204
185
|
* 获取商品列表(深拷贝,供外部安全使用)
|
|
205
186
|
*/
|
|
206
187
|
getProducts(): Promise<ProductData[]>;
|
|
207
|
-
/**
|
|
208
|
-
* 批量获取商品轻量快照,供订单详情等响应补齐展示协议字段。
|
|
209
|
-
*/
|
|
210
|
-
getProductSnapshotsByIds(ids: number[]): Promise<Record<string, ProductSnapshot>>;
|
|
211
188
|
/**
|
|
212
189
|
* 内部获取商品列表的直接引用(无拷贝)
|
|
213
190
|
* 仅供内部 formatter 流程使用,因为 formatter 会创建新对象
|