@pisell/pisellos 2.2.276 → 2.2.800
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/core/index.d.ts +0 -2
- package/dist/core/index.js +0 -7
- package/dist/model/strategy/adapter/promotion/adapter.d.ts +0 -4
- package/dist/model/strategy/adapter/promotion/adapter.js +0 -23
- package/dist/model/strategy/adapter/promotion/evaluator.d.ts +0 -17
- package/dist/model/strategy/adapter/promotion/evaluator.js +6 -279
- package/dist/model/strategy/adapter/promotion/examples.d.ts +0 -86
- package/dist/model/strategy/adapter/promotion/examples.js +0 -99
- 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 +2 -90
- package/dist/model/strategy/adapter/promotion/type.js +0 -45
- package/dist/modules/OpenData/index.d.ts +0 -2
- package/dist/modules/OpenData/index.js +0 -8
- package/dist/modules/Order/index.d.ts +8 -28
- package/dist/modules/Order/index.js +496 -808
- package/dist/modules/Order/types.d.ts +1 -35
- package/dist/modules/Order/utils/orderCollectionIdentity.js +2 -7
- package/dist/modules/Order/utils.js +6 -10
- package/dist/modules/Payment/index.d.ts +0 -2
- package/dist/modules/Payment/index.js +49 -78
- package/dist/modules/Payment/types.d.ts +25 -104
- package/dist/modules/Payment/types.js +0 -17
- package/dist/modules/Payment/walletpass.d.ts +1 -38
- package/dist/modules/Payment/walletpass.js +114 -917
- package/dist/modules/Rules/index.d.ts +0 -3
- package/dist/modules/Rules/index.js +70 -100
- package/dist/server/index.d.ts +0 -25
- package/dist/server/index.js +1069 -2001
- package/dist/server/modules/index.d.ts +1 -1
- package/dist/server/modules/order/index.d.ts +4 -70
- package/dist/server/modules/order/index.js +728 -1816
- package/dist/server/modules/order/types.d.ts +3 -25
- package/dist/server/modules/order/types.js +1 -7
- package/dist/server/utils/small-ticket.js +2 -1
- package/dist/solution/BaseSales/index.d.ts +5 -104
- package/dist/solution/BaseSales/index.js +436 -1767
- package/dist/solution/BaseSales/types.d.ts +1 -55
- package/dist/solution/BaseSales/types.js +1 -2
- package/dist/solution/BaseSales/utils/cartPromotion.d.ts +1 -3
- package/dist/solution/BaseSales/utils/cartPromotion.js +31 -90
- package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +1 -6
- package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +4 -7
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.d.ts +5 -21
- package/dist/solution/BookingTicket/index.js +56 -139
- package/dist/solution/BookingTicket/types.d.ts +0 -1
- package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +0 -8
- package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +83 -173
- package/dist/solution/Sales/index.d.ts +0 -2
- package/dist/solution/Sales/index.js +4 -26
- package/dist/solution/ScanOrder/index.js +20 -31
- package/dist/solution/VenueBooking/index.d.ts +0 -1
- package/dist/solution/VenueBooking/index.js +19 -30
- package/dist/types/index.d.ts +0 -1
- package/lib/core/index.d.ts +0 -2
- package/lib/core/index.js +0 -4
- package/lib/model/strategy/adapter/promotion/adapter.d.ts +0 -4
- package/lib/model/strategy/adapter/promotion/adapter.js +0 -20
- package/lib/model/strategy/adapter/promotion/evaluator.d.ts +0 -17
- package/lib/model/strategy/adapter/promotion/evaluator.js +0 -235
- package/lib/model/strategy/adapter/promotion/examples.d.ts +0 -86
- package/lib/model/strategy/adapter/promotion/examples.js +0 -91
- package/lib/model/strategy/adapter/promotion/index.d.ts +1 -1
- package/lib/model/strategy/adapter/promotion/index.js +0 -2
- package/lib/model/strategy/adapter/promotion/type.d.ts +2 -90
- package/lib/model/strategy/adapter/promotion/type.js +0 -2
- package/lib/modules/OpenData/index.d.ts +0 -2
- package/lib/modules/OpenData/index.js +0 -5
- package/lib/modules/Order/index.d.ts +8 -28
- package/lib/modules/Order/index.js +69 -231
- package/lib/modules/Order/types.d.ts +1 -35
- package/lib/modules/Order/utils/orderCollectionIdentity.js +0 -3
- package/lib/modules/Order/utils.js +4 -11
- package/lib/modules/Payment/index.d.ts +0 -2
- package/lib/modules/Payment/index.js +12 -33
- package/lib/modules/Payment/types.d.ts +25 -104
- package/lib/modules/Payment/types.js +0 -1
- package/lib/modules/Payment/walletpass.d.ts +1 -38
- package/lib/modules/Payment/walletpass.js +21 -730
- package/lib/modules/Rules/index.d.ts +0 -3
- package/lib/modules/Rules/index.js +9 -38
- package/lib/server/index.d.ts +0 -25
- package/lib/server/index.js +31 -726
- package/lib/server/modules/index.d.ts +1 -1
- package/lib/server/modules/order/index.d.ts +4 -70
- package/lib/server/modules/order/index.js +69 -818
- package/lib/server/modules/order/types.d.ts +3 -25
- package/lib/server/modules/order/types.js +0 -1
- package/lib/server/utils/small-ticket.js +1 -1
- package/lib/solution/BaseSales/index.d.ts +5 -104
- package/lib/solution/BaseSales/index.js +27 -858
- package/lib/solution/BaseSales/types.d.ts +1 -55
- package/lib/solution/BaseSales/types.js +1 -2
- package/lib/solution/BaseSales/utils/cartPromotion.d.ts +1 -3
- package/lib/solution/BaseSales/utils/cartPromotion.js +12 -63
- package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +1 -6
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +3 -4
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.d.ts +5 -21
- package/lib/solution/BookingTicket/index.js +13 -64
- package/lib/solution/BookingTicket/types.d.ts +0 -1
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +0 -8
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +5 -37
- package/lib/solution/Sales/index.d.ts +0 -2
- package/lib/solution/Sales/index.js +6 -20
- package/lib/solution/ScanOrder/index.js +0 -8
- package/lib/solution/VenueBooking/index.d.ts +0 -1
- package/lib/solution/VenueBooking/index.js +0 -8
- package/lib/types/index.d.ts +0 -1
- package/package.json +1 -1
- package/dist/modules/Order/payment-utils.d.ts +0 -26
- package/dist/modules/Order/payment-utils.js +0 -225
- package/dist/utils/payment-number.d.ts +0 -9
- package/dist/utils/payment-number.js +0 -69
- package/lib/modules/Order/payment-utils.d.ts +0 -26
- package/lib/modules/Order/payment-utils.js +0 -224
- package/lib/utils/payment-number.d.ts +0 -9
- package/lib/utils/payment-number.js +0 -64
|
@@ -37,7 +37,6 @@ var import_dayjs = __toESM(require("dayjs"));
|
|
|
37
37
|
var import_BaseModule = require("../../../modules/BaseModule");
|
|
38
38
|
var import_orderCollectionIdentity = require("../../../modules/Order/utils/orderCollectionIdentity");
|
|
39
39
|
var import_types = require("./types");
|
|
40
|
-
var import_payment_utils = require("../../../modules/Order/payment-utils");
|
|
41
40
|
var INDEXDB_STORE_NAME = "orders";
|
|
42
41
|
var ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY = "server_order_last_full_fetch_at";
|
|
43
42
|
var ORDER_SYNC_THROTTLE_MS_STORAGE_KEY = "order_sync_throttle_ms";
|
|
@@ -47,13 +46,10 @@ var ORDER_SILENT_REFRESH_MIN_INTERVAL_MS = 3e4;
|
|
|
47
46
|
var ORDER_BUSINESS_WRITE_SOURCES = /* @__PURE__ */ new Set([
|
|
48
47
|
"upsertOrdersFromRemote",
|
|
49
48
|
"upsertPendingSyncOrders",
|
|
50
|
-
"upsertLocalDraftOrders",
|
|
51
49
|
"overwriteExistingOrder",
|
|
52
|
-
"markOrderSyncedByExternalSaleNumber"
|
|
53
|
-
"updateLocalPayment"
|
|
50
|
+
"markOrderSyncedByExternalSaleNumber"
|
|
54
51
|
]);
|
|
55
52
|
var ORDER_MERGE_SELF_CHECK = false;
|
|
56
|
-
var PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER = "__pisell_os_pending_payment_without_unique_number__";
|
|
57
53
|
var ORDER_AUTHORITATIVE_COLLECTION_FIELDS = ["products", "bookings", "payments"];
|
|
58
54
|
var ORDER_COLLECTION_KIND_BY_FIELD = {
|
|
59
55
|
products: "product",
|
|
@@ -89,24 +85,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
89
85
|
};
|
|
90
86
|
await this.core.effects.emit(import_types.OrderHooks.onOrdersChanged, payload);
|
|
91
87
|
}
|
|
92
|
-
/**
|
|
93
|
-
* 广播远端商品成员增删。监听器异常必须与订单落库和原有订单广播隔离。
|
|
94
|
-
*/
|
|
95
|
-
async emitRemoteProductMembershipChanges(changes) {
|
|
96
|
-
for (const payload of changes) {
|
|
97
|
-
try {
|
|
98
|
-
await this.core.effects.emit(import_types.OrderHooks.onRemoteProductMembershipChanged, payload);
|
|
99
|
-
} catch (error) {
|
|
100
|
-
this.logError("广播远端订单商品成员变更失败", {
|
|
101
|
-
order_id: payload.order_id,
|
|
102
|
-
source: payload.source,
|
|
103
|
-
added_product_count: payload.added_product_keys.length,
|
|
104
|
-
removed_product_count: payload.removed_product_keys.length,
|
|
105
|
-
error: error instanceof Error ? error.message : String(error)
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
88
|
async initialize(core, options) {
|
|
111
89
|
var _a;
|
|
112
90
|
this.core = core;
|
|
@@ -122,10 +100,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
122
100
|
this.updateCreateStore();
|
|
123
101
|
}
|
|
124
102
|
if (Array.isArray((_a = options == null ? void 0 : options.initialState) == null ? void 0 : _a.list)) {
|
|
125
|
-
this.store.list = this.
|
|
126
|
-
options.initialState.list,
|
|
127
|
-
"initialState"
|
|
128
|
-
);
|
|
103
|
+
this.store.list = options.initialState.list.map((order) => this.normalizeOrderForMemoryList(order));
|
|
129
104
|
this.syncOrdersMap();
|
|
130
105
|
this.emitOrdersChanged([], "initialState");
|
|
131
106
|
} else {
|
|
@@ -191,35 +166,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
191
166
|
* 仅记录计数与订单标识,不输出商品、预约、支付或客户明细。
|
|
192
167
|
*/
|
|
193
168
|
normalizeOrderCollectionsForIngress(order, source) {
|
|
194
|
-
const
|
|
195
|
-
const sourceOrderRecord = sourceOrder;
|
|
196
|
-
if (Array.isArray(sourceOrderRecord.payments)) {
|
|
197
|
-
sourceOrderRecord.payments = sourceOrderRecord.payments.map((payment) => {
|
|
198
|
-
if (!(0, import_payment_utils.isPendingOrderPayment)(payment) || (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment).some((key) => key.startsWith("unique_payment_number:"))) {
|
|
199
|
-
return payment;
|
|
200
|
-
}
|
|
201
|
-
return {
|
|
202
|
-
...payment,
|
|
203
|
-
[PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER]: true
|
|
204
|
-
};
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
const result = (0, import_orderCollectionIdentity.normalizeOrderCollections)(sourceOrder);
|
|
208
|
-
const normalizedOrderRecord = result.order;
|
|
209
|
-
if (Array.isArray(normalizedOrderRecord.payments)) {
|
|
210
|
-
normalizedOrderRecord.payments = normalizedOrderRecord.payments.map(
|
|
211
|
-
(payment) => {
|
|
212
|
-
if (!(payment == null ? void 0 : payment[PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER]))
|
|
213
|
-
return payment;
|
|
214
|
-
const nextPayment = { ...payment };
|
|
215
|
-
const metadata = { ...nextPayment.metadata || {} };
|
|
216
|
-
delete metadata.unique_payment_number;
|
|
217
|
-
delete nextPayment[PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER];
|
|
218
|
-
nextPayment.metadata = metadata;
|
|
219
|
-
return nextPayment;
|
|
220
|
-
}
|
|
221
|
-
);
|
|
222
|
-
}
|
|
169
|
+
const result = (0, import_orderCollectionIdentity.normalizeOrderCollections)(order);
|
|
223
170
|
const kinds = ["product", "booking", "payment"];
|
|
224
171
|
const hasChanges = kinds.some((kind) => {
|
|
225
172
|
const stats = result.stats[kind];
|
|
@@ -255,16 +202,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
255
202
|
/**
|
|
256
203
|
* incoming 决定权威成员集合;同一持久化行仍从 existing 补齐 incoming 省略的本地展示字段。
|
|
257
204
|
*/
|
|
258
|
-
mergeAuthoritativeOrderCollection(field, existing, incoming, uidRemaps = []
|
|
205
|
+
mergeAuthoritativeOrderCollection(field, existing, incoming, uidRemaps = []) {
|
|
259
206
|
const kind = ORDER_COLLECTION_KIND_BY_FIELD[field];
|
|
260
207
|
const existingItems = Array.isArray(existing) ? existing : [];
|
|
261
|
-
if (field === "payments" && options.preserveIdentifiedPendingPayments) {
|
|
262
|
-
return (0, import_payment_utils.mergeOrderPaymentListsByIdentity)(
|
|
263
|
-
existingItems,
|
|
264
|
-
incoming,
|
|
265
|
-
{ preserveUnmatchedExistingWhen: import_payment_utils.isIdentifiedPendingOrderPayment }
|
|
266
|
-
);
|
|
267
|
-
}
|
|
268
208
|
return incoming.map((incomingItem) => {
|
|
269
209
|
const existingItem = existingItems.find(
|
|
270
210
|
(item) => (0, import_orderCollectionIdentity.isSameOrderCollectionItem)(kind, item, incomingItem)
|
|
@@ -332,7 +272,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
332
272
|
* @example
|
|
333
273
|
* const { toWrite, skipped } = this.filterRedundantPatchOrders('pubsub.bodyUpsert', orders, mergeActions)
|
|
334
274
|
*/
|
|
335
|
-
filterRedundantPatchOrders(source, orders, mergeActions
|
|
275
|
+
filterRedundantPatchOrders(source, orders, mergeActions) {
|
|
336
276
|
const eligibleSkipSources = /* @__PURE__ */ new Set(["pubsub.bodyUpsert", "pubsub.httpRefresh"]);
|
|
337
277
|
if (!eligibleSkipSources.has(source)) {
|
|
338
278
|
return { toWrite: orders, skipped: [] };
|
|
@@ -352,10 +292,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
352
292
|
toWrite.push(order);
|
|
353
293
|
continue;
|
|
354
294
|
}
|
|
355
|
-
if (forceWriteStorageKeys.has(storageKey)) {
|
|
356
|
-
toWrite.push(order);
|
|
357
|
-
continue;
|
|
358
|
-
}
|
|
359
295
|
const recent = this.recentSqliteWriteByStorageKey.get(storageKey);
|
|
360
296
|
if (recent && ORDER_BUSINESS_WRITE_SOURCES.has(recent.source) && now - recent.ts < ORDER_SQLITE_DEDUPE_MS) {
|
|
361
297
|
skipped.push({
|
|
@@ -524,11 +460,17 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
524
460
|
return DEFAULT_ORDER_SYNC_THROTTLE_MS;
|
|
525
461
|
}
|
|
526
462
|
async preload() {
|
|
527
|
-
const
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
463
|
+
const getData = async () => {
|
|
464
|
+
const orders = await this.loadOrdersByServer();
|
|
465
|
+
if (orders.length === 0) {
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
this.store.list = (0, import_lodash_es.cloneDeep)(orders);
|
|
469
|
+
this.syncOrdersMap();
|
|
470
|
+
this.emitOrdersChanged([], "preload");
|
|
471
|
+
this.core.effects.emit(import_types.OrderHooks.onOrdersSyncCompleted, null);
|
|
472
|
+
};
|
|
473
|
+
getData();
|
|
532
474
|
}
|
|
533
475
|
getOrders() {
|
|
534
476
|
return this.store.list;
|
|
@@ -540,27 +482,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
540
482
|
getOrderByOrderId(orderId) {
|
|
541
483
|
return this.store.map.get(this.getIdKey(orderId));
|
|
542
484
|
}
|
|
543
|
-
buildLocalPaymentOrderLogContext(order) {
|
|
544
|
-
if (!order)
|
|
545
|
-
return {};
|
|
546
|
-
return {
|
|
547
|
-
order_id: order.order_id ?? null,
|
|
548
|
-
external_sale_number: order.external_sale_number ?? null,
|
|
549
|
-
order_number: order.order_number ?? null,
|
|
550
|
-
shop_order_number: order.shop_order_number ?? null,
|
|
551
|
-
shop_full_order_number: order.shop_full_order_number ?? null,
|
|
552
|
-
order_status: order.status ?? null,
|
|
553
|
-
payment_status: order.payment_status ?? null,
|
|
554
|
-
is_draft_order: Number(order.is_draft_order || 0),
|
|
555
|
-
need_sync: Number(order.need_sync || 0),
|
|
556
|
-
platform: order.platform ?? null,
|
|
557
|
-
business_code: order.business_code ?? null,
|
|
558
|
-
order_sales_channel: order.order_sales_channel ?? null,
|
|
559
|
-
sales_channel: order.sales_channel ?? null,
|
|
560
|
-
order_type: order.type ?? null,
|
|
561
|
-
payments_count: Array.isArray(order.payments) ? order.payments.length : 0
|
|
562
|
-
};
|
|
563
|
-
}
|
|
564
485
|
getLocalOrderFromMemoryByLookup(lookup) {
|
|
565
486
|
const key = this.getIdKey(lookup);
|
|
566
487
|
const memoryOrderById = this.store.map.get(key);
|
|
@@ -569,200 +490,28 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
569
490
|
const memoryOrder = this.store.list.find((order) => this.isOrderLookupMatch(order, key));
|
|
570
491
|
return memoryOrder || null;
|
|
571
492
|
}
|
|
572
|
-
async getLocalOrderByLookup(lookup
|
|
493
|
+
async getLocalOrderByLookup(lookup) {
|
|
573
494
|
const key = this.getIdKey(lookup);
|
|
574
|
-
const logContext = {
|
|
575
|
-
operation_id: options.operationId,
|
|
576
|
-
lookup: key,
|
|
577
|
-
memory_order_count: this.store.list.length
|
|
578
|
-
};
|
|
579
|
-
if (options.operationId) {
|
|
580
|
-
this.logInfo("getLocalOrderByLookup-localPayment-开始", logContext);
|
|
581
|
-
}
|
|
582
495
|
const memoryOrderById = this.store.map.get(key);
|
|
583
|
-
if (memoryOrderById)
|
|
584
|
-
if (options.operationId) {
|
|
585
|
-
this.logInfo("getLocalOrderByLookup-localPayment-命中内存映射", {
|
|
586
|
-
...logContext,
|
|
587
|
-
...this.buildLocalPaymentOrderLogContext(memoryOrderById)
|
|
588
|
-
});
|
|
589
|
-
}
|
|
496
|
+
if (memoryOrderById)
|
|
590
497
|
return memoryOrderById;
|
|
591
|
-
}
|
|
592
498
|
const memoryOrder = this.store.list.find((order) => this.isOrderLookupMatch(order, key));
|
|
593
|
-
if (memoryOrder)
|
|
594
|
-
if (options.operationId) {
|
|
595
|
-
this.logInfo("getLocalOrderByLookup-localPayment-命中内存列表", {
|
|
596
|
-
...logContext,
|
|
597
|
-
...this.buildLocalPaymentOrderLogContext(memoryOrder)
|
|
598
|
-
});
|
|
599
|
-
}
|
|
499
|
+
if (memoryOrder)
|
|
600
500
|
return memoryOrder;
|
|
601
|
-
}
|
|
602
|
-
if (options.operationId) {
|
|
603
|
-
this.logInfo("getLocalOrderByLookup-localPayment-开始读取SQLite", logContext);
|
|
604
|
-
}
|
|
605
501
|
const orders = await this.loadOrdersFromSQLite();
|
|
606
502
|
const localOrder = orders.find((order) => this.isOrderLookupMatch(order, key));
|
|
607
|
-
if (!localOrder)
|
|
608
|
-
if (options.operationId) {
|
|
609
|
-
this.logWarning("getLocalOrderByLookup-localPayment-SQLite未命中", {
|
|
610
|
-
...logContext,
|
|
611
|
-
sqlite_order_count: orders.length
|
|
612
|
-
});
|
|
613
|
-
}
|
|
614
|
-
return null;
|
|
615
|
-
}
|
|
616
|
-
this.store.list = this.normalizeOrdersForMemoryList(
|
|
617
|
-
orders,
|
|
618
|
-
"getLocalOrderByLookup.sqliteMemory"
|
|
619
|
-
);
|
|
620
|
-
this.syncOrdersMap();
|
|
621
|
-
const normalizedOrder = this.normalizeOrderForMemoryList(localOrder);
|
|
622
|
-
if (options.operationId) {
|
|
623
|
-
this.logInfo("getLocalOrderByLookup-localPayment-SQLite命中", {
|
|
624
|
-
...logContext,
|
|
625
|
-
sqlite_order_count: orders.length,
|
|
626
|
-
...this.buildLocalPaymentOrderLogContext(normalizedOrder)
|
|
627
|
-
});
|
|
628
|
-
}
|
|
629
|
-
return normalizedOrder;
|
|
630
|
-
}
|
|
631
|
-
async getLocalPayment(params) {
|
|
632
|
-
const logContext = {
|
|
633
|
-
operation_id: params.operationId,
|
|
634
|
-
sale_id: params.saleId,
|
|
635
|
-
payment_number: params.paymentNumber
|
|
636
|
-
};
|
|
637
|
-
this.logInfo("getLocalPayment-开始", logContext);
|
|
638
|
-
try {
|
|
639
|
-
const order = await this.getLocalOrderByLookup(params.saleId, {
|
|
640
|
-
operationId: params.operationId
|
|
641
|
-
});
|
|
642
|
-
if (!order) {
|
|
643
|
-
this.logWarning("getLocalPayment-订单未命中", logContext);
|
|
644
|
-
return null;
|
|
645
|
-
}
|
|
646
|
-
const payments = order.payments || [];
|
|
647
|
-
const match = (0, import_payment_utils.resolveOrderPaymentIdentity)(
|
|
648
|
-
payments,
|
|
649
|
-
params.paymentNumber,
|
|
650
|
-
"compat"
|
|
651
|
-
);
|
|
652
|
-
if (!match) {
|
|
653
|
-
this.logWarning("getLocalPayment-支付项未命中", {
|
|
654
|
-
...logContext,
|
|
655
|
-
...this.buildLocalPaymentOrderLogContext(order),
|
|
656
|
-
payments
|
|
657
|
-
});
|
|
658
|
-
return null;
|
|
659
|
-
}
|
|
660
|
-
this.logInfo("getLocalPayment-支付项命中", {
|
|
661
|
-
...logContext,
|
|
662
|
-
...this.buildLocalPaymentOrderLogContext(order),
|
|
663
|
-
matched_by: match.matchedBy,
|
|
664
|
-
payment_index: match.index,
|
|
665
|
-
payment: match.payment
|
|
666
|
-
});
|
|
667
|
-
return {
|
|
668
|
-
order,
|
|
669
|
-
payment: match.payment,
|
|
670
|
-
paymentIndex: match.index,
|
|
671
|
-
matchedBy: match.matchedBy
|
|
672
|
-
};
|
|
673
|
-
} catch (error) {
|
|
674
|
-
this.logError("getLocalPayment-查询失败", {
|
|
675
|
-
...logContext,
|
|
676
|
-
error: error instanceof Error ? error.message : String(error)
|
|
677
|
-
});
|
|
678
|
-
throw error;
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
async updateLocalPayment(params) {
|
|
682
|
-
const logContext = {
|
|
683
|
-
operation_id: params.operationId,
|
|
684
|
-
sale_id: params.saleId,
|
|
685
|
-
payment_number: params.paymentNumber,
|
|
686
|
-
incoming_payment_update: params.updates
|
|
687
|
-
};
|
|
688
|
-
this.logInfo("updateLocalPayment-开始", logContext);
|
|
689
|
-
const found = await this.getLocalPayment(params);
|
|
690
|
-
if (!found) {
|
|
691
|
-
this.logWarning("updateLocalPayment-支付项未命中", logContext);
|
|
692
|
-
return null;
|
|
693
|
-
}
|
|
694
|
-
const previousPayment = (0, import_lodash_es.cloneDeep)(found.payment);
|
|
695
|
-
const nextPayment = (0, import_payment_utils.mergeOrderPaymentRecord)(found.payment, {
|
|
696
|
-
...params.updates,
|
|
697
|
-
updated_at: params.updates.updated_at || (0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss")
|
|
698
|
-
});
|
|
699
|
-
const nextOrder = {
|
|
700
|
-
...found.order,
|
|
701
|
-
payments: (found.order.payments || []).map((payment, index) => index === found.paymentIndex ? nextPayment : payment),
|
|
702
|
-
updated_at: (0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss")
|
|
703
|
-
};
|
|
704
|
-
const paymentContext = {
|
|
705
|
-
...logContext,
|
|
706
|
-
matched_by: found.matchedBy,
|
|
707
|
-
payment_index: found.paymentIndex,
|
|
708
|
-
...this.buildLocalPaymentOrderLogContext(nextOrder),
|
|
709
|
-
previous_payment: previousPayment,
|
|
710
|
-
payment: nextPayment
|
|
711
|
-
};
|
|
712
|
-
this.logInfo("updateLocalPayment-支付项合并完成", paymentContext);
|
|
713
|
-
const targetIndex = this.findOrderIndexByIdentity(this.store.list, found.order);
|
|
714
|
-
const shouldKeepInMemory = this.shouldKeepOrderInMemory(nextOrder);
|
|
715
|
-
if (targetIndex < 0 && shouldKeepInMemory) {
|
|
716
|
-
this.logError("updateLocalPayment-订单Store索引未命中", paymentContext);
|
|
503
|
+
if (!localOrder)
|
|
717
504
|
return null;
|
|
718
|
-
|
|
719
|
-
const previousList = this.store.list;
|
|
720
|
-
this.store.list = shouldKeepInMemory ? this.store.list.map((order, index) => index === targetIndex ? nextOrder : order) : this.store.list.filter((_, index) => index !== targetIndex);
|
|
505
|
+
this.store.list = orders.map((order) => this.normalizeOrderForMemoryList(order));
|
|
721
506
|
this.syncOrdersMap();
|
|
722
|
-
|
|
723
|
-
try {
|
|
724
|
-
this.logInfo("updateLocalPayment-SQLite写入开始", {
|
|
725
|
-
...paymentContext,
|
|
726
|
-
storage_order_id: storageOrder.order_id ?? null
|
|
727
|
-
});
|
|
728
|
-
await this.updateOrderInSQLite(storageOrder, "updateLocalPayment", { throwOnError: true });
|
|
729
|
-
this.logInfo("updateLocalPayment-SQLite写入完成", {
|
|
730
|
-
...paymentContext,
|
|
731
|
-
storage_order_id: storageOrder.order_id ?? null
|
|
732
|
-
});
|
|
733
|
-
} catch (error) {
|
|
734
|
-
this.store.list = previousList;
|
|
735
|
-
this.syncOrdersMap();
|
|
736
|
-
this.logError("updateLocalPayment-SQLite写入失败并回滚内存", {
|
|
737
|
-
...paymentContext,
|
|
738
|
-
storage_order_id: storageOrder.order_id ?? null,
|
|
739
|
-
error: error instanceof Error ? error.message : String(error)
|
|
740
|
-
});
|
|
741
|
-
throw error;
|
|
742
|
-
}
|
|
743
|
-
if (shouldKeepInMemory || targetIndex >= 0) {
|
|
744
|
-
await this.emitOrdersChanged(
|
|
745
|
-
shouldKeepInMemory ? [nextOrder] : [],
|
|
746
|
-
shouldKeepInMemory ? "updateLocalPayment" : "updateLocalPayment.sqliteOnlyDraft"
|
|
747
|
-
);
|
|
748
|
-
}
|
|
749
|
-
this.logInfo("updateLocalPayment-变更事件完成", paymentContext);
|
|
750
|
-
return { order: nextOrder, payment: nextPayment, previousPayment };
|
|
507
|
+
return this.normalizeOrderForMemoryList(localOrder);
|
|
751
508
|
}
|
|
752
509
|
async loadOrdersByServer() {
|
|
753
510
|
var _a;
|
|
754
511
|
let orderList = [];
|
|
755
|
-
const protectedOrdersBeforeRemoteFetch = (await this.loadOrdersFromSQLite()).filter(
|
|
756
|
-
(order) => this.shouldProtectLocalOrderFromRemoteSnapshot(order)
|
|
757
|
-
);
|
|
758
512
|
this.logInfo("loadOrdersByServer-开始", {
|
|
759
513
|
hasOrderDataSource: !!this.orderDataSource,
|
|
760
|
-
query: ((_a = this.store) == null ? void 0 : _a.createdAtQuery) || null
|
|
761
|
-
protectedLocalOrderCount: protectedOrdersBeforeRemoteFetch.length,
|
|
762
|
-
protectedPendingPaymentCount: protectedOrdersBeforeRemoteFetch.reduce(
|
|
763
|
-
(count, order) => count + this.getIdentifiedPendingPayments(order).length,
|
|
764
|
-
0
|
|
765
|
-
)
|
|
514
|
+
query: ((_a = this.store) == null ? void 0 : _a.createdAtQuery) || null
|
|
766
515
|
});
|
|
767
516
|
if (this.orderDataSource) {
|
|
768
517
|
try {
|
|
@@ -782,19 +531,10 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
782
531
|
return this.store.list;
|
|
783
532
|
}
|
|
784
533
|
}
|
|
785
|
-
const mergedOrders = await this.replaceOrdersSnapshotInSQLite(
|
|
786
|
-
|
|
787
|
-
"loadOrdersByServer",
|
|
788
|
-
protectedOrdersBeforeRemoteFetch
|
|
789
|
-
);
|
|
790
|
-
const memoryOrders = this.normalizeOrdersForMemoryList(
|
|
791
|
-
mergedOrders,
|
|
792
|
-
"loadOrdersByServer.memory"
|
|
793
|
-
);
|
|
534
|
+
const mergedOrders = await this.replaceOrdersSnapshotInSQLite(orderList, "loadOrdersByServer");
|
|
535
|
+
const memoryOrders = mergedOrders.map((order) => this.normalizeOrderForMemoryList(order));
|
|
794
536
|
this.logInfo("loadOrdersByServer-结束", {
|
|
795
|
-
count: memoryOrders.length
|
|
796
|
-
persistedCount: mergedOrders.length,
|
|
797
|
-
sqliteOnlyDraftCount: mergedOrders.length - memoryOrders.length
|
|
537
|
+
count: memoryOrders.length
|
|
798
538
|
});
|
|
799
539
|
await this.core.effects.emit(import_types.OrderHooks.onOrdersLoaded, memoryOrders);
|
|
800
540
|
return memoryOrders;
|
|
@@ -814,14 +554,18 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
814
554
|
try {
|
|
815
555
|
this.updateCreateStore();
|
|
816
556
|
const orders = await this.loadOrdersByServer();
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
557
|
+
if (orders.length > 0) {
|
|
558
|
+
this.store.list = (0, import_lodash_es.cloneDeep)(orders);
|
|
559
|
+
this.syncOrdersMap();
|
|
560
|
+
this.emitOrdersChanged([], "silentRefresh");
|
|
561
|
+
await this.core.effects.emit(import_types.OrderHooks.onOrdersSyncCompleted, null);
|
|
562
|
+
this.logInfo("silentRefresh 完成", {
|
|
563
|
+
orderCount: orders.length,
|
|
564
|
+
duration: `${Date.now() - startTime}ms`
|
|
565
|
+
});
|
|
566
|
+
} else {
|
|
567
|
+
this.logInfo("silentRefresh: 服务器未返回数据");
|
|
568
|
+
}
|
|
825
569
|
return this.store.list;
|
|
826
570
|
} catch (error) {
|
|
827
571
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -835,9 +579,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
835
579
|
normalizeOrderForMemoryList(order, source = "normalizeOrderForMemoryList") {
|
|
836
580
|
const normalizedOrder = this.normalizeOrderCollectionsForIngress(order, source);
|
|
837
581
|
const externalSaleNumber = normalizedOrder == null ? void 0 : normalizedOrder.external_sale_number;
|
|
838
|
-
if (this.isDraftOrder(normalizedOrder) && !this.hasRealOrderId(normalizedOrder)) {
|
|
839
|
-
return normalizedOrder;
|
|
840
|
-
}
|
|
841
582
|
if ((normalizedOrder == null ? void 0 : normalizedOrder.order_id) !== void 0 && (normalizedOrder == null ? void 0 : normalizedOrder.order_id) !== null && (normalizedOrder == null ? void 0 : normalizedOrder.order_id) !== "") {
|
|
842
583
|
return normalizedOrder;
|
|
843
584
|
}
|
|
@@ -849,27 +590,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
849
590
|
order_id: externalSaleNumber
|
|
850
591
|
};
|
|
851
592
|
}
|
|
852
|
-
normalizeOrdersForMemoryList(orders, source) {
|
|
853
|
-
return orders.map((order) => this.normalizeOrderForMemoryList(order, source)).filter((order) => this.shouldKeepOrderInMemory(order));
|
|
854
|
-
}
|
|
855
|
-
hasRealOrderId(order) {
|
|
856
|
-
if (!order || this.isBlankIdentityValue(order.order_id))
|
|
857
|
-
return false;
|
|
858
|
-
const externalSaleNumber = order.external_sale_number;
|
|
859
|
-
return !(this.isDraftOrder(order) && !this.isBlankIdentityValue(externalSaleNumber) && String(order.order_id) === String(externalSaleNumber));
|
|
860
|
-
}
|
|
861
|
-
shouldKeepOrderInMemory(order) {
|
|
862
|
-
return !this.isDraftOrder(order) || this.hasRealOrderId(order);
|
|
863
|
-
}
|
|
864
|
-
withoutSyntheticDraftOrderId(order) {
|
|
865
|
-
const externalSaleNumber = order.external_sale_number;
|
|
866
|
-
if (Number(order.is_draft_order || 0) !== 1 || order.order_id === void 0 || externalSaleNumber === void 0 || String(order.order_id) !== String(externalSaleNumber)) {
|
|
867
|
-
return order;
|
|
868
|
-
}
|
|
869
|
-
const next = { ...order };
|
|
870
|
-
delete next.order_id;
|
|
871
|
-
return next;
|
|
872
|
-
}
|
|
873
593
|
/**
|
|
874
594
|
* 仅覆盖本地已存在的订单;不存在则直接跳过,不落库、不 emit。
|
|
875
595
|
* 适用于"按 order_id 主动刷新本地订单详情"的代理场景。
|
|
@@ -918,13 +638,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
918
638
|
* 将远端拉取的订单合并进本地 store(已存在则更新,不存在则追加),落库并 emit onOrdersChanged。
|
|
919
639
|
* 供 /update/localOrder 等在「本地尚无该单」时写入新建单。
|
|
920
640
|
*/
|
|
921
|
-
async upsertOrdersFromRemote(freshOrders
|
|
641
|
+
async upsertOrdersFromRemote(freshOrders) {
|
|
922
642
|
if (!(freshOrders == null ? void 0 : freshOrders.length)) {
|
|
923
643
|
this.logInfo("upsertOrdersFromRemote-订单列表为空", {});
|
|
924
644
|
return;
|
|
925
645
|
}
|
|
926
|
-
this.logInfo("upsertOrdersFromRemote-开始", { count: freshOrders.length
|
|
927
|
-
await this.mergeOrdersToStore(freshOrders,
|
|
646
|
+
this.logInfo("upsertOrdersFromRemote-开始", { count: freshOrders.length });
|
|
647
|
+
await this.mergeOrdersToStore(freshOrders, "upsertOrdersFromRemote");
|
|
928
648
|
}
|
|
929
649
|
async markOrderSyncedByExternalSaleNumber(params) {
|
|
930
650
|
const externalSaleNumber = params.externalSaleNumber;
|
|
@@ -950,8 +670,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
950
670
|
...existing,
|
|
951
671
|
...params.patch || {},
|
|
952
672
|
external_sale_number: existing.external_sale_number ?? externalSaleNumber,
|
|
953
|
-
need_sync: 0
|
|
954
|
-
is_draft_order: 0
|
|
673
|
+
need_sync: 0
|
|
955
674
|
});
|
|
956
675
|
const storageKey = this.getOrderStorageKey(nextOrder) || key;
|
|
957
676
|
this.store.list = this.store.list.map((order, index) => {
|
|
@@ -976,7 +695,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
976
695
|
* 将本地待同步订单按 SQLite storage key 合并进 store 并落库。
|
|
977
696
|
* checkout 离线兜底可能没有 order_id,但通常会有 external_sale_number。
|
|
978
697
|
*/
|
|
979
|
-
async upsertPendingSyncOrders(pendingOrders
|
|
698
|
+
async upsertPendingSyncOrders(pendingOrders) {
|
|
980
699
|
if (!(pendingOrders == null ? void 0 : pendingOrders.length)) {
|
|
981
700
|
this.logInfo("upsertPendingSyncOrders-订单列表为空", {});
|
|
982
701
|
return;
|
|
@@ -988,19 +707,14 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
988
707
|
order,
|
|
989
708
|
"upsertPendingSyncOrders.incoming"
|
|
990
709
|
);
|
|
991
|
-
const
|
|
992
|
-
...normalizedOrder,
|
|
993
|
-
need_sync: 1,
|
|
994
|
-
is_draft_order: 0
|
|
995
|
-
};
|
|
996
|
-
const storageKey = this.getOrderStorageKey(pendingOrder);
|
|
710
|
+
const storageKey = this.getOrderStorageKey(normalizedOrder);
|
|
997
711
|
if (!storageKey)
|
|
998
712
|
continue;
|
|
999
|
-
pendingMap.set(storageKey,
|
|
713
|
+
pendingMap.set(storageKey, normalizedOrder);
|
|
1000
714
|
memoryPendingMap.set(
|
|
1001
715
|
storageKey,
|
|
1002
716
|
this.normalizeOrderForMemoryList(
|
|
1003
|
-
|
|
717
|
+
normalizedOrder,
|
|
1004
718
|
"upsertPendingSyncOrders.memory"
|
|
1005
719
|
)
|
|
1006
720
|
);
|
|
@@ -1031,12 +745,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1031
745
|
if (matchIndex >= 0) {
|
|
1032
746
|
const existingOrder = updatedList[matchIndex];
|
|
1033
747
|
const mergedOrder = this.mergeOrderRecords(existingOrder, pendingOrder);
|
|
1034
|
-
|
|
1035
|
-
...mergedOrder,
|
|
1036
|
-
need_sync: 1,
|
|
1037
|
-
is_draft_order: 0
|
|
1038
|
-
};
|
|
1039
|
-
updatedList[matchIndex] = nextOrder;
|
|
748
|
+
updatedList[matchIndex] = mergedOrder;
|
|
1040
749
|
const pendingSnapshot = pendingMap.get(storageKey);
|
|
1041
750
|
if (pendingSnapshot) {
|
|
1042
751
|
pendingMap.set(
|
|
@@ -1044,7 +753,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1044
753
|
this.reconcileOverwriteOrderCollections(existingOrder, pendingSnapshot)
|
|
1045
754
|
);
|
|
1046
755
|
}
|
|
1047
|
-
this.registerOrderIdentityKeys(identityKeyToIndex,
|
|
756
|
+
this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, matchIndex);
|
|
1048
757
|
mergeActions[storageKey] = "update";
|
|
1049
758
|
continue;
|
|
1050
759
|
}
|
|
@@ -1054,131 +763,15 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1054
763
|
mergeActions[storageKey] = "insert";
|
|
1055
764
|
}
|
|
1056
765
|
const patchedOrders = [...pendingMap.values()];
|
|
1057
|
-
const previousList = this.store.list;
|
|
1058
766
|
this.store.list = this.runOrderStoreSelfCheck(updatedList, "upsertPendingSyncOrders.store");
|
|
1059
767
|
this.syncOrdersMap();
|
|
1060
|
-
|
|
1061
|
-
await this.patchOrdersInSQLite(
|
|
1062
|
-
patchedOrders,
|
|
1063
|
-
"upsertPendingSyncOrders",
|
|
1064
|
-
mergeActions,
|
|
1065
|
-
options
|
|
1066
|
-
);
|
|
1067
|
-
} catch (error) {
|
|
1068
|
-
this.store.list = previousList;
|
|
1069
|
-
this.syncOrdersMap();
|
|
1070
|
-
throw error;
|
|
1071
|
-
}
|
|
768
|
+
await this.patchOrdersInSQLite(patchedOrders, "upsertPendingSyncOrders", mergeActions);
|
|
1072
769
|
this.logInfo("upsertPendingSyncOrders-结束", {
|
|
1073
770
|
count: patchedOrders.length,
|
|
1074
771
|
storeOrderCountAfter: this.store.list.length
|
|
1075
772
|
});
|
|
1076
773
|
await this.emitOrdersChanged(patchedOrders, "upsertPendingSyncOrders");
|
|
1077
774
|
}
|
|
1078
|
-
/**
|
|
1079
|
-
* 将 POS 草稿订单按 SQLite storage key 落库。
|
|
1080
|
-
* 只有具备真实 order_id 的草稿进入 store;其余草稿仅供本地恢复查询。
|
|
1081
|
-
*/
|
|
1082
|
-
async upsertLocalDraftOrders(draftOrders) {
|
|
1083
|
-
if (!(draftOrders == null ? void 0 : draftOrders.length)) {
|
|
1084
|
-
this.logInfo("upsertLocalDraftOrders-订单列表为空", {});
|
|
1085
|
-
return;
|
|
1086
|
-
}
|
|
1087
|
-
const draftMap = /* @__PURE__ */ new Map();
|
|
1088
|
-
const memoryDraftMap = /* @__PURE__ */ new Map();
|
|
1089
|
-
for (const order of draftOrders) {
|
|
1090
|
-
const draftOrder = {
|
|
1091
|
-
...order,
|
|
1092
|
-
need_sync: 0,
|
|
1093
|
-
is_draft_order: 1
|
|
1094
|
-
};
|
|
1095
|
-
const storageKey = this.getOrderStorageKey(draftOrder);
|
|
1096
|
-
if (!storageKey)
|
|
1097
|
-
continue;
|
|
1098
|
-
draftMap.set(storageKey, draftOrder);
|
|
1099
|
-
const memoryDraftOrder = this.normalizeOrderForMemoryList(draftOrder);
|
|
1100
|
-
if (this.shouldKeepOrderInMemory(memoryDraftOrder)) {
|
|
1101
|
-
memoryDraftMap.set(storageKey, memoryDraftOrder);
|
|
1102
|
-
}
|
|
1103
|
-
}
|
|
1104
|
-
if (draftMap.size === 0) {
|
|
1105
|
-
this.logError("upsertLocalDraftOrders-订单缺少可落库标识", {
|
|
1106
|
-
count: draftOrders.length
|
|
1107
|
-
});
|
|
1108
|
-
return;
|
|
1109
|
-
}
|
|
1110
|
-
this.logInfo("upsertLocalDraftOrders-开始", {
|
|
1111
|
-
count: draftMap.size,
|
|
1112
|
-
memoryDraftCount: memoryDraftMap.size,
|
|
1113
|
-
sqliteOnlyDraftCount: draftMap.size - memoryDraftMap.size
|
|
1114
|
-
});
|
|
1115
|
-
const mergeActions = {};
|
|
1116
|
-
const updatedList = this.store.list.filter((order) => this.shouldKeepOrderInMemory(order));
|
|
1117
|
-
const identityKeyToIndex = /* @__PURE__ */ new Map();
|
|
1118
|
-
for (let index = 0; index < updatedList.length; index += 1) {
|
|
1119
|
-
for (const key of this.getOrderIdentityMatchKeys(updatedList[index])) {
|
|
1120
|
-
if (!identityKeyToIndex.has(key))
|
|
1121
|
-
identityKeyToIndex.set(key, index);
|
|
1122
|
-
}
|
|
1123
|
-
}
|
|
1124
|
-
for (const [storageKey, draftOrder] of memoryDraftMap.entries()) {
|
|
1125
|
-
const matchIndex = this.lookupOrderIndexByIdentityKeys(
|
|
1126
|
-
identityKeyToIndex,
|
|
1127
|
-
this.getOrderIdentityMatchKeys(draftOrder)
|
|
1128
|
-
);
|
|
1129
|
-
if (matchIndex >= 0) {
|
|
1130
|
-
const existingOrder = updatedList[matchIndex];
|
|
1131
|
-
const reconciledDraftOrder = this.preserveExistingBusinessCodeForDraft(
|
|
1132
|
-
existingOrder,
|
|
1133
|
-
draftOrder
|
|
1134
|
-
);
|
|
1135
|
-
const mergedOrder = this.mergeOrderRecords(existingOrder, reconciledDraftOrder);
|
|
1136
|
-
const nextOrder = {
|
|
1137
|
-
...mergedOrder,
|
|
1138
|
-
need_sync: 0,
|
|
1139
|
-
is_draft_order: 1
|
|
1140
|
-
};
|
|
1141
|
-
updatedList[matchIndex] = nextOrder;
|
|
1142
|
-
draftMap.set(storageKey, reconciledDraftOrder);
|
|
1143
|
-
this.registerOrderIdentityKeys(identityKeyToIndex, nextOrder, matchIndex);
|
|
1144
|
-
mergeActions[storageKey] = "update";
|
|
1145
|
-
continue;
|
|
1146
|
-
}
|
|
1147
|
-
const insertIndex = updatedList.length;
|
|
1148
|
-
updatedList.push(draftOrder);
|
|
1149
|
-
this.registerOrderIdentityKeys(identityKeyToIndex, draftOrder, insertIndex);
|
|
1150
|
-
mergeActions[storageKey] = "insert";
|
|
1151
|
-
}
|
|
1152
|
-
const patchedOrders = [...draftMap.values()];
|
|
1153
|
-
const previousList = this.store.list;
|
|
1154
|
-
this.store.list = this.runOrderStoreSelfCheck(updatedList, "upsertLocalDraftOrders.store");
|
|
1155
|
-
this.syncOrdersMap();
|
|
1156
|
-
try {
|
|
1157
|
-
await this.patchOrdersInSQLite(
|
|
1158
|
-
patchedOrders,
|
|
1159
|
-
"upsertLocalDraftOrders",
|
|
1160
|
-
mergeActions,
|
|
1161
|
-
{ throwOnError: true }
|
|
1162
|
-
);
|
|
1163
|
-
} catch (error) {
|
|
1164
|
-
this.store.list = previousList;
|
|
1165
|
-
this.syncOrdersMap();
|
|
1166
|
-
throw error;
|
|
1167
|
-
}
|
|
1168
|
-
this.logInfo("upsertLocalDraftOrders-结束", {
|
|
1169
|
-
count: patchedOrders.length,
|
|
1170
|
-
storeOrderCountAfter: this.store.list.length
|
|
1171
|
-
});
|
|
1172
|
-
const removedLegacyMemoryDraft = previousList.some(
|
|
1173
|
-
(order) => !this.shouldKeepOrderInMemory(order)
|
|
1174
|
-
);
|
|
1175
|
-
if (memoryDraftMap.size > 0 || removedLegacyMemoryDraft) {
|
|
1176
|
-
await this.emitOrdersChanged(
|
|
1177
|
-
patchedOrders.filter((order) => this.shouldKeepOrderInMemory(order)),
|
|
1178
|
-
"upsertLocalDraftOrders"
|
|
1179
|
-
);
|
|
1180
|
-
}
|
|
1181
|
-
}
|
|
1182
775
|
/**
|
|
1183
776
|
* 通过 SSE 按自定义 query 拉取订单(支持 select/with 精简字段)
|
|
1184
777
|
*/
|
|
@@ -1211,7 +804,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1211
804
|
super.destroy();
|
|
1212
805
|
}
|
|
1213
806
|
syncOrdersMap() {
|
|
1214
|
-
this.store.list = this.store.list.filter((order) => this.shouldKeepOrderInMemory(order));
|
|
1215
807
|
this.store.map.clear();
|
|
1216
808
|
for (const order of this.store.list) {
|
|
1217
809
|
const primaryIdentity = this.getOrderMapKey(order);
|
|
@@ -1235,22 +827,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1235
827
|
isBlankIdentityValue(value) {
|
|
1236
828
|
return value === void 0 || value === null || value === "";
|
|
1237
829
|
}
|
|
1238
|
-
/**
|
|
1239
|
-
* `/sales/draft` 的旧调用方可能把未设置的 business_code 传成空串。
|
|
1240
|
-
* 对同一真实订单,空值不能覆盖已有的分类,否则 booking 查询会把该订单从 Party 列表过滤掉。
|
|
1241
|
-
*/
|
|
1242
|
-
preserveExistingBusinessCodeForDraft(existingOrder, draftOrder) {
|
|
1243
|
-
const existingBusinessCode = existingOrder.business_code;
|
|
1244
|
-
const draftBusinessCode = draftOrder.business_code;
|
|
1245
|
-
const hasExistingBusinessCode = typeof existingBusinessCode === "string" && existingBusinessCode.trim() !== "";
|
|
1246
|
-
const hasDraftBusinessCode = typeof draftBusinessCode === "string" && draftBusinessCode.trim() !== "";
|
|
1247
|
-
if (!hasExistingBusinessCode || hasDraftBusinessCode)
|
|
1248
|
-
return draftOrder;
|
|
1249
|
-
return {
|
|
1250
|
-
...draftOrder,
|
|
1251
|
-
business_code: existingBusinessCode
|
|
1252
|
-
};
|
|
1253
|
-
}
|
|
1254
830
|
getOrderIdentityEntries(order) {
|
|
1255
831
|
if (!order)
|
|
1256
832
|
return [];
|
|
@@ -1506,20 +1082,10 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1506
1082
|
});
|
|
1507
1083
|
this.logDuplicateOrders(`${source}.beforeMerge`, this.store.list);
|
|
1508
1084
|
const normalizedFreshOrders = [];
|
|
1509
|
-
const incomingProductsHaveStableIdentity = /* @__PURE__ */ new Map();
|
|
1510
1085
|
for (const order of freshOrders) {
|
|
1511
1086
|
const id = order == null ? void 0 : order.order_id;
|
|
1512
1087
|
if (id === void 0 || id === null)
|
|
1513
1088
|
continue;
|
|
1514
|
-
const rawProducts = order.products;
|
|
1515
|
-
if (Array.isArray(rawProducts)) {
|
|
1516
|
-
const allProductsHaveStableIdentity = this.doProductsHaveStableMembershipIdentity(rawProducts);
|
|
1517
|
-
const orderIdKey = this.getIdKey(id);
|
|
1518
|
-
incomingProductsHaveStableIdentity.set(
|
|
1519
|
-
orderIdKey,
|
|
1520
|
-
(incomingProductsHaveStableIdentity.get(orderIdKey) ?? true) && allProductsHaveStableIdentity
|
|
1521
|
-
);
|
|
1522
|
-
}
|
|
1523
1089
|
normalizedFreshOrders.push(this.normalizeRemoteSyncedOrder(order));
|
|
1524
1090
|
}
|
|
1525
1091
|
const uniqueFreshOrders = this.compactOrderListByIdentity(
|
|
@@ -1528,14 +1094,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1528
1094
|
).list;
|
|
1529
1095
|
const uniqueFreshCount = uniqueFreshOrders.length;
|
|
1530
1096
|
const patchedOrders = [];
|
|
1531
|
-
const remoteProductMembershipChanges = [];
|
|
1532
|
-
const forceWriteStorageKeys = /* @__PURE__ */ new Set();
|
|
1533
1097
|
const mergeActions = {};
|
|
1534
|
-
const existingProductsHaveStableIdentity = this.store.list.map(
|
|
1535
|
-
(order) => this.doProductsHaveStableMembershipIdentity(
|
|
1536
|
-
order.products
|
|
1537
|
-
)
|
|
1538
|
-
);
|
|
1539
1098
|
const updatedList = this.store.list.map(
|
|
1540
1099
|
(order) => this.normalizeOrderForMemoryList(order, `${source}.existingMemory`)
|
|
1541
1100
|
);
|
|
@@ -1567,63 +1126,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1567
1126
|
});
|
|
1568
1127
|
continue;
|
|
1569
1128
|
}
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
order_id: existingOrder.order_id ?? fresh.order_id ?? null,
|
|
1574
|
-
external_sale_number: existingOrder.external_sale_number ?? fresh.external_sale_number ?? null,
|
|
1575
|
-
local_is_draft_order: existingOrder.is_draft_order ?? null,
|
|
1576
|
-
remote_is_draft_order: fresh.is_draft_order ?? null,
|
|
1577
|
-
reason: "protect_draft_order_from_remote_echo"
|
|
1578
|
-
});
|
|
1579
|
-
continue;
|
|
1580
|
-
}
|
|
1581
|
-
let mergedOrder = this.mergeOrderRecords(existingOrder, fresh);
|
|
1582
|
-
const freshOrderId = fresh.order_id;
|
|
1583
|
-
const incomingProductsAreStable = freshOrderId !== void 0 && freshOrderId !== null && incomingProductsHaveStableIdentity.get(this.getIdKey(freshOrderId)) !== false;
|
|
1584
|
-
let membershipChange = null;
|
|
1585
|
-
if (Array.isArray(fresh.products) && freshOrderId !== void 0 && freshOrderId !== null && existingProductsHaveStableIdentity[matchIndex] !== false && incomingProductsAreStable) {
|
|
1586
|
-
membershipChange = this.getRemoteProductMembershipChange(
|
|
1587
|
-
existingOrder,
|
|
1588
|
-
mergedOrder,
|
|
1589
|
-
source
|
|
1590
|
-
);
|
|
1591
|
-
}
|
|
1592
|
-
let mergedProductsHaveStableIdentity = existingProductsHaveStableIdentity[matchIndex] !== false && incomingProductsAreStable;
|
|
1593
|
-
let adjustedMatchIndex = matchIndex;
|
|
1594
|
-
const duplicateIndexes = /* @__PURE__ */ new Set();
|
|
1595
|
-
for (const key of freshIdentityKeys) {
|
|
1596
|
-
const duplicateIndex = identityKeyToIndex.get(key);
|
|
1597
|
-
if (duplicateIndex === void 0 || duplicateIndex === matchIndex)
|
|
1598
|
-
continue;
|
|
1599
|
-
duplicateIndexes.add(duplicateIndex);
|
|
1600
|
-
}
|
|
1601
|
-
if (duplicateIndexes.size > 0) {
|
|
1602
|
-
for (const duplicateIndex of [...duplicateIndexes].sort((left, right) => right - left)) {
|
|
1603
|
-
mergedOrder = this.mergeOrderRecords(mergedOrder, updatedList[duplicateIndex]);
|
|
1604
|
-
mergedProductsHaveStableIdentity = mergedProductsHaveStableIdentity && existingProductsHaveStableIdentity[duplicateIndex] !== false;
|
|
1605
|
-
updatedList.splice(duplicateIndex, 1);
|
|
1606
|
-
existingProductsHaveStableIdentity.splice(duplicateIndex, 1);
|
|
1607
|
-
if (duplicateIndex < adjustedMatchIndex)
|
|
1608
|
-
adjustedMatchIndex -= 1;
|
|
1609
|
-
}
|
|
1610
|
-
identityKeyToIndex.clear();
|
|
1611
|
-
for (let index = 0; index < updatedList.length; index += 1) {
|
|
1612
|
-
for (const key of this.getOrderIdentityMatchKeys(updatedList[index])) {
|
|
1613
|
-
if (!identityKeyToIndex.has(key))
|
|
1614
|
-
identityKeyToIndex.set(key, index);
|
|
1615
|
-
}
|
|
1616
|
-
}
|
|
1617
|
-
}
|
|
1618
|
-
updatedList[adjustedMatchIndex] = mergedOrder;
|
|
1619
|
-
existingProductsHaveStableIdentity[adjustedMatchIndex] = mergedProductsHaveStableIdentity;
|
|
1620
|
-
if (membershipChange) {
|
|
1621
|
-
remoteProductMembershipChanges.push(membershipChange);
|
|
1622
|
-
const mergedStorageKey = this.getOrderStorageKey(mergedOrder);
|
|
1623
|
-
if (mergedStorageKey)
|
|
1624
|
-
forceWriteStorageKeys.add(mergedStorageKey);
|
|
1625
|
-
}
|
|
1626
|
-
this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, adjustedMatchIndex);
|
|
1129
|
+
const mergedOrder = this.mergeOrderRecords(existingOrder, fresh);
|
|
1130
|
+
updatedList[matchIndex] = mergedOrder;
|
|
1131
|
+
this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, matchIndex);
|
|
1627
1132
|
patchedOrders.push(mergedOrder);
|
|
1628
1133
|
if (mergeKey)
|
|
1629
1134
|
mergeActions[mergeKey] = "update";
|
|
@@ -1631,9 +1136,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1631
1136
|
}
|
|
1632
1137
|
const insertIndex = updatedList.length;
|
|
1633
1138
|
updatedList.push(fresh);
|
|
1634
|
-
existingProductsHaveStableIdentity.push(
|
|
1635
|
-
fresh.order_id !== void 0 && fresh.order_id !== null && incomingProductsHaveStableIdentity.get(this.getIdKey(fresh.order_id)) !== false
|
|
1636
|
-
);
|
|
1637
1139
|
this.registerOrderIdentityKeys(identityKeyToIndex, fresh, insertIndex);
|
|
1638
1140
|
patchedOrders.push(fresh);
|
|
1639
1141
|
if (mergeKey)
|
|
@@ -1648,20 +1150,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1648
1150
|
});
|
|
1649
1151
|
this.store.list = this.runOrderStoreSelfCheck(updatedList, `${source}.store`);
|
|
1650
1152
|
this.syncOrdersMap();
|
|
1651
|
-
await this.patchOrdersInSQLite(
|
|
1652
|
-
patchedOrders,
|
|
1653
|
-
source,
|
|
1654
|
-
mergeActions,
|
|
1655
|
-
{},
|
|
1656
|
-
forceWriteStorageKeys
|
|
1657
|
-
);
|
|
1153
|
+
await this.patchOrdersInSQLite(patchedOrders, source, mergeActions);
|
|
1658
1154
|
this.logInfo("mergeOrdersToStore-结束", {
|
|
1659
1155
|
uniqueFreshCount,
|
|
1660
1156
|
storeOrderCountAfter: this.store.list.length,
|
|
1661
1157
|
insertCount,
|
|
1662
1158
|
updateCount
|
|
1663
1159
|
});
|
|
1664
|
-
await this.emitRemoteProductMembershipChanges(remoteProductMembershipChanges);
|
|
1665
1160
|
await this.emitOrdersChanged(patchedOrders, source);
|
|
1666
1161
|
}
|
|
1667
1162
|
/**
|
|
@@ -1685,72 +1180,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1685
1180
|
isRemoteEchoMergeSource(source) {
|
|
1686
1181
|
return source === "pubsub.bodyUpsert" || source === "pubsub.httpRefresh";
|
|
1687
1182
|
}
|
|
1688
|
-
getProductMembershipKey(product) {
|
|
1689
|
-
const persistentId = (0, import_orderCollectionIdentity.getOrderCollectionPersistentId)("product", product);
|
|
1690
|
-
if (persistentId)
|
|
1691
|
-
return `order_detail_id:${persistentId}`;
|
|
1692
|
-
const uid = (0, import_orderCollectionIdentity.getOrderCollectionUid)("product", product);
|
|
1693
|
-
return uid ? `unique_identification_number:${uid}` : "";
|
|
1694
|
-
}
|
|
1695
|
-
doProductsHaveStableMembershipIdentity(products) {
|
|
1696
|
-
if (!Array.isArray(products))
|
|
1697
|
-
return true;
|
|
1698
|
-
return products.every(
|
|
1699
|
-
(product) => Boolean(
|
|
1700
|
-
(0, import_orderCollectionIdentity.getOrderCollectionPersistentId)("product", product) || (0, import_orderCollectionIdentity.getOrderCollectionUid)("product", product)
|
|
1701
|
-
)
|
|
1702
|
-
);
|
|
1703
|
-
}
|
|
1704
|
-
/**
|
|
1705
|
-
* 冲突提示关注逻辑商品行,而不是服务端 checkout 过程中可能被重建的 detail 记录。
|
|
1706
|
-
* 通用集合合并仍以 order_detail_id 为事实主键;这里只允许相同稳定 UID 跨 detail id 对齐,
|
|
1707
|
-
* 避免本机 checkout 回声被误判成“一删一增”。
|
|
1708
|
-
*/
|
|
1709
|
-
isSameProductMembershipItem(left, right) {
|
|
1710
|
-
if ((0, import_orderCollectionIdentity.isSameOrderCollectionItem)("product", left, right))
|
|
1711
|
-
return true;
|
|
1712
|
-
const leftUid = (0, import_orderCollectionIdentity.getOrderCollectionUid)("product", left);
|
|
1713
|
-
const rightUid = (0, import_orderCollectionIdentity.getOrderCollectionUid)("product", right);
|
|
1714
|
-
return Boolean(leftUid && rightUid && leftUid === rightUid);
|
|
1715
|
-
}
|
|
1716
|
-
/**
|
|
1717
|
-
* 对比合并前后的商品成员集合。商品字段修改与数组重排不会产生 diff。
|
|
1718
|
-
*/
|
|
1719
|
-
getRemoteProductMembershipChange(existingOrder, mergedOrder, source) {
|
|
1720
|
-
if (!this.isRemoteEchoMergeSource(source))
|
|
1721
|
-
return null;
|
|
1722
|
-
const previousProducts = Array.isArray(existingOrder.products) ? existingOrder.products : [];
|
|
1723
|
-
const currentProducts = Array.isArray(mergedOrder.products) ? mergedOrder.products : [];
|
|
1724
|
-
const unmatchedCurrentIndexes = new Set(currentProducts.map((_, index) => index));
|
|
1725
|
-
const removedProductKeys = [];
|
|
1726
|
-
for (const previousProduct of previousProducts) {
|
|
1727
|
-
const matchedIndex = currentProducts.findIndex(
|
|
1728
|
-
(currentProduct, index) => unmatchedCurrentIndexes.has(index) && this.isSameProductMembershipItem(previousProduct, currentProduct)
|
|
1729
|
-
);
|
|
1730
|
-
if (matchedIndex >= 0) {
|
|
1731
|
-
unmatchedCurrentIndexes.delete(matchedIndex);
|
|
1732
|
-
continue;
|
|
1733
|
-
}
|
|
1734
|
-
const productKey = this.getProductMembershipKey(previousProduct);
|
|
1735
|
-
if (productKey)
|
|
1736
|
-
removedProductKeys.push(productKey);
|
|
1737
|
-
}
|
|
1738
|
-
const addedProductKeys = [...unmatchedCurrentIndexes].map((index) => this.getProductMembershipKey(currentProducts[index])).filter(Boolean);
|
|
1739
|
-
if (addedProductKeys.length === 0 && removedProductKeys.length === 0) {
|
|
1740
|
-
return null;
|
|
1741
|
-
}
|
|
1742
|
-
const orderId = mergedOrder.order_id ?? existingOrder.order_id;
|
|
1743
|
-
if (orderId === void 0 || orderId === null)
|
|
1744
|
-
return null;
|
|
1745
|
-
return {
|
|
1746
|
-
order_id: orderId,
|
|
1747
|
-
source,
|
|
1748
|
-
added_product_keys: addedProductKeys,
|
|
1749
|
-
removed_product_keys: removedProductKeys,
|
|
1750
|
-
previous_product_count: previousProducts.length,
|
|
1751
|
-
current_product_count: currentProducts.length
|
|
1752
|
-
};
|
|
1753
|
-
}
|
|
1754
1183
|
/**
|
|
1755
1184
|
* 将订单的全部身份键登记到索引并指向其在列表中的下标。
|
|
1756
1185
|
* 合并后订单新增的身份字段(如挂单同步后拿到 order_id)也会被登记。
|
|
@@ -1891,72 +1320,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1891
1320
|
return right;
|
|
1892
1321
|
return left;
|
|
1893
1322
|
}
|
|
1894
|
-
getProductIdentityKeys(product) {
|
|
1895
|
-
var _a;
|
|
1896
|
-
const record = product;
|
|
1897
|
-
if (!record)
|
|
1898
|
-
return [];
|
|
1899
|
-
const keys = [];
|
|
1900
|
-
const metadataUid = (_a = record.metadata) == null ? void 0 : _a.unique_identification_number;
|
|
1901
|
-
if (!this.isBlankIdentityValue(metadataUid))
|
|
1902
|
-
keys.push(`uid:${String(metadataUid)}`);
|
|
1903
|
-
const topLevelUid = record.unique_identification_number;
|
|
1904
|
-
if (!this.isBlankIdentityValue(topLevelUid))
|
|
1905
|
-
keys.push(`uid:${String(topLevelUid)}`);
|
|
1906
|
-
const orderDetailId = record.order_detail_id;
|
|
1907
|
-
if (!this.isBlankIdentityValue(orderDetailId))
|
|
1908
|
-
keys.push(`detail:${String(orderDetailId)}`);
|
|
1909
|
-
const bookingUid = record.booking_uid;
|
|
1910
|
-
if (!this.isBlankIdentityValue(bookingUid))
|
|
1911
|
-
keys.push(`booking:${String(bookingUid)}`);
|
|
1912
|
-
return keys;
|
|
1913
|
-
}
|
|
1914
|
-
mergeOrderProductLists(preferred, secondary) {
|
|
1915
|
-
const preferredList = Array.isArray(preferred) ? preferred : [];
|
|
1916
|
-
const secondaryList = Array.isArray(secondary) ? secondary : [];
|
|
1917
|
-
if (secondaryList.length === 0)
|
|
1918
|
-
return preferredList;
|
|
1919
|
-
if (preferredList.length === 0)
|
|
1920
|
-
return secondaryList;
|
|
1921
|
-
const seenKeys = /* @__PURE__ */ new Set();
|
|
1922
|
-
for (const item of preferredList) {
|
|
1923
|
-
const keys = this.getProductIdentityKeys(item);
|
|
1924
|
-
for (const key of keys)
|
|
1925
|
-
seenKeys.add(key);
|
|
1926
|
-
}
|
|
1927
|
-
const result = [...preferredList];
|
|
1928
|
-
for (const item of secondaryList) {
|
|
1929
|
-
const keys = this.getProductIdentityKeys(item);
|
|
1930
|
-
if (keys.length === 0 || keys.some((key) => seenKeys.has(key)))
|
|
1931
|
-
continue;
|
|
1932
|
-
for (const key of keys)
|
|
1933
|
-
seenKeys.add(key);
|
|
1934
|
-
result.push((0, import_lodash_es.cloneDeep)(item));
|
|
1935
|
-
}
|
|
1936
|
-
return result;
|
|
1937
|
-
}
|
|
1938
|
-
mergeOrderPaymentLists(existing, incoming) {
|
|
1939
|
-
const existingList = Array.isArray(existing) ? existing : [];
|
|
1940
|
-
const incomingList = Array.isArray(incoming) ? incoming : [];
|
|
1941
|
-
if (incomingList.length === 0)
|
|
1942
|
-
return (0, import_lodash_es.cloneDeep)(existingList);
|
|
1943
|
-
return (0, import_payment_utils.mergeOrderPaymentListsByIdentity)(existingList, incomingList);
|
|
1944
|
-
}
|
|
1945
|
-
getIdentifiedPendingPayments(order) {
|
|
1946
|
-
const payments = Array.isArray(order == null ? void 0 : order.payments) ? order.payments : [];
|
|
1947
|
-
return payments.filter((payment) => (0, import_payment_utils.isIdentifiedPendingOrderPayment)(payment));
|
|
1948
|
-
}
|
|
1949
|
-
shouldProtectLocalOrderFromRemoteSnapshot(order) {
|
|
1950
|
-
return this.isPendingSyncOrder(order) || this.isDraftOrder(order) || this.getIdentifiedPendingPayments(order).length > 0;
|
|
1951
|
-
}
|
|
1952
|
-
getUnmatchedIdentifiedPendingPayments(existing, incoming) {
|
|
1953
|
-
const existingPayments = Array.isArray(existing) ? existing : [];
|
|
1954
|
-
const incomingPayments = Array.isArray(incoming) ? incoming : [];
|
|
1955
|
-
const incomingIdentityKeys = new Set(
|
|
1956
|
-
incomingPayments.flatMap((payment) => (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment))
|
|
1957
|
-
);
|
|
1958
|
-
return existingPayments.filter((payment) => (0, import_payment_utils.isIdentifiedPendingOrderPayment)(payment) && !(0, import_payment_utils.getOrderPaymentIdentityKeys)(payment).some((key) => incomingIdentityKeys.has(key)));
|
|
1959
|
-
}
|
|
1960
1323
|
mergeOrderRecords(existing, incoming) {
|
|
1961
1324
|
const preferred = this.pickPreferredOrder(existing, incoming);
|
|
1962
1325
|
const secondary = preferred === existing ? incoming : existing;
|
|
@@ -1986,8 +1349,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1986
1349
|
"contacts_info",
|
|
1987
1350
|
"phone",
|
|
1988
1351
|
"email",
|
|
1989
|
-
"relation_forms"
|
|
1990
|
-
"is_draft_order"
|
|
1352
|
+
"relation_forms"
|
|
1991
1353
|
];
|
|
1992
1354
|
const mergedRecord = merged;
|
|
1993
1355
|
const preferredRecord = preferred;
|
|
@@ -2015,26 +1377,11 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2015
1377
|
}
|
|
2016
1378
|
for (const field of ORDER_AUTHORITATIVE_COLLECTION_FIELDS) {
|
|
2017
1379
|
if (Array.isArray(incomingRecord[field])) {
|
|
2018
|
-
if (field === "payments") {
|
|
2019
|
-
const preservedPending = this.getUnmatchedIdentifiedPendingPayments(
|
|
2020
|
-
existingRecord[field],
|
|
2021
|
-
incomingRecord[field]
|
|
2022
|
-
);
|
|
2023
|
-
if (preservedPending.length > 0) {
|
|
2024
|
-
this.logInfo("mergeOrderRecords-保留本地 pending 支付项", {
|
|
2025
|
-
order_id: existing.order_id ?? incoming.order_id ?? null,
|
|
2026
|
-
external_sale_number: existingRecord.external_sale_number ?? incomingRecord.external_sale_number ?? null,
|
|
2027
|
-
preserved_pending_count: preservedPending.length,
|
|
2028
|
-
preserved_payment_identities: preservedPending.map((payment) => (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment))
|
|
2029
|
-
});
|
|
2030
|
-
}
|
|
2031
|
-
}
|
|
2032
1380
|
mergedRecord[field] = this.mergeAuthoritativeOrderCollection(
|
|
2033
1381
|
field,
|
|
2034
1382
|
existingRecord[field],
|
|
2035
1383
|
incomingRecord[field],
|
|
2036
|
-
childUidRemaps
|
|
2037
|
-
{ preserveIdentifiedPendingPayments: field === "payments" }
|
|
1384
|
+
childUidRemaps
|
|
2038
1385
|
);
|
|
2039
1386
|
continue;
|
|
2040
1387
|
}
|
|
@@ -2069,8 +1416,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2069
1416
|
external_sale_number: order.external_sale_number ?? null,
|
|
2070
1417
|
shop_order_number: order.shop_order_number ?? null,
|
|
2071
1418
|
shop_full_order_number: order.shop_full_order_number ?? null,
|
|
2072
|
-
need_sync: order.need_sync ?? null
|
|
2073
|
-
is_draft_order: order.is_draft_order ?? null
|
|
1419
|
+
need_sync: order.need_sync ?? null
|
|
2074
1420
|
}))
|
|
2075
1421
|
}));
|
|
2076
1422
|
}
|
|
@@ -2187,48 +1533,18 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2187
1533
|
isPendingSyncOrder(order) {
|
|
2188
1534
|
return Number(order == null ? void 0 : order.need_sync) === 1;
|
|
2189
1535
|
}
|
|
2190
|
-
isDraftOrder(order) {
|
|
2191
|
-
return Number(order == null ? void 0 : order.is_draft_order) === 1;
|
|
2192
|
-
}
|
|
2193
|
-
shouldProtectDraftOrderFromIncoming(source) {
|
|
2194
|
-
return source !== "checkoutSync";
|
|
2195
|
-
}
|
|
2196
1536
|
normalizeRemoteSyncedOrder(order) {
|
|
2197
1537
|
const normalizedOrder = this.normalizeOrderCollectionsForIngress(
|
|
2198
1538
|
order,
|
|
2199
1539
|
"normalizeRemoteSyncedOrder"
|
|
2200
1540
|
);
|
|
2201
1541
|
if (this.isPendingSyncOrder(normalizedOrder))
|
|
2202
|
-
return
|
|
2203
|
-
...normalizedOrder,
|
|
2204
|
-
is_draft_order: 0
|
|
2205
|
-
};
|
|
1542
|
+
return normalizedOrder;
|
|
2206
1543
|
return {
|
|
2207
1544
|
...normalizedOrder,
|
|
2208
|
-
need_sync: 0
|
|
2209
|
-
is_draft_order: 0
|
|
1545
|
+
need_sync: 0
|
|
2210
1546
|
};
|
|
2211
1547
|
}
|
|
2212
|
-
mergeRemoteIdentityIntoDraftOrder(draftOrder, remoteOrder) {
|
|
2213
|
-
const merged = {
|
|
2214
|
-
...this.withoutSyntheticDraftOrderId(draftOrder)
|
|
2215
|
-
};
|
|
2216
|
-
const remote = remoteOrder;
|
|
2217
|
-
for (const field of [
|
|
2218
|
-
"order_id",
|
|
2219
|
-
"order_number",
|
|
2220
|
-
"shop_order_number",
|
|
2221
|
-
"shop_full_order_number"
|
|
2222
|
-
]) {
|
|
2223
|
-
if (this.isBlankIdentityValue(merged[field]) && !this.isBlankIdentityValue(remote[field])) {
|
|
2224
|
-
merged[field] = remote[field];
|
|
2225
|
-
}
|
|
2226
|
-
}
|
|
2227
|
-
return this.normalizeOrderCollectionsForIngress(
|
|
2228
|
-
merged,
|
|
2229
|
-
"mergeRemoteIdentityIntoDraftOrder"
|
|
2230
|
-
);
|
|
2231
|
-
}
|
|
2232
1548
|
mergeRemoteSnapshotWithPendingOrders(remoteOrders, existingOrders) {
|
|
2233
1549
|
const merged = remoteOrders.map((order) => this.normalizeRemoteSyncedOrder(order));
|
|
2234
1550
|
for (const rawOrder of existingOrders) {
|
|
@@ -2236,18 +1552,11 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2236
1552
|
rawOrder,
|
|
2237
1553
|
"mergeRemoteSnapshotWithPendingOrders.existingSQLite"
|
|
2238
1554
|
);
|
|
2239
|
-
if (!this.
|
|
1555
|
+
if (!this.isPendingSyncOrder(order))
|
|
2240
1556
|
continue;
|
|
2241
1557
|
const matchIndex = this.findOrderIndexByIdentity(merged, order);
|
|
2242
1558
|
if (matchIndex >= 0) {
|
|
2243
|
-
|
|
2244
|
-
merged[matchIndex] = this.mergeRemoteIdentityIntoDraftOrder(
|
|
2245
|
-
order,
|
|
2246
|
-
merged[matchIndex]
|
|
2247
|
-
);
|
|
2248
|
-
} else {
|
|
2249
|
-
merged[matchIndex] = this.mergeOrderRecords(order, merged[matchIndex]);
|
|
2250
|
-
}
|
|
1559
|
+
merged[matchIndex] = this.mergeOrderRecords(order, merged[matchIndex]);
|
|
2251
1560
|
continue;
|
|
2252
1561
|
}
|
|
2253
1562
|
if (!this.getOrderStorageKey(order))
|
|
@@ -2275,13 +1584,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2275
1584
|
* @example
|
|
2276
1585
|
* await this.patchOrdersInSQLite(freshOrders)
|
|
2277
1586
|
*/
|
|
2278
|
-
async patchOrdersInSQLite(orders, source, mergeActions = {}
|
|
2279
|
-
if (orders.length === 0) {
|
|
2280
|
-
return;
|
|
2281
|
-
}
|
|
2282
|
-
if (!this.dbManager) {
|
|
2283
|
-
if (options.throwOnError)
|
|
2284
|
-
throw new Error("订单 SQLite 数据库未初始化");
|
|
1587
|
+
async patchOrdersInSQLite(orders, source, mergeActions = {}) {
|
|
1588
|
+
if (!this.dbManager || orders.length === 0) {
|
|
2285
1589
|
return;
|
|
2286
1590
|
}
|
|
2287
1591
|
const ordersSnapshot = (0, import_lodash_es.cloneDeep)(orders).map((order) => this.normalizeOrderCollectionsForIngress(order, `${source}.sqliteIngress`)).filter((order) => this.getOrderStorageKey(order));
|
|
@@ -2291,8 +1595,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2291
1595
|
const { toWrite, skipped } = this.filterRedundantPatchOrders(
|
|
2292
1596
|
source,
|
|
2293
1597
|
ordersSnapshot,
|
|
2294
|
-
mergeActions
|
|
2295
|
-
forceWriteStorageKeys
|
|
1598
|
+
mergeActions
|
|
2296
1599
|
);
|
|
2297
1600
|
if (toWrite.length === 0) {
|
|
2298
1601
|
return;
|
|
@@ -2320,8 +1623,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2320
1623
|
for (const order of compactedToWrite) {
|
|
2321
1624
|
await this.dbManager.update(INDEXDB_STORE_NAME, order);
|
|
2322
1625
|
}
|
|
2323
|
-
} else if (options.throwOnError) {
|
|
2324
|
-
throw new Error("订单 SQLite 数据库不支持写入");
|
|
2325
1626
|
}
|
|
2326
1627
|
this.recordRecentSqliteWrite(source, compactedToWrite);
|
|
2327
1628
|
this.logInfo("patchOrdersInSQLite-完成", {
|
|
@@ -2336,8 +1637,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2336
1637
|
error: error instanceof Error ? error.message : String(error),
|
|
2337
1638
|
orderCount: ordersSnapshot.length
|
|
2338
1639
|
});
|
|
2339
|
-
if (options.throwOnError)
|
|
2340
|
-
throw error;
|
|
2341
1640
|
}
|
|
2342
1641
|
}
|
|
2343
1642
|
/**
|
|
@@ -2346,15 +1645,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2346
1645
|
* @example
|
|
2347
1646
|
* await this.updateOrderInSQLite(freshOrder)
|
|
2348
1647
|
*/
|
|
2349
|
-
async updateOrderInSQLite(order, source
|
|
2350
|
-
if (!this.getOrderStorageKey(order)) {
|
|
2351
|
-
if (options.throwOnError)
|
|
2352
|
-
throw new Error("订单缺少可用的 SQLite 存储主键");
|
|
2353
|
-
return;
|
|
2354
|
-
}
|
|
2355
|
-
if (!this.dbManager) {
|
|
2356
|
-
if (options.throwOnError)
|
|
2357
|
-
throw new Error("订单 SQLite 数据库未初始化");
|
|
1648
|
+
async updateOrderInSQLite(order, source) {
|
|
1649
|
+
if (!this.dbManager || !this.getOrderStorageKey(order)) {
|
|
2358
1650
|
return;
|
|
2359
1651
|
}
|
|
2360
1652
|
const orderSnapshot = this.normalizeOrderCollectionsForIngress(
|
|
@@ -2378,8 +1670,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2378
1670
|
} else if (typeof this.dbManager.bulkAdd === "function") {
|
|
2379
1671
|
writeMethod = "bulkAdd";
|
|
2380
1672
|
await this.dbManager.bulkAdd(INDEXDB_STORE_NAME, [orderSnapshot]);
|
|
2381
|
-
} else if (options.throwOnError) {
|
|
2382
|
-
throw new Error("订单 SQLite 数据库不支持写入");
|
|
2383
1673
|
}
|
|
2384
1674
|
this.recordRecentSqliteWrite(source, [orderSnapshot]);
|
|
2385
1675
|
this.logInfo("updateOrderInSQLite-完成", {
|
|
@@ -2393,18 +1683,15 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2393
1683
|
error: error instanceof Error ? error.message : String(error),
|
|
2394
1684
|
orderId: orderSnapshot.order_id ?? null
|
|
2395
1685
|
});
|
|
2396
|
-
if (options.throwOnError)
|
|
2397
|
-
throw error;
|
|
2398
1686
|
}
|
|
2399
1687
|
}
|
|
2400
1688
|
/**
|
|
2401
|
-
* 全量快照替换 orders 表(clear + bulkAdd
|
|
2402
|
-
* 用于 SSE 全量拉取与营业日窗口裁剪。
|
|
1689
|
+
* 全量快照替换 orders 表(clear + bulkAdd),用于 SSE 全量拉取与营业日窗口裁剪。
|
|
2403
1690
|
*
|
|
2404
1691
|
* @example
|
|
2405
1692
|
* await this.replaceOrdersSnapshotInSQLite(orderList)
|
|
2406
1693
|
*/
|
|
2407
|
-
async replaceOrdersSnapshotInSQLite(orderList, source
|
|
1694
|
+
async replaceOrdersSnapshotInSQLite(orderList, source) {
|
|
2408
1695
|
if (!this.dbManager) {
|
|
2409
1696
|
return this.compactOrderListByIdentity(
|
|
2410
1697
|
orderList.map((order) => this.normalizeRemoteSyncedOrder(order)),
|
|
@@ -2421,52 +1708,16 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2421
1708
|
try {
|
|
2422
1709
|
await this.runInOrderSQLiteSaveQueue(async () => {
|
|
2423
1710
|
const existingOrders = typeof this.dbManager.getAll === "function" ? await this.dbManager.getAll(INDEXDB_STORE_NAME) : [];
|
|
2424
|
-
const protectedLocalOrders = protectedOrdersBeforeRemoteFetch.map((order) => this.normalizeOrderCollectionsForIngress(
|
|
2425
|
-
order,
|
|
2426
|
-
`${source}.protectedBeforeRemoteFetch`
|
|
2427
|
-
)).filter((order) => this.shouldProtectLocalOrderFromRemoteSnapshot(order));
|
|
2428
|
-
for (const rawCurrentOrder of existingOrders || []) {
|
|
2429
|
-
const currentOrder = this.normalizeOrderCollectionsForIngress(
|
|
2430
|
-
rawCurrentOrder,
|
|
2431
|
-
`${source}.currentSQLite`
|
|
2432
|
-
);
|
|
2433
|
-
const protectedIndex = this.findOrderIndexByIdentity(
|
|
2434
|
-
protectedLocalOrders,
|
|
2435
|
-
currentOrder
|
|
2436
|
-
);
|
|
2437
|
-
const currentNeedsProtection = this.shouldProtectLocalOrderFromRemoteSnapshot(currentOrder);
|
|
2438
|
-
if (protectedIndex >= 0) {
|
|
2439
|
-
if (currentNeedsProtection) {
|
|
2440
|
-
protectedLocalOrders[protectedIndex] = currentOrder;
|
|
2441
|
-
} else {
|
|
2442
|
-
protectedLocalOrders.splice(protectedIndex, 1);
|
|
2443
|
-
}
|
|
2444
|
-
continue;
|
|
2445
|
-
}
|
|
2446
|
-
if (currentNeedsProtection)
|
|
2447
|
-
protectedLocalOrders.push(currentOrder);
|
|
2448
|
-
}
|
|
2449
1711
|
const orderListSnapshot = this.mergeRemoteSnapshotWithPendingOrders(
|
|
2450
1712
|
remoteSnapshot,
|
|
2451
|
-
|
|
1713
|
+
existingOrders || []
|
|
2452
1714
|
);
|
|
2453
1715
|
mergedSnapshot = this.compactOrderListByIdentity(orderListSnapshot, `${source}.sqliteSnapshot`).list;
|
|
2454
1716
|
this.logInfo("replaceOrdersSnapshotInSQLite-开始", {
|
|
2455
1717
|
source,
|
|
2456
1718
|
count: mergedSnapshot.length,
|
|
2457
1719
|
remoteCount: remoteSnapshot.length,
|
|
2458
|
-
|
|
2459
|
-
protectedLocalOrderCount: protectedLocalOrders.length,
|
|
2460
|
-
preservedLocalUnsyncedCount: mergedSnapshot.length - remoteSnapshot.length,
|
|
2461
|
-
protectedPendingPaymentCount: protectedLocalOrders.reduce(
|
|
2462
|
-
(count, order) => count + this.getIdentifiedPendingPayments(order).length,
|
|
2463
|
-
0
|
|
2464
|
-
),
|
|
2465
|
-
protectedPendingPaymentIdentities: protectedLocalOrders.flatMap((order) => this.getIdentifiedPendingPayments(order).map((payment) => ({
|
|
2466
|
-
order_id: order.order_id ?? null,
|
|
2467
|
-
external_sale_number: order.external_sale_number ?? null,
|
|
2468
|
-
payment_identities: (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment)
|
|
2469
|
-
})))
|
|
1720
|
+
preservedPendingCount: mergedSnapshot.length - remoteSnapshot.length
|
|
2470
1721
|
});
|
|
2471
1722
|
await this.dbManager.clear(INDEXDB_STORE_NAME);
|
|
2472
1723
|
this.logInfo("replaceOrdersSnapshotInSQLite-clear完成", {
|