@pisell/pisellos 2.3.38 → 2.3.39
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/type.d.ts +2 -90
- package/dist/model/strategy/adapter/promotion/type.js +0 -45
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +3 -5
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +3 -6
- package/dist/modules/Discount/index.d.ts +1 -0
- package/dist/modules/Discount/index.js +40 -11
- package/dist/modules/Discount/types.d.ts +1 -0
- package/dist/modules/Holder/index.d.ts +48 -0
- package/dist/modules/Holder/index.js +640 -0
- package/dist/modules/Holder/types.d.ts +123 -0
- package/dist/modules/Holder/types.js +1 -0
- package/dist/modules/Holder/utils.d.ts +13 -0
- package/dist/modules/Holder/utils.js +34 -0
- package/dist/modules/OpenData/index.d.ts +0 -2
- package/dist/modules/OpenData/index.js +2 -10
- package/dist/modules/Order/index.d.ts +11 -28
- package/dist/modules/Order/index.js +509 -750
- package/dist/modules/Order/types.d.ts +10 -33
- package/dist/modules/Order/utils/orderCollectionIdentity.js +2 -7
- package/dist/modules/Order/utils.d.ts +10 -0
- package/dist/modules/Order/utils.js +41 -13
- package/dist/modules/Payment/index.d.ts +0 -2
- package/dist/modules/Payment/index.js +50 -79
- package/dist/modules/Payment/types.d.ts +28 -99
- package/dist/modules/Payment/types.js +3 -20
- package/dist/modules/Payment/walletpass.d.ts +1 -25
- package/dist/modules/Payment/walletpass.js +157 -707
- package/dist/modules/Product/types.d.ts +1 -0
- package/dist/modules/ProductList/index.js +33 -14
- package/dist/modules/Quotation/index.d.ts +1 -1
- package/dist/modules/Quotation/index.js +2 -2
- package/dist/modules/ResourcePlanner/index.d.ts +24 -0
- package/dist/modules/ResourcePlanner/index.js +181 -0
- package/dist/modules/ResourcePlanner/planner.d.ts +14 -0
- package/dist/modules/ResourcePlanner/planner.js +1069 -0
- package/dist/modules/ResourcePlanner/types.d.ts +227 -0
- package/dist/modules/ResourcePlanner/types.js +1 -0
- package/dist/modules/Rules/index.d.ts +0 -1
- package/dist/modules/Rules/index.js +96 -89
- package/dist/modules/SalesSummary/index.js +12 -13
- package/dist/modules/ScanOrderLogger/index.d.ts +2 -0
- package/dist/modules/ScanOrderLogger/index.js +15 -2
- package/dist/modules/ScanOrderLogger/providers/feishu.js +45 -27
- package/dist/modules/ScanOrderLogger/types.d.ts +1 -0
- package/dist/modules/Schedule/index.d.ts +3 -1
- package/dist/modules/Schedule/index.js +21 -16
- package/dist/modules/Summary/utils.js +38 -13
- package/dist/modules/index.d.ts +2 -0
- package/dist/modules/index.js +3 -1
- package/dist/plugins/window.d.ts +1 -0
- package/dist/server/index.d.ts +14 -16
- package/dist/server/index.js +1148 -1930
- package/dist/server/modules/order/index.d.ts +4 -54
- package/dist/server/modules/order/index.js +695 -1595
- package/dist/server/modules/order/types.d.ts +3 -11
- package/dist/server/modules/order/types.js +1 -1
- package/dist/solution/BaseSales/index.d.ts +20 -109
- package/dist/solution/BaseSales/index.js +481 -1797
- package/dist/solution/BaseSales/types.d.ts +0 -52
- 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/BookingByStep/index.d.ts +17 -2
- package/dist/solution/BookingByStep/index.js +294 -215
- package/dist/solution/BookingByStep/types.d.ts +2 -1
- package/dist/solution/BookingByStep/types.js +3 -1
- package/dist/solution/BookingByStep/utils/capacity.js +17 -1
- package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
- package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
- package/dist/solution/BookingTicket/index.d.ts +3 -7
- package/dist/solution/BookingTicket/index.js +49 -132
- package/dist/solution/BookingTicket/utils/addProductDecision.js +0 -6
- package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +0 -8
- package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +82 -172
- package/dist/solution/Sales/index.d.ts +0 -1
- package/dist/solution/Sales/index.js +2 -10
- package/dist/solution/ScanOrder/index.d.ts +26 -14
- package/dist/solution/ScanOrder/index.js +1148 -756
- package/dist/solution/ScanOrder/types.d.ts +21 -1
- package/dist/solution/ScanOrder/utils.d.ts +8 -0
- package/dist/solution/ScanOrder/utils.js +66 -25
- package/dist/solution/ShopDiscount/index.d.ts +1 -0
- package/dist/solution/ShopDiscount/index.js +125 -87
- package/dist/solution/UnifiedBookingSales/index.d.ts +183 -0
- package/dist/solution/UnifiedBookingSales/index.js +1871 -0
- package/dist/solution/UnifiedBookingSales/types.d.ts +143 -0
- package/dist/solution/UnifiedBookingSales/types.js +11 -0
- package/dist/solution/VenueBooking/index.d.ts +39 -11
- package/dist/solution/VenueBooking/index.js +1176 -860
- package/dist/solution/VenueBooking/types.d.ts +3 -0
- package/dist/solution/VenueBooking/utils/resource.js +1 -0
- package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
- package/dist/solution/VenueBooking/utils/slotMerge.js +10 -5
- package/dist/solution/index.d.ts +1 -0
- package/dist/solution/index.js +2 -1
- package/dist/types/index.d.ts +1 -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 -51
- package/lib/model/strategy/adapter/promotion/type.d.ts +2 -90
- package/lib/model/strategy/adapter/promotion/type.js +0 -2
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +1 -2
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +1 -2
- package/lib/modules/Discount/index.d.ts +1 -0
- package/lib/modules/Discount/index.js +9 -0
- package/lib/modules/Discount/types.d.ts +1 -0
- package/lib/modules/Holder/index.d.ts +48 -0
- package/lib/modules/Holder/index.js +402 -0
- package/lib/modules/Holder/types.d.ts +123 -0
- package/lib/modules/Holder/types.js +17 -0
- package/lib/modules/Holder/utils.d.ts +13 -0
- package/lib/modules/Holder/utils.js +71 -0
- package/lib/modules/OpenData/index.d.ts +0 -2
- package/lib/modules/OpenData/index.js +1 -6
- package/lib/modules/Order/index.d.ts +11 -28
- package/lib/modules/Order/index.js +86 -196
- package/lib/modules/Order/types.d.ts +10 -33
- package/lib/modules/Order/utils/orderCollectionIdentity.js +0 -3
- package/lib/modules/Order/utils.d.ts +10 -0
- package/lib/modules/Order/utils.js +40 -16
- package/lib/modules/Payment/index.d.ts +0 -2
- package/lib/modules/Payment/index.js +13 -34
- package/lib/modules/Payment/types.d.ts +28 -99
- package/lib/modules/Payment/types.js +3 -4
- package/lib/modules/Payment/walletpass.d.ts +1 -25
- package/lib/modules/Payment/walletpass.js +21 -470
- package/lib/modules/Product/types.d.ts +1 -0
- package/lib/modules/ProductList/index.js +40 -31
- package/lib/modules/Quotation/index.d.ts +1 -1
- package/lib/modules/Quotation/index.js +2 -2
- package/lib/modules/ResourcePlanner/index.d.ts +24 -0
- package/lib/modules/ResourcePlanner/index.js +148 -0
- package/lib/modules/ResourcePlanner/planner.d.ts +14 -0
- package/lib/modules/ResourcePlanner/planner.js +933 -0
- package/lib/modules/ResourcePlanner/types.d.ts +227 -0
- package/lib/modules/ResourcePlanner/types.js +17 -0
- package/lib/modules/Rules/index.d.ts +0 -1
- package/lib/modules/Rules/index.js +40 -47
- package/lib/modules/SalesSummary/index.js +6 -7
- package/lib/modules/ScanOrderLogger/index.d.ts +2 -0
- package/lib/modules/ScanOrderLogger/index.js +13 -1
- package/lib/modules/ScanOrderLogger/providers/feishu.js +15 -6
- package/lib/modules/ScanOrderLogger/types.d.ts +1 -0
- package/lib/modules/Schedule/index.d.ts +3 -1
- package/lib/modules/Schedule/index.js +10 -8
- package/lib/modules/Summary/utils.js +21 -1
- package/lib/modules/index.d.ts +2 -0
- package/lib/modules/index.js +5 -1
- package/lib/plugins/window.d.ts +1 -0
- package/lib/server/index.d.ts +14 -16
- package/lib/server/index.js +83 -675
- package/lib/server/modules/order/index.d.ts +4 -54
- package/lib/server/modules/order/index.js +66 -679
- package/lib/server/modules/order/types.d.ts +3 -11
- package/lib/solution/BaseSales/index.d.ts +20 -109
- package/lib/solution/BaseSales/index.js +70 -881
- package/lib/solution/BaseSales/types.d.ts +0 -52
- 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/BookingByStep/index.d.ts +17 -2
- package/lib/solution/BookingByStep/index.js +60 -18
- package/lib/solution/BookingByStep/types.d.ts +2 -1
- package/lib/solution/BookingByStep/types.js +5 -0
- package/lib/solution/BookingByStep/utils/capacity.js +20 -1
- package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
- package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
- package/lib/solution/BookingTicket/index.d.ts +3 -7
- package/lib/solution/BookingTicket/index.js +9 -62
- package/lib/solution/BookingTicket/utils/addProductDecision.js +0 -4
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +0 -8
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +4 -36
- package/lib/solution/Sales/index.d.ts +0 -1
- package/lib/solution/Sales/index.js +3 -5
- package/lib/solution/ScanOrder/index.d.ts +26 -14
- package/lib/solution/ScanOrder/index.js +449 -190
- package/lib/solution/ScanOrder/types.d.ts +21 -1
- package/lib/solution/ScanOrder/utils.d.ts +8 -0
- package/lib/solution/ScanOrder/utils.js +31 -0
- package/lib/solution/ShopDiscount/index.d.ts +1 -0
- package/lib/solution/ShopDiscount/index.js +14 -0
- package/lib/solution/UnifiedBookingSales/index.d.ts +183 -0
- package/lib/solution/UnifiedBookingSales/index.js +1076 -0
- package/lib/solution/UnifiedBookingSales/types.d.ts +143 -0
- package/lib/solution/UnifiedBookingSales/types.js +33 -0
- package/lib/solution/VenueBooking/index.d.ts +39 -11
- package/lib/solution/VenueBooking/index.js +328 -123
- package/lib/solution/VenueBooking/types.d.ts +3 -0
- package/lib/solution/VenueBooking/utils/resource.js +1 -0
- package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
- package/lib/solution/VenueBooking/utils/slotMerge.js +6 -4
- package/lib/solution/index.d.ts +1 -0
- package/lib/solution/index.js +3 -1
- package/lib/types/index.d.ts +1 -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/solution/BookingTicket/utils/weighingProductSku.d.ts +0 -5
- package/dist/solution/BookingTicket/utils/weighingProductSku.js +0 -45
- 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/solution/BookingTicket/utils/weighingProductSku.d.ts +0 -5
- package/lib/solution/BookingTicket/utils/weighingProductSku.js +0 -63
- 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",
|
|
@@ -104,10 +100,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
104
100
|
this.updateCreateStore();
|
|
105
101
|
}
|
|
106
102
|
if (Array.isArray((_a = options == null ? void 0 : options.initialState) == null ? void 0 : _a.list)) {
|
|
107
|
-
this.store.list = this.
|
|
108
|
-
options.initialState.list,
|
|
109
|
-
"initialState"
|
|
110
|
-
);
|
|
103
|
+
this.store.list = options.initialState.list.map((order) => this.normalizeOrderForMemoryList(order));
|
|
111
104
|
this.syncOrdersMap();
|
|
112
105
|
this.emitOrdersChanged([], "initialState");
|
|
113
106
|
} else {
|
|
@@ -173,35 +166,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
173
166
|
* 仅记录计数与订单标识,不输出商品、预约、支付或客户明细。
|
|
174
167
|
*/
|
|
175
168
|
normalizeOrderCollectionsForIngress(order, source) {
|
|
176
|
-
const
|
|
177
|
-
const sourceOrderRecord = sourceOrder;
|
|
178
|
-
if (Array.isArray(sourceOrderRecord.payments)) {
|
|
179
|
-
sourceOrderRecord.payments = sourceOrderRecord.payments.map((payment) => {
|
|
180
|
-
if (!(0, import_payment_utils.isPendingOrderPayment)(payment) || (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment).some((key) => key.startsWith("unique_payment_number:"))) {
|
|
181
|
-
return payment;
|
|
182
|
-
}
|
|
183
|
-
return {
|
|
184
|
-
...payment,
|
|
185
|
-
[PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER]: true
|
|
186
|
-
};
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
const result = (0, import_orderCollectionIdentity.normalizeOrderCollections)(sourceOrder);
|
|
190
|
-
const normalizedOrderRecord = result.order;
|
|
191
|
-
if (Array.isArray(normalizedOrderRecord.payments)) {
|
|
192
|
-
normalizedOrderRecord.payments = normalizedOrderRecord.payments.map(
|
|
193
|
-
(payment) => {
|
|
194
|
-
if (!(payment == null ? void 0 : payment[PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER]))
|
|
195
|
-
return payment;
|
|
196
|
-
const nextPayment = { ...payment };
|
|
197
|
-
const metadata = { ...nextPayment.metadata || {} };
|
|
198
|
-
delete metadata.unique_payment_number;
|
|
199
|
-
delete nextPayment[PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER];
|
|
200
|
-
nextPayment.metadata = metadata;
|
|
201
|
-
return nextPayment;
|
|
202
|
-
}
|
|
203
|
-
);
|
|
204
|
-
}
|
|
169
|
+
const result = (0, import_orderCollectionIdentity.normalizeOrderCollections)(order);
|
|
205
170
|
const kinds = ["product", "booking", "payment"];
|
|
206
171
|
const hasChanges = kinds.some((kind) => {
|
|
207
172
|
const stats = result.stats[kind];
|
|
@@ -237,16 +202,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
237
202
|
/**
|
|
238
203
|
* incoming 决定权威成员集合;同一持久化行仍从 existing 补齐 incoming 省略的本地展示字段。
|
|
239
204
|
*/
|
|
240
|
-
mergeAuthoritativeOrderCollection(field, existing, incoming, uidRemaps = []
|
|
205
|
+
mergeAuthoritativeOrderCollection(field, existing, incoming, uidRemaps = []) {
|
|
241
206
|
const kind = ORDER_COLLECTION_KIND_BY_FIELD[field];
|
|
242
207
|
const existingItems = Array.isArray(existing) ? existing : [];
|
|
243
|
-
if (field === "payments" && options.preserveIdentifiedPendingPayments) {
|
|
244
|
-
return (0, import_payment_utils.mergeOrderPaymentListsByIdentity)(
|
|
245
|
-
existingItems,
|
|
246
|
-
incoming,
|
|
247
|
-
{ preserveUnmatchedExistingWhen: import_payment_utils.isIdentifiedPendingOrderPayment }
|
|
248
|
-
);
|
|
249
|
-
}
|
|
250
208
|
return incoming.map((incomingItem) => {
|
|
251
209
|
const existingItem = existingItems.find(
|
|
252
210
|
(item) => (0, import_orderCollectionIdentity.isSameOrderCollectionItem)(kind, item, incomingItem)
|
|
@@ -502,11 +460,17 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
502
460
|
return DEFAULT_ORDER_SYNC_THROTTLE_MS;
|
|
503
461
|
}
|
|
504
462
|
async preload() {
|
|
505
|
-
const
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
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();
|
|
510
474
|
}
|
|
511
475
|
getOrders() {
|
|
512
476
|
return this.store.list;
|
|
@@ -518,27 +482,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
518
482
|
getOrderByOrderId(orderId) {
|
|
519
483
|
return this.store.map.get(this.getIdKey(orderId));
|
|
520
484
|
}
|
|
521
|
-
buildLocalPaymentOrderLogContext(order) {
|
|
522
|
-
if (!order)
|
|
523
|
-
return {};
|
|
524
|
-
return {
|
|
525
|
-
order_id: order.order_id ?? null,
|
|
526
|
-
external_sale_number: order.external_sale_number ?? null,
|
|
527
|
-
order_number: order.order_number ?? null,
|
|
528
|
-
shop_order_number: order.shop_order_number ?? null,
|
|
529
|
-
shop_full_order_number: order.shop_full_order_number ?? null,
|
|
530
|
-
order_status: order.status ?? null,
|
|
531
|
-
payment_status: order.payment_status ?? null,
|
|
532
|
-
is_draft_order: Number(order.is_draft_order || 0),
|
|
533
|
-
need_sync: Number(order.need_sync || 0),
|
|
534
|
-
platform: order.platform ?? null,
|
|
535
|
-
business_code: order.business_code ?? null,
|
|
536
|
-
order_sales_channel: order.order_sales_channel ?? null,
|
|
537
|
-
sales_channel: order.sales_channel ?? null,
|
|
538
|
-
order_type: order.type ?? null,
|
|
539
|
-
payments_count: Array.isArray(order.payments) ? order.payments.length : 0
|
|
540
|
-
};
|
|
541
|
-
}
|
|
542
485
|
getLocalOrderFromMemoryByLookup(lookup) {
|
|
543
486
|
const key = this.getIdKey(lookup);
|
|
544
487
|
const memoryOrderById = this.store.map.get(key);
|
|
@@ -547,200 +490,28 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
547
490
|
const memoryOrder = this.store.list.find((order) => this.isOrderLookupMatch(order, key));
|
|
548
491
|
return memoryOrder || null;
|
|
549
492
|
}
|
|
550
|
-
async getLocalOrderByLookup(lookup
|
|
493
|
+
async getLocalOrderByLookup(lookup) {
|
|
551
494
|
const key = this.getIdKey(lookup);
|
|
552
|
-
const logContext = {
|
|
553
|
-
operation_id: options.operationId,
|
|
554
|
-
lookup: key,
|
|
555
|
-
memory_order_count: this.store.list.length
|
|
556
|
-
};
|
|
557
|
-
if (options.operationId) {
|
|
558
|
-
this.logInfo("getLocalOrderByLookup-localPayment-开始", logContext);
|
|
559
|
-
}
|
|
560
495
|
const memoryOrderById = this.store.map.get(key);
|
|
561
|
-
if (memoryOrderById)
|
|
562
|
-
if (options.operationId) {
|
|
563
|
-
this.logInfo("getLocalOrderByLookup-localPayment-命中内存映射", {
|
|
564
|
-
...logContext,
|
|
565
|
-
...this.buildLocalPaymentOrderLogContext(memoryOrderById)
|
|
566
|
-
});
|
|
567
|
-
}
|
|
496
|
+
if (memoryOrderById)
|
|
568
497
|
return memoryOrderById;
|
|
569
|
-
}
|
|
570
498
|
const memoryOrder = this.store.list.find((order) => this.isOrderLookupMatch(order, key));
|
|
571
|
-
if (memoryOrder)
|
|
572
|
-
if (options.operationId) {
|
|
573
|
-
this.logInfo("getLocalOrderByLookup-localPayment-命中内存列表", {
|
|
574
|
-
...logContext,
|
|
575
|
-
...this.buildLocalPaymentOrderLogContext(memoryOrder)
|
|
576
|
-
});
|
|
577
|
-
}
|
|
499
|
+
if (memoryOrder)
|
|
578
500
|
return memoryOrder;
|
|
579
|
-
}
|
|
580
|
-
if (options.operationId) {
|
|
581
|
-
this.logInfo("getLocalOrderByLookup-localPayment-开始读取SQLite", logContext);
|
|
582
|
-
}
|
|
583
501
|
const orders = await this.loadOrdersFromSQLite();
|
|
584
502
|
const localOrder = orders.find((order) => this.isOrderLookupMatch(order, key));
|
|
585
|
-
if (!localOrder)
|
|
586
|
-
if (options.operationId) {
|
|
587
|
-
this.logWarning("getLocalOrderByLookup-localPayment-SQLite未命中", {
|
|
588
|
-
...logContext,
|
|
589
|
-
sqlite_order_count: orders.length
|
|
590
|
-
});
|
|
591
|
-
}
|
|
592
|
-
return null;
|
|
593
|
-
}
|
|
594
|
-
this.store.list = this.normalizeOrdersForMemoryList(
|
|
595
|
-
orders,
|
|
596
|
-
"getLocalOrderByLookup.sqliteMemory"
|
|
597
|
-
);
|
|
598
|
-
this.syncOrdersMap();
|
|
599
|
-
const normalizedOrder = this.normalizeOrderForMemoryList(localOrder);
|
|
600
|
-
if (options.operationId) {
|
|
601
|
-
this.logInfo("getLocalOrderByLookup-localPayment-SQLite命中", {
|
|
602
|
-
...logContext,
|
|
603
|
-
sqlite_order_count: orders.length,
|
|
604
|
-
...this.buildLocalPaymentOrderLogContext(normalizedOrder)
|
|
605
|
-
});
|
|
606
|
-
}
|
|
607
|
-
return normalizedOrder;
|
|
608
|
-
}
|
|
609
|
-
async getLocalPayment(params) {
|
|
610
|
-
const logContext = {
|
|
611
|
-
operation_id: params.operationId,
|
|
612
|
-
sale_id: params.saleId,
|
|
613
|
-
payment_number: params.paymentNumber
|
|
614
|
-
};
|
|
615
|
-
this.logInfo("getLocalPayment-开始", logContext);
|
|
616
|
-
try {
|
|
617
|
-
const order = await this.getLocalOrderByLookup(params.saleId, {
|
|
618
|
-
operationId: params.operationId
|
|
619
|
-
});
|
|
620
|
-
if (!order) {
|
|
621
|
-
this.logWarning("getLocalPayment-订单未命中", logContext);
|
|
622
|
-
return null;
|
|
623
|
-
}
|
|
624
|
-
const payments = order.payments || [];
|
|
625
|
-
const match = (0, import_payment_utils.resolveOrderPaymentIdentity)(
|
|
626
|
-
payments,
|
|
627
|
-
params.paymentNumber,
|
|
628
|
-
"compat"
|
|
629
|
-
);
|
|
630
|
-
if (!match) {
|
|
631
|
-
this.logWarning("getLocalPayment-支付项未命中", {
|
|
632
|
-
...logContext,
|
|
633
|
-
...this.buildLocalPaymentOrderLogContext(order),
|
|
634
|
-
payments
|
|
635
|
-
});
|
|
636
|
-
return null;
|
|
637
|
-
}
|
|
638
|
-
this.logInfo("getLocalPayment-支付项命中", {
|
|
639
|
-
...logContext,
|
|
640
|
-
...this.buildLocalPaymentOrderLogContext(order),
|
|
641
|
-
matched_by: match.matchedBy,
|
|
642
|
-
payment_index: match.index,
|
|
643
|
-
payment: match.payment
|
|
644
|
-
});
|
|
645
|
-
return {
|
|
646
|
-
order,
|
|
647
|
-
payment: match.payment,
|
|
648
|
-
paymentIndex: match.index,
|
|
649
|
-
matchedBy: match.matchedBy
|
|
650
|
-
};
|
|
651
|
-
} catch (error) {
|
|
652
|
-
this.logError("getLocalPayment-查询失败", {
|
|
653
|
-
...logContext,
|
|
654
|
-
error: error instanceof Error ? error.message : String(error)
|
|
655
|
-
});
|
|
656
|
-
throw error;
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
async updateLocalPayment(params) {
|
|
660
|
-
const logContext = {
|
|
661
|
-
operation_id: params.operationId,
|
|
662
|
-
sale_id: params.saleId,
|
|
663
|
-
payment_number: params.paymentNumber,
|
|
664
|
-
incoming_payment_update: params.updates
|
|
665
|
-
};
|
|
666
|
-
this.logInfo("updateLocalPayment-开始", logContext);
|
|
667
|
-
const found = await this.getLocalPayment(params);
|
|
668
|
-
if (!found) {
|
|
669
|
-
this.logWarning("updateLocalPayment-支付项未命中", logContext);
|
|
503
|
+
if (!localOrder)
|
|
670
504
|
return null;
|
|
671
|
-
|
|
672
|
-
const previousPayment = (0, import_lodash_es.cloneDeep)(found.payment);
|
|
673
|
-
const nextPayment = (0, import_payment_utils.mergeOrderPaymentRecord)(found.payment, {
|
|
674
|
-
...params.updates,
|
|
675
|
-
updated_at: params.updates.updated_at || (0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss")
|
|
676
|
-
});
|
|
677
|
-
const nextOrder = {
|
|
678
|
-
...found.order,
|
|
679
|
-
payments: (found.order.payments || []).map((payment, index) => index === found.paymentIndex ? nextPayment : payment),
|
|
680
|
-
updated_at: (0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss")
|
|
681
|
-
};
|
|
682
|
-
const paymentContext = {
|
|
683
|
-
...logContext,
|
|
684
|
-
matched_by: found.matchedBy,
|
|
685
|
-
payment_index: found.paymentIndex,
|
|
686
|
-
...this.buildLocalPaymentOrderLogContext(nextOrder),
|
|
687
|
-
previous_payment: previousPayment,
|
|
688
|
-
payment: nextPayment
|
|
689
|
-
};
|
|
690
|
-
this.logInfo("updateLocalPayment-支付项合并完成", paymentContext);
|
|
691
|
-
const targetIndex = this.findOrderIndexByIdentity(this.store.list, found.order);
|
|
692
|
-
const shouldKeepInMemory = this.shouldKeepOrderInMemory(nextOrder);
|
|
693
|
-
if (targetIndex < 0 && shouldKeepInMemory) {
|
|
694
|
-
this.logError("updateLocalPayment-订单Store索引未命中", paymentContext);
|
|
695
|
-
return null;
|
|
696
|
-
}
|
|
697
|
-
const previousList = this.store.list;
|
|
698
|
-
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));
|
|
699
506
|
this.syncOrdersMap();
|
|
700
|
-
|
|
701
|
-
try {
|
|
702
|
-
this.logInfo("updateLocalPayment-SQLite写入开始", {
|
|
703
|
-
...paymentContext,
|
|
704
|
-
storage_order_id: storageOrder.order_id ?? null
|
|
705
|
-
});
|
|
706
|
-
await this.updateOrderInSQLite(storageOrder, "updateLocalPayment", { throwOnError: true });
|
|
707
|
-
this.logInfo("updateLocalPayment-SQLite写入完成", {
|
|
708
|
-
...paymentContext,
|
|
709
|
-
storage_order_id: storageOrder.order_id ?? null
|
|
710
|
-
});
|
|
711
|
-
} catch (error) {
|
|
712
|
-
this.store.list = previousList;
|
|
713
|
-
this.syncOrdersMap();
|
|
714
|
-
this.logError("updateLocalPayment-SQLite写入失败并回滚内存", {
|
|
715
|
-
...paymentContext,
|
|
716
|
-
storage_order_id: storageOrder.order_id ?? null,
|
|
717
|
-
error: error instanceof Error ? error.message : String(error)
|
|
718
|
-
});
|
|
719
|
-
throw error;
|
|
720
|
-
}
|
|
721
|
-
if (shouldKeepInMemory || targetIndex >= 0) {
|
|
722
|
-
await this.emitOrdersChanged(
|
|
723
|
-
shouldKeepInMemory ? [nextOrder] : [],
|
|
724
|
-
shouldKeepInMemory ? "updateLocalPayment" : "updateLocalPayment.sqliteOnlyDraft"
|
|
725
|
-
);
|
|
726
|
-
}
|
|
727
|
-
this.logInfo("updateLocalPayment-变更事件完成", paymentContext);
|
|
728
|
-
return { order: nextOrder, payment: nextPayment, previousPayment };
|
|
507
|
+
return this.normalizeOrderForMemoryList(localOrder);
|
|
729
508
|
}
|
|
730
509
|
async loadOrdersByServer() {
|
|
731
510
|
var _a;
|
|
732
511
|
let orderList = [];
|
|
733
|
-
const protectedOrdersBeforeRemoteFetch = (await this.loadOrdersFromSQLite()).filter(
|
|
734
|
-
(order) => this.shouldProtectLocalOrderFromRemoteSnapshot(order)
|
|
735
|
-
);
|
|
736
512
|
this.logInfo("loadOrdersByServer-开始", {
|
|
737
513
|
hasOrderDataSource: !!this.orderDataSource,
|
|
738
|
-
query: ((_a = this.store) == null ? void 0 : _a.createdAtQuery) || null
|
|
739
|
-
protectedLocalOrderCount: protectedOrdersBeforeRemoteFetch.length,
|
|
740
|
-
protectedPendingPaymentCount: protectedOrdersBeforeRemoteFetch.reduce(
|
|
741
|
-
(count, order) => count + this.getIdentifiedPendingPayments(order).length,
|
|
742
|
-
0
|
|
743
|
-
)
|
|
514
|
+
query: ((_a = this.store) == null ? void 0 : _a.createdAtQuery) || null
|
|
744
515
|
});
|
|
745
516
|
if (this.orderDataSource) {
|
|
746
517
|
try {
|
|
@@ -760,19 +531,10 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
760
531
|
return this.store.list;
|
|
761
532
|
}
|
|
762
533
|
}
|
|
763
|
-
const mergedOrders = await this.replaceOrdersSnapshotInSQLite(
|
|
764
|
-
|
|
765
|
-
"loadOrdersByServer",
|
|
766
|
-
protectedOrdersBeforeRemoteFetch
|
|
767
|
-
);
|
|
768
|
-
const memoryOrders = this.normalizeOrdersForMemoryList(
|
|
769
|
-
mergedOrders,
|
|
770
|
-
"loadOrdersByServer.memory"
|
|
771
|
-
);
|
|
534
|
+
const mergedOrders = await this.replaceOrdersSnapshotInSQLite(orderList, "loadOrdersByServer");
|
|
535
|
+
const memoryOrders = mergedOrders.map((order) => this.normalizeOrderForMemoryList(order));
|
|
772
536
|
this.logInfo("loadOrdersByServer-结束", {
|
|
773
|
-
count: memoryOrders.length
|
|
774
|
-
persistedCount: mergedOrders.length,
|
|
775
|
-
sqliteOnlyDraftCount: mergedOrders.length - memoryOrders.length
|
|
537
|
+
count: memoryOrders.length
|
|
776
538
|
});
|
|
777
539
|
await this.core.effects.emit(import_types.OrderHooks.onOrdersLoaded, memoryOrders);
|
|
778
540
|
return memoryOrders;
|
|
@@ -792,14 +554,18 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
792
554
|
try {
|
|
793
555
|
this.updateCreateStore();
|
|
794
556
|
const orders = await this.loadOrdersByServer();
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
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
|
+
}
|
|
803
569
|
return this.store.list;
|
|
804
570
|
} catch (error) {
|
|
805
571
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -813,9 +579,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
813
579
|
normalizeOrderForMemoryList(order, source = "normalizeOrderForMemoryList") {
|
|
814
580
|
const normalizedOrder = this.normalizeOrderCollectionsForIngress(order, source);
|
|
815
581
|
const externalSaleNumber = normalizedOrder == null ? void 0 : normalizedOrder.external_sale_number;
|
|
816
|
-
if (this.isDraftOrder(normalizedOrder) && !this.hasRealOrderId(normalizedOrder)) {
|
|
817
|
-
return normalizedOrder;
|
|
818
|
-
}
|
|
819
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) !== "") {
|
|
820
583
|
return normalizedOrder;
|
|
821
584
|
}
|
|
@@ -827,27 +590,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
827
590
|
order_id: externalSaleNumber
|
|
828
591
|
};
|
|
829
592
|
}
|
|
830
|
-
normalizeOrdersForMemoryList(orders, source) {
|
|
831
|
-
return orders.map((order) => this.normalizeOrderForMemoryList(order, source)).filter((order) => this.shouldKeepOrderInMemory(order));
|
|
832
|
-
}
|
|
833
|
-
hasRealOrderId(order) {
|
|
834
|
-
if (!order || this.isBlankIdentityValue(order.order_id))
|
|
835
|
-
return false;
|
|
836
|
-
const externalSaleNumber = order.external_sale_number;
|
|
837
|
-
return !(this.isDraftOrder(order) && !this.isBlankIdentityValue(externalSaleNumber) && String(order.order_id) === String(externalSaleNumber));
|
|
838
|
-
}
|
|
839
|
-
shouldKeepOrderInMemory(order) {
|
|
840
|
-
return !this.isDraftOrder(order) || this.hasRealOrderId(order);
|
|
841
|
-
}
|
|
842
|
-
withoutSyntheticDraftOrderId(order) {
|
|
843
|
-
const externalSaleNumber = order.external_sale_number;
|
|
844
|
-
if (Number(order.is_draft_order || 0) !== 1 || order.order_id === void 0 || externalSaleNumber === void 0 || String(order.order_id) !== String(externalSaleNumber)) {
|
|
845
|
-
return order;
|
|
846
|
-
}
|
|
847
|
-
const next = { ...order };
|
|
848
|
-
delete next.order_id;
|
|
849
|
-
return next;
|
|
850
|
-
}
|
|
851
593
|
/**
|
|
852
594
|
* 仅覆盖本地已存在的订单;不存在则直接跳过,不落库、不 emit。
|
|
853
595
|
* 适用于"按 order_id 主动刷新本地订单详情"的代理场景。
|
|
@@ -896,13 +638,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
896
638
|
* 将远端拉取的订单合并进本地 store(已存在则更新,不存在则追加),落库并 emit onOrdersChanged。
|
|
897
639
|
* 供 /update/localOrder 等在「本地尚无该单」时写入新建单。
|
|
898
640
|
*/
|
|
899
|
-
async upsertOrdersFromRemote(freshOrders
|
|
641
|
+
async upsertOrdersFromRemote(freshOrders) {
|
|
900
642
|
if (!(freshOrders == null ? void 0 : freshOrders.length)) {
|
|
901
643
|
this.logInfo("upsertOrdersFromRemote-订单列表为空", {});
|
|
902
644
|
return;
|
|
903
645
|
}
|
|
904
|
-
this.logInfo("upsertOrdersFromRemote-开始", { count: freshOrders.length
|
|
905
|
-
await this.mergeOrdersToStore(freshOrders,
|
|
646
|
+
this.logInfo("upsertOrdersFromRemote-开始", { count: freshOrders.length });
|
|
647
|
+
await this.mergeOrdersToStore(freshOrders, "upsertOrdersFromRemote");
|
|
906
648
|
}
|
|
907
649
|
async markOrderSyncedByExternalSaleNumber(params) {
|
|
908
650
|
const externalSaleNumber = params.externalSaleNumber;
|
|
@@ -928,8 +670,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
928
670
|
...existing,
|
|
929
671
|
...params.patch || {},
|
|
930
672
|
external_sale_number: existing.external_sale_number ?? externalSaleNumber,
|
|
931
|
-
need_sync: 0
|
|
932
|
-
is_draft_order: 0
|
|
673
|
+
need_sync: 0
|
|
933
674
|
});
|
|
934
675
|
const storageKey = this.getOrderStorageKey(nextOrder) || key;
|
|
935
676
|
this.store.list = this.store.list.map((order, index) => {
|
|
@@ -954,7 +695,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
954
695
|
* 将本地待同步订单按 SQLite storage key 合并进 store 并落库。
|
|
955
696
|
* checkout 离线兜底可能没有 order_id,但通常会有 external_sale_number。
|
|
956
697
|
*/
|
|
957
|
-
async upsertPendingSyncOrders(pendingOrders
|
|
698
|
+
async upsertPendingSyncOrders(pendingOrders) {
|
|
958
699
|
if (!(pendingOrders == null ? void 0 : pendingOrders.length)) {
|
|
959
700
|
this.logInfo("upsertPendingSyncOrders-订单列表为空", {});
|
|
960
701
|
return;
|
|
@@ -966,19 +707,14 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
966
707
|
order,
|
|
967
708
|
"upsertPendingSyncOrders.incoming"
|
|
968
709
|
);
|
|
969
|
-
const
|
|
970
|
-
...normalizedOrder,
|
|
971
|
-
need_sync: 1,
|
|
972
|
-
is_draft_order: 0
|
|
973
|
-
};
|
|
974
|
-
const storageKey = this.getOrderStorageKey(pendingOrder);
|
|
710
|
+
const storageKey = this.getOrderStorageKey(normalizedOrder);
|
|
975
711
|
if (!storageKey)
|
|
976
712
|
continue;
|
|
977
|
-
pendingMap.set(storageKey,
|
|
713
|
+
pendingMap.set(storageKey, normalizedOrder);
|
|
978
714
|
memoryPendingMap.set(
|
|
979
715
|
storageKey,
|
|
980
716
|
this.normalizeOrderForMemoryList(
|
|
981
|
-
|
|
717
|
+
normalizedOrder,
|
|
982
718
|
"upsertPendingSyncOrders.memory"
|
|
983
719
|
)
|
|
984
720
|
);
|
|
@@ -1009,12 +745,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1009
745
|
if (matchIndex >= 0) {
|
|
1010
746
|
const existingOrder = updatedList[matchIndex];
|
|
1011
747
|
const mergedOrder = this.mergeOrderRecords(existingOrder, pendingOrder);
|
|
1012
|
-
|
|
1013
|
-
...mergedOrder,
|
|
1014
|
-
need_sync: 1,
|
|
1015
|
-
is_draft_order: 0
|
|
1016
|
-
};
|
|
1017
|
-
updatedList[matchIndex] = nextOrder;
|
|
748
|
+
updatedList[matchIndex] = mergedOrder;
|
|
1018
749
|
const pendingSnapshot = pendingMap.get(storageKey);
|
|
1019
750
|
if (pendingSnapshot) {
|
|
1020
751
|
pendingMap.set(
|
|
@@ -1022,7 +753,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1022
753
|
this.reconcileOverwriteOrderCollections(existingOrder, pendingSnapshot)
|
|
1023
754
|
);
|
|
1024
755
|
}
|
|
1025
|
-
this.registerOrderIdentityKeys(identityKeyToIndex,
|
|
756
|
+
this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, matchIndex);
|
|
1026
757
|
mergeActions[storageKey] = "update";
|
|
1027
758
|
continue;
|
|
1028
759
|
}
|
|
@@ -1032,131 +763,15 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1032
763
|
mergeActions[storageKey] = "insert";
|
|
1033
764
|
}
|
|
1034
765
|
const patchedOrders = [...pendingMap.values()];
|
|
1035
|
-
const previousList = this.store.list;
|
|
1036
766
|
this.store.list = this.runOrderStoreSelfCheck(updatedList, "upsertPendingSyncOrders.store");
|
|
1037
767
|
this.syncOrdersMap();
|
|
1038
|
-
|
|
1039
|
-
await this.patchOrdersInSQLite(
|
|
1040
|
-
patchedOrders,
|
|
1041
|
-
"upsertPendingSyncOrders",
|
|
1042
|
-
mergeActions,
|
|
1043
|
-
options
|
|
1044
|
-
);
|
|
1045
|
-
} catch (error) {
|
|
1046
|
-
this.store.list = previousList;
|
|
1047
|
-
this.syncOrdersMap();
|
|
1048
|
-
throw error;
|
|
1049
|
-
}
|
|
768
|
+
await this.patchOrdersInSQLite(patchedOrders, "upsertPendingSyncOrders", mergeActions);
|
|
1050
769
|
this.logInfo("upsertPendingSyncOrders-结束", {
|
|
1051
770
|
count: patchedOrders.length,
|
|
1052
771
|
storeOrderCountAfter: this.store.list.length
|
|
1053
772
|
});
|
|
1054
773
|
await this.emitOrdersChanged(patchedOrders, "upsertPendingSyncOrders");
|
|
1055
774
|
}
|
|
1056
|
-
/**
|
|
1057
|
-
* 将 POS 草稿订单按 SQLite storage key 落库。
|
|
1058
|
-
* 只有具备真实 order_id 的草稿进入 store;其余草稿仅供本地恢复查询。
|
|
1059
|
-
*/
|
|
1060
|
-
async upsertLocalDraftOrders(draftOrders) {
|
|
1061
|
-
if (!(draftOrders == null ? void 0 : draftOrders.length)) {
|
|
1062
|
-
this.logInfo("upsertLocalDraftOrders-订单列表为空", {});
|
|
1063
|
-
return;
|
|
1064
|
-
}
|
|
1065
|
-
const draftMap = /* @__PURE__ */ new Map();
|
|
1066
|
-
const memoryDraftMap = /* @__PURE__ */ new Map();
|
|
1067
|
-
for (const order of draftOrders) {
|
|
1068
|
-
const draftOrder = {
|
|
1069
|
-
...order,
|
|
1070
|
-
need_sync: 0,
|
|
1071
|
-
is_draft_order: 1
|
|
1072
|
-
};
|
|
1073
|
-
const storageKey = this.getOrderStorageKey(draftOrder);
|
|
1074
|
-
if (!storageKey)
|
|
1075
|
-
continue;
|
|
1076
|
-
draftMap.set(storageKey, draftOrder);
|
|
1077
|
-
const memoryDraftOrder = this.normalizeOrderForMemoryList(draftOrder);
|
|
1078
|
-
if (this.shouldKeepOrderInMemory(memoryDraftOrder)) {
|
|
1079
|
-
memoryDraftMap.set(storageKey, memoryDraftOrder);
|
|
1080
|
-
}
|
|
1081
|
-
}
|
|
1082
|
-
if (draftMap.size === 0) {
|
|
1083
|
-
this.logError("upsertLocalDraftOrders-订单缺少可落库标识", {
|
|
1084
|
-
count: draftOrders.length
|
|
1085
|
-
});
|
|
1086
|
-
return;
|
|
1087
|
-
}
|
|
1088
|
-
this.logInfo("upsertLocalDraftOrders-开始", {
|
|
1089
|
-
count: draftMap.size,
|
|
1090
|
-
memoryDraftCount: memoryDraftMap.size,
|
|
1091
|
-
sqliteOnlyDraftCount: draftMap.size - memoryDraftMap.size
|
|
1092
|
-
});
|
|
1093
|
-
const mergeActions = {};
|
|
1094
|
-
const updatedList = this.store.list.filter((order) => this.shouldKeepOrderInMemory(order));
|
|
1095
|
-
const identityKeyToIndex = /* @__PURE__ */ new Map();
|
|
1096
|
-
for (let index = 0; index < updatedList.length; index += 1) {
|
|
1097
|
-
for (const key of this.getOrderIdentityMatchKeys(updatedList[index])) {
|
|
1098
|
-
if (!identityKeyToIndex.has(key))
|
|
1099
|
-
identityKeyToIndex.set(key, index);
|
|
1100
|
-
}
|
|
1101
|
-
}
|
|
1102
|
-
for (const [storageKey, draftOrder] of memoryDraftMap.entries()) {
|
|
1103
|
-
const matchIndex = this.lookupOrderIndexByIdentityKeys(
|
|
1104
|
-
identityKeyToIndex,
|
|
1105
|
-
this.getOrderIdentityMatchKeys(draftOrder)
|
|
1106
|
-
);
|
|
1107
|
-
if (matchIndex >= 0) {
|
|
1108
|
-
const existingOrder = updatedList[matchIndex];
|
|
1109
|
-
const reconciledDraftOrder = this.preserveExistingBusinessCodeForDraft(
|
|
1110
|
-
existingOrder,
|
|
1111
|
-
draftOrder
|
|
1112
|
-
);
|
|
1113
|
-
const mergedOrder = this.mergeOrderRecords(existingOrder, reconciledDraftOrder);
|
|
1114
|
-
const nextOrder = {
|
|
1115
|
-
...mergedOrder,
|
|
1116
|
-
need_sync: 0,
|
|
1117
|
-
is_draft_order: 1
|
|
1118
|
-
};
|
|
1119
|
-
updatedList[matchIndex] = nextOrder;
|
|
1120
|
-
draftMap.set(storageKey, reconciledDraftOrder);
|
|
1121
|
-
this.registerOrderIdentityKeys(identityKeyToIndex, nextOrder, matchIndex);
|
|
1122
|
-
mergeActions[storageKey] = "update";
|
|
1123
|
-
continue;
|
|
1124
|
-
}
|
|
1125
|
-
const insertIndex = updatedList.length;
|
|
1126
|
-
updatedList.push(draftOrder);
|
|
1127
|
-
this.registerOrderIdentityKeys(identityKeyToIndex, draftOrder, insertIndex);
|
|
1128
|
-
mergeActions[storageKey] = "insert";
|
|
1129
|
-
}
|
|
1130
|
-
const patchedOrders = [...draftMap.values()];
|
|
1131
|
-
const previousList = this.store.list;
|
|
1132
|
-
this.store.list = this.runOrderStoreSelfCheck(updatedList, "upsertLocalDraftOrders.store");
|
|
1133
|
-
this.syncOrdersMap();
|
|
1134
|
-
try {
|
|
1135
|
-
await this.patchOrdersInSQLite(
|
|
1136
|
-
patchedOrders,
|
|
1137
|
-
"upsertLocalDraftOrders",
|
|
1138
|
-
mergeActions,
|
|
1139
|
-
{ throwOnError: true }
|
|
1140
|
-
);
|
|
1141
|
-
} catch (error) {
|
|
1142
|
-
this.store.list = previousList;
|
|
1143
|
-
this.syncOrdersMap();
|
|
1144
|
-
throw error;
|
|
1145
|
-
}
|
|
1146
|
-
this.logInfo("upsertLocalDraftOrders-结束", {
|
|
1147
|
-
count: patchedOrders.length,
|
|
1148
|
-
storeOrderCountAfter: this.store.list.length
|
|
1149
|
-
});
|
|
1150
|
-
const removedLegacyMemoryDraft = previousList.some(
|
|
1151
|
-
(order) => !this.shouldKeepOrderInMemory(order)
|
|
1152
|
-
);
|
|
1153
|
-
if (memoryDraftMap.size > 0 || removedLegacyMemoryDraft) {
|
|
1154
|
-
await this.emitOrdersChanged(
|
|
1155
|
-
patchedOrders.filter((order) => this.shouldKeepOrderInMemory(order)),
|
|
1156
|
-
"upsertLocalDraftOrders"
|
|
1157
|
-
);
|
|
1158
|
-
}
|
|
1159
|
-
}
|
|
1160
775
|
/**
|
|
1161
776
|
* 通过 SSE 按自定义 query 拉取订单(支持 select/with 精简字段)
|
|
1162
777
|
*/
|
|
@@ -1189,7 +804,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1189
804
|
super.destroy();
|
|
1190
805
|
}
|
|
1191
806
|
syncOrdersMap() {
|
|
1192
|
-
this.store.list = this.store.list.filter((order) => this.shouldKeepOrderInMemory(order));
|
|
1193
807
|
this.store.map.clear();
|
|
1194
808
|
for (const order of this.store.list) {
|
|
1195
809
|
const primaryIdentity = this.getOrderMapKey(order);
|
|
@@ -1213,22 +827,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1213
827
|
isBlankIdentityValue(value) {
|
|
1214
828
|
return value === void 0 || value === null || value === "";
|
|
1215
829
|
}
|
|
1216
|
-
/**
|
|
1217
|
-
* `/sales/draft` 的旧调用方可能把未设置的 business_code 传成空串。
|
|
1218
|
-
* 对同一真实订单,空值不能覆盖已有的分类,否则 booking 查询会把该订单从 Party 列表过滤掉。
|
|
1219
|
-
*/
|
|
1220
|
-
preserveExistingBusinessCodeForDraft(existingOrder, draftOrder) {
|
|
1221
|
-
const existingBusinessCode = existingOrder.business_code;
|
|
1222
|
-
const draftBusinessCode = draftOrder.business_code;
|
|
1223
|
-
const hasExistingBusinessCode = typeof existingBusinessCode === "string" && existingBusinessCode.trim() !== "";
|
|
1224
|
-
const hasDraftBusinessCode = typeof draftBusinessCode === "string" && draftBusinessCode.trim() !== "";
|
|
1225
|
-
if (!hasExistingBusinessCode || hasDraftBusinessCode)
|
|
1226
|
-
return draftOrder;
|
|
1227
|
-
return {
|
|
1228
|
-
...draftOrder,
|
|
1229
|
-
business_code: existingBusinessCode
|
|
1230
|
-
};
|
|
1231
|
-
}
|
|
1232
830
|
getOrderIdentityEntries(order) {
|
|
1233
831
|
if (!order)
|
|
1234
832
|
return [];
|
|
@@ -1528,43 +1126,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1528
1126
|
});
|
|
1529
1127
|
continue;
|
|
1530
1128
|
}
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
order_id: existingOrder.order_id ?? fresh.order_id ?? null,
|
|
1535
|
-
external_sale_number: existingOrder.external_sale_number ?? fresh.external_sale_number ?? null,
|
|
1536
|
-
local_is_draft_order: existingOrder.is_draft_order ?? null,
|
|
1537
|
-
remote_is_draft_order: fresh.is_draft_order ?? null,
|
|
1538
|
-
reason: "protect_draft_order_from_remote_echo"
|
|
1539
|
-
});
|
|
1540
|
-
continue;
|
|
1541
|
-
}
|
|
1542
|
-
let mergedOrder = this.mergeOrderRecords(existingOrder, fresh);
|
|
1543
|
-
let adjustedMatchIndex = matchIndex;
|
|
1544
|
-
const duplicateIndexes = /* @__PURE__ */ new Set();
|
|
1545
|
-
for (const key of freshIdentityKeys) {
|
|
1546
|
-
const duplicateIndex = identityKeyToIndex.get(key);
|
|
1547
|
-
if (duplicateIndex === void 0 || duplicateIndex === matchIndex)
|
|
1548
|
-
continue;
|
|
1549
|
-
duplicateIndexes.add(duplicateIndex);
|
|
1550
|
-
}
|
|
1551
|
-
if (duplicateIndexes.size > 0) {
|
|
1552
|
-
for (const duplicateIndex of [...duplicateIndexes].sort((left, right) => right - left)) {
|
|
1553
|
-
mergedOrder = this.mergeOrderRecords(mergedOrder, updatedList[duplicateIndex]);
|
|
1554
|
-
updatedList.splice(duplicateIndex, 1);
|
|
1555
|
-
if (duplicateIndex < adjustedMatchIndex)
|
|
1556
|
-
adjustedMatchIndex -= 1;
|
|
1557
|
-
}
|
|
1558
|
-
identityKeyToIndex.clear();
|
|
1559
|
-
for (let index = 0; index < updatedList.length; index += 1) {
|
|
1560
|
-
for (const key of this.getOrderIdentityMatchKeys(updatedList[index])) {
|
|
1561
|
-
if (!identityKeyToIndex.has(key))
|
|
1562
|
-
identityKeyToIndex.set(key, index);
|
|
1563
|
-
}
|
|
1564
|
-
}
|
|
1565
|
-
}
|
|
1566
|
-
updatedList[adjustedMatchIndex] = mergedOrder;
|
|
1567
|
-
this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, adjustedMatchIndex);
|
|
1129
|
+
const mergedOrder = this.mergeOrderRecords(existingOrder, fresh);
|
|
1130
|
+
updatedList[matchIndex] = mergedOrder;
|
|
1131
|
+
this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, matchIndex);
|
|
1568
1132
|
patchedOrders.push(mergedOrder);
|
|
1569
1133
|
if (mergeKey)
|
|
1570
1134
|
mergeActions[mergeKey] = "update";
|
|
@@ -1756,72 +1320,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1756
1320
|
return right;
|
|
1757
1321
|
return left;
|
|
1758
1322
|
}
|
|
1759
|
-
getProductIdentityKeys(product) {
|
|
1760
|
-
var _a;
|
|
1761
|
-
const record = product;
|
|
1762
|
-
if (!record)
|
|
1763
|
-
return [];
|
|
1764
|
-
const keys = [];
|
|
1765
|
-
const metadataUid = (_a = record.metadata) == null ? void 0 : _a.unique_identification_number;
|
|
1766
|
-
if (!this.isBlankIdentityValue(metadataUid))
|
|
1767
|
-
keys.push(`uid:${String(metadataUid)}`);
|
|
1768
|
-
const topLevelUid = record.unique_identification_number;
|
|
1769
|
-
if (!this.isBlankIdentityValue(topLevelUid))
|
|
1770
|
-
keys.push(`uid:${String(topLevelUid)}`);
|
|
1771
|
-
const orderDetailId = record.order_detail_id;
|
|
1772
|
-
if (!this.isBlankIdentityValue(orderDetailId))
|
|
1773
|
-
keys.push(`detail:${String(orderDetailId)}`);
|
|
1774
|
-
const bookingUid = record.booking_uid;
|
|
1775
|
-
if (!this.isBlankIdentityValue(bookingUid))
|
|
1776
|
-
keys.push(`booking:${String(bookingUid)}`);
|
|
1777
|
-
return keys;
|
|
1778
|
-
}
|
|
1779
|
-
mergeOrderProductLists(preferred, secondary) {
|
|
1780
|
-
const preferredList = Array.isArray(preferred) ? preferred : [];
|
|
1781
|
-
const secondaryList = Array.isArray(secondary) ? secondary : [];
|
|
1782
|
-
if (secondaryList.length === 0)
|
|
1783
|
-
return preferredList;
|
|
1784
|
-
if (preferredList.length === 0)
|
|
1785
|
-
return secondaryList;
|
|
1786
|
-
const seenKeys = /* @__PURE__ */ new Set();
|
|
1787
|
-
for (const item of preferredList) {
|
|
1788
|
-
const keys = this.getProductIdentityKeys(item);
|
|
1789
|
-
for (const key of keys)
|
|
1790
|
-
seenKeys.add(key);
|
|
1791
|
-
}
|
|
1792
|
-
const result = [...preferredList];
|
|
1793
|
-
for (const item of secondaryList) {
|
|
1794
|
-
const keys = this.getProductIdentityKeys(item);
|
|
1795
|
-
if (keys.length === 0 || keys.some((key) => seenKeys.has(key)))
|
|
1796
|
-
continue;
|
|
1797
|
-
for (const key of keys)
|
|
1798
|
-
seenKeys.add(key);
|
|
1799
|
-
result.push((0, import_lodash_es.cloneDeep)(item));
|
|
1800
|
-
}
|
|
1801
|
-
return result;
|
|
1802
|
-
}
|
|
1803
|
-
mergeOrderPaymentLists(existing, incoming) {
|
|
1804
|
-
const existingList = Array.isArray(existing) ? existing : [];
|
|
1805
|
-
const incomingList = Array.isArray(incoming) ? incoming : [];
|
|
1806
|
-
if (incomingList.length === 0)
|
|
1807
|
-
return (0, import_lodash_es.cloneDeep)(existingList);
|
|
1808
|
-
return (0, import_payment_utils.mergeOrderPaymentListsByIdentity)(existingList, incomingList);
|
|
1809
|
-
}
|
|
1810
|
-
getIdentifiedPendingPayments(order) {
|
|
1811
|
-
const payments = Array.isArray(order == null ? void 0 : order.payments) ? order.payments : [];
|
|
1812
|
-
return payments.filter((payment) => (0, import_payment_utils.isIdentifiedPendingOrderPayment)(payment));
|
|
1813
|
-
}
|
|
1814
|
-
shouldProtectLocalOrderFromRemoteSnapshot(order) {
|
|
1815
|
-
return this.isPendingSyncOrder(order) || this.isDraftOrder(order) || this.getIdentifiedPendingPayments(order).length > 0;
|
|
1816
|
-
}
|
|
1817
|
-
getUnmatchedIdentifiedPendingPayments(existing, incoming) {
|
|
1818
|
-
const existingPayments = Array.isArray(existing) ? existing : [];
|
|
1819
|
-
const incomingPayments = Array.isArray(incoming) ? incoming : [];
|
|
1820
|
-
const incomingIdentityKeys = new Set(
|
|
1821
|
-
incomingPayments.flatMap((payment) => (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment))
|
|
1822
|
-
);
|
|
1823
|
-
return existingPayments.filter((payment) => (0, import_payment_utils.isIdentifiedPendingOrderPayment)(payment) && !(0, import_payment_utils.getOrderPaymentIdentityKeys)(payment).some((key) => incomingIdentityKeys.has(key)));
|
|
1824
|
-
}
|
|
1825
1323
|
mergeOrderRecords(existing, incoming) {
|
|
1826
1324
|
const preferred = this.pickPreferredOrder(existing, incoming);
|
|
1827
1325
|
const secondary = preferred === existing ? incoming : existing;
|
|
@@ -1851,8 +1349,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1851
1349
|
"contacts_info",
|
|
1852
1350
|
"phone",
|
|
1853
1351
|
"email",
|
|
1854
|
-
"relation_forms"
|
|
1855
|
-
"is_draft_order"
|
|
1352
|
+
"relation_forms"
|
|
1856
1353
|
];
|
|
1857
1354
|
const mergedRecord = merged;
|
|
1858
1355
|
const preferredRecord = preferred;
|
|
@@ -1880,26 +1377,11 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1880
1377
|
}
|
|
1881
1378
|
for (const field of ORDER_AUTHORITATIVE_COLLECTION_FIELDS) {
|
|
1882
1379
|
if (Array.isArray(incomingRecord[field])) {
|
|
1883
|
-
if (field === "payments") {
|
|
1884
|
-
const preservedPending = this.getUnmatchedIdentifiedPendingPayments(
|
|
1885
|
-
existingRecord[field],
|
|
1886
|
-
incomingRecord[field]
|
|
1887
|
-
);
|
|
1888
|
-
if (preservedPending.length > 0) {
|
|
1889
|
-
this.logInfo("mergeOrderRecords-保留本地 pending 支付项", {
|
|
1890
|
-
order_id: existing.order_id ?? incoming.order_id ?? null,
|
|
1891
|
-
external_sale_number: existingRecord.external_sale_number ?? incomingRecord.external_sale_number ?? null,
|
|
1892
|
-
preserved_pending_count: preservedPending.length,
|
|
1893
|
-
preserved_payment_identities: preservedPending.map((payment) => (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment))
|
|
1894
|
-
});
|
|
1895
|
-
}
|
|
1896
|
-
}
|
|
1897
1380
|
mergedRecord[field] = this.mergeAuthoritativeOrderCollection(
|
|
1898
1381
|
field,
|
|
1899
1382
|
existingRecord[field],
|
|
1900
1383
|
incomingRecord[field],
|
|
1901
|
-
childUidRemaps
|
|
1902
|
-
{ preserveIdentifiedPendingPayments: field === "payments" }
|
|
1384
|
+
childUidRemaps
|
|
1903
1385
|
);
|
|
1904
1386
|
continue;
|
|
1905
1387
|
}
|
|
@@ -1934,8 +1416,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1934
1416
|
external_sale_number: order.external_sale_number ?? null,
|
|
1935
1417
|
shop_order_number: order.shop_order_number ?? null,
|
|
1936
1418
|
shop_full_order_number: order.shop_full_order_number ?? null,
|
|
1937
|
-
need_sync: order.need_sync ?? null
|
|
1938
|
-
is_draft_order: order.is_draft_order ?? null
|
|
1419
|
+
need_sync: order.need_sync ?? null
|
|
1939
1420
|
}))
|
|
1940
1421
|
}));
|
|
1941
1422
|
}
|
|
@@ -2052,48 +1533,18 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2052
1533
|
isPendingSyncOrder(order) {
|
|
2053
1534
|
return Number(order == null ? void 0 : order.need_sync) === 1;
|
|
2054
1535
|
}
|
|
2055
|
-
isDraftOrder(order) {
|
|
2056
|
-
return Number(order == null ? void 0 : order.is_draft_order) === 1;
|
|
2057
|
-
}
|
|
2058
|
-
shouldProtectDraftOrderFromIncoming(source) {
|
|
2059
|
-
return source !== "checkoutSync";
|
|
2060
|
-
}
|
|
2061
1536
|
normalizeRemoteSyncedOrder(order) {
|
|
2062
1537
|
const normalizedOrder = this.normalizeOrderCollectionsForIngress(
|
|
2063
1538
|
order,
|
|
2064
1539
|
"normalizeRemoteSyncedOrder"
|
|
2065
1540
|
);
|
|
2066
1541
|
if (this.isPendingSyncOrder(normalizedOrder))
|
|
2067
|
-
return
|
|
2068
|
-
...normalizedOrder,
|
|
2069
|
-
is_draft_order: 0
|
|
2070
|
-
};
|
|
1542
|
+
return normalizedOrder;
|
|
2071
1543
|
return {
|
|
2072
1544
|
...normalizedOrder,
|
|
2073
|
-
need_sync: 0
|
|
2074
|
-
is_draft_order: 0
|
|
1545
|
+
need_sync: 0
|
|
2075
1546
|
};
|
|
2076
1547
|
}
|
|
2077
|
-
mergeRemoteIdentityIntoDraftOrder(draftOrder, remoteOrder) {
|
|
2078
|
-
const merged = {
|
|
2079
|
-
...this.withoutSyntheticDraftOrderId(draftOrder)
|
|
2080
|
-
};
|
|
2081
|
-
const remote = remoteOrder;
|
|
2082
|
-
for (const field of [
|
|
2083
|
-
"order_id",
|
|
2084
|
-
"order_number",
|
|
2085
|
-
"shop_order_number",
|
|
2086
|
-
"shop_full_order_number"
|
|
2087
|
-
]) {
|
|
2088
|
-
if (this.isBlankIdentityValue(merged[field]) && !this.isBlankIdentityValue(remote[field])) {
|
|
2089
|
-
merged[field] = remote[field];
|
|
2090
|
-
}
|
|
2091
|
-
}
|
|
2092
|
-
return this.normalizeOrderCollectionsForIngress(
|
|
2093
|
-
merged,
|
|
2094
|
-
"mergeRemoteIdentityIntoDraftOrder"
|
|
2095
|
-
);
|
|
2096
|
-
}
|
|
2097
1548
|
mergeRemoteSnapshotWithPendingOrders(remoteOrders, existingOrders) {
|
|
2098
1549
|
const merged = remoteOrders.map((order) => this.normalizeRemoteSyncedOrder(order));
|
|
2099
1550
|
for (const rawOrder of existingOrders) {
|
|
@@ -2101,18 +1552,11 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2101
1552
|
rawOrder,
|
|
2102
1553
|
"mergeRemoteSnapshotWithPendingOrders.existingSQLite"
|
|
2103
1554
|
);
|
|
2104
|
-
if (!this.
|
|
1555
|
+
if (!this.isPendingSyncOrder(order))
|
|
2105
1556
|
continue;
|
|
2106
1557
|
const matchIndex = this.findOrderIndexByIdentity(merged, order);
|
|
2107
1558
|
if (matchIndex >= 0) {
|
|
2108
|
-
|
|
2109
|
-
merged[matchIndex] = this.mergeRemoteIdentityIntoDraftOrder(
|
|
2110
|
-
order,
|
|
2111
|
-
merged[matchIndex]
|
|
2112
|
-
);
|
|
2113
|
-
} else {
|
|
2114
|
-
merged[matchIndex] = this.mergeOrderRecords(order, merged[matchIndex]);
|
|
2115
|
-
}
|
|
1559
|
+
merged[matchIndex] = this.mergeOrderRecords(order, merged[matchIndex]);
|
|
2116
1560
|
continue;
|
|
2117
1561
|
}
|
|
2118
1562
|
if (!this.getOrderStorageKey(order))
|
|
@@ -2140,13 +1584,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2140
1584
|
* @example
|
|
2141
1585
|
* await this.patchOrdersInSQLite(freshOrders)
|
|
2142
1586
|
*/
|
|
2143
|
-
async patchOrdersInSQLite(orders, source, mergeActions = {}
|
|
2144
|
-
if (orders.length === 0) {
|
|
2145
|
-
return;
|
|
2146
|
-
}
|
|
2147
|
-
if (!this.dbManager) {
|
|
2148
|
-
if (options.throwOnError)
|
|
2149
|
-
throw new Error("订单 SQLite 数据库未初始化");
|
|
1587
|
+
async patchOrdersInSQLite(orders, source, mergeActions = {}) {
|
|
1588
|
+
if (!this.dbManager || orders.length === 0) {
|
|
2150
1589
|
return;
|
|
2151
1590
|
}
|
|
2152
1591
|
const ordersSnapshot = (0, import_lodash_es.cloneDeep)(orders).map((order) => this.normalizeOrderCollectionsForIngress(order, `${source}.sqliteIngress`)).filter((order) => this.getOrderStorageKey(order));
|
|
@@ -2184,8 +1623,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2184
1623
|
for (const order of compactedToWrite) {
|
|
2185
1624
|
await this.dbManager.update(INDEXDB_STORE_NAME, order);
|
|
2186
1625
|
}
|
|
2187
|
-
} else if (options.throwOnError) {
|
|
2188
|
-
throw new Error("订单 SQLite 数据库不支持写入");
|
|
2189
1626
|
}
|
|
2190
1627
|
this.recordRecentSqliteWrite(source, compactedToWrite);
|
|
2191
1628
|
this.logInfo("patchOrdersInSQLite-完成", {
|
|
@@ -2200,8 +1637,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2200
1637
|
error: error instanceof Error ? error.message : String(error),
|
|
2201
1638
|
orderCount: ordersSnapshot.length
|
|
2202
1639
|
});
|
|
2203
|
-
if (options.throwOnError)
|
|
2204
|
-
throw error;
|
|
2205
1640
|
}
|
|
2206
1641
|
}
|
|
2207
1642
|
/**
|
|
@@ -2210,15 +1645,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2210
1645
|
* @example
|
|
2211
1646
|
* await this.updateOrderInSQLite(freshOrder)
|
|
2212
1647
|
*/
|
|
2213
|
-
async updateOrderInSQLite(order, source
|
|
2214
|
-
if (!this.getOrderStorageKey(order)) {
|
|
2215
|
-
if (options.throwOnError)
|
|
2216
|
-
throw new Error("订单缺少可用的 SQLite 存储主键");
|
|
2217
|
-
return;
|
|
2218
|
-
}
|
|
2219
|
-
if (!this.dbManager) {
|
|
2220
|
-
if (options.throwOnError)
|
|
2221
|
-
throw new Error("订单 SQLite 数据库未初始化");
|
|
1648
|
+
async updateOrderInSQLite(order, source) {
|
|
1649
|
+
if (!this.dbManager || !this.getOrderStorageKey(order)) {
|
|
2222
1650
|
return;
|
|
2223
1651
|
}
|
|
2224
1652
|
const orderSnapshot = this.normalizeOrderCollectionsForIngress(
|
|
@@ -2242,8 +1670,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2242
1670
|
} else if (typeof this.dbManager.bulkAdd === "function") {
|
|
2243
1671
|
writeMethod = "bulkAdd";
|
|
2244
1672
|
await this.dbManager.bulkAdd(INDEXDB_STORE_NAME, [orderSnapshot]);
|
|
2245
|
-
} else if (options.throwOnError) {
|
|
2246
|
-
throw new Error("订单 SQLite 数据库不支持写入");
|
|
2247
1673
|
}
|
|
2248
1674
|
this.recordRecentSqliteWrite(source, [orderSnapshot]);
|
|
2249
1675
|
this.logInfo("updateOrderInSQLite-完成", {
|
|
@@ -2257,18 +1683,15 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2257
1683
|
error: error instanceof Error ? error.message : String(error),
|
|
2258
1684
|
orderId: orderSnapshot.order_id ?? null
|
|
2259
1685
|
});
|
|
2260
|
-
if (options.throwOnError)
|
|
2261
|
-
throw error;
|
|
2262
1686
|
}
|
|
2263
1687
|
}
|
|
2264
1688
|
/**
|
|
2265
|
-
* 全量快照替换 orders 表(clear + bulkAdd
|
|
2266
|
-
* 用于 SSE 全量拉取与营业日窗口裁剪。
|
|
1689
|
+
* 全量快照替换 orders 表(clear + bulkAdd),用于 SSE 全量拉取与营业日窗口裁剪。
|
|
2267
1690
|
*
|
|
2268
1691
|
* @example
|
|
2269
1692
|
* await this.replaceOrdersSnapshotInSQLite(orderList)
|
|
2270
1693
|
*/
|
|
2271
|
-
async replaceOrdersSnapshotInSQLite(orderList, source
|
|
1694
|
+
async replaceOrdersSnapshotInSQLite(orderList, source) {
|
|
2272
1695
|
if (!this.dbManager) {
|
|
2273
1696
|
return this.compactOrderListByIdentity(
|
|
2274
1697
|
orderList.map((order) => this.normalizeRemoteSyncedOrder(order)),
|
|
@@ -2285,52 +1708,16 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2285
1708
|
try {
|
|
2286
1709
|
await this.runInOrderSQLiteSaveQueue(async () => {
|
|
2287
1710
|
const existingOrders = typeof this.dbManager.getAll === "function" ? await this.dbManager.getAll(INDEXDB_STORE_NAME) : [];
|
|
2288
|
-
const protectedLocalOrders = protectedOrdersBeforeRemoteFetch.map((order) => this.normalizeOrderCollectionsForIngress(
|
|
2289
|
-
order,
|
|
2290
|
-
`${source}.protectedBeforeRemoteFetch`
|
|
2291
|
-
)).filter((order) => this.shouldProtectLocalOrderFromRemoteSnapshot(order));
|
|
2292
|
-
for (const rawCurrentOrder of existingOrders || []) {
|
|
2293
|
-
const currentOrder = this.normalizeOrderCollectionsForIngress(
|
|
2294
|
-
rawCurrentOrder,
|
|
2295
|
-
`${source}.currentSQLite`
|
|
2296
|
-
);
|
|
2297
|
-
const protectedIndex = this.findOrderIndexByIdentity(
|
|
2298
|
-
protectedLocalOrders,
|
|
2299
|
-
currentOrder
|
|
2300
|
-
);
|
|
2301
|
-
const currentNeedsProtection = this.shouldProtectLocalOrderFromRemoteSnapshot(currentOrder);
|
|
2302
|
-
if (protectedIndex >= 0) {
|
|
2303
|
-
if (currentNeedsProtection) {
|
|
2304
|
-
protectedLocalOrders[protectedIndex] = currentOrder;
|
|
2305
|
-
} else {
|
|
2306
|
-
protectedLocalOrders.splice(protectedIndex, 1);
|
|
2307
|
-
}
|
|
2308
|
-
continue;
|
|
2309
|
-
}
|
|
2310
|
-
if (currentNeedsProtection)
|
|
2311
|
-
protectedLocalOrders.push(currentOrder);
|
|
2312
|
-
}
|
|
2313
1711
|
const orderListSnapshot = this.mergeRemoteSnapshotWithPendingOrders(
|
|
2314
1712
|
remoteSnapshot,
|
|
2315
|
-
|
|
1713
|
+
existingOrders || []
|
|
2316
1714
|
);
|
|
2317
1715
|
mergedSnapshot = this.compactOrderListByIdentity(orderListSnapshot, `${source}.sqliteSnapshot`).list;
|
|
2318
1716
|
this.logInfo("replaceOrdersSnapshotInSQLite-开始", {
|
|
2319
1717
|
source,
|
|
2320
1718
|
count: mergedSnapshot.length,
|
|
2321
1719
|
remoteCount: remoteSnapshot.length,
|
|
2322
|
-
|
|
2323
|
-
protectedLocalOrderCount: protectedLocalOrders.length,
|
|
2324
|
-
preservedLocalUnsyncedCount: mergedSnapshot.length - remoteSnapshot.length,
|
|
2325
|
-
protectedPendingPaymentCount: protectedLocalOrders.reduce(
|
|
2326
|
-
(count, order) => count + this.getIdentifiedPendingPayments(order).length,
|
|
2327
|
-
0
|
|
2328
|
-
),
|
|
2329
|
-
protectedPendingPaymentIdentities: protectedLocalOrders.flatMap((order) => this.getIdentifiedPendingPayments(order).map((payment) => ({
|
|
2330
|
-
order_id: order.order_id ?? null,
|
|
2331
|
-
external_sale_number: order.external_sale_number ?? null,
|
|
2332
|
-
payment_identities: (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment)
|
|
2333
|
-
})))
|
|
1720
|
+
preservedPendingCount: mergedSnapshot.length - remoteSnapshot.length
|
|
2334
1721
|
});
|
|
2335
1722
|
await this.dbManager.clear(INDEXDB_STORE_NAME);
|
|
2336
1723
|
this.logInfo("replaceOrdersSnapshotInSQLite-clear完成", {
|