@pisell/pisellos 2.2.274 → 2.2.276

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/core/index.d.ts +2 -0
  2. package/dist/core/index.js +7 -0
  3. package/dist/model/strategy/adapter/promotion/adapter.d.ts +4 -0
  4. package/dist/model/strategy/adapter/promotion/adapter.js +23 -0
  5. package/dist/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
  6. package/dist/model/strategy/adapter/promotion/evaluator.js +279 -6
  7. package/dist/model/strategy/adapter/promotion/examples.d.ts +86 -0
  8. package/dist/model/strategy/adapter/promotion/examples.js +99 -0
  9. package/dist/model/strategy/adapter/promotion/index.d.ts +1 -1
  10. package/dist/model/strategy/adapter/promotion/index.js +1 -1
  11. package/dist/model/strategy/adapter/promotion/type.d.ts +90 -2
  12. package/dist/model/strategy/adapter/promotion/type.js +45 -0
  13. package/dist/modules/OpenData/index.d.ts +2 -0
  14. package/dist/modules/OpenData/index.js +8 -0
  15. package/dist/modules/Order/index.d.ts +28 -8
  16. package/dist/modules/Order/index.js +907 -588
  17. package/dist/modules/Order/payment-utils.d.ts +26 -0
  18. package/dist/modules/Order/payment-utils.js +225 -0
  19. package/dist/modules/Order/types.d.ts +35 -1
  20. package/dist/modules/Order/utils/orderCollectionIdentity.js +7 -2
  21. package/dist/modules/Order/utils.js +10 -6
  22. package/dist/modules/Payment/index.d.ts +2 -0
  23. package/dist/modules/Payment/index.js +78 -49
  24. package/dist/modules/Payment/types.d.ts +104 -25
  25. package/dist/modules/Payment/types.js +17 -0
  26. package/dist/modules/Payment/walletpass.d.ts +38 -1
  27. package/dist/modules/Payment/walletpass.js +917 -114
  28. package/dist/modules/Rules/index.d.ts +3 -0
  29. package/dist/modules/Rules/index.js +100 -70
  30. package/dist/server/index.d.ts +25 -0
  31. package/dist/server/index.js +1993 -1061
  32. package/dist/server/modules/index.d.ts +1 -1
  33. package/dist/server/modules/order/index.d.ts +70 -4
  34. package/dist/server/modules/order/index.js +1816 -728
  35. package/dist/server/modules/order/types.d.ts +25 -3
  36. package/dist/server/modules/order/types.js +7 -1
  37. package/dist/solution/BaseSales/index.d.ts +104 -5
  38. package/dist/solution/BaseSales/index.js +1767 -436
  39. package/dist/solution/BaseSales/types.d.ts +55 -1
  40. package/dist/solution/BaseSales/types.js +2 -1
  41. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
  42. package/dist/solution/BaseSales/utils/cartPromotion.js +94 -32
  43. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +6 -1
  44. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +7 -4
  45. package/dist/solution/BookingByStep/index.d.ts +1 -1
  46. package/dist/solution/BookingTicket/index.d.ts +21 -5
  47. package/dist/solution/BookingTicket/index.js +139 -56
  48. package/dist/solution/BookingTicket/types.d.ts +1 -0
  49. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +8 -0
  50. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +173 -83
  51. package/dist/solution/Sales/index.d.ts +2 -0
  52. package/dist/solution/Sales/index.js +26 -4
  53. package/dist/solution/ScanOrder/index.js +31 -20
  54. package/dist/solution/VenueBooking/index.d.ts +1 -0
  55. package/dist/solution/VenueBooking/index.js +30 -19
  56. package/dist/types/index.d.ts +1 -0
  57. package/dist/utils/payment-number.d.ts +9 -0
  58. package/dist/utils/payment-number.js +69 -0
  59. package/lib/core/index.d.ts +2 -0
  60. package/lib/core/index.js +4 -0
  61. package/lib/model/strategy/adapter/promotion/adapter.d.ts +4 -0
  62. package/lib/model/strategy/adapter/promotion/adapter.js +20 -0
  63. package/lib/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
  64. package/lib/model/strategy/adapter/promotion/evaluator.js +235 -0
  65. package/lib/model/strategy/adapter/promotion/examples.d.ts +86 -0
  66. package/lib/model/strategy/adapter/promotion/examples.js +91 -0
  67. package/lib/model/strategy/adapter/promotion/index.d.ts +1 -1
  68. package/lib/model/strategy/adapter/promotion/index.js +2 -0
  69. package/lib/model/strategy/adapter/promotion/type.d.ts +90 -2
  70. package/lib/model/strategy/adapter/promotion/type.js +2 -0
  71. package/lib/modules/OpenData/index.d.ts +2 -0
  72. package/lib/modules/OpenData/index.js +5 -0
  73. package/lib/modules/Order/index.d.ts +28 -8
  74. package/lib/modules/Order/index.js +252 -84
  75. package/lib/modules/Order/payment-utils.d.ts +26 -0
  76. package/lib/modules/Order/payment-utils.js +224 -0
  77. package/lib/modules/Order/types.d.ts +35 -1
  78. package/lib/modules/Order/utils/orderCollectionIdentity.js +3 -0
  79. package/lib/modules/Order/utils.js +11 -4
  80. package/lib/modules/Payment/index.d.ts +2 -0
  81. package/lib/modules/Payment/index.js +33 -12
  82. package/lib/modules/Payment/types.d.ts +104 -25
  83. package/lib/modules/Payment/types.js +1 -0
  84. package/lib/modules/Payment/walletpass.d.ts +38 -1
  85. package/lib/modules/Payment/walletpass.js +730 -21
  86. package/lib/modules/Rules/index.d.ts +3 -0
  87. package/lib/modules/Rules/index.js +38 -9
  88. package/lib/server/index.d.ts +25 -0
  89. package/lib/server/index.js +726 -31
  90. package/lib/server/modules/index.d.ts +1 -1
  91. package/lib/server/modules/order/index.d.ts +70 -4
  92. package/lib/server/modules/order/index.js +818 -69
  93. package/lib/server/modules/order/types.d.ts +25 -3
  94. package/lib/server/modules/order/types.js +1 -0
  95. package/lib/solution/BaseSales/index.d.ts +104 -5
  96. package/lib/solution/BaseSales/index.js +858 -27
  97. package/lib/solution/BaseSales/types.d.ts +55 -1
  98. package/lib/solution/BaseSales/types.js +2 -1
  99. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
  100. package/lib/solution/BaseSales/utils/cartPromotion.js +66 -12
  101. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +6 -1
  102. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +4 -3
  103. package/lib/solution/BookingByStep/index.d.ts +1 -1
  104. package/lib/solution/BookingTicket/index.d.ts +21 -5
  105. package/lib/solution/BookingTicket/index.js +64 -13
  106. package/lib/solution/BookingTicket/types.d.ts +1 -0
  107. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +8 -0
  108. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +37 -5
  109. package/lib/solution/Sales/index.d.ts +2 -0
  110. package/lib/solution/Sales/index.js +20 -6
  111. package/lib/solution/ScanOrder/index.js +8 -0
  112. package/lib/solution/VenueBooking/index.d.ts +1 -0
  113. package/lib/solution/VenueBooking/index.js +8 -0
  114. package/lib/types/index.d.ts +1 -0
  115. package/lib/utils/payment-number.d.ts +9 -0
  116. package/lib/utils/payment-number.js +64 -0
  117. package/package.json +1 -1
@@ -35,6 +35,7 @@ import dayjs from 'dayjs';
35
35
  import { BaseModule } from "../../../modules/BaseModule";
36
36
  import { applyOrderCollectionUidRemaps, getOrderCollectionPersistentId, getOrderCollectionReferenceUid, getOrderCollectionUid, isSameOrderCollectionItem, mergeOrderCollectionItems, normalizeOrderCollections } from "../../../modules/Order/utils/orderCollectionIdentity";
37
37
  import { OrderHooks } from "./types";
38
+ import { getOrderPaymentIdentityKeys, isIdentifiedPendingOrderPayment, isPendingOrderPayment, mergeOrderPaymentListsByIdentity, mergeOrderPaymentRecord, resolveOrderPaymentIdentity } from "../../../modules/Order/payment-utils";
38
39
 
39
40
  /**
40
41
  * SQLite 存储名称
@@ -48,7 +49,7 @@ var ORDER_SQLITE_DEDUPE_MS = 15000;
48
49
  /** silentRefresh 最小间隔,避免 preload 后立即全量重拉 */
49
50
  var ORDER_SILENT_REFRESH_MIN_INTERVAL_MS = 30000;
50
51
  /** 视为「业务侧刚写入」的来源,pubsub 回声可跳过 SQLite */
51
- var ORDER_BUSINESS_WRITE_SOURCES = new Set(['upsertOrdersFromRemote', 'upsertPendingSyncOrders', 'overwriteExistingOrder', 'markOrderSyncedByExternalSaleNumber']);
52
+ var ORDER_BUSINESS_WRITE_SOURCES = new Set(['upsertOrdersFromRemote', 'upsertPendingSyncOrders', 'upsertLocalDraftOrders', 'overwriteExistingOrder', 'markOrderSyncedByExternalSaleNumber', 'updateLocalPayment']);
52
53
 
53
54
  /**
54
55
  * 合并热路径全表去重自检开关:默认关闭。
@@ -56,6 +57,7 @@ var ORDER_BUSINESS_WRITE_SOURCES = new Set(['upsertOrdersFromRemote', 'upsertPen
56
57
  * 仅用于排查增量身份索引是否遗漏了重复订单,不应在生产常开。
57
58
  */
58
59
  var ORDER_MERGE_SELF_CHECK = false;
60
+ var PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER = '__pisell_os_pending_payment_without_unique_number__';
59
61
  var ORDER_AUTHORITATIVE_COLLECTION_FIELDS = ['products', 'bookings', 'payments'];
60
62
  var ORDER_COLLECTION_KIND_BY_FIELD = {
61
63
  products: 'product',
@@ -133,16 +135,77 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
133
135
  return _emitOrdersChanged.apply(this, arguments);
134
136
  }
135
137
  return emitOrdersChanged;
138
+ }()
139
+ /**
140
+ * 广播远端商品成员增删。监听器异常必须与订单落库和原有订单广播隔离。
141
+ */
142
+ )
143
+ }, {
144
+ key: "emitRemoteProductMembershipChanges",
145
+ value: (function () {
146
+ var _emitRemoteProductMembershipChanges = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(changes) {
147
+ var _iterator, _step, payload;
148
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
149
+ while (1) switch (_context2.prev = _context2.next) {
150
+ case 0:
151
+ _iterator = _createForOfIteratorHelper(changes);
152
+ _context2.prev = 1;
153
+ _iterator.s();
154
+ case 3:
155
+ if ((_step = _iterator.n()).done) {
156
+ _context2.next = 15;
157
+ break;
158
+ }
159
+ payload = _step.value;
160
+ _context2.prev = 5;
161
+ _context2.next = 8;
162
+ return this.core.effects.emit(OrderHooks.onRemoteProductMembershipChanged, payload);
163
+ case 8:
164
+ _context2.next = 13;
165
+ break;
166
+ case 10:
167
+ _context2.prev = 10;
168
+ _context2.t0 = _context2["catch"](5);
169
+ this.logError('广播远端订单商品成员变更失败', {
170
+ order_id: payload.order_id,
171
+ source: payload.source,
172
+ added_product_count: payload.added_product_keys.length,
173
+ removed_product_count: payload.removed_product_keys.length,
174
+ error: _context2.t0 instanceof Error ? _context2.t0.message : String(_context2.t0)
175
+ });
176
+ case 13:
177
+ _context2.next = 3;
178
+ break;
179
+ case 15:
180
+ _context2.next = 20;
181
+ break;
182
+ case 17:
183
+ _context2.prev = 17;
184
+ _context2.t1 = _context2["catch"](1);
185
+ _iterator.e(_context2.t1);
186
+ case 20:
187
+ _context2.prev = 20;
188
+ _iterator.f();
189
+ return _context2.finish(20);
190
+ case 23:
191
+ case "end":
192
+ return _context2.stop();
193
+ }
194
+ }, _callee2, this, [[1, 17, 20, 23], [5, 10]]);
195
+ }));
196
+ function emitRemoteProductMembershipChanges(_x) {
197
+ return _emitRemoteProductMembershipChanges.apply(this, arguments);
198
+ }
199
+ return emitRemoteProductMembershipChanges;
136
200
  }())
137
201
  }, {
138
202
  key: "initialize",
139
203
  value: function () {
140
- var _initialize = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(core, options) {
141
- var _options$initialState,
142
- _this3 = this;
204
+ var _initialize = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(core, options) {
205
+ var _options$initialState;
143
206
  var appPlugin, app;
144
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
145
- while (1) switch (_context2.prev = _context2.next) {
207
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
208
+ while (1) switch (_context3.prev = _context3.next) {
146
209
  case 0:
147
210
  this.core = core;
148
211
  this.store = options === null || options === void 0 ? void 0 : options.store;
@@ -156,9 +219,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
156
219
  this.updateCreateStore();
157
220
  }
158
221
  if (Array.isArray(options === null || options === void 0 || (_options$initialState = options.initialState) === null || _options$initialState === void 0 ? void 0 : _options$initialState.list)) {
159
- this.store.list = options.initialState.list.map(function (order) {
160
- return _this3.normalizeOrderForMemoryList(order);
161
- });
222
+ this.store.list = this.normalizeOrdersForMemoryList(options.initialState.list, 'initialState');
162
223
  this.syncOrdersMap();
163
224
  this.emitOrdersChanged([], 'initialState');
164
225
  } else {
@@ -174,11 +235,11 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
174
235
  });
175
236
  case 10:
176
237
  case "end":
177
- return _context2.stop();
238
+ return _context3.stop();
178
239
  }
179
- }, _callee2, this);
240
+ }, _callee3, this);
180
241
  }));
181
- function initialize(_x, _x2) {
242
+ function initialize(_x2, _x3) {
182
243
  return _initialize.apply(this, arguments);
183
244
  }
184
245
  return initialize;
@@ -247,7 +308,31 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
247
308
  }, {
248
309
  key: "normalizeOrderCollectionsForIngress",
249
310
  value: function normalizeOrderCollectionsForIngress(order, source) {
250
- var result = normalizeOrderCollections(order);
311
+ var sourceOrder = cloneDeep(order);
312
+ var sourceOrderRecord = sourceOrder;
313
+ if (Array.isArray(sourceOrderRecord.payments)) {
314
+ sourceOrderRecord.payments = sourceOrderRecord.payments.map(function (payment) {
315
+ if (!isPendingOrderPayment(payment) || getOrderPaymentIdentityKeys(payment).some(function (key) {
316
+ return key.startsWith('unique_payment_number:');
317
+ })) {
318
+ return payment;
319
+ }
320
+ return _objectSpread(_objectSpread({}, payment), {}, _defineProperty({}, PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER, true));
321
+ });
322
+ }
323
+ var result = normalizeOrderCollections(sourceOrder);
324
+ var normalizedOrderRecord = result.order;
325
+ if (Array.isArray(normalizedOrderRecord.payments)) {
326
+ normalizedOrderRecord.payments = normalizedOrderRecord.payments.map(function (payment) {
327
+ if (!(payment !== null && payment !== void 0 && payment[PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER])) return payment;
328
+ var nextPayment = _objectSpread({}, payment);
329
+ var metadata = _objectSpread({}, nextPayment.metadata || {});
330
+ delete metadata.unique_payment_number;
331
+ delete nextPayment[PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER];
332
+ nextPayment.metadata = metadata;
333
+ return nextPayment;
334
+ });
335
+ }
251
336
  var kinds = ['product', 'booking', 'payment'];
252
337
  var hasChanges = kinds.some(function (kind) {
253
338
  var stats = result.stats[kind];
@@ -291,8 +376,14 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
291
376
  key: "mergeAuthoritativeOrderCollection",
292
377
  value: function mergeAuthoritativeOrderCollection(field, existing, incoming) {
293
378
  var uidRemaps = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
379
+ var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
294
380
  var kind = ORDER_COLLECTION_KIND_BY_FIELD[field];
295
381
  var existingItems = Array.isArray(existing) ? existing : [];
382
+ if (field === 'payments' && options.preserveIdentifiedPendingPayments) {
383
+ return mergeOrderPaymentListsByIdentity(existingItems, incoming, {
384
+ preserveUnmatchedExistingWhen: isIdentifiedPendingOrderPayment
385
+ });
386
+ }
296
387
  return incoming.map(function (incomingItem) {
297
388
  var existingItem = existingItems.find(function (item) {
298
389
  return isSameOrderCollectionItem(kind, item, incomingItem);
@@ -301,11 +392,11 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
301
392
  var mergedItem = mergeOrderCollectionItems(kind, existingItem, incomingItem);
302
393
  var mergedUid = getOrderCollectionUid(kind, mergedItem);
303
394
  if (mergedUid) {
304
- var _iterator = _createForOfIteratorHelper(new Set([getOrderCollectionReferenceUid(kind, existingItem), getOrderCollectionReferenceUid(kind, incomingItem)])),
305
- _step;
395
+ var _iterator2 = _createForOfIteratorHelper(new Set([getOrderCollectionReferenceUid(kind, existingItem), getOrderCollectionReferenceUid(kind, incomingItem)])),
396
+ _step2;
306
397
  try {
307
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
308
- var from = _step.value;
398
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
399
+ var from = _step2.value;
309
400
  if (!from || from === mergedUid) continue;
310
401
  uidRemaps.push({
311
402
  kind: kind,
@@ -315,9 +406,9 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
315
406
  });
316
407
  }
317
408
  } catch (err) {
318
- _iterator.e(err);
409
+ _iterator2.e(err);
319
410
  } finally {
320
- _iterator.f();
411
+ _iterator2.f();
321
412
  }
322
413
  }
323
414
  return mergedItem;
@@ -348,11 +439,11 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
348
439
  key: "recordRecentSqliteWrite",
349
440
  value: function recordRecentSqliteWrite(source, orders) {
350
441
  var now = Date.now();
351
- var _iterator2 = _createForOfIteratorHelper(orders),
352
- _step2;
442
+ var _iterator3 = _createForOfIteratorHelper(orders),
443
+ _step3;
353
444
  try {
354
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
355
- var order = _step2.value;
445
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
446
+ var order = _step3.value;
356
447
  var storageKey = this.getOrderStorageKey(order);
357
448
  if (!storageKey) continue;
358
449
  this.recentSqliteWriteByStorageKey.set(storageKey, {
@@ -361,9 +452,9 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
361
452
  });
362
453
  }
363
454
  } catch (err) {
364
- _iterator2.e(err);
455
+ _iterator3.e(err);
365
456
  } finally {
366
- _iterator2.f();
457
+ _iterator3.f();
367
458
  }
368
459
  }
369
460
 
@@ -376,6 +467,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
376
467
  }, {
377
468
  key: "filterRedundantPatchOrders",
378
469
  value: function filterRedundantPatchOrders(source, orders, mergeActions) {
470
+ var forceWriteStorageKeys = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Set();
379
471
  var eligibleSkipSources = new Set(['pubsub.bodyUpsert', 'pubsub.httpRefresh']);
380
472
  if (!eligibleSkipSources.has(source)) {
381
473
  return {
@@ -386,11 +478,11 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
386
478
  var now = Date.now();
387
479
  var toWrite = [];
388
480
  var skipped = [];
389
- var _iterator3 = _createForOfIteratorHelper(orders),
390
- _step3;
481
+ var _iterator4 = _createForOfIteratorHelper(orders),
482
+ _step4;
391
483
  try {
392
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
393
- var order = _step3.value;
484
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
485
+ var order = _step4.value;
394
486
  var storageKey = this.getOrderStorageKey(order);
395
487
  if (!storageKey) {
396
488
  toWrite.push(order);
@@ -404,6 +496,12 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
404
496
  toWrite.push(order);
405
497
  continue;
406
498
  }
499
+
500
+ // 远端商品成员确实发生增删时必须落库,避免内存已更新但 SQLite 仍被回声窗口跳过。
501
+ if (forceWriteStorageKeys.has(storageKey)) {
502
+ toWrite.push(order);
503
+ continue;
504
+ }
407
505
  var recent = this.recentSqliteWriteByStorageKey.get(storageKey);
408
506
  if (recent && ORDER_BUSINESS_WRITE_SOURCES.has(recent.source) && now - recent.ts < ORDER_SQLITE_DEDUPE_MS) {
409
507
  var _order$order_id2;
@@ -419,9 +517,9 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
419
517
  toWrite.push(order);
420
518
  }
421
519
  } catch (err) {
422
- _iterator3.e(err);
520
+ _iterator4.e(err);
423
521
  } finally {
424
- _iterator3.f();
522
+ _iterator4.f();
425
523
  }
426
524
  return {
427
525
  toWrite: toWrite,
@@ -441,11 +539,11 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
441
539
  var now = Date.now();
442
540
  var toFetch = [];
443
541
  var skipped = [];
444
- var _iterator4 = _createForOfIteratorHelper(ids),
445
- _step4;
542
+ var _iterator5 = _createForOfIteratorHelper(ids),
543
+ _step5;
446
544
  try {
447
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
448
- var id = _step4.value;
545
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
546
+ var id = _step5.value;
449
547
  var existing = this.getOrderByOrderId(id);
450
548
  if (!existing) {
451
549
  toFetch.push(id);
@@ -464,9 +562,9 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
464
562
  toFetch.push(id);
465
563
  }
466
564
  } catch (err) {
467
- _iterator4.e(err);
565
+ _iterator5.e(err);
468
566
  } finally {
469
- _iterator4.f();
567
+ _iterator5.f();
470
568
  }
471
569
  return {
472
570
  toFetch: toFetch,
@@ -602,61 +700,26 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
602
700
  key: "preload",
603
701
  value: function () {
604
702
  var _preload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
605
- var _this4 = this;
606
- var getData;
703
+ var orders;
607
704
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
608
705
  while (1) switch (_context4.prev = _context4.next) {
609
706
  case 0:
610
- // const hasPulledInCurrentWindow = this.hasPulledOrdersToday()
611
- // // 仅当缓存属于当前统计窗口时才直接复用,避免跨天/跨营业日窗口继续使用旧数据
612
- // if (cachedOrders.length > 0 && hasPulledInCurrentWindow) {
613
- // this.store.list = cloneDeep(cachedOrders)
614
- // this.syncOrdersMap()
615
- // this.core.effects.emit(OrderHooks.onOrdersChanged, this.store.list)
616
- // return
617
- // }
618
- // if (hasPulledInCurrentWindow) {
619
- // this.logInfo('当天已完成全量订单拉取,跳过本次全量拉取', {
620
- // lastFullFetchAt: this.getStorageItem(ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY),
621
- // })
622
- // return
623
- // }
624
- getData = /*#__PURE__*/function () {
625
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
626
- var orders;
627
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
628
- while (1) switch (_context3.prev = _context3.next) {
629
- case 0:
630
- _context3.next = 2;
631
- return _this4.loadOrdersByServer();
632
- case 2:
633
- orders = _context3.sent;
634
- if (!(orders.length === 0)) {
635
- _context3.next = 5;
636
- break;
637
- }
638
- return _context3.abrupt("return");
639
- case 5:
640
- _this4.store.list = cloneDeep(orders);
641
- _this4.syncOrdersMap();
642
- _this4.emitOrdersChanged([], 'preload');
643
- _this4.core.effects.emit(OrderHooks.onOrdersSyncCompleted, null);
644
- case 9:
645
- case "end":
646
- return _context3.stop();
647
- }
648
- }, _callee3);
649
- }));
650
- return function getData() {
651
- return _ref.apply(this, arguments);
652
- };
653
- }();
654
- getData();
707
+ _context4.next = 2;
708
+ return this.loadOrdersByServer();
655
709
  case 2:
710
+ orders = _context4.sent;
711
+ this.store.list = cloneDeep(orders);
712
+ this.syncOrdersMap();
713
+ _context4.next = 7;
714
+ return this.emitOrdersChanged([], 'preload');
715
+ case 7:
716
+ _context4.next = 9;
717
+ return this.core.effects.emit(OrderHooks.onOrdersSyncCompleted, null);
718
+ case 9:
656
719
  case "end":
657
720
  return _context4.stop();
658
721
  }
659
- }, _callee4);
722
+ }, _callee4, this);
660
723
  }));
661
724
  function preload() {
662
725
  return _preload.apply(this, arguments);
@@ -680,15 +743,38 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
680
743
  value: function getOrderByOrderId(orderId) {
681
744
  return this.store.map.get(this.getIdKey(orderId));
682
745
  }
746
+ }, {
747
+ key: "buildLocalPaymentOrderLogContext",
748
+ value: function buildLocalPaymentOrderLogContext(order) {
749
+ var _order$order_id3, _order$external_sale_, _order$order_number, _order$shop_order_num, _order$shop_full_orde, _order$status, _order$payment_status, _order$platform, _order$business_code, _order$order_sales_ch, _order$sales_channel, _order$type;
750
+ if (!order) return {};
751
+ return {
752
+ order_id: (_order$order_id3 = order.order_id) !== null && _order$order_id3 !== void 0 ? _order$order_id3 : null,
753
+ external_sale_number: (_order$external_sale_ = order.external_sale_number) !== null && _order$external_sale_ !== void 0 ? _order$external_sale_ : null,
754
+ order_number: (_order$order_number = order.order_number) !== null && _order$order_number !== void 0 ? _order$order_number : null,
755
+ shop_order_number: (_order$shop_order_num = order.shop_order_number) !== null && _order$shop_order_num !== void 0 ? _order$shop_order_num : null,
756
+ shop_full_order_number: (_order$shop_full_orde = order.shop_full_order_number) !== null && _order$shop_full_orde !== void 0 ? _order$shop_full_orde : null,
757
+ order_status: (_order$status = order.status) !== null && _order$status !== void 0 ? _order$status : null,
758
+ payment_status: (_order$payment_status = order.payment_status) !== null && _order$payment_status !== void 0 ? _order$payment_status : null,
759
+ is_draft_order: Number(order.is_draft_order || 0),
760
+ need_sync: Number(order.need_sync || 0),
761
+ platform: (_order$platform = order.platform) !== null && _order$platform !== void 0 ? _order$platform : null,
762
+ business_code: (_order$business_code = order.business_code) !== null && _order$business_code !== void 0 ? _order$business_code : null,
763
+ order_sales_channel: (_order$order_sales_ch = order.order_sales_channel) !== null && _order$order_sales_ch !== void 0 ? _order$order_sales_ch : null,
764
+ sales_channel: (_order$sales_channel = order.sales_channel) !== null && _order$sales_channel !== void 0 ? _order$sales_channel : null,
765
+ order_type: (_order$type = order.type) !== null && _order$type !== void 0 ? _order$type : null,
766
+ payments_count: Array.isArray(order.payments) ? order.payments.length : 0
767
+ };
768
+ }
683
769
  }, {
684
770
  key: "getLocalOrderFromMemoryByLookup",
685
771
  value: function getLocalOrderFromMemoryByLookup(lookup) {
686
- var _this5 = this;
772
+ var _this3 = this;
687
773
  var key = this.getIdKey(lookup);
688
774
  var memoryOrderById = this.store.map.get(key);
689
775
  if (memoryOrderById) return memoryOrderById;
690
776
  var memoryOrder = this.store.list.find(function (order) {
691
- return _this5.isOrderLookupMatch(order, key);
777
+ return _this3.isOrderLookupMatch(order, key);
692
778
  });
693
779
  return memoryOrder || null;
694
780
  }
@@ -696,118 +782,341 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
696
782
  key: "getLocalOrderByLookup",
697
783
  value: function () {
698
784
  var _getLocalOrderByLookup = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(lookup) {
699
- var _this6 = this;
700
- var key, memoryOrderById, memoryOrder, orders, localOrder;
785
+ var _this4 = this;
786
+ var options,
787
+ key,
788
+ logContext,
789
+ memoryOrderById,
790
+ memoryOrder,
791
+ orders,
792
+ localOrder,
793
+ normalizedOrder,
794
+ _args5 = arguments;
701
795
  return _regeneratorRuntime().wrap(function _callee5$(_context5) {
702
796
  while (1) switch (_context5.prev = _context5.next) {
703
797
  case 0:
798
+ options = _args5.length > 1 && _args5[1] !== undefined ? _args5[1] : {};
704
799
  key = this.getIdKey(lookup);
800
+ logContext = {
801
+ operation_id: options.operationId,
802
+ lookup: key,
803
+ memory_order_count: this.store.list.length
804
+ };
805
+ if (options.operationId) {
806
+ this.logInfo('getLocalOrderByLookup-localPayment-开始', logContext);
807
+ }
705
808
  memoryOrderById = this.store.map.get(key);
706
809
  if (!memoryOrderById) {
707
- _context5.next = 4;
810
+ _context5.next = 8;
708
811
  break;
709
812
  }
813
+ if (options.operationId) {
814
+ this.logInfo('getLocalOrderByLookup-localPayment-命中内存映射', _objectSpread(_objectSpread({}, logContext), this.buildLocalPaymentOrderLogContext(memoryOrderById)));
815
+ }
710
816
  return _context5.abrupt("return", memoryOrderById);
711
- case 4:
817
+ case 8:
712
818
  memoryOrder = this.store.list.find(function (order) {
713
- return _this6.isOrderLookupMatch(order, key);
819
+ return _this4.isOrderLookupMatch(order, key);
714
820
  });
715
821
  if (!memoryOrder) {
716
- _context5.next = 7;
822
+ _context5.next = 12;
717
823
  break;
718
824
  }
825
+ if (options.operationId) {
826
+ this.logInfo('getLocalOrderByLookup-localPayment-命中内存列表', _objectSpread(_objectSpread({}, logContext), this.buildLocalPaymentOrderLogContext(memoryOrder)));
827
+ }
719
828
  return _context5.abrupt("return", memoryOrder);
720
- case 7:
721
- _context5.next = 9;
829
+ case 12:
830
+ if (options.operationId) {
831
+ this.logInfo('getLocalOrderByLookup-localPayment-开始读取SQLite', logContext);
832
+ }
833
+ _context5.next = 15;
722
834
  return this.loadOrdersFromSQLite();
723
- case 9:
835
+ case 15:
724
836
  orders = _context5.sent;
725
837
  localOrder = orders.find(function (order) {
726
- return _this6.isOrderLookupMatch(order, key);
838
+ return _this4.isOrderLookupMatch(order, key);
727
839
  });
728
840
  if (localOrder) {
729
- _context5.next = 13;
841
+ _context5.next = 20;
730
842
  break;
731
843
  }
844
+ if (options.operationId) {
845
+ this.logWarning('getLocalOrderByLookup-localPayment-SQLite未命中', _objectSpread(_objectSpread({}, logContext), {}, {
846
+ sqlite_order_count: orders.length
847
+ }));
848
+ }
732
849
  return _context5.abrupt("return", null);
733
- case 13:
734
- this.store.list = orders.map(function (order) {
735
- return _this6.normalizeOrderForMemoryList(order);
736
- });
850
+ case 20:
851
+ this.store.list = this.normalizeOrdersForMemoryList(orders, 'getLocalOrderByLookup.sqliteMemory');
737
852
  this.syncOrdersMap();
738
- return _context5.abrupt("return", this.normalizeOrderForMemoryList(localOrder));
739
- case 16:
853
+ normalizedOrder = this.normalizeOrderForMemoryList(localOrder);
854
+ if (options.operationId) {
855
+ this.logInfo('getLocalOrderByLookup-localPayment-SQLite命中', _objectSpread(_objectSpread({}, logContext), {}, {
856
+ sqlite_order_count: orders.length
857
+ }, this.buildLocalPaymentOrderLogContext(normalizedOrder)));
858
+ }
859
+ return _context5.abrupt("return", normalizedOrder);
860
+ case 25:
740
861
  case "end":
741
862
  return _context5.stop();
742
863
  }
743
864
  }, _callee5, this);
744
865
  }));
745
- function getLocalOrderByLookup(_x3) {
866
+ function getLocalOrderByLookup(_x4) {
746
867
  return _getLocalOrderByLookup.apply(this, arguments);
747
868
  }
748
869
  return getLocalOrderByLookup;
749
870
  }()
750
871
  }, {
751
- key: "loadOrdersByServer",
872
+ key: "getLocalPayment",
752
873
  value: function () {
753
- var _loadOrdersByServer = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
754
- var _this$store,
755
- _this7 = this;
756
- var orderList, data, mergedOrders, memoryOrders;
874
+ var _getLocalPayment = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(params) {
875
+ var logContext, order, payments, match;
757
876
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
758
877
  while (1) switch (_context6.prev = _context6.next) {
878
+ case 0:
879
+ logContext = {
880
+ operation_id: params.operationId,
881
+ sale_id: params.saleId,
882
+ payment_number: params.paymentNumber
883
+ };
884
+ this.logInfo('getLocalPayment-开始', logContext);
885
+ _context6.prev = 2;
886
+ _context6.next = 5;
887
+ return this.getLocalOrderByLookup(params.saleId, {
888
+ operationId: params.operationId
889
+ });
890
+ case 5:
891
+ order = _context6.sent;
892
+ if (order) {
893
+ _context6.next = 9;
894
+ break;
895
+ }
896
+ this.logWarning('getLocalPayment-订单未命中', logContext);
897
+ return _context6.abrupt("return", null);
898
+ case 9:
899
+ payments = order.payments || [];
900
+ match = resolveOrderPaymentIdentity(payments, params.paymentNumber, 'compat');
901
+ if (match) {
902
+ _context6.next = 14;
903
+ break;
904
+ }
905
+ this.logWarning('getLocalPayment-支付项未命中', _objectSpread(_objectSpread(_objectSpread({}, logContext), this.buildLocalPaymentOrderLogContext(order)), {}, {
906
+ payments: payments
907
+ }));
908
+ return _context6.abrupt("return", null);
909
+ case 14:
910
+ this.logInfo('getLocalPayment-支付项命中', _objectSpread(_objectSpread(_objectSpread({}, logContext), this.buildLocalPaymentOrderLogContext(order)), {}, {
911
+ matched_by: match.matchedBy,
912
+ payment_index: match.index,
913
+ payment: match.payment
914
+ }));
915
+ return _context6.abrupt("return", {
916
+ order: order,
917
+ payment: match.payment,
918
+ paymentIndex: match.index,
919
+ matchedBy: match.matchedBy
920
+ });
921
+ case 18:
922
+ _context6.prev = 18;
923
+ _context6.t0 = _context6["catch"](2);
924
+ this.logError('getLocalPayment-查询失败', _objectSpread(_objectSpread({}, logContext), {}, {
925
+ error: _context6.t0 instanceof Error ? _context6.t0.message : String(_context6.t0)
926
+ }));
927
+ throw _context6.t0;
928
+ case 22:
929
+ case "end":
930
+ return _context6.stop();
931
+ }
932
+ }, _callee6, this, [[2, 18]]);
933
+ }));
934
+ function getLocalPayment(_x5) {
935
+ return _getLocalPayment.apply(this, arguments);
936
+ }
937
+ return getLocalPayment;
938
+ }()
939
+ }, {
940
+ key: "updateLocalPayment",
941
+ value: function () {
942
+ var _updateLocalPayment = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(params) {
943
+ var logContext, found, previousPayment, nextPayment, nextOrder, paymentContext, targetIndex, shouldKeepInMemory, previousList, storageOrder, _storageOrder$order_i, _storageOrder$order_i2, _storageOrder$order_i3;
944
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
945
+ while (1) switch (_context7.prev = _context7.next) {
946
+ case 0:
947
+ logContext = {
948
+ operation_id: params.operationId,
949
+ sale_id: params.saleId,
950
+ payment_number: params.paymentNumber,
951
+ incoming_payment_update: params.updates
952
+ };
953
+ this.logInfo('updateLocalPayment-开始', logContext);
954
+ _context7.next = 4;
955
+ return this.getLocalPayment(params);
956
+ case 4:
957
+ found = _context7.sent;
958
+ if (found) {
959
+ _context7.next = 8;
960
+ break;
961
+ }
962
+ this.logWarning('updateLocalPayment-支付项未命中', logContext);
963
+ return _context7.abrupt("return", null);
964
+ case 8:
965
+ previousPayment = cloneDeep(found.payment);
966
+ nextPayment = mergeOrderPaymentRecord(found.payment, _objectSpread(_objectSpread({}, params.updates), {}, {
967
+ updated_at: params.updates.updated_at || dayjs().format('YYYY-MM-DD HH:mm:ss')
968
+ }));
969
+ nextOrder = _objectSpread(_objectSpread({}, found.order), {}, {
970
+ payments: (found.order.payments || []).map(function (payment, index) {
971
+ return index === found.paymentIndex ? nextPayment : payment;
972
+ }),
973
+ updated_at: dayjs().format('YYYY-MM-DD HH:mm:ss')
974
+ });
975
+ paymentContext = _objectSpread(_objectSpread(_objectSpread({}, logContext), {}, {
976
+ matched_by: found.matchedBy,
977
+ payment_index: found.paymentIndex
978
+ }, this.buildLocalPaymentOrderLogContext(nextOrder)), {}, {
979
+ previous_payment: previousPayment,
980
+ payment: nextPayment
981
+ });
982
+ this.logInfo('updateLocalPayment-支付项合并完成', paymentContext);
983
+ targetIndex = this.findOrderIndexByIdentity(this.store.list, found.order);
984
+ shouldKeepInMemory = this.shouldKeepOrderInMemory(nextOrder);
985
+ if (!(targetIndex < 0 && shouldKeepInMemory)) {
986
+ _context7.next = 18;
987
+ break;
988
+ }
989
+ this.logError('updateLocalPayment-订单Store索引未命中', paymentContext);
990
+ return _context7.abrupt("return", null);
991
+ case 18:
992
+ previousList = this.store.list;
993
+ this.store.list = shouldKeepInMemory ? this.store.list.map(function (order, index) {
994
+ return index === targetIndex ? nextOrder : order;
995
+ }) : this.store.list.filter(function (_, index) {
996
+ return index !== targetIndex;
997
+ });
998
+ this.syncOrdersMap();
999
+ storageOrder = this.withoutSyntheticDraftOrderId(nextOrder);
1000
+ _context7.prev = 22;
1001
+ this.logInfo('updateLocalPayment-SQLite写入开始', _objectSpread(_objectSpread({}, paymentContext), {}, {
1002
+ storage_order_id: (_storageOrder$order_i = storageOrder.order_id) !== null && _storageOrder$order_i !== void 0 ? _storageOrder$order_i : null
1003
+ }));
1004
+ _context7.next = 26;
1005
+ return this.updateOrderInSQLite(storageOrder, 'updateLocalPayment', {
1006
+ throwOnError: true
1007
+ });
1008
+ case 26:
1009
+ this.logInfo('updateLocalPayment-SQLite写入完成', _objectSpread(_objectSpread({}, paymentContext), {}, {
1010
+ storage_order_id: (_storageOrder$order_i2 = storageOrder.order_id) !== null && _storageOrder$order_i2 !== void 0 ? _storageOrder$order_i2 : null
1011
+ }));
1012
+ _context7.next = 35;
1013
+ break;
1014
+ case 29:
1015
+ _context7.prev = 29;
1016
+ _context7.t0 = _context7["catch"](22);
1017
+ this.store.list = previousList;
1018
+ this.syncOrdersMap();
1019
+ this.logError('updateLocalPayment-SQLite写入失败并回滚内存', _objectSpread(_objectSpread({}, paymentContext), {}, {
1020
+ storage_order_id: (_storageOrder$order_i3 = storageOrder.order_id) !== null && _storageOrder$order_i3 !== void 0 ? _storageOrder$order_i3 : null,
1021
+ error: _context7.t0 instanceof Error ? _context7.t0.message : String(_context7.t0)
1022
+ }));
1023
+ throw _context7.t0;
1024
+ case 35:
1025
+ if (!(shouldKeepInMemory || targetIndex >= 0)) {
1026
+ _context7.next = 38;
1027
+ break;
1028
+ }
1029
+ _context7.next = 38;
1030
+ return this.emitOrdersChanged(shouldKeepInMemory ? [nextOrder] : [], shouldKeepInMemory ? 'updateLocalPayment' : 'updateLocalPayment.sqliteOnlyDraft');
1031
+ case 38:
1032
+ this.logInfo('updateLocalPayment-变更事件完成', paymentContext);
1033
+ return _context7.abrupt("return", {
1034
+ order: nextOrder,
1035
+ payment: nextPayment,
1036
+ previousPayment: previousPayment
1037
+ });
1038
+ case 40:
1039
+ case "end":
1040
+ return _context7.stop();
1041
+ }
1042
+ }, _callee7, this, [[22, 29]]);
1043
+ }));
1044
+ function updateLocalPayment(_x6) {
1045
+ return _updateLocalPayment.apply(this, arguments);
1046
+ }
1047
+ return updateLocalPayment;
1048
+ }()
1049
+ }, {
1050
+ key: "loadOrdersByServer",
1051
+ value: function () {
1052
+ var _loadOrdersByServer = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
1053
+ var _this5 = this,
1054
+ _this$store;
1055
+ var orderList, protectedOrdersBeforeRemoteFetch, data, mergedOrders, memoryOrders;
1056
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
1057
+ while (1) switch (_context8.prev = _context8.next) {
759
1058
  case 0:
760
1059
  orderList = [];
1060
+ _context8.next = 3;
1061
+ return this.loadOrdersFromSQLite();
1062
+ case 3:
1063
+ protectedOrdersBeforeRemoteFetch = _context8.sent.filter(function (order) {
1064
+ return _this5.shouldProtectLocalOrderFromRemoteSnapshot(order);
1065
+ });
761
1066
  this.logInfo('loadOrdersByServer-开始', {
762
1067
  hasOrderDataSource: !!this.orderDataSource,
763
- query: ((_this$store = this.store) === null || _this$store === void 0 ? void 0 : _this$store.createdAtQuery) || null
1068
+ query: ((_this$store = this.store) === null || _this$store === void 0 ? void 0 : _this$store.createdAtQuery) || null,
1069
+ protectedLocalOrderCount: protectedOrdersBeforeRemoteFetch.length,
1070
+ protectedPendingPaymentCount: protectedOrdersBeforeRemoteFetch.reduce(function (count, order) {
1071
+ return count + _this5.getIdentifiedPendingPayments(order).length;
1072
+ }, 0)
764
1073
  });
765
1074
  if (!this.orderDataSource) {
766
- _context6.next = 17;
1075
+ _context8.next = 20;
767
1076
  break;
768
1077
  }
769
- _context6.prev = 3;
770
- _context6.next = 6;
1078
+ _context8.prev = 6;
1079
+ _context8.next = 9;
771
1080
  return this.orderDataSource.run({
772
1081
  sse: {
773
1082
  query: this.store.createdAtQuery
774
1083
  }
775
1084
  });
776
- case 6:
777
- data = _context6.sent;
1085
+ case 9:
1086
+ data = _context8.sent;
778
1087
  orderList = data || [];
779
1088
  this.logInfo('loadOrdersByServer-SSE拉取成功', {
780
1089
  count: orderList.length
781
1090
  });
782
1091
  this.markOrderPulledAtNow();
783
1092
  this.lastServerFullFetchAtMs = Date.now();
784
- _context6.next = 17;
1093
+ _context8.next = 20;
785
1094
  break;
786
- case 13:
787
- _context6.prev = 13;
788
- _context6.t0 = _context6["catch"](3);
1095
+ case 16:
1096
+ _context8.prev = 16;
1097
+ _context8.t0 = _context8["catch"](6);
789
1098
  this.logInfo('loadOrdersByServer-SSE拉取失败,保持当前内存订单');
790
- return _context6.abrupt("return", this.store.list);
791
- case 17:
792
- _context6.next = 19;
793
- return this.replaceOrdersSnapshotInSQLite(orderList, 'loadOrdersByServer');
794
- case 19:
795
- mergedOrders = _context6.sent;
796
- memoryOrders = mergedOrders.map(function (order) {
797
- return _this7.normalizeOrderForMemoryList(order);
798
- });
1099
+ return _context8.abrupt("return", this.store.list);
1100
+ case 20:
1101
+ _context8.next = 22;
1102
+ return this.replaceOrdersSnapshotInSQLite(orderList, 'loadOrdersByServer', protectedOrdersBeforeRemoteFetch);
1103
+ case 22:
1104
+ mergedOrders = _context8.sent;
1105
+ memoryOrders = this.normalizeOrdersForMemoryList(mergedOrders, 'loadOrdersByServer.memory');
799
1106
  this.logInfo('loadOrdersByServer-结束', {
800
- count: memoryOrders.length
1107
+ count: memoryOrders.length,
1108
+ persistedCount: mergedOrders.length,
1109
+ sqliteOnlyDraftCount: mergedOrders.length - memoryOrders.length
801
1110
  });
802
- _context6.next = 24;
1111
+ _context8.next = 27;
803
1112
  return this.core.effects.emit(OrderHooks.onOrdersLoaded, memoryOrders);
804
- case 24:
805
- return _context6.abrupt("return", memoryOrders);
806
- case 25:
1113
+ case 27:
1114
+ return _context8.abrupt("return", memoryOrders);
1115
+ case 28:
807
1116
  case "end":
808
- return _context6.stop();
1117
+ return _context8.stop();
809
1118
  }
810
- }, _callee6, this, [[3, 13]]);
1119
+ }, _callee8, this, [[6, 16]]);
811
1120
  }));
812
1121
  function loadOrdersByServer() {
813
1122
  return _loadOrdersByServer.apply(this, arguments);
@@ -822,61 +1131,54 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
822
1131
  }, {
823
1132
  key: "silentRefresh",
824
1133
  value: (function () {
825
- var _silentRefresh = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
1134
+ var _silentRefresh = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
826
1135
  var startTime, elapsedSinceFullFetch, orders, errorMessage;
827
- return _regeneratorRuntime().wrap(function _callee7$(_context7) {
828
- while (1) switch (_context7.prev = _context7.next) {
1136
+ return _regeneratorRuntime().wrap(function _callee9$(_context9) {
1137
+ while (1) switch (_context9.prev = _context9.next) {
829
1138
  case 0:
830
1139
  startTime = Date.now();
831
1140
  elapsedSinceFullFetch = Date.now() - this.lastServerFullFetchAtMs;
832
1141
  if (!(this.lastServerFullFetchAtMs > 0 && elapsedSinceFullFetch < ORDER_SILENT_REFRESH_MIN_INTERVAL_MS)) {
833
- _context7.next = 4;
1142
+ _context9.next = 4;
834
1143
  break;
835
1144
  }
836
- return _context7.abrupt("return", this.store.list);
1145
+ return _context9.abrupt("return", this.store.list);
837
1146
  case 4:
838
1147
  this.logInfo('silentRefresh 开始');
839
- _context7.prev = 5;
1148
+ _context9.prev = 5;
840
1149
  // 刷新前,需要更新当前营业日边界(store.createdAtQuery)
841
1150
  this.updateCreateStore();
842
- _context7.next = 9;
1151
+ _context9.next = 9;
843
1152
  return this.loadOrdersByServer();
844
1153
  case 9:
845
- orders = _context7.sent;
846
- if (!(orders.length > 0)) {
847
- _context7.next = 19;
848
- break;
849
- }
1154
+ orders = _context9.sent;
850
1155
  this.store.list = cloneDeep(orders);
851
1156
  this.syncOrdersMap();
852
- this.emitOrdersChanged([], 'silentRefresh');
853
- _context7.next = 16;
1157
+ _context9.next = 14;
1158
+ return this.emitOrdersChanged([], 'silentRefresh');
1159
+ case 14:
1160
+ _context9.next = 16;
854
1161
  return this.core.effects.emit(OrderHooks.onOrdersSyncCompleted, null);
855
1162
  case 16:
856
1163
  this.logInfo('silentRefresh 完成', {
857
1164
  orderCount: orders.length,
858
1165
  duration: "".concat(Date.now() - startTime, "ms")
859
1166
  });
860
- _context7.next = 20;
861
- break;
862
- case 19:
863
- this.logInfo('silentRefresh: 服务器未返回数据');
1167
+ return _context9.abrupt("return", this.store.list);
864
1168
  case 20:
865
- return _context7.abrupt("return", this.store.list);
866
- case 23:
867
- _context7.prev = 23;
868
- _context7.t0 = _context7["catch"](5);
869
- errorMessage = _context7.t0 instanceof Error ? _context7.t0.message : String(_context7.t0);
1169
+ _context9.prev = 20;
1170
+ _context9.t0 = _context9["catch"](5);
1171
+ errorMessage = _context9.t0 instanceof Error ? _context9.t0.message : String(_context9.t0);
870
1172
  this.logError('silentRefresh 失败', {
871
1173
  duration: "".concat(Date.now() - startTime, "ms"),
872
1174
  error: errorMessage
873
1175
  });
874
- return _context7.abrupt("return", this.store.list);
875
- case 28:
1176
+ return _context9.abrupt("return", this.store.list);
1177
+ case 25:
876
1178
  case "end":
877
- return _context7.stop();
1179
+ return _context9.stop();
878
1180
  }
879
- }, _callee7, this, [[5, 23]]);
1181
+ }, _callee9, this, [[5, 20]]);
880
1182
  }));
881
1183
  function silentRefresh() {
882
1184
  return _silentRefresh.apply(this, arguments);
@@ -889,6 +1191,9 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
889
1191
  var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'normalizeOrderForMemoryList';
890
1192
  var normalizedOrder = this.normalizeOrderCollectionsForIngress(order, source);
891
1193
  var externalSaleNumber = normalizedOrder === null || normalizedOrder === void 0 ? void 0 : normalizedOrder.external_sale_number;
1194
+ if (this.isDraftOrder(normalizedOrder) && !this.hasRealOrderId(normalizedOrder)) {
1195
+ return normalizedOrder;
1196
+ }
892
1197
  if ((normalizedOrder === null || normalizedOrder === void 0 ? void 0 : normalizedOrder.order_id) !== undefined && (normalizedOrder === null || normalizedOrder === void 0 ? void 0 : normalizedOrder.order_id) !== null && (normalizedOrder === null || normalizedOrder === void 0 ? void 0 : normalizedOrder.order_id) !== '') {
893
1198
  return normalizedOrder;
894
1199
  }
@@ -899,6 +1204,39 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
899
1204
  order_id: externalSaleNumber
900
1205
  });
901
1206
  }
1207
+ }, {
1208
+ key: "normalizeOrdersForMemoryList",
1209
+ value: function normalizeOrdersForMemoryList(orders, source) {
1210
+ var _this6 = this;
1211
+ return orders.map(function (order) {
1212
+ return _this6.normalizeOrderForMemoryList(order, source);
1213
+ }).filter(function (order) {
1214
+ return _this6.shouldKeepOrderInMemory(order);
1215
+ });
1216
+ }
1217
+ }, {
1218
+ key: "hasRealOrderId",
1219
+ value: function hasRealOrderId(order) {
1220
+ if (!order || this.isBlankIdentityValue(order.order_id)) return false;
1221
+ var externalSaleNumber = order.external_sale_number;
1222
+ return !(this.isDraftOrder(order) && !this.isBlankIdentityValue(externalSaleNumber) && String(order.order_id) === String(externalSaleNumber));
1223
+ }
1224
+ }, {
1225
+ key: "shouldKeepOrderInMemory",
1226
+ value: function shouldKeepOrderInMemory(order) {
1227
+ return !this.isDraftOrder(order) || this.hasRealOrderId(order);
1228
+ }
1229
+ }, {
1230
+ key: "withoutSyntheticDraftOrderId",
1231
+ value: function withoutSyntheticDraftOrderId(order) {
1232
+ var externalSaleNumber = order.external_sale_number;
1233
+ if (Number(order.is_draft_order || 0) !== 1 || order.order_id === undefined || externalSaleNumber === undefined || String(order.order_id) !== String(externalSaleNumber)) {
1234
+ return order;
1235
+ }
1236
+ var next = _objectSpread({}, order);
1237
+ delete next.order_id;
1238
+ return next;
1239
+ }
902
1240
 
903
1241
  /**
904
1242
  * 仅覆盖本地已存在的订单;不存在则直接跳过,不落库、不 emit。
@@ -907,31 +1245,31 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
907
1245
  }, {
908
1246
  key: "overwriteExistingOrder",
909
1247
  value: (function () {
910
- var _overwriteExistingOrder = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(fresh) {
911
- var _this8 = this;
1248
+ var _overwriteExistingOrder = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10(fresh) {
1249
+ var _this7 = this;
912
1250
  var orderId, key, normalizedFresh, existingOrder, reconciledFresh;
913
- return _regeneratorRuntime().wrap(function _callee8$(_context8) {
914
- while (1) switch (_context8.prev = _context8.next) {
1251
+ return _regeneratorRuntime().wrap(function _callee10$(_context10) {
1252
+ while (1) switch (_context10.prev = _context10.next) {
915
1253
  case 0:
916
1254
  orderId = fresh === null || fresh === void 0 ? void 0 : fresh.order_id;
917
1255
  if (!(orderId === undefined || orderId === null)) {
918
- _context8.next = 4;
1256
+ _context10.next = 4;
919
1257
  break;
920
1258
  }
921
1259
  this.logError('overwriteExistingOrder-入参缺少 order_id');
922
- return _context8.abrupt("return", {
1260
+ return _context10.abrupt("return", {
923
1261
  overwritten: false
924
1262
  });
925
1263
  case 4:
926
1264
  key = this.getIdKey(orderId);
927
1265
  if (this.store.map.has(key)) {
928
- _context8.next = 8;
1266
+ _context10.next = 8;
929
1267
  break;
930
1268
  }
931
1269
  this.logInfo('overwriteExistingOrder-本地不存在该订单,跳过', {
932
1270
  orderId: orderId
933
1271
  });
934
- return _context8.abrupt("return", {
1272
+ return _context10.abrupt("return", {
935
1273
  overwritten: false
936
1274
  });
937
1275
  case 8:
@@ -945,31 +1283,31 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
945
1283
  this.store.list = this.store.list.map(function (order) {
946
1284
  var id = order === null || order === void 0 ? void 0 : order.order_id;
947
1285
  if (id === undefined || id === null) {
948
- return _this8.normalizeOrderForMemoryList(order, 'overwriteExistingOrder.existingMemory');
1286
+ return _this7.normalizeOrderForMemoryList(order, 'overwriteExistingOrder.existingMemory');
949
1287
  }
950
- return _this8.getIdKey(id) === key ? reconciledFresh : _this8.normalizeOrderForMemoryList(order, 'overwriteExistingOrder.existingMemory');
1288
+ return _this7.getIdKey(id) === key ? reconciledFresh : _this7.normalizeOrderForMemoryList(order, 'overwriteExistingOrder.existingMemory');
951
1289
  });
952
1290
  this.syncOrdersMap();
953
- _context8.next = 16;
1291
+ _context10.next = 16;
954
1292
  return this.updateOrderInSQLite(reconciledFresh, 'overwriteExistingOrder');
955
1293
  case 16:
956
1294
  this.logInfo('overwriteExistingOrder-结束', {
957
1295
  orderId: orderId,
958
1296
  storeOrderCountAfter: this.store.list.length
959
1297
  });
960
- _context8.next = 19;
1298
+ _context10.next = 19;
961
1299
  return this.emitOrdersChanged([reconciledFresh], 'overwriteExistingOrder');
962
1300
  case 19:
963
- return _context8.abrupt("return", {
1301
+ return _context10.abrupt("return", {
964
1302
  overwritten: true
965
1303
  });
966
1304
  case 20:
967
1305
  case "end":
968
- return _context8.stop();
1306
+ return _context10.stop();
969
1307
  }
970
- }, _callee8, this);
1308
+ }, _callee10, this);
971
1309
  }));
972
- function overwriteExistingOrder(_x4) {
1310
+ function overwriteExistingOrder(_x7) {
973
1311
  return _overwriteExistingOrder.apply(this, arguments);
974
1312
  }
975
1313
  return overwriteExistingOrder;
@@ -982,29 +1320,33 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
982
1320
  }, {
983
1321
  key: "upsertOrdersFromRemote",
984
1322
  value: (function () {
985
- var _upsertOrdersFromRemote = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(freshOrders) {
986
- return _regeneratorRuntime().wrap(function _callee9$(_context9) {
987
- while (1) switch (_context9.prev = _context9.next) {
1323
+ var _upsertOrdersFromRemote = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11(freshOrders) {
1324
+ var source,
1325
+ _args11 = arguments;
1326
+ return _regeneratorRuntime().wrap(function _callee11$(_context11) {
1327
+ while (1) switch (_context11.prev = _context11.next) {
988
1328
  case 0:
1329
+ source = _args11.length > 1 && _args11[1] !== undefined ? _args11[1] : 'upsertOrdersFromRemote';
989
1330
  if (freshOrders !== null && freshOrders !== void 0 && freshOrders.length) {
990
- _context9.next = 3;
1331
+ _context11.next = 4;
991
1332
  break;
992
1333
  }
993
1334
  this.logInfo('upsertOrdersFromRemote-订单列表为空', {});
994
- return _context9.abrupt("return");
995
- case 3:
1335
+ return _context11.abrupt("return");
1336
+ case 4:
996
1337
  this.logInfo('upsertOrdersFromRemote-开始', {
997
- count: freshOrders.length
1338
+ count: freshOrders.length,
1339
+ source: source
998
1340
  });
999
- _context9.next = 6;
1000
- return this.mergeOrdersToStore(freshOrders, 'upsertOrdersFromRemote');
1001
- case 6:
1341
+ _context11.next = 7;
1342
+ return this.mergeOrdersToStore(freshOrders, source);
1343
+ case 7:
1002
1344
  case "end":
1003
- return _context9.stop();
1345
+ return _context11.stop();
1004
1346
  }
1005
- }, _callee9, this);
1347
+ }, _callee11, this);
1006
1348
  }));
1007
- function upsertOrdersFromRemote(_x5) {
1349
+ function upsertOrdersFromRemote(_x8) {
1008
1350
  return _upsertOrdersFromRemote.apply(this, arguments);
1009
1351
  }
1010
1352
  return upsertOrdersFromRemote;
@@ -1012,21 +1354,21 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1012
1354
  }, {
1013
1355
  key: "markOrderSyncedByExternalSaleNumber",
1014
1356
  value: function () {
1015
- var _markOrderSyncedByExternalSaleNumber = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10(params) {
1016
- var _this9 = this,
1357
+ var _markOrderSyncedByExternalSaleNumber = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12(params) {
1358
+ var _this8 = this,
1017
1359
  _existing$external_sa,
1018
1360
  _nextOrder$order_id;
1019
1361
  var externalSaleNumber, key, targetIndex, existing, nextOrder, storageKey;
1020
- return _regeneratorRuntime().wrap(function _callee10$(_context10) {
1021
- while (1) switch (_context10.prev = _context10.next) {
1362
+ return _regeneratorRuntime().wrap(function _callee12$(_context12) {
1363
+ while (1) switch (_context12.prev = _context12.next) {
1022
1364
  case 0:
1023
1365
  externalSaleNumber = params.externalSaleNumber;
1024
1366
  if (!(externalSaleNumber === undefined || externalSaleNumber === null || externalSaleNumber === '')) {
1025
- _context10.next = 4;
1367
+ _context12.next = 4;
1026
1368
  break;
1027
1369
  }
1028
1370
  this.logError('markOrderSyncedByExternalSaleNumber-缺少 external_sale_number');
1029
- return _context10.abrupt("return", {
1371
+ return _context12.abrupt("return", {
1030
1372
  updated: false
1031
1373
  });
1032
1374
  case 4:
@@ -1034,23 +1376,24 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1034
1376
  targetIndex = this.store.list.findIndex(function (order) {
1035
1377
  var value = order === null || order === void 0 ? void 0 : order.external_sale_number;
1036
1378
  if (value === undefined || value === null || value === '') return false;
1037
- return _this9.getIdKey(value) === key;
1379
+ return _this8.getIdKey(value) === key;
1038
1380
  });
1039
1381
  if (!(targetIndex < 0)) {
1040
- _context10.next = 9;
1382
+ _context12.next = 9;
1041
1383
  break;
1042
1384
  }
1043
1385
  this.logInfo('markOrderSyncedByExternalSaleNumber-本地订单不存在,跳过', {
1044
1386
  external_sale_number: externalSaleNumber
1045
1387
  });
1046
- return _context10.abrupt("return", {
1388
+ return _context12.abrupt("return", {
1047
1389
  updated: false
1048
1390
  });
1049
1391
  case 9:
1050
1392
  existing = this.store.list[targetIndex];
1051
1393
  nextOrder = this.normalizeRemoteSyncedOrder(_objectSpread(_objectSpread(_objectSpread({}, existing), params.patch || {}), {}, {
1052
1394
  external_sale_number: (_existing$external_sa = existing.external_sale_number) !== null && _existing$external_sa !== void 0 ? _existing$external_sa : externalSaleNumber,
1053
- need_sync: 0
1395
+ need_sync: 0,
1396
+ is_draft_order: 0
1054
1397
  }));
1055
1398
  storageKey = this.getOrderStorageKey(nextOrder) || key;
1056
1399
  this.store.list = this.store.list.map(function (order, index) {
@@ -1058,27 +1401,27 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1058
1401
  return nextOrder;
1059
1402
  });
1060
1403
  this.syncOrdersMap();
1061
- _context10.next = 16;
1404
+ _context12.next = 16;
1062
1405
  return this.patchOrdersInSQLite([nextOrder], 'markOrderSyncedByExternalSaleNumber', _defineProperty({}, storageKey, 'update'));
1063
1406
  case 16:
1064
1407
  this.logInfo('markOrderSyncedByExternalSaleNumber-完成', {
1065
1408
  external_sale_number: externalSaleNumber,
1066
1409
  order_id: (_nextOrder$order_id = nextOrder.order_id) !== null && _nextOrder$order_id !== void 0 ? _nextOrder$order_id : null
1067
1410
  });
1068
- _context10.next = 19;
1411
+ _context12.next = 19;
1069
1412
  return this.emitOrdersChanged([nextOrder], 'markOrderSyncedByExternalSaleNumber');
1070
1413
  case 19:
1071
- return _context10.abrupt("return", {
1414
+ return _context12.abrupt("return", {
1072
1415
  updated: true,
1073
1416
  order: nextOrder
1074
1417
  });
1075
1418
  case 20:
1076
1419
  case "end":
1077
- return _context10.stop();
1420
+ return _context12.stop();
1078
1421
  }
1079
- }, _callee10, this);
1422
+ }, _callee12, this);
1080
1423
  }));
1081
- function markOrderSyncedByExternalSaleNumber(_x6) {
1424
+ function markOrderSyncedByExternalSaleNumber(_x9) {
1082
1425
  return _markOrderSyncedByExternalSaleNumber.apply(this, arguments);
1083
1426
  }
1084
1427
  return markOrderSyncedByExternalSaleNumber;
@@ -1090,155 +1433,391 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1090
1433
  }, {
1091
1434
  key: "upsertPendingSyncOrders",
1092
1435
  value: (function () {
1093
- var _upsertPendingSyncOrders = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11(pendingOrders) {
1094
- var _this10 = this;
1095
- var pendingMap, memoryPendingMap, _iterator5, _step5, order, normalizedOrder, storageKey, mergeActions, updatedList, identityKeyToIndex, index, _iterator6, _step6, key, _iterator7, _step7, _step7$value, _storageKey, pendingOrder, matchIndex, existingOrder, mergedOrder, pendingSnapshot, insertIndex, patchedOrders;
1096
- return _regeneratorRuntime().wrap(function _callee11$(_context11) {
1097
- while (1) switch (_context11.prev = _context11.next) {
1436
+ var _upsertPendingSyncOrders = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee13(pendingOrders) {
1437
+ var _this9 = this;
1438
+ var options,
1439
+ pendingMap,
1440
+ memoryPendingMap,
1441
+ _iterator6,
1442
+ _step6,
1443
+ order,
1444
+ normalizedOrder,
1445
+ pendingOrder,
1446
+ storageKey,
1447
+ mergeActions,
1448
+ updatedList,
1449
+ identityKeyToIndex,
1450
+ index,
1451
+ _iterator7,
1452
+ _step7,
1453
+ key,
1454
+ _iterator8,
1455
+ _step8,
1456
+ _step8$value,
1457
+ _storageKey,
1458
+ _pendingOrder,
1459
+ matchIndex,
1460
+ existingOrder,
1461
+ mergedOrder,
1462
+ nextOrder,
1463
+ pendingSnapshot,
1464
+ insertIndex,
1465
+ patchedOrders,
1466
+ previousList,
1467
+ _args13 = arguments;
1468
+ return _regeneratorRuntime().wrap(function _callee13$(_context13) {
1469
+ while (1) switch (_context13.prev = _context13.next) {
1098
1470
  case 0:
1471
+ options = _args13.length > 1 && _args13[1] !== undefined ? _args13[1] : {};
1099
1472
  if (pendingOrders !== null && pendingOrders !== void 0 && pendingOrders.length) {
1100
- _context11.next = 3;
1473
+ _context13.next = 4;
1101
1474
  break;
1102
1475
  }
1103
1476
  this.logInfo('upsertPendingSyncOrders-订单列表为空', {});
1104
- return _context11.abrupt("return");
1105
- case 3:
1477
+ return _context13.abrupt("return");
1478
+ case 4:
1106
1479
  pendingMap = new Map();
1107
1480
  memoryPendingMap = new Map();
1108
- _iterator5 = _createForOfIteratorHelper(pendingOrders);
1109
- _context11.prev = 6;
1110
- _iterator5.s();
1111
- case 8:
1112
- if ((_step5 = _iterator5.n()).done) {
1113
- _context11.next = 18;
1481
+ _iterator6 = _createForOfIteratorHelper(pendingOrders);
1482
+ _context13.prev = 7;
1483
+ _iterator6.s();
1484
+ case 9:
1485
+ if ((_step6 = _iterator6.n()).done) {
1486
+ _context13.next = 20;
1114
1487
  break;
1115
1488
  }
1116
- order = _step5.value;
1489
+ order = _step6.value;
1117
1490
  normalizedOrder = this.normalizeOrderCollectionsForIngress(order, 'upsertPendingSyncOrders.incoming');
1118
- storageKey = this.getOrderStorageKey(normalizedOrder);
1491
+ pendingOrder = _objectSpread(_objectSpread({}, normalizedOrder), {}, {
1492
+ need_sync: 1,
1493
+ is_draft_order: 0
1494
+ });
1495
+ storageKey = this.getOrderStorageKey(pendingOrder);
1119
1496
  if (storageKey) {
1120
- _context11.next = 14;
1497
+ _context13.next = 16;
1121
1498
  break;
1122
1499
  }
1123
- return _context11.abrupt("continue", 16);
1124
- case 14:
1125
- pendingMap.set(storageKey, normalizedOrder);
1126
- memoryPendingMap.set(storageKey, this.normalizeOrderForMemoryList(normalizedOrder, 'upsertPendingSyncOrders.memory'));
1500
+ return _context13.abrupt("continue", 18);
1127
1501
  case 16:
1128
- _context11.next = 8;
1129
- break;
1502
+ pendingMap.set(storageKey, pendingOrder);
1503
+ memoryPendingMap.set(storageKey, this.normalizeOrderForMemoryList(pendingOrder, 'upsertPendingSyncOrders.memory'));
1130
1504
  case 18:
1131
- _context11.next = 23;
1505
+ _context13.next = 9;
1132
1506
  break;
1133
1507
  case 20:
1134
- _context11.prev = 20;
1135
- _context11.t0 = _context11["catch"](6);
1136
- _iterator5.e(_context11.t0);
1137
- case 23:
1138
- _context11.prev = 23;
1139
- _iterator5.f();
1140
- return _context11.finish(23);
1141
- case 26:
1508
+ _context13.next = 25;
1509
+ break;
1510
+ case 22:
1511
+ _context13.prev = 22;
1512
+ _context13.t0 = _context13["catch"](7);
1513
+ _iterator6.e(_context13.t0);
1514
+ case 25:
1515
+ _context13.prev = 25;
1516
+ _iterator6.f();
1517
+ return _context13.finish(25);
1518
+ case 28:
1142
1519
  if (!(pendingMap.size === 0)) {
1143
- _context11.next = 29;
1520
+ _context13.next = 31;
1144
1521
  break;
1145
1522
  }
1146
1523
  this.logError('upsertPendingSyncOrders-订单缺少可落库标识', {
1147
1524
  count: pendingOrders.length
1148
1525
  });
1149
- return _context11.abrupt("return");
1150
- case 29:
1526
+ return _context13.abrupt("return");
1527
+ case 31:
1151
1528
  this.logInfo('upsertPendingSyncOrders-开始', {
1152
1529
  count: pendingMap.size
1153
1530
  });
1154
1531
  mergeActions = {};
1155
1532
  updatedList = this.store.list.map(function (order) {
1156
- return _this10.normalizeOrderForMemoryList(order, 'upsertPendingSyncOrders.existingMemory');
1533
+ return _this9.normalizeOrderForMemoryList(order, 'upsertPendingSyncOrders.existingMemory');
1157
1534
  }); // 与 mergeOrdersToStore 一致:基于身份键(field:value)建立索引,把「查找已存在订单」
1158
1535
  // 从 O(n) 线性扫描降为 O(1),整体复杂度由 O(n^2) 降为 O(n + m)。
1159
1536
  identityKeyToIndex = new Map();
1160
1537
  for (index = 0; index < updatedList.length; index += 1) {
1161
- _iterator6 = _createForOfIteratorHelper(this.getOrderIdentityMatchKeys(updatedList[index]));
1538
+ _iterator7 = _createForOfIteratorHelper(this.getOrderIdentityMatchKeys(updatedList[index]));
1162
1539
  try {
1163
- for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
1164
- key = _step6.value;
1540
+ for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
1541
+ key = _step7.value;
1165
1542
  // 同一 key 命中多张时保留最靠前的下标,与原 findIndex「取首个匹配」一致
1166
1543
  if (!identityKeyToIndex.has(key)) identityKeyToIndex.set(key, index);
1167
1544
  }
1168
1545
  } catch (err) {
1169
- _iterator6.e(err);
1546
+ _iterator7.e(err);
1170
1547
  } finally {
1171
- _iterator6.f();
1548
+ _iterator7.f();
1172
1549
  }
1173
1550
  }
1174
- _iterator7 = _createForOfIteratorHelper(memoryPendingMap.entries());
1175
- _context11.prev = 35;
1176
- _iterator7.s();
1177
- case 37:
1178
- if ((_step7 = _iterator7.n()).done) {
1179
- _context11.next = 55;
1551
+ _iterator8 = _createForOfIteratorHelper(memoryPendingMap.entries());
1552
+ _context13.prev = 37;
1553
+ _iterator8.s();
1554
+ case 39:
1555
+ if ((_step8 = _iterator8.n()).done) {
1556
+ _context13.next = 58;
1180
1557
  break;
1181
1558
  }
1182
- _step7$value = _slicedToArray(_step7.value, 2), _storageKey = _step7$value[0], pendingOrder = _step7$value[1];
1183
- matchIndex = this.lookupOrderIndexByIdentityKeys(identityKeyToIndex, this.getOrderIdentityMatchKeys(pendingOrder));
1559
+ _step8$value = _slicedToArray(_step8.value, 2), _storageKey = _step8$value[0], _pendingOrder = _step8$value[1];
1560
+ matchIndex = this.lookupOrderIndexByIdentityKeys(identityKeyToIndex, this.getOrderIdentityMatchKeys(_pendingOrder));
1184
1561
  if (!(matchIndex >= 0)) {
1185
- _context11.next = 49;
1562
+ _context13.next = 52;
1186
1563
  break;
1187
1564
  }
1188
1565
  existingOrder = updatedList[matchIndex];
1189
- mergedOrder = this.mergeOrderRecords(existingOrder, pendingOrder);
1190
- updatedList[matchIndex] = mergedOrder;
1566
+ mergedOrder = this.mergeOrderRecords(existingOrder, _pendingOrder);
1567
+ nextOrder = _objectSpread(_objectSpread({}, mergedOrder), {}, {
1568
+ need_sync: 1,
1569
+ is_draft_order: 0
1570
+ });
1571
+ updatedList[matchIndex] = nextOrder;
1191
1572
  pendingSnapshot = pendingMap.get(_storageKey);
1192
1573
  if (pendingSnapshot) {
1193
1574
  pendingMap.set(_storageKey, this.reconcileOverwriteOrderCollections(existingOrder, pendingSnapshot));
1194
1575
  }
1195
1576
  // 合并后身份字段可能新增(如挂单拿到 order_id),同步登记,供同批后续 pending 命中同一槽位
1196
- this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, matchIndex);
1577
+ this.registerOrderIdentityKeys(identityKeyToIndex, nextOrder, matchIndex);
1197
1578
  mergeActions[_storageKey] = 'update';
1198
- return _context11.abrupt("continue", 53);
1199
- case 49:
1579
+ return _context13.abrupt("continue", 56);
1580
+ case 52:
1200
1581
  insertIndex = updatedList.length;
1201
- updatedList.push(pendingOrder);
1202
- this.registerOrderIdentityKeys(identityKeyToIndex, pendingOrder, insertIndex);
1582
+ updatedList.push(_pendingOrder);
1583
+ this.registerOrderIdentityKeys(identityKeyToIndex, _pendingOrder, insertIndex);
1203
1584
  mergeActions[_storageKey] = 'insert';
1204
- case 53:
1205
- _context11.next = 37;
1585
+ case 56:
1586
+ _context13.next = 39;
1206
1587
  break;
1207
- case 55:
1208
- _context11.next = 60;
1588
+ case 58:
1589
+ _context13.next = 63;
1209
1590
  break;
1210
- case 57:
1211
- _context11.prev = 57;
1212
- _context11.t1 = _context11["catch"](35);
1213
- _iterator7.e(_context11.t1);
1214
1591
  case 60:
1215
- _context11.prev = 60;
1216
- _iterator7.f();
1217
- return _context11.finish(60);
1592
+ _context13.prev = 60;
1593
+ _context13.t1 = _context13["catch"](37);
1594
+ _iterator8.e(_context13.t1);
1218
1595
  case 63:
1596
+ _context13.prev = 63;
1597
+ _iterator8.f();
1598
+ return _context13.finish(63);
1599
+ case 66:
1219
1600
  patchedOrders = _toConsumableArray(pendingMap.values()); // 增量索引已保证 store 去重不变量,无需再对全表做 O(n^2) 压缩;仅自检开关开启时兜底。
1601
+ previousList = this.store.list;
1220
1602
  this.store.list = this.runOrderStoreSelfCheck(updatedList, 'upsertPendingSyncOrders.store');
1221
1603
  this.syncOrdersMap();
1222
- _context11.next = 68;
1223
- return this.patchOrdersInSQLite(patchedOrders, 'upsertPendingSyncOrders', mergeActions);
1224
- case 68:
1604
+ _context13.prev = 70;
1605
+ _context13.next = 73;
1606
+ return this.patchOrdersInSQLite(patchedOrders, 'upsertPendingSyncOrders', mergeActions, options);
1607
+ case 73:
1608
+ _context13.next = 80;
1609
+ break;
1610
+ case 75:
1611
+ _context13.prev = 75;
1612
+ _context13.t2 = _context13["catch"](70);
1613
+ this.store.list = previousList;
1614
+ this.syncOrdersMap();
1615
+ throw _context13.t2;
1616
+ case 80:
1225
1617
  this.logInfo('upsertPendingSyncOrders-结束', {
1226
1618
  count: patchedOrders.length,
1227
1619
  storeOrderCountAfter: this.store.list.length
1228
1620
  });
1229
- _context11.next = 71;
1621
+ _context13.next = 83;
1230
1622
  return this.emitOrdersChanged(patchedOrders, 'upsertPendingSyncOrders');
1231
- case 71:
1623
+ case 83:
1232
1624
  case "end":
1233
- return _context11.stop();
1625
+ return _context13.stop();
1234
1626
  }
1235
- }, _callee11, this, [[6, 20, 23, 26], [35, 57, 60, 63]]);
1627
+ }, _callee13, this, [[7, 22, 25, 28], [37, 60, 63, 66], [70, 75]]);
1236
1628
  }));
1237
- function upsertPendingSyncOrders(_x7) {
1629
+ function upsertPendingSyncOrders(_x10) {
1238
1630
  return _upsertPendingSyncOrders.apply(this, arguments);
1239
1631
  }
1240
1632
  return upsertPendingSyncOrders;
1241
1633
  }()
1634
+ /**
1635
+ * 将 POS 草稿订单按 SQLite storage key 落库。
1636
+ * 只有具备真实 order_id 的草稿进入 store;其余草稿仅供本地恢复查询。
1637
+ */
1638
+ )
1639
+ }, {
1640
+ key: "upsertLocalDraftOrders",
1641
+ value: (function () {
1642
+ var _upsertLocalDraftOrders = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee14(draftOrders) {
1643
+ var _this10 = this;
1644
+ var draftMap, memoryDraftMap, _iterator9, _step9, order, draftOrder, storageKey, memoryDraftOrder, mergeActions, updatedList, identityKeyToIndex, index, _iterator10, _step10, key, _iterator11, _step11, _step11$value, _storageKey2, _draftOrder, matchIndex, existingOrder, reconciledDraftOrder, mergedOrder, nextOrder, insertIndex, patchedOrders, previousList, removedLegacyMemoryDraft;
1645
+ return _regeneratorRuntime().wrap(function _callee14$(_context14) {
1646
+ while (1) switch (_context14.prev = _context14.next) {
1647
+ case 0:
1648
+ if (draftOrders !== null && draftOrders !== void 0 && draftOrders.length) {
1649
+ _context14.next = 3;
1650
+ break;
1651
+ }
1652
+ this.logInfo('upsertLocalDraftOrders-订单列表为空', {});
1653
+ return _context14.abrupt("return");
1654
+ case 3:
1655
+ draftMap = new Map();
1656
+ memoryDraftMap = new Map();
1657
+ _iterator9 = _createForOfIteratorHelper(draftOrders);
1658
+ _context14.prev = 6;
1659
+ _iterator9.s();
1660
+ case 8:
1661
+ if ((_step9 = _iterator9.n()).done) {
1662
+ _context14.next = 19;
1663
+ break;
1664
+ }
1665
+ order = _step9.value;
1666
+ draftOrder = _objectSpread(_objectSpread({}, order), {}, {
1667
+ need_sync: 0,
1668
+ is_draft_order: 1
1669
+ });
1670
+ storageKey = this.getOrderStorageKey(draftOrder);
1671
+ if (storageKey) {
1672
+ _context14.next = 14;
1673
+ break;
1674
+ }
1675
+ return _context14.abrupt("continue", 17);
1676
+ case 14:
1677
+ draftMap.set(storageKey, draftOrder);
1678
+ memoryDraftOrder = this.normalizeOrderForMemoryList(draftOrder);
1679
+ if (this.shouldKeepOrderInMemory(memoryDraftOrder)) {
1680
+ memoryDraftMap.set(storageKey, memoryDraftOrder);
1681
+ }
1682
+ case 17:
1683
+ _context14.next = 8;
1684
+ break;
1685
+ case 19:
1686
+ _context14.next = 24;
1687
+ break;
1688
+ case 21:
1689
+ _context14.prev = 21;
1690
+ _context14.t0 = _context14["catch"](6);
1691
+ _iterator9.e(_context14.t0);
1692
+ case 24:
1693
+ _context14.prev = 24;
1694
+ _iterator9.f();
1695
+ return _context14.finish(24);
1696
+ case 27:
1697
+ if (!(draftMap.size === 0)) {
1698
+ _context14.next = 30;
1699
+ break;
1700
+ }
1701
+ this.logError('upsertLocalDraftOrders-订单缺少可落库标识', {
1702
+ count: draftOrders.length
1703
+ });
1704
+ return _context14.abrupt("return");
1705
+ case 30:
1706
+ this.logInfo('upsertLocalDraftOrders-开始', {
1707
+ count: draftMap.size,
1708
+ memoryDraftCount: memoryDraftMap.size,
1709
+ sqliteOnlyDraftCount: draftMap.size - memoryDraftMap.size
1710
+ });
1711
+ mergeActions = {};
1712
+ updatedList = this.store.list.filter(function (order) {
1713
+ return _this10.shouldKeepOrderInMemory(order);
1714
+ });
1715
+ identityKeyToIndex = new Map();
1716
+ for (index = 0; index < updatedList.length; index += 1) {
1717
+ _iterator10 = _createForOfIteratorHelper(this.getOrderIdentityMatchKeys(updatedList[index]));
1718
+ try {
1719
+ for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
1720
+ key = _step10.value;
1721
+ if (!identityKeyToIndex.has(key)) identityKeyToIndex.set(key, index);
1722
+ }
1723
+ } catch (err) {
1724
+ _iterator10.e(err);
1725
+ } finally {
1726
+ _iterator10.f();
1727
+ }
1728
+ }
1729
+ _iterator11 = _createForOfIteratorHelper(memoryDraftMap.entries());
1730
+ _context14.prev = 36;
1731
+ _iterator11.s();
1732
+ case 38:
1733
+ if ((_step11 = _iterator11.n()).done) {
1734
+ _context14.next = 57;
1735
+ break;
1736
+ }
1737
+ _step11$value = _slicedToArray(_step11.value, 2), _storageKey2 = _step11$value[0], _draftOrder = _step11$value[1];
1738
+ matchIndex = this.lookupOrderIndexByIdentityKeys(identityKeyToIndex, this.getOrderIdentityMatchKeys(_draftOrder));
1739
+ if (!(matchIndex >= 0)) {
1740
+ _context14.next = 51;
1741
+ break;
1742
+ }
1743
+ existingOrder = updatedList[matchIndex];
1744
+ reconciledDraftOrder = this.preserveExistingBusinessCodeForDraft(existingOrder, _draftOrder);
1745
+ mergedOrder = this.mergeOrderRecords(existingOrder, reconciledDraftOrder);
1746
+ nextOrder = _objectSpread(_objectSpread({}, mergedOrder), {}, {
1747
+ need_sync: 0,
1748
+ is_draft_order: 1
1749
+ });
1750
+ updatedList[matchIndex] = nextOrder;
1751
+ // SQLite 必须与内存中的草稿保持同一份 business_code,避免下次 hydrate 再次丢失分类。
1752
+ draftMap.set(_storageKey2, reconciledDraftOrder);
1753
+ this.registerOrderIdentityKeys(identityKeyToIndex, nextOrder, matchIndex);
1754
+ mergeActions[_storageKey2] = 'update';
1755
+ return _context14.abrupt("continue", 55);
1756
+ case 51:
1757
+ insertIndex = updatedList.length;
1758
+ updatedList.push(_draftOrder);
1759
+ this.registerOrderIdentityKeys(identityKeyToIndex, _draftOrder, insertIndex);
1760
+ mergeActions[_storageKey2] = 'insert';
1761
+ case 55:
1762
+ _context14.next = 38;
1763
+ break;
1764
+ case 57:
1765
+ _context14.next = 62;
1766
+ break;
1767
+ case 59:
1768
+ _context14.prev = 59;
1769
+ _context14.t1 = _context14["catch"](36);
1770
+ _iterator11.e(_context14.t1);
1771
+ case 62:
1772
+ _context14.prev = 62;
1773
+ _iterator11.f();
1774
+ return _context14.finish(62);
1775
+ case 65:
1776
+ patchedOrders = _toConsumableArray(draftMap.values());
1777
+ previousList = this.store.list;
1778
+ this.store.list = this.runOrderStoreSelfCheck(updatedList, 'upsertLocalDraftOrders.store');
1779
+ this.syncOrdersMap();
1780
+ _context14.prev = 69;
1781
+ _context14.next = 72;
1782
+ return this.patchOrdersInSQLite(patchedOrders, 'upsertLocalDraftOrders', mergeActions, {
1783
+ throwOnError: true
1784
+ });
1785
+ case 72:
1786
+ _context14.next = 79;
1787
+ break;
1788
+ case 74:
1789
+ _context14.prev = 74;
1790
+ _context14.t2 = _context14["catch"](69);
1791
+ this.store.list = previousList;
1792
+ this.syncOrdersMap();
1793
+ throw _context14.t2;
1794
+ case 79:
1795
+ this.logInfo('upsertLocalDraftOrders-结束', {
1796
+ count: patchedOrders.length,
1797
+ storeOrderCountAfter: this.store.list.length
1798
+ });
1799
+ removedLegacyMemoryDraft = previousList.some(function (order) {
1800
+ return !_this10.shouldKeepOrderInMemory(order);
1801
+ });
1802
+ if (!(memoryDraftMap.size > 0 || removedLegacyMemoryDraft)) {
1803
+ _context14.next = 84;
1804
+ break;
1805
+ }
1806
+ _context14.next = 84;
1807
+ return this.emitOrdersChanged(patchedOrders.filter(function (order) {
1808
+ return _this10.shouldKeepOrderInMemory(order);
1809
+ }), 'upsertLocalDraftOrders');
1810
+ case 84:
1811
+ case "end":
1812
+ return _context14.stop();
1813
+ }
1814
+ }, _callee14, this, [[6, 21, 24, 27], [36, 59, 62, 65], [69, 74]]);
1815
+ }));
1816
+ function upsertLocalDraftOrders(_x11) {
1817
+ return _upsertLocalDraftOrders.apply(this, arguments);
1818
+ }
1819
+ return upsertLocalDraftOrders;
1820
+ }()
1242
1821
  /**
1243
1822
  * 通过 SSE 按自定义 query 拉取订单(支持 select/with 精简字段)
1244
1823
  */
@@ -1246,42 +1825,42 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1246
1825
  }, {
1247
1826
  key: "fetchOrdersBySSE",
1248
1827
  value: (function () {
1249
- var _fetchOrdersBySSE = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12() {
1828
+ var _fetchOrdersBySSE = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee15() {
1250
1829
  var query,
1251
1830
  data,
1252
- _args12 = arguments;
1253
- return _regeneratorRuntime().wrap(function _callee12$(_context12) {
1254
- while (1) switch (_context12.prev = _context12.next) {
1831
+ _args15 = arguments;
1832
+ return _regeneratorRuntime().wrap(function _callee15$(_context15) {
1833
+ while (1) switch (_context15.prev = _context15.next) {
1255
1834
  case 0:
1256
- query = _args12.length > 0 && _args12[0] !== undefined ? _args12[0] : {};
1835
+ query = _args15.length > 0 && _args15[0] !== undefined ? _args15[0] : {};
1257
1836
  if (this.orderDataSource) {
1258
- _context12.next = 3;
1837
+ _context15.next = 3;
1259
1838
  break;
1260
1839
  }
1261
- return _context12.abrupt("return", []);
1840
+ return _context15.abrupt("return", []);
1262
1841
  case 3:
1263
- _context12.prev = 3;
1264
- _context12.next = 6;
1842
+ _context15.prev = 3;
1843
+ _context15.next = 6;
1265
1844
  return this.orderDataSource.run({
1266
1845
  sse: {
1267
1846
  query: query
1268
1847
  }
1269
1848
  });
1270
1849
  case 6:
1271
- data = _context12.sent;
1272
- return _context12.abrupt("return", data || []);
1850
+ data = _context15.sent;
1851
+ return _context15.abrupt("return", data || []);
1273
1852
  case 10:
1274
- _context12.prev = 10;
1275
- _context12.t0 = _context12["catch"](3);
1853
+ _context15.prev = 10;
1854
+ _context15.t0 = _context15["catch"](3);
1276
1855
  this.logError('fetchOrdersBySSE-失败', {
1277
- error: _context12.t0 instanceof Error ? _context12.t0.message : String(_context12.t0)
1856
+ error: _context15.t0 instanceof Error ? _context15.t0.message : String(_context15.t0)
1278
1857
  });
1279
- return _context12.abrupt("return", []);
1858
+ return _context15.abrupt("return", []);
1280
1859
  case 14:
1281
1860
  case "end":
1282
- return _context12.stop();
1861
+ return _context15.stop();
1283
1862
  }
1284
- }, _callee12, this, [[3, 10]]);
1863
+ }, _callee15, this, [[3, 10]]);
1285
1864
  }));
1286
1865
  function fetchOrdersBySSE() {
1287
1866
  return _fetchOrdersBySSE.apply(this, arguments);
@@ -1309,20 +1888,24 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1309
1888
  }, {
1310
1889
  key: "syncOrdersMap",
1311
1890
  value: function syncOrdersMap() {
1891
+ var _this11 = this;
1892
+ this.store.list = this.store.list.filter(function (order) {
1893
+ return _this11.shouldKeepOrderInMemory(order);
1894
+ });
1312
1895
  this.store.map.clear();
1313
- var _iterator8 = _createForOfIteratorHelper(this.store.list),
1314
- _step8;
1896
+ var _iterator12 = _createForOfIteratorHelper(this.store.list),
1897
+ _step12;
1315
1898
  try {
1316
- for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
1317
- var order = _step8.value;
1899
+ for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
1900
+ var order = _step12.value;
1318
1901
  var primaryIdentity = this.getOrderMapKey(order);
1319
1902
  if (!primaryIdentity) continue;
1320
1903
  this.store.map.set(primaryIdentity, order);
1321
1904
  }
1322
1905
  } catch (err) {
1323
- _iterator8.e(err);
1906
+ _iterator12.e(err);
1324
1907
  } finally {
1325
- _iterator8.f();
1908
+ _iterator12.f();
1326
1909
  }
1327
1910
  }
1328
1911
  }, {
@@ -1343,10 +1926,27 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1343
1926
  value: function isBlankIdentityValue(value) {
1344
1927
  return value === undefined || value === null || value === '';
1345
1928
  }
1929
+
1930
+ /**
1931
+ * `/sales/draft` 的旧调用方可能把未设置的 business_code 传成空串。
1932
+ * 对同一真实订单,空值不能覆盖已有的分类,否则 booking 查询会把该订单从 Party 列表过滤掉。
1933
+ */
1934
+ }, {
1935
+ key: "preserveExistingBusinessCodeForDraft",
1936
+ value: function preserveExistingBusinessCodeForDraft(existingOrder, draftOrder) {
1937
+ var existingBusinessCode = existingOrder.business_code;
1938
+ var draftBusinessCode = draftOrder.business_code;
1939
+ var hasExistingBusinessCode = typeof existingBusinessCode === 'string' && existingBusinessCode.trim() !== '';
1940
+ var hasDraftBusinessCode = typeof draftBusinessCode === 'string' && draftBusinessCode.trim() !== '';
1941
+ if (!hasExistingBusinessCode || hasDraftBusinessCode) return draftOrder;
1942
+ return _objectSpread(_objectSpread({}, draftOrder), {}, {
1943
+ business_code: existingBusinessCode
1944
+ });
1945
+ }
1346
1946
  }, {
1347
1947
  key: "getOrderIdentityEntries",
1348
1948
  value: function getOrderIdentityEntries(order) {
1349
- var _this11 = this;
1949
+ var _this12 = this;
1350
1950
  if (!order) return [];
1351
1951
  var record = order;
1352
1952
  var candidates = [{
@@ -1365,8 +1965,8 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1365
1965
  var entries = [];
1366
1966
  var _loop = function _loop() {
1367
1967
  var candidate = _candidates[_i2];
1368
- if (_this11.isBlankIdentityValue(candidate.value)) return 0; // continue
1369
- var key = _this11.getIdKey(candidate.value);
1968
+ if (_this12.isBlankIdentityValue(candidate.value)) return 0; // continue
1969
+ var key = _this12.getIdKey(candidate.value);
1370
1970
  if (entries.some(function (entry) {
1371
1971
  return entry.field === candidate.field && entry.key === key;
1372
1972
  })) return 0; // continue
@@ -1386,17 +1986,17 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1386
1986
  key: "getOrderIdentityKeys",
1387
1987
  value: function getOrderIdentityKeys(order) {
1388
1988
  var keys = [];
1389
- var _iterator9 = _createForOfIteratorHelper(this.getOrderIdentityEntries(order)),
1390
- _step9;
1989
+ var _iterator13 = _createForOfIteratorHelper(this.getOrderIdentityEntries(order)),
1990
+ _step13;
1391
1991
  try {
1392
- for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
1393
- var entry = _step9.value;
1992
+ for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
1993
+ var entry = _step13.value;
1394
1994
  if (!keys.includes(entry.key)) keys.push(entry.key);
1395
1995
  }
1396
1996
  } catch (err) {
1397
- _iterator9.e(err);
1997
+ _iterator13.e(err);
1398
1998
  } finally {
1399
- _iterator9.f();
1999
+ _iterator13.f();
1400
2000
  }
1401
2001
  return keys;
1402
2002
  }
@@ -1433,7 +2033,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1433
2033
  }, {
1434
2034
  key: "setupOrderSync",
1435
2035
  value: function setupOrderSync() {
1436
- var _this12 = this;
2036
+ var _this13 = this;
1437
2037
  if (!this.orderDataSource) return;
1438
2038
  this.orderDataSource.run({
1439
2039
  pubsub: {
@@ -1441,22 +2041,22 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1441
2041
  var _message$id, _message$order_id, _message$type;
1442
2042
  console.log('orderDataSource', res);
1443
2043
  var pubsubReceivedAt = Date.now();
1444
- var message = _this12.normalizeOrderSyncMessage(res);
2044
+ var message = _this13.normalizeOrderSyncMessage(res);
1445
2045
  if (!message) return;
1446
2046
  message._pubsubReceivedAt = pubsubReceivedAt;
1447
- _this12.pendingSyncMessages.push(message);
1448
- var throttleMs = _this12.getOrderSyncThrottleMs();
1449
- var routeInfo = _this12.resolveSyncMessageRoute(message);
1450
- _this12.logInfo('orderSync-收到消息并入队', {
2047
+ _this13.pendingSyncMessages.push(message);
2048
+ var throttleMs = _this13.getOrderSyncThrottleMs();
2049
+ var routeInfo = _this13.resolveSyncMessageRoute(message);
2050
+ _this13.logInfo('orderSync-收到消息并入队', {
1451
2051
  id: (_message$id = message.id) !== null && _message$id !== void 0 ? _message$id : null,
1452
2052
  order_id: (_message$order_id = message.order_id) !== null && _message$order_id !== void 0 ? _message$order_id : null,
1453
2053
  type: (_message$type = message.type) !== null && _message$type !== void 0 ? _message$type : null,
1454
- pendingCount: _this12.pendingSyncMessages.length,
2054
+ pendingCount: _this13.pendingSyncMessages.length,
1455
2055
  throttleMs: throttleMs,
1456
2056
  pubsubReceivedAt: new Date(pubsubReceivedAt).toISOString(),
1457
2057
  fullMessage: JSON.stringify(message)
1458
2058
  });
1459
- _this12.scheduleOrderSyncThrottle();
2059
+ _this13.scheduleOrderSyncThrottle();
1460
2060
  }
1461
2061
  }
1462
2062
  }).catch(function () {
@@ -1473,7 +2073,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1473
2073
  }, {
1474
2074
  key: "scheduleOrderSyncThrottle",
1475
2075
  value: function scheduleOrderSyncThrottle() {
1476
- var _this13 = this;
2076
+ var _this14 = this;
1477
2077
  if (this.isProcessingSyncBatch) return;
1478
2078
  if (this.isIdlePhase) {
1479
2079
  this.isIdlePhase = false;
@@ -1484,8 +2084,8 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1484
2084
  if (this.syncTimer) return;
1485
2085
  var throttleMs = this.getOrderSyncThrottleMs();
1486
2086
  this.syncTimer = setTimeout(function () {
1487
- _this13.syncTimer = undefined;
1488
- void _this13.flushOrderSyncMessagesByThrottle();
2087
+ _this14.syncTimer = undefined;
2088
+ void _this14.flushOrderSyncMessagesByThrottle();
1489
2089
  }, throttleMs);
1490
2090
  }
1491
2091
 
@@ -1496,41 +2096,41 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1496
2096
  }, {
1497
2097
  key: "flushOrderSyncMessagesByThrottle",
1498
2098
  value: (function () {
1499
- var _flushOrderSyncMessagesByThrottle = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee13() {
1500
- return _regeneratorRuntime().wrap(function _callee13$(_context13) {
1501
- while (1) switch (_context13.prev = _context13.next) {
2099
+ var _flushOrderSyncMessagesByThrottle = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee16() {
2100
+ return _regeneratorRuntime().wrap(function _callee16$(_context16) {
2101
+ while (1) switch (_context16.prev = _context16.next) {
1502
2102
  case 0:
1503
2103
  if (!this.isProcessingSyncBatch) {
1504
- _context13.next = 2;
2104
+ _context16.next = 2;
1505
2105
  break;
1506
2106
  }
1507
- return _context13.abrupt("return");
2107
+ return _context16.abrupt("return");
1508
2108
  case 2:
1509
2109
  if (!(this.pendingSyncMessages.length === 0)) {
1510
- _context13.next = 5;
2110
+ _context16.next = 5;
1511
2111
  break;
1512
2112
  }
1513
2113
  this.isIdlePhase = true;
1514
- return _context13.abrupt("return");
2114
+ return _context16.abrupt("return");
1515
2115
  case 5:
1516
2116
  this.isProcessingSyncBatch = true;
1517
- _context13.prev = 6;
1518
- _context13.next = 9;
2117
+ _context16.prev = 6;
2118
+ _context16.next = 9;
1519
2119
  return this.processOrderSyncMessages();
1520
2120
  case 9:
1521
- _context13.prev = 9;
2121
+ _context16.prev = 9;
1522
2122
  this.isProcessingSyncBatch = false;
1523
2123
  if (this.pendingSyncMessages.length > 0) {
1524
2124
  this.scheduleOrderSyncThrottle();
1525
2125
  } else {
1526
2126
  this.isIdlePhase = true;
1527
2127
  }
1528
- return _context13.finish(9);
2128
+ return _context16.finish(9);
1529
2129
  case 13:
1530
2130
  case "end":
1531
- return _context13.stop();
2131
+ return _context16.stop();
1532
2132
  }
1533
- }, _callee13, this, [[6,, 9, 13]]);
2133
+ }, _callee16, this, [[6,, 9, 13]]);
1534
2134
  }));
1535
2135
  function flushOrderSyncMessagesByThrottle() {
1536
2136
  return _flushOrderSyncMessagesByThrottle.apply(this, arguments);
@@ -1552,19 +2152,19 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1552
2152
  }, {
1553
2153
  key: "processOrderSyncMessages",
1554
2154
  value: (function () {
1555
- var _processOrderSyncMessages = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee14() {
1556
- var _this14 = this;
2155
+ var _processOrderSyncMessages = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee17() {
2156
+ var _this15 = this;
1557
2157
  var messages, batchProcessStartAt, earliestReceivedAt, upsertOrders, refreshIds, uniqueRefreshIds, upsertList, _this$filterRedundant, toFetch, skipped, freshOrders, batchProcessEndAt;
1558
- return _regeneratorRuntime().wrap(function _callee14$(_context14) {
1559
- while (1) switch (_context14.prev = _context14.next) {
2158
+ return _regeneratorRuntime().wrap(function _callee17$(_context17) {
2159
+ while (1) switch (_context17.prev = _context17.next) {
1560
2160
  case 0:
1561
2161
  messages = _toConsumableArray(this.pendingSyncMessages);
1562
2162
  this.pendingSyncMessages = [];
1563
2163
  if (!(messages.length === 0)) {
1564
- _context14.next = 4;
2164
+ _context17.next = 4;
1565
2165
  break;
1566
2166
  }
1567
- return _context14.abrupt("return");
2167
+ return _context17.abrupt("return");
1568
2168
  case 4:
1569
2169
  batchProcessStartAt = Date.now();
1570
2170
  earliestReceivedAt = Math.min.apply(Math, _toConsumableArray(messages.map(function (m) {
@@ -1580,13 +2180,13 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1580
2180
  upsertOrders = new Map();
1581
2181
  refreshIds = [];
1582
2182
  messages.forEach(function (msg, msgIndex) {
1583
- var routeInfo = _this14.resolveSyncMessageRoute(msg);
2183
+ var routeInfo = _this15.resolveSyncMessageRoute(msg);
1584
2184
  var hasBatchIds = routeInfo.hasBatchIds;
1585
2185
  var singleId = routeInfo.singleId;
1586
2186
  var hasSingleId = routeInfo.hasSingleId;
1587
- var normalizedBody = _this14.normalizeOrderSyncPayload(msg.body || msg.data);
2187
+ var normalizedBody = _this15.normalizeOrderSyncPayload(msg.body || msg.data);
1588
2188
  if (routeInfo.route === 'bodyUpsert' && normalizedBody) {
1589
- upsertOrders.set(_this14.getIdKey(normalizedBody.order_id), normalizedBody);
2189
+ upsertOrders.set(_this15.getIdKey(normalizedBody.order_id), normalizedBody);
1590
2190
  return;
1591
2191
  }
1592
2192
  if (hasBatchIds) refreshIds.push.apply(refreshIds, _toConsumableArray(routeInfo.batchIds));else if (routeInfo.route === 'httpRefresh.singleId' && singleId !== null) refreshIds.push(singleId);else if (routeInfo.route === 'httpRefresh.relationIds') refreshIds.push.apply(refreshIds, _toConsumableArray(routeInfo.batchIds));
@@ -1598,41 +2198,41 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1598
2198
  refreshIdCount: uniqueRefreshIds.length
1599
2199
  });
1600
2200
  if (!(upsertList.length > 0)) {
1601
- _context14.next = 16;
2201
+ _context17.next = 16;
1602
2202
  break;
1603
2203
  }
1604
- _context14.next = 16;
2204
+ _context17.next = 16;
1605
2205
  return this.mergeOrdersToStore(upsertList, 'pubsub.bodyUpsert');
1606
2206
  case 16:
1607
2207
  if (!(uniqueRefreshIds.length > 0)) {
1608
- _context14.next = 28;
2208
+ _context17.next = 28;
1609
2209
  break;
1610
2210
  }
1611
2211
  _this$filterRedundant = this.filterRedundantHttpRefreshIds(uniqueRefreshIds), toFetch = _this$filterRedundant.toFetch, skipped = _this$filterRedundant.skipped;
1612
2212
  if (skipped.length > 0) {}
1613
2213
  if (!(toFetch.length > 0)) {
1614
- _context14.next = 28;
2214
+ _context17.next = 28;
1615
2215
  break;
1616
2216
  }
1617
- _context14.next = 22;
2217
+ _context17.next = 22;
1618
2218
  return this.fetchOrdersByHttp(toFetch);
1619
2219
  case 22:
1620
- freshOrders = _context14.sent;
2220
+ freshOrders = _context17.sent;
1621
2221
  if (!(freshOrders.length > 0)) {
1622
- _context14.next = 28;
2222
+ _context17.next = 28;
1623
2223
  break;
1624
2224
  }
1625
- _context14.next = 26;
2225
+ _context17.next = 26;
1626
2226
  return this.mergeOrdersToStore(freshOrders, 'pubsub.httpRefresh');
1627
2227
  case 26:
1628
- _context14.next = 28;
2228
+ _context17.next = 28;
1629
2229
  break;
1630
2230
  case 28:
1631
2231
  if (!(upsertList.length === 0 && uniqueRefreshIds.length === 0)) {
1632
- _context14.next = 30;
2232
+ _context17.next = 30;
1633
2233
  break;
1634
2234
  }
1635
- return _context14.abrupt("return");
2235
+ return _context17.abrupt("return");
1636
2236
  case 30:
1637
2237
  batchProcessEndAt = Date.now();
1638
2238
  this.logInfo('processOrderSyncMessages-结束', {
@@ -1641,13 +2241,13 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1641
2241
  batchProcessDurationMs: batchProcessEndAt - batchProcessStartAt,
1642
2242
  totalFromPubsubToProcessedMs: batchProcessEndAt - earliestReceivedAt
1643
2243
  });
1644
- _context14.next = 34;
2244
+ _context17.next = 34;
1645
2245
  return this.core.effects.emit(OrderHooks.onOrdersSyncCompleted, null);
1646
2246
  case 34:
1647
2247
  case "end":
1648
- return _context14.stop();
2248
+ return _context17.stop();
1649
2249
  }
1650
- }, _callee14, this);
2250
+ }, _callee17, this);
1651
2251
  }));
1652
2252
  function processOrderSyncMessages() {
1653
2253
  return _processOrderSyncMessages.apply(this, arguments);
@@ -1668,29 +2268,29 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1668
2268
  }, {
1669
2269
  key: "fetchOrdersByHttp",
1670
2270
  value: (function () {
1671
- var _fetchOrdersByHttp = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee15(ids) {
2271
+ var _fetchOrdersByHttp = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee18(ids) {
1672
2272
  var _orderList, orderList;
1673
- return _regeneratorRuntime().wrap(function _callee15$(_context15) {
1674
- while (1) switch (_context15.prev = _context15.next) {
2273
+ return _regeneratorRuntime().wrap(function _callee18$(_context18) {
2274
+ while (1) switch (_context18.prev = _context18.next) {
1675
2275
  case 0:
1676
2276
  if (!(!this.orderDataSource || ids.length === 0)) {
1677
- _context15.next = 2;
2277
+ _context18.next = 2;
1678
2278
  break;
1679
2279
  }
1680
- return _context15.abrupt("return", []);
2280
+ return _context18.abrupt("return", []);
1681
2281
  case 2:
1682
- _context15.prev = 2;
2282
+ _context18.prev = 2;
1683
2283
  if (!(typeof this.orderDataSource.fetchOrdersByIds === 'function')) {
1684
- _context15.next = 8;
2284
+ _context18.next = 8;
1685
2285
  break;
1686
2286
  }
1687
- _context15.next = 6;
2287
+ _context18.next = 6;
1688
2288
  return this.orderDataSource.fetchOrdersByIds(ids);
1689
2289
  case 6:
1690
- _orderList = _context15.sent;
1691
- return _context15.abrupt("return", _orderList || []);
2290
+ _orderList = _context18.sent;
2291
+ return _context18.abrupt("return", _orderList || []);
1692
2292
  case 8:
1693
- _context15.next = 10;
2293
+ _context18.next = 10;
1694
2294
  return this.orderDataSource.run({
1695
2295
  http: {
1696
2296
  query: {
@@ -1699,19 +2299,19 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1699
2299
  }
1700
2300
  });
1701
2301
  case 10:
1702
- orderList = _context15.sent;
1703
- return _context15.abrupt("return", orderList || []);
2302
+ orderList = _context18.sent;
2303
+ return _context18.abrupt("return", orderList || []);
1704
2304
  case 14:
1705
- _context15.prev = 14;
1706
- _context15.t0 = _context15["catch"](2);
1707
- return _context15.abrupt("return", []);
2305
+ _context18.prev = 14;
2306
+ _context18.t0 = _context18["catch"](2);
2307
+ return _context18.abrupt("return", []);
1708
2308
  case 17:
1709
2309
  case "end":
1710
- return _context15.stop();
2310
+ return _context18.stop();
1711
2311
  }
1712
- }, _callee15, this, [[2, 14]]);
2312
+ }, _callee18, this, [[2, 14]]);
1713
2313
  }));
1714
- function fetchOrdersByHttp(_x8) {
2314
+ function fetchOrdersByHttp(_x12) {
1715
2315
  return _fetchOrdersByHttp.apply(this, arguments);
1716
2316
  }
1717
2317
  return fetchOrdersByHttp;
@@ -1723,11 +2323,11 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1723
2323
  }, {
1724
2324
  key: "mergeOrdersToStore",
1725
2325
  value: (function () {
1726
- var _mergeOrdersToStore = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee16(freshOrders, source) {
1727
- var _this15 = this;
1728
- var storeOrderCountBefore, normalizedFreshOrders, _iterator10, _step10, order, id, uniqueFreshOrders, uniqueFreshCount, patchedOrders, mergeActions, updatedList, identityKeyToIndex, index, identityKeys, _iterator11, _step11, key, _iterator12, _step12, fresh, freshIdentityKeys, matchIndex, storageKey, mergeKey, existingOrder, _ref2, _existingOrder$order_, _ref3, _external_sale_number2, _existingOrder$paymen, _fresh$payment_status, _existingOrder$need_s, _fresh$need_sync, mergedOrder, insertIndex, insertCount, updateCount;
1729
- return _regeneratorRuntime().wrap(function _callee16$(_context16) {
1730
- while (1) switch (_context16.prev = _context16.next) {
2326
+ var _mergeOrdersToStore = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee19(freshOrders, source) {
2327
+ var _this16 = this;
2328
+ var storeOrderCountBefore, normalizedFreshOrders, incomingProductsHaveStableIdentity, _iterator14, _step14, order, id, rawProducts, _incomingProductsHave, allProductsHaveStableIdentity, orderIdKey, uniqueFreshOrders, uniqueFreshCount, patchedOrders, remoteProductMembershipChanges, forceWriteStorageKeys, mergeActions, existingProductsHaveStableIdentity, updatedList, identityKeyToIndex, index, identityKeys, _iterator15, _step15, key, _iterator16, _step16, fresh, freshIdentityKeys, matchIndex, storageKey, mergeKey, existingOrder, _ref, _existingOrder$order_, _ref2, _external_sale_number2, _existingOrder$paymen, _fresh$payment_status, _existingOrder$need_s, _fresh$need_sync, _ref3, _existingOrder$order_2, _ref4, _external_sale_number3, _existingOrder$is_dra, _fresh$is_draft_order, mergedOrder, freshOrderId, incomingProductsAreStable, membershipChange, mergedProductsHaveStableIdentity, adjustedMatchIndex, duplicateIndexes, _iterator17, _step17, _key2, _duplicateIndex, _iterator18, _step18, duplicateIndex, _index, _iterator19, _step19, _key, mergedStorageKey, insertIndex, insertCount, updateCount;
2329
+ return _regeneratorRuntime().wrap(function _callee19$(_context19) {
2330
+ while (1) switch (_context19.prev = _context19.next) {
1731
2331
  case 0:
1732
2332
  storeOrderCountBefore = this.store.list.length;
1733
2333
  this.logInfo('mergeOrdersToStore-开始', {
@@ -1737,127 +2337,234 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1737
2337
  });
1738
2338
  this.logDuplicateOrders("".concat(source, ".beforeMerge"), this.store.list);
1739
2339
  normalizedFreshOrders = [];
1740
- _iterator10 = _createForOfIteratorHelper(freshOrders);
1741
- _context16.prev = 5;
1742
- _iterator10.s();
1743
- case 7:
1744
- if ((_step10 = _iterator10.n()).done) {
1745
- _context16.next = 15;
2340
+ incomingProductsHaveStableIdentity = new Map();
2341
+ _iterator14 = _createForOfIteratorHelper(freshOrders);
2342
+ _context19.prev = 6;
2343
+ _iterator14.s();
2344
+ case 8:
2345
+ if ((_step14 = _iterator14.n()).done) {
2346
+ _context19.next = 18;
1746
2347
  break;
1747
2348
  }
1748
- order = _step10.value;
2349
+ order = _step14.value;
1749
2350
  id = order === null || order === void 0 ? void 0 : order.order_id;
1750
2351
  if (!(id === undefined || id === null)) {
1751
- _context16.next = 12;
2352
+ _context19.next = 13;
1752
2353
  break;
1753
2354
  }
1754
- return _context16.abrupt("continue", 13);
1755
- case 12:
1756
- normalizedFreshOrders.push(this.normalizeRemoteSyncedOrder(order));
2355
+ return _context19.abrupt("continue", 16);
1757
2356
  case 13:
1758
- _context16.next = 7;
2357
+ rawProducts = order.products;
2358
+ if (Array.isArray(rawProducts)) {
2359
+ allProductsHaveStableIdentity = this.doProductsHaveStableMembershipIdentity(rawProducts);
2360
+ orderIdKey = this.getIdKey(id);
2361
+ incomingProductsHaveStableIdentity.set(orderIdKey, ((_incomingProductsHave = incomingProductsHaveStableIdentity.get(orderIdKey)) !== null && _incomingProductsHave !== void 0 ? _incomingProductsHave : true) && allProductsHaveStableIdentity);
2362
+ }
2363
+ normalizedFreshOrders.push(this.normalizeRemoteSyncedOrder(order));
2364
+ case 16:
2365
+ _context19.next = 8;
1759
2366
  break;
1760
- case 15:
1761
- _context16.next = 20;
2367
+ case 18:
2368
+ _context19.next = 23;
1762
2369
  break;
1763
- case 17:
1764
- _context16.prev = 17;
1765
- _context16.t0 = _context16["catch"](5);
1766
- _iterator10.e(_context16.t0);
1767
2370
  case 20:
1768
- _context16.prev = 20;
1769
- _iterator10.f();
1770
- return _context16.finish(20);
2371
+ _context19.prev = 20;
2372
+ _context19.t0 = _context19["catch"](6);
2373
+ _iterator14.e(_context19.t0);
1771
2374
  case 23:
2375
+ _context19.prev = 23;
2376
+ _iterator14.f();
2377
+ return _context19.finish(23);
2378
+ case 26:
1772
2379
  // 先对本批新单做去重(批内规模 m 很小),保证每条 fresh 身份唯一
1773
2380
  uniqueFreshOrders = this.compactOrderListByIdentity(normalizedFreshOrders, "".concat(source, ".incoming")).list;
1774
2381
  uniqueFreshCount = uniqueFreshOrders.length;
1775
2382
  patchedOrders = [];
2383
+ remoteProductMembershipChanges = [];
2384
+ forceWriteStorageKeys = new Set();
1776
2385
  mergeActions = {};
2386
+ existingProductsHaveStableIdentity = this.store.list.map(function (order) {
2387
+ return _this16.doProductsHaveStableMembershipIdentity(order.products);
2388
+ });
1777
2389
  updatedList = this.store.list.map(function (order) {
1778
- return _this15.normalizeOrderForMemoryList(order, "".concat(source, ".existingMemory"));
2390
+ return _this16.normalizeOrderForMemoryList(order, "".concat(source, ".existingMemory"));
1779
2391
  }); // 基于身份键(field:value)建立索引,把「查找已存在订单」从 O(n) 线性扫描降为 O(1),
1780
2392
  // 整体合并复杂度由 O(n^2) 降为 O(n + m)。索引语义与 doOrdersShareIdentity 完全一致:
1781
2393
  // 任一身份字段(order_id/external_sale_number/order_number/shop_order_number)同值即同一单。
1782
2394
  identityKeyToIndex = new Map();
1783
2395
  for (index = 0; index < updatedList.length; index += 1) {
1784
2396
  identityKeys = this.getOrderIdentityMatchKeys(updatedList[index]);
1785
- _iterator11 = _createForOfIteratorHelper(identityKeys);
2397
+ _iterator15 = _createForOfIteratorHelper(identityKeys);
1786
2398
  try {
1787
- for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
1788
- key = _step11.value;
2399
+ for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
2400
+ key = _step15.value;
1789
2401
  // 同一 key 命中多张时保留最靠前的下标,与原 findIndex「取首个匹配」一致
1790
2402
  if (!identityKeyToIndex.has(key)) identityKeyToIndex.set(key, index);
1791
2403
  }
1792
2404
  } catch (err) {
1793
- _iterator11.e(err);
2405
+ _iterator15.e(err);
1794
2406
  } finally {
1795
- _iterator11.f();
2407
+ _iterator15.f();
1796
2408
  }
1797
2409
  }
1798
- _iterator12 = _createForOfIteratorHelper(uniqueFreshOrders);
1799
- _context16.prev = 31;
1800
- _iterator12.s();
1801
- case 33:
1802
- if ((_step12 = _iterator12.n()).done) {
1803
- _context16.next = 57;
2410
+ _iterator16 = _createForOfIteratorHelper(uniqueFreshOrders);
2411
+ _context19.prev = 37;
2412
+ _iterator16.s();
2413
+ case 39:
2414
+ if ((_step16 = _iterator16.n()).done) {
2415
+ _context19.next = 96;
1804
2416
  break;
1805
2417
  }
1806
- fresh = _step12.value;
2418
+ fresh = _step16.value;
1807
2419
  freshIdentityKeys = this.getOrderIdentityMatchKeys(fresh);
1808
2420
  matchIndex = this.lookupOrderIndexByIdentityKeys(identityKeyToIndex, freshIdentityKeys);
1809
2421
  storageKey = this.getOrderStorageKey(fresh);
1810
2422
  mergeKey = storageKey || (fresh.order_id !== undefined && fresh.order_id !== null ? this.getIdKey(fresh.order_id) : '');
1811
2423
  if (!(matchIndex >= 0)) {
1812
- _context16.next = 50;
2424
+ _context19.next = 88;
1813
2425
  break;
1814
2426
  }
1815
2427
  existingOrder = updatedList[matchIndex];
1816
2428
  if (!(this.isPendingSyncOrder(existingOrder) && this.isRemoteEchoMergeSource(source))) {
1817
- _context16.next = 44;
2429
+ _context19.next = 50;
1818
2430
  break;
1819
2431
  }
1820
2432
  this.logInfo('mergeOrdersToStore-跳过 pending 订单远端覆盖', {
1821
2433
  source: source,
1822
- order_id: (_ref2 = (_existingOrder$order_ = existingOrder.order_id) !== null && _existingOrder$order_ !== void 0 ? _existingOrder$order_ : fresh.order_id) !== null && _ref2 !== void 0 ? _ref2 : null,
1823
- external_sale_number: (_ref3 = (_external_sale_number2 = existingOrder.external_sale_number) !== null && _external_sale_number2 !== void 0 ? _external_sale_number2 : fresh.external_sale_number) !== null && _ref3 !== void 0 ? _ref3 : null,
2434
+ order_id: (_ref = (_existingOrder$order_ = existingOrder.order_id) !== null && _existingOrder$order_ !== void 0 ? _existingOrder$order_ : fresh.order_id) !== null && _ref !== void 0 ? _ref : null,
2435
+ external_sale_number: (_ref2 = (_external_sale_number2 = existingOrder.external_sale_number) !== null && _external_sale_number2 !== void 0 ? _external_sale_number2 : fresh.external_sale_number) !== null && _ref2 !== void 0 ? _ref2 : null,
1824
2436
  local_payment_status: (_existingOrder$paymen = existingOrder.payment_status) !== null && _existingOrder$paymen !== void 0 ? _existingOrder$paymen : null,
1825
2437
  remote_payment_status: (_fresh$payment_status = fresh.payment_status) !== null && _fresh$payment_status !== void 0 ? _fresh$payment_status : null,
1826
2438
  local_need_sync: (_existingOrder$need_s = existingOrder.need_sync) !== null && _existingOrder$need_s !== void 0 ? _existingOrder$need_s : null,
1827
2439
  remote_need_sync: (_fresh$need_sync = fresh.need_sync) !== null && _fresh$need_sync !== void 0 ? _fresh$need_sync : null,
1828
2440
  reason: 'protect_pending_sync_order_from_remote_echo'
1829
2441
  });
1830
- return _context16.abrupt("continue", 55);
1831
- case 44:
2442
+ return _context19.abrupt("continue", 94);
2443
+ case 50:
2444
+ if (!(this.isDraftOrder(existingOrder) && this.shouldProtectDraftOrderFromIncoming(source))) {
2445
+ _context19.next = 53;
2446
+ break;
2447
+ }
2448
+ this.logInfo('mergeOrdersToStore-跳过 draft 订单远端覆盖', {
2449
+ source: source,
2450
+ order_id: (_ref3 = (_existingOrder$order_2 = existingOrder.order_id) !== null && _existingOrder$order_2 !== void 0 ? _existingOrder$order_2 : fresh.order_id) !== null && _ref3 !== void 0 ? _ref3 : null,
2451
+ external_sale_number: (_ref4 = (_external_sale_number3 = existingOrder.external_sale_number) !== null && _external_sale_number3 !== void 0 ? _external_sale_number3 : fresh.external_sale_number) !== null && _ref4 !== void 0 ? _ref4 : null,
2452
+ local_is_draft_order: (_existingOrder$is_dra = existingOrder.is_draft_order) !== null && _existingOrder$is_dra !== void 0 ? _existingOrder$is_dra : null,
2453
+ remote_is_draft_order: (_fresh$is_draft_order = fresh.is_draft_order) !== null && _fresh$is_draft_order !== void 0 ? _fresh$is_draft_order : null,
2454
+ reason: 'protect_draft_order_from_remote_echo'
2455
+ });
2456
+ return _context19.abrupt("continue", 94);
2457
+ case 53:
1832
2458
  mergedOrder = this.mergeOrderRecords(existingOrder, fresh);
1833
- updatedList[matchIndex] = mergedOrder;
2459
+ freshOrderId = fresh.order_id;
2460
+ incomingProductsAreStable = freshOrderId !== undefined && freshOrderId !== null && incomingProductsHaveStableIdentity.get(this.getIdKey(freshOrderId)) !== false;
2461
+ membershipChange = null;
2462
+ if (Array.isArray(fresh.products) && freshOrderId !== undefined && freshOrderId !== null && existingProductsHaveStableIdentity[matchIndex] !== false && incomingProductsAreStable) {
2463
+ membershipChange = this.getRemoteProductMembershipChange(existingOrder, mergedOrder, source);
2464
+ }
2465
+ mergedProductsHaveStableIdentity = existingProductsHaveStableIdentity[matchIndex] !== false && incomingProductsAreStable;
2466
+ adjustedMatchIndex = matchIndex;
2467
+ duplicateIndexes = new Set();
2468
+ _iterator17 = _createForOfIteratorHelper(freshIdentityKeys);
2469
+ _context19.prev = 62;
2470
+ _iterator17.s();
2471
+ case 64:
2472
+ if ((_step17 = _iterator17.n()).done) {
2473
+ _context19.next = 72;
2474
+ break;
2475
+ }
2476
+ _key2 = _step17.value;
2477
+ _duplicateIndex = identityKeyToIndex.get(_key2);
2478
+ if (!(_duplicateIndex === undefined || _duplicateIndex === matchIndex)) {
2479
+ _context19.next = 69;
2480
+ break;
2481
+ }
2482
+ return _context19.abrupt("continue", 70);
2483
+ case 69:
2484
+ duplicateIndexes.add(_duplicateIndex);
2485
+ case 70:
2486
+ _context19.next = 64;
2487
+ break;
2488
+ case 72:
2489
+ _context19.next = 77;
2490
+ break;
2491
+ case 74:
2492
+ _context19.prev = 74;
2493
+ _context19.t1 = _context19["catch"](62);
2494
+ _iterator17.e(_context19.t1);
2495
+ case 77:
2496
+ _context19.prev = 77;
2497
+ _iterator17.f();
2498
+ return _context19.finish(77);
2499
+ case 80:
2500
+ if (duplicateIndexes.size > 0) {
2501
+ _iterator18 = _createForOfIteratorHelper(_toConsumableArray(duplicateIndexes).sort(function (left, right) {
2502
+ return right - left;
2503
+ }));
2504
+ try {
2505
+ for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {
2506
+ duplicateIndex = _step18.value;
2507
+ mergedOrder = this.mergeOrderRecords(mergedOrder, updatedList[duplicateIndex]);
2508
+ mergedProductsHaveStableIdentity = mergedProductsHaveStableIdentity && existingProductsHaveStableIdentity[duplicateIndex] !== false;
2509
+ updatedList.splice(duplicateIndex, 1);
2510
+ existingProductsHaveStableIdentity.splice(duplicateIndex, 1);
2511
+ if (duplicateIndex < adjustedMatchIndex) adjustedMatchIndex -= 1;
2512
+ }
2513
+ } catch (err) {
2514
+ _iterator18.e(err);
2515
+ } finally {
2516
+ _iterator18.f();
2517
+ }
2518
+ identityKeyToIndex.clear();
2519
+ for (_index = 0; _index < updatedList.length; _index += 1) {
2520
+ _iterator19 = _createForOfIteratorHelper(this.getOrderIdentityMatchKeys(updatedList[_index]));
2521
+ try {
2522
+ for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {
2523
+ _key = _step19.value;
2524
+ if (!identityKeyToIndex.has(_key)) identityKeyToIndex.set(_key, _index);
2525
+ }
2526
+ } catch (err) {
2527
+ _iterator19.e(err);
2528
+ } finally {
2529
+ _iterator19.f();
2530
+ }
2531
+ }
2532
+ }
2533
+ updatedList[adjustedMatchIndex] = mergedOrder;
2534
+ existingProductsHaveStableIdentity[adjustedMatchIndex] = mergedProductsHaveStableIdentity;
2535
+ if (membershipChange) {
2536
+ remoteProductMembershipChanges.push(membershipChange);
2537
+ mergedStorageKey = this.getOrderStorageKey(mergedOrder);
2538
+ if (mergedStorageKey) forceWriteStorageKeys.add(mergedStorageKey);
2539
+ }
1834
2540
  // 合并后身份字段可能新增(如挂单拿到 order_id),同步登记到索引,
1835
2541
  // 供同批后续 fresh 命中同一槽位,避免重复插入
1836
- this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, matchIndex);
2542
+ this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, adjustedMatchIndex);
1837
2543
  patchedOrders.push(mergedOrder);
1838
2544
  if (mergeKey) mergeActions[mergeKey] = 'update';
1839
- return _context16.abrupt("continue", 55);
1840
- case 50:
2545
+ return _context19.abrupt("continue", 94);
2546
+ case 88:
1841
2547
  insertIndex = updatedList.length;
1842
2548
  updatedList.push(fresh);
2549
+ existingProductsHaveStableIdentity.push(fresh.order_id !== undefined && fresh.order_id !== null && incomingProductsHaveStableIdentity.get(this.getIdKey(fresh.order_id)) !== false);
1843
2550
  this.registerOrderIdentityKeys(identityKeyToIndex, fresh, insertIndex);
1844
2551
  patchedOrders.push(fresh);
1845
2552
  if (mergeKey) mergeActions[mergeKey] = 'insert';
1846
- case 55:
1847
- _context16.next = 33;
2553
+ case 94:
2554
+ _context19.next = 39;
1848
2555
  break;
1849
- case 57:
1850
- _context16.next = 62;
2556
+ case 96:
2557
+ _context19.next = 101;
1851
2558
  break;
1852
- case 59:
1853
- _context16.prev = 59;
1854
- _context16.t1 = _context16["catch"](31);
1855
- _iterator12.e(_context16.t1);
1856
- case 62:
1857
- _context16.prev = 62;
1858
- _iterator12.f();
1859
- return _context16.finish(62);
1860
- case 65:
2559
+ case 98:
2560
+ _context19.prev = 98;
2561
+ _context19.t2 = _context19["catch"](37);
2562
+ _iterator16.e(_context19.t2);
2563
+ case 101:
2564
+ _context19.prev = 101;
2565
+ _iterator16.f();
2566
+ return _context19.finish(101);
2567
+ case 104:
1861
2568
  insertCount = Object.values(mergeActions).filter(function (v) {
1862
2569
  return v === 'insert';
1863
2570
  }).length;
@@ -1873,24 +2580,27 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1873
2580
  // 仅在自检开关开启时做一次兜底校验。
1874
2581
  this.store.list = this.runOrderStoreSelfCheck(updatedList, "".concat(source, ".store"));
1875
2582
  this.syncOrdersMap();
1876
- _context16.next = 72;
1877
- return this.patchOrdersInSQLite(patchedOrders, source, mergeActions);
1878
- case 72:
2583
+ _context19.next = 111;
2584
+ return this.patchOrdersInSQLite(patchedOrders, source, mergeActions, {}, forceWriteStorageKeys);
2585
+ case 111:
1879
2586
  this.logInfo('mergeOrdersToStore-结束', {
1880
2587
  uniqueFreshCount: uniqueFreshCount,
1881
2588
  storeOrderCountAfter: this.store.list.length,
1882
2589
  insertCount: insertCount,
1883
2590
  updateCount: updateCount
1884
2591
  });
1885
- _context16.next = 75;
2592
+ _context19.next = 114;
2593
+ return this.emitRemoteProductMembershipChanges(remoteProductMembershipChanges);
2594
+ case 114:
2595
+ _context19.next = 116;
1886
2596
  return this.emitOrdersChanged(patchedOrders, source);
1887
- case 75:
2597
+ case 116:
1888
2598
  case "end":
1889
- return _context16.stop();
2599
+ return _context19.stop();
1890
2600
  }
1891
- }, _callee16, this, [[5, 17, 20, 23], [31, 59, 62, 65]]);
2601
+ }, _callee19, this, [[6, 20, 23, 26], [37, 98, 101, 104], [62, 74, 77, 80]]);
1892
2602
  }));
1893
- function mergeOrdersToStore(_x9, _x10) {
2603
+ function mergeOrdersToStore(_x13, _x14) {
1894
2604
  return _mergeOrdersToStore.apply(this, arguments);
1895
2605
  }
1896
2606
  return mergeOrdersToStore;
@@ -1907,19 +2617,19 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1907
2617
  key: "lookupOrderIndexByIdentityKeys",
1908
2618
  value: function lookupOrderIndexByIdentityKeys(identityKeyToIndex, identityKeys) {
1909
2619
  var matchIndex = -1;
1910
- var _iterator13 = _createForOfIteratorHelper(identityKeys),
1911
- _step13;
2620
+ var _iterator20 = _createForOfIteratorHelper(identityKeys),
2621
+ _step20;
1912
2622
  try {
1913
- for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
1914
- var key = _step13.value;
2623
+ for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {
2624
+ var key = _step20.value;
1915
2625
  var index = identityKeyToIndex.get(key);
1916
2626
  if (index === undefined) continue;
1917
2627
  if (matchIndex < 0 || index < matchIndex) matchIndex = index;
1918
2628
  }
1919
2629
  } catch (err) {
1920
- _iterator13.e(err);
2630
+ _iterator20.e(err);
1921
2631
  } finally {
1922
- _iterator13.f();
2632
+ _iterator20.f();
1923
2633
  }
1924
2634
  return matchIndex;
1925
2635
  }
@@ -1928,6 +2638,92 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1928
2638
  value: function isRemoteEchoMergeSource(source) {
1929
2639
  return source === 'pubsub.bodyUpsert' || source === 'pubsub.httpRefresh';
1930
2640
  }
2641
+ }, {
2642
+ key: "getProductMembershipKey",
2643
+ value: function getProductMembershipKey(product) {
2644
+ var persistentId = getOrderCollectionPersistentId('product', product);
2645
+ if (persistentId) return "order_detail_id:".concat(persistentId);
2646
+ var uid = getOrderCollectionUid('product', product);
2647
+ return uid ? "unique_identification_number:".concat(uid) : '';
2648
+ }
2649
+ }, {
2650
+ key: "doProductsHaveStableMembershipIdentity",
2651
+ value: function doProductsHaveStableMembershipIdentity(products) {
2652
+ if (!Array.isArray(products)) return true;
2653
+ return products.every(function (product) {
2654
+ return Boolean(getOrderCollectionPersistentId('product', product) || getOrderCollectionUid('product', product));
2655
+ });
2656
+ }
2657
+
2658
+ /**
2659
+ * 冲突提示关注逻辑商品行,而不是服务端 checkout 过程中可能被重建的 detail 记录。
2660
+ * 通用集合合并仍以 order_detail_id 为事实主键;这里只允许相同稳定 UID 跨 detail id 对齐,
2661
+ * 避免本机 checkout 回声被误判成“一删一增”。
2662
+ */
2663
+ }, {
2664
+ key: "isSameProductMembershipItem",
2665
+ value: function isSameProductMembershipItem(left, right) {
2666
+ if (isSameOrderCollectionItem('product', left, right)) return true;
2667
+ var leftUid = getOrderCollectionUid('product', left);
2668
+ var rightUid = getOrderCollectionUid('product', right);
2669
+ return Boolean(leftUid && rightUid && leftUid === rightUid);
2670
+ }
2671
+
2672
+ /**
2673
+ * 对比合并前后的商品成员集合。商品字段修改与数组重排不会产生 diff。
2674
+ */
2675
+ }, {
2676
+ key: "getRemoteProductMembershipChange",
2677
+ value: function getRemoteProductMembershipChange(existingOrder, mergedOrder, source) {
2678
+ var _this17 = this,
2679
+ _mergedOrder$order_id;
2680
+ if (!this.isRemoteEchoMergeSource(source)) return null;
2681
+ var previousProducts = Array.isArray(existingOrder.products) ? existingOrder.products : [];
2682
+ var currentProducts = Array.isArray(mergedOrder.products) ? mergedOrder.products : [];
2683
+ var unmatchedCurrentIndexes = new Set(currentProducts.map(function (_, index) {
2684
+ return index;
2685
+ }));
2686
+ var removedProductKeys = [];
2687
+ var _iterator21 = _createForOfIteratorHelper(previousProducts),
2688
+ _step21;
2689
+ try {
2690
+ var _loop2 = function _loop2() {
2691
+ var previousProduct = _step21.value;
2692
+ var matchedIndex = currentProducts.findIndex(function (currentProduct, index) {
2693
+ return unmatchedCurrentIndexes.has(index) && _this17.isSameProductMembershipItem(previousProduct, currentProduct);
2694
+ });
2695
+ if (matchedIndex >= 0) {
2696
+ unmatchedCurrentIndexes.delete(matchedIndex);
2697
+ return 1; // continue
2698
+ }
2699
+ var productKey = _this17.getProductMembershipKey(previousProduct);
2700
+ if (productKey) removedProductKeys.push(productKey);
2701
+ };
2702
+ for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {
2703
+ if (_loop2()) continue;
2704
+ }
2705
+ } catch (err) {
2706
+ _iterator21.e(err);
2707
+ } finally {
2708
+ _iterator21.f();
2709
+ }
2710
+ var addedProductKeys = _toConsumableArray(unmatchedCurrentIndexes).map(function (index) {
2711
+ return _this17.getProductMembershipKey(currentProducts[index]);
2712
+ }).filter(Boolean);
2713
+ if (addedProductKeys.length === 0 && removedProductKeys.length === 0) {
2714
+ return null;
2715
+ }
2716
+ var orderId = (_mergedOrder$order_id = mergedOrder.order_id) !== null && _mergedOrder$order_id !== void 0 ? _mergedOrder$order_id : existingOrder.order_id;
2717
+ if (orderId === undefined || orderId === null) return null;
2718
+ return {
2719
+ order_id: orderId,
2720
+ source: source,
2721
+ added_product_keys: addedProductKeys,
2722
+ removed_product_keys: removedProductKeys,
2723
+ previous_product_count: previousProducts.length,
2724
+ current_product_count: currentProducts.length
2725
+ };
2726
+ }
1931
2727
 
1932
2728
  /**
1933
2729
  * 将订单的全部身份键登记到索引并指向其在列表中的下标。
@@ -1940,17 +2736,17 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1940
2736
  key: "registerOrderIdentityKeys",
1941
2737
  value: function registerOrderIdentityKeys(identityKeyToIndex, order, index) {
1942
2738
  var identityKeys = this.getOrderIdentityMatchKeys(order);
1943
- var _iterator14 = _createForOfIteratorHelper(identityKeys),
1944
- _step14;
2739
+ var _iterator22 = _createForOfIteratorHelper(identityKeys),
2740
+ _step22;
1945
2741
  try {
1946
- for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
1947
- var key = _step14.value;
2742
+ for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {
2743
+ var key = _step22.value;
1948
2744
  identityKeyToIndex.set(key, index);
1949
2745
  }
1950
2746
  } catch (err) {
1951
- _iterator14.e(err);
2747
+ _iterator22.e(err);
1952
2748
  } finally {
1953
- _iterator14.f();
2749
+ _iterator22.f();
1954
2750
  }
1955
2751
  }
1956
2752
 
@@ -2005,17 +2801,17 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2005
2801
  key: "uniqueOrderIds",
2006
2802
  value: function uniqueOrderIds(ids) {
2007
2803
  var idMap = new Map();
2008
- var _iterator15 = _createForOfIteratorHelper(ids),
2009
- _step15;
2804
+ var _iterator23 = _createForOfIteratorHelper(ids),
2805
+ _step23;
2010
2806
  try {
2011
- for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
2012
- var id = _step15.value;
2807
+ for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {
2808
+ var id = _step23.value;
2013
2809
  idMap.set(this.getIdKey(id), id);
2014
2810
  }
2015
2811
  } catch (err) {
2016
- _iterator15.e(err);
2812
+ _iterator23.e(err);
2017
2813
  } finally {
2018
- _iterator15.f();
2814
+ _iterator23.f();
2019
2815
  }
2020
2816
  return _toConsumableArray(idMap.values());
2021
2817
  }
@@ -2027,12 +2823,12 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2027
2823
  }, {
2028
2824
  key: "isOrderLookupMatch",
2029
2825
  value: function isOrderLookupMatch(order, lookupKey) {
2030
- var _this16 = this;
2826
+ var _this18 = this;
2031
2827
  if (!order || !lookupKey) return false;
2032
2828
  var candidates = [order.order_id, order.external_sale_number, order.order_number, order.shop_order_number, order.shop_full_order_number];
2033
2829
  return candidates.some(function (value) {
2034
2830
  if (value === undefined || value === null || value === '') return false;
2035
- return _this16.getIdKey(value) === lookupKey;
2831
+ return _this18.getIdKey(value) === lookupKey;
2036
2832
  });
2037
2833
  }
2038
2834
 
@@ -2075,10 +2871,10 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2075
2871
  }, {
2076
2872
  key: "findOrderIndexByIdentity",
2077
2873
  value: function findOrderIndexByIdentity(orders, target) {
2078
- var _this17 = this;
2874
+ var _this19 = this;
2079
2875
  if (this.getOrderIdentityMatchKeys(target).length === 0) return -1;
2080
2876
  return orders.findIndex(function (order) {
2081
- return _this17.doOrdersShareIdentity(order, target);
2877
+ return _this19.doOrdersShareIdentity(order, target);
2082
2878
  });
2083
2879
  }
2084
2880
  }, {
@@ -2102,6 +2898,121 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2102
2898
  if (rightScore >= leftScore) return right;
2103
2899
  return left;
2104
2900
  }
2901
+ }, {
2902
+ key: "getProductIdentityKeys",
2903
+ value: function getProductIdentityKeys(product) {
2904
+ var _record$metadata;
2905
+ var record = product;
2906
+ if (!record) return [];
2907
+ var keys = [];
2908
+ var metadataUid = (_record$metadata = record.metadata) === null || _record$metadata === void 0 ? void 0 : _record$metadata.unique_identification_number;
2909
+ if (!this.isBlankIdentityValue(metadataUid)) keys.push("uid:".concat(String(metadataUid)));
2910
+ var topLevelUid = record.unique_identification_number;
2911
+ if (!this.isBlankIdentityValue(topLevelUid)) keys.push("uid:".concat(String(topLevelUid)));
2912
+ var orderDetailId = record.order_detail_id;
2913
+ if (!this.isBlankIdentityValue(orderDetailId)) keys.push("detail:".concat(String(orderDetailId)));
2914
+ var bookingUid = record.booking_uid;
2915
+ if (!this.isBlankIdentityValue(bookingUid)) keys.push("booking:".concat(String(bookingUid)));
2916
+ return keys;
2917
+ }
2918
+ }, {
2919
+ key: "mergeOrderProductLists",
2920
+ value: function mergeOrderProductLists(preferred, secondary) {
2921
+ var preferredList = Array.isArray(preferred) ? preferred : [];
2922
+ var secondaryList = Array.isArray(secondary) ? secondary : [];
2923
+ if (secondaryList.length === 0) return preferredList;
2924
+ if (preferredList.length === 0) return secondaryList;
2925
+ var seenKeys = new Set();
2926
+ var _iterator24 = _createForOfIteratorHelper(preferredList),
2927
+ _step24;
2928
+ try {
2929
+ for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {
2930
+ var item = _step24.value;
2931
+ var keys = this.getProductIdentityKeys(item);
2932
+ var _iterator26 = _createForOfIteratorHelper(keys),
2933
+ _step26;
2934
+ try {
2935
+ for (_iterator26.s(); !(_step26 = _iterator26.n()).done;) {
2936
+ var key = _step26.value;
2937
+ seenKeys.add(key);
2938
+ }
2939
+ } catch (err) {
2940
+ _iterator26.e(err);
2941
+ } finally {
2942
+ _iterator26.f();
2943
+ }
2944
+ }
2945
+ } catch (err) {
2946
+ _iterator24.e(err);
2947
+ } finally {
2948
+ _iterator24.f();
2949
+ }
2950
+ var result = _toConsumableArray(preferredList);
2951
+ var _iterator25 = _createForOfIteratorHelper(secondaryList),
2952
+ _step25;
2953
+ try {
2954
+ for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {
2955
+ var _item = _step25.value;
2956
+ var _keys = this.getProductIdentityKeys(_item);
2957
+ if (_keys.length === 0 || _keys.some(function (key) {
2958
+ return seenKeys.has(key);
2959
+ })) continue;
2960
+ var _iterator27 = _createForOfIteratorHelper(_keys),
2961
+ _step27;
2962
+ try {
2963
+ for (_iterator27.s(); !(_step27 = _iterator27.n()).done;) {
2964
+ var _key3 = _step27.value;
2965
+ seenKeys.add(_key3);
2966
+ }
2967
+ } catch (err) {
2968
+ _iterator27.e(err);
2969
+ } finally {
2970
+ _iterator27.f();
2971
+ }
2972
+ result.push(cloneDeep(_item));
2973
+ }
2974
+ } catch (err) {
2975
+ _iterator25.e(err);
2976
+ } finally {
2977
+ _iterator25.f();
2978
+ }
2979
+ return result;
2980
+ }
2981
+ }, {
2982
+ key: "mergeOrderPaymentLists",
2983
+ value: function mergeOrderPaymentLists(existing, incoming) {
2984
+ var existingList = Array.isArray(existing) ? existing : [];
2985
+ var incomingList = Array.isArray(incoming) ? incoming : [];
2986
+ if (incomingList.length === 0) return cloneDeep(existingList);
2987
+ return mergeOrderPaymentListsByIdentity(existingList, incomingList);
2988
+ }
2989
+ }, {
2990
+ key: "getIdentifiedPendingPayments",
2991
+ value: function getIdentifiedPendingPayments(order) {
2992
+ var payments = Array.isArray(order === null || order === void 0 ? void 0 : order.payments) ? order.payments : [];
2993
+ return payments.filter(function (payment) {
2994
+ return isIdentifiedPendingOrderPayment(payment);
2995
+ });
2996
+ }
2997
+ }, {
2998
+ key: "shouldProtectLocalOrderFromRemoteSnapshot",
2999
+ value: function shouldProtectLocalOrderFromRemoteSnapshot(order) {
3000
+ return this.isPendingSyncOrder(order) || this.isDraftOrder(order) || this.getIdentifiedPendingPayments(order).length > 0;
3001
+ }
3002
+ }, {
3003
+ key: "getUnmatchedIdentifiedPendingPayments",
3004
+ value: function getUnmatchedIdentifiedPendingPayments(existing, incoming) {
3005
+ var existingPayments = Array.isArray(existing) ? existing : [];
3006
+ var incomingPayments = Array.isArray(incoming) ? incoming : [];
3007
+ var incomingIdentityKeys = new Set(incomingPayments.flatMap(function (payment) {
3008
+ return getOrderPaymentIdentityKeys(payment);
3009
+ }));
3010
+ return existingPayments.filter(function (payment) {
3011
+ return isIdentifiedPendingOrderPayment(payment) && !getOrderPaymentIdentityKeys(payment).some(function (key) {
3012
+ return incomingIdentityKeys.has(key);
3013
+ });
3014
+ });
3015
+ }
2105
3016
  }, {
2106
3017
  key: "mergeOrderRecords",
2107
3018
  value: function mergeOrderRecords(existing, incoming) {
@@ -2109,7 +3020,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2109
3020
  var secondary = preferred === existing ? incoming : existing;
2110
3021
  var merged = _objectSpread(_objectSpread({}, secondary), preferred);
2111
3022
  var fieldsToPreserve = ['order_id', 'external_sale_number', 'order_number', 'shop_order_number', 'shop_full_order_number'];
2112
- var incomingPatchFields = ['payment_status', 'status', 'shipping_status', 'updated_at', 'shop_discount', 'summary', 'note', 'customer_id', 'customer_name', 'customer', 'holder', 'contacts_info', 'phone', 'email', 'relation_forms'];
3023
+ var incomingPatchFields = ['payment_status', 'status', 'shipping_status', 'updated_at', 'shop_discount', 'summary', 'note', 'customer_id', 'customer_name', 'customer', 'holder', 'contacts_info', 'phone', 'email', 'relation_forms', 'is_draft_order'];
2113
3024
  var mergedRecord = merged;
2114
3025
  var preferredRecord = preferred;
2115
3026
  var secondaryRecord = secondary;
@@ -2139,7 +3050,23 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2139
3050
  for (var _i6 = 0, _ORDER_AUTHORITATIVE_2 = ORDER_AUTHORITATIVE_COLLECTION_FIELDS; _i6 < _ORDER_AUTHORITATIVE_2.length; _i6++) {
2140
3051
  var _field2 = _ORDER_AUTHORITATIVE_2[_i6];
2141
3052
  if (Array.isArray(incomingRecord[_field2])) {
2142
- mergedRecord[_field2] = this.mergeAuthoritativeOrderCollection(_field2, existingRecord[_field2], incomingRecord[_field2], childUidRemaps);
3053
+ if (_field2 === 'payments') {
3054
+ var preservedPending = this.getUnmatchedIdentifiedPendingPayments(existingRecord[_field2], incomingRecord[_field2]);
3055
+ if (preservedPending.length > 0) {
3056
+ var _ref5, _existing$order_id, _ref6, _existingRecord$exter;
3057
+ this.logInfo('mergeOrderRecords-保留本地 pending 支付项', {
3058
+ order_id: (_ref5 = (_existing$order_id = existing.order_id) !== null && _existing$order_id !== void 0 ? _existing$order_id : incoming.order_id) !== null && _ref5 !== void 0 ? _ref5 : null,
3059
+ external_sale_number: (_ref6 = (_existingRecord$exter = existingRecord.external_sale_number) !== null && _existingRecord$exter !== void 0 ? _existingRecord$exter : incomingRecord.external_sale_number) !== null && _ref6 !== void 0 ? _ref6 : null,
3060
+ preserved_pending_count: preservedPending.length,
3061
+ preserved_payment_identities: preservedPending.map(function (payment) {
3062
+ return getOrderPaymentIdentityKeys(payment);
3063
+ })
3064
+ });
3065
+ }
3066
+ }
3067
+ mergedRecord[_field2] = this.mergeAuthoritativeOrderCollection(_field2, existingRecord[_field2], incomingRecord[_field2], childUidRemaps, {
3068
+ preserveIdentifiedPendingPayments: _field2 === 'payments'
3069
+ });
2143
3070
  continue;
2144
3071
  }
2145
3072
  if (Object.prototype.hasOwnProperty.call(existingRecord, _field2)) {
@@ -2157,50 +3084,51 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2157
3084
  key: "summarizeDuplicateOrders",
2158
3085
  value: function summarizeDuplicateOrders(orders) {
2159
3086
  var groups = new Map();
2160
- var _iterator16 = _createForOfIteratorHelper(orders),
2161
- _step16;
3087
+ var _iterator28 = _createForOfIteratorHelper(orders),
3088
+ _step28;
2162
3089
  try {
2163
- for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
2164
- var order = _step16.value;
2165
- var _iterator17 = _createForOfIteratorHelper(this.getOrderIdentityMatchKeys(order)),
2166
- _step17;
3090
+ for (_iterator28.s(); !(_step28 = _iterator28.n()).done;) {
3091
+ var order = _step28.value;
3092
+ var _iterator29 = _createForOfIteratorHelper(this.getOrderIdentityMatchKeys(order)),
3093
+ _step29;
2167
3094
  try {
2168
- for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {
2169
- var key = _step17.value;
3095
+ for (_iterator29.s(); !(_step29 = _iterator29.n()).done;) {
3096
+ var key = _step29.value;
2170
3097
  var group = groups.get(key) || [];
2171
3098
  group.push(order);
2172
3099
  groups.set(key, group);
2173
3100
  }
2174
3101
  } catch (err) {
2175
- _iterator17.e(err);
3102
+ _iterator29.e(err);
2176
3103
  } finally {
2177
- _iterator17.f();
3104
+ _iterator29.f();
2178
3105
  }
2179
3106
  }
2180
3107
  } catch (err) {
2181
- _iterator16.e(err);
3108
+ _iterator28.e(err);
2182
3109
  } finally {
2183
- _iterator16.f();
3110
+ _iterator28.f();
2184
3111
  }
2185
- return _toConsumableArray(groups.entries()).filter(function (_ref4) {
2186
- var _ref5 = _slicedToArray(_ref4, 2),
2187
- group = _ref5[1];
3112
+ return _toConsumableArray(groups.entries()).filter(function (_ref7) {
3113
+ var _ref8 = _slicedToArray(_ref7, 2),
3114
+ group = _ref8[1];
2188
3115
  return group.length > 1;
2189
- }).slice(0, 20).map(function (_ref6) {
2190
- var _ref7 = _slicedToArray(_ref6, 2),
2191
- key = _ref7[0],
2192
- group = _ref7[1];
3116
+ }).slice(0, 20).map(function (_ref9) {
3117
+ var _ref10 = _slicedToArray(_ref9, 2),
3118
+ key = _ref10[0],
3119
+ group = _ref10[1];
2193
3120
  return {
2194
3121
  key: key,
2195
3122
  count: group.length,
2196
3123
  orders: group.map(function (order) {
2197
- var _order$order_id3, _external_sale_number3, _shop_order_number, _shop_full_order_numb, _order$need_sync;
3124
+ var _order$order_id4, _external_sale_number4, _shop_order_number, _shop_full_order_numb, _order$need_sync, _order$is_draft_order;
2198
3125
  return {
2199
- order_id: (_order$order_id3 = order.order_id) !== null && _order$order_id3 !== void 0 ? _order$order_id3 : null,
2200
- external_sale_number: (_external_sale_number3 = order.external_sale_number) !== null && _external_sale_number3 !== void 0 ? _external_sale_number3 : null,
3126
+ order_id: (_order$order_id4 = order.order_id) !== null && _order$order_id4 !== void 0 ? _order$order_id4 : null,
3127
+ external_sale_number: (_external_sale_number4 = order.external_sale_number) !== null && _external_sale_number4 !== void 0 ? _external_sale_number4 : null,
2201
3128
  shop_order_number: (_shop_order_number = order.shop_order_number) !== null && _shop_order_number !== void 0 ? _shop_order_number : null,
2202
3129
  shop_full_order_number: (_shop_full_order_numb = order.shop_full_order_number) !== null && _shop_full_order_numb !== void 0 ? _shop_full_order_numb : null,
2203
- need_sync: (_order$need_sync = order.need_sync) !== null && _order$need_sync !== void 0 ? _order$need_sync : null
3130
+ need_sync: (_order$need_sync = order.need_sync) !== null && _order$need_sync !== void 0 ? _order$need_sync : null,
3131
+ is_draft_order: (_order$is_draft_order = order.is_draft_order) !== null && _order$is_draft_order !== void 0 ? _order$is_draft_order : null
2204
3132
  };
2205
3133
  })
2206
3134
  };
@@ -2222,11 +3150,11 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2222
3150
  value: function compactOrderListByIdentity(orders, source) {
2223
3151
  var list = [];
2224
3152
  var removedCount = 0;
2225
- var _iterator18 = _createForOfIteratorHelper(orders),
2226
- _step18;
3153
+ var _iterator30 = _createForOfIteratorHelper(orders),
3154
+ _step30;
2227
3155
  try {
2228
- for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {
2229
- var order = _step18.value;
3156
+ for (_iterator30.s(); !(_step30 = _iterator30.n()).done;) {
3157
+ var order = _step30.value;
2230
3158
  var normalizedOrder = this.normalizeOrderCollectionsForIngress(order, "".concat(source, ".order"));
2231
3159
  var matchIndex = this.findOrderIndexByIdentity(list, normalizedOrder);
2232
3160
  if (matchIndex < 0) {
@@ -2237,9 +3165,9 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2237
3165
  removedCount += 1;
2238
3166
  }
2239
3167
  } catch (err) {
2240
- _iterator18.e(err);
3168
+ _iterator30.e(err);
2241
3169
  } finally {
2242
- _iterator18.f();
3170
+ _iterator30.f();
2243
3171
  }
2244
3172
  if (removedCount > 0) {
2245
3173
  this.logWarning('订单列表重复项已压缩', {
@@ -2337,35 +3265,35 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2337
3265
  }, {
2338
3266
  key: "loadOrdersFromSQLite",
2339
3267
  value: function () {
2340
- var _loadOrdersFromSQLite = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee17() {
2341
- var _this18 = this;
3268
+ var _loadOrdersFromSQLite = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee20() {
3269
+ var _this20 = this;
2342
3270
  var orders;
2343
- return _regeneratorRuntime().wrap(function _callee17$(_context17) {
2344
- while (1) switch (_context17.prev = _context17.next) {
3271
+ return _regeneratorRuntime().wrap(function _callee20$(_context20) {
3272
+ while (1) switch (_context20.prev = _context20.next) {
2345
3273
  case 0:
2346
3274
  if (this.dbManager) {
2347
- _context17.next = 2;
3275
+ _context20.next = 2;
2348
3276
  break;
2349
3277
  }
2350
- return _context17.abrupt("return", []);
3278
+ return _context20.abrupt("return", []);
2351
3279
  case 2:
2352
- _context17.prev = 2;
2353
- _context17.next = 5;
3280
+ _context20.prev = 2;
3281
+ _context20.next = 5;
2354
3282
  return this.dbManager.getAll(INDEXDB_STORE_NAME);
2355
3283
  case 5:
2356
- orders = _context17.sent;
2357
- return _context17.abrupt("return", (orders || []).map(function (order) {
2358
- return _this18.normalizeOrderCollectionsForIngress(order, 'loadOrdersFromSQLite');
3284
+ orders = _context20.sent;
3285
+ return _context20.abrupt("return", (orders || []).map(function (order) {
3286
+ return _this20.normalizeOrderCollectionsForIngress(order, 'loadOrdersFromSQLite');
2359
3287
  }));
2360
3288
  case 9:
2361
- _context17.prev = 9;
2362
- _context17.t0 = _context17["catch"](2);
2363
- return _context17.abrupt("return", []);
3289
+ _context20.prev = 9;
3290
+ _context20.t0 = _context20["catch"](2);
3291
+ return _context20.abrupt("return", []);
2364
3292
  case 12:
2365
3293
  case "end":
2366
- return _context17.stop();
3294
+ return _context20.stop();
2367
3295
  }
2368
- }, _callee17, this, [[2, 9]]);
3296
+ }, _callee20, this, [[2, 9]]);
2369
3297
  }));
2370
3298
  function loadOrdersFromSQLite() {
2371
3299
  return _loadOrdersFromSQLite.apply(this, arguments);
@@ -2377,41 +3305,71 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2377
3305
  value: function isPendingSyncOrder(order) {
2378
3306
  return Number(order === null || order === void 0 ? void 0 : order.need_sync) === 1;
2379
3307
  }
3308
+ }, {
3309
+ key: "isDraftOrder",
3310
+ value: function isDraftOrder(order) {
3311
+ return Number(order === null || order === void 0 ? void 0 : order.is_draft_order) === 1;
3312
+ }
3313
+ }, {
3314
+ key: "shouldProtectDraftOrderFromIncoming",
3315
+ value: function shouldProtectDraftOrderFromIncoming(source) {
3316
+ return source !== 'checkoutSync';
3317
+ }
2380
3318
  }, {
2381
3319
  key: "normalizeRemoteSyncedOrder",
2382
3320
  value: function normalizeRemoteSyncedOrder(order) {
2383
3321
  var normalizedOrder = this.normalizeOrderCollectionsForIngress(order, 'normalizeRemoteSyncedOrder');
2384
- if (this.isPendingSyncOrder(normalizedOrder)) return normalizedOrder;
3322
+ if (this.isPendingSyncOrder(normalizedOrder)) return _objectSpread(_objectSpread({}, normalizedOrder), {}, {
3323
+ is_draft_order: 0
3324
+ });
2385
3325
  return _objectSpread(_objectSpread({}, normalizedOrder), {}, {
2386
- need_sync: 0
3326
+ need_sync: 0,
3327
+ is_draft_order: 0
2387
3328
  });
2388
3329
  }
3330
+ }, {
3331
+ key: "mergeRemoteIdentityIntoDraftOrder",
3332
+ value: function mergeRemoteIdentityIntoDraftOrder(draftOrder, remoteOrder) {
3333
+ var merged = _objectSpread({}, this.withoutSyntheticDraftOrderId(draftOrder));
3334
+ var remote = remoteOrder;
3335
+ for (var _i7 = 0, _arr = ['order_id', 'order_number', 'shop_order_number', 'shop_full_order_number']; _i7 < _arr.length; _i7++) {
3336
+ var field = _arr[_i7];
3337
+ if (this.isBlankIdentityValue(merged[field]) && !this.isBlankIdentityValue(remote[field])) {
3338
+ merged[field] = remote[field];
3339
+ }
3340
+ }
3341
+ return this.normalizeOrderCollectionsForIngress(merged, 'mergeRemoteIdentityIntoDraftOrder');
3342
+ }
2389
3343
  }, {
2390
3344
  key: "mergeRemoteSnapshotWithPendingOrders",
2391
3345
  value: function mergeRemoteSnapshotWithPendingOrders(remoteOrders, existingOrders) {
2392
- var _this19 = this;
3346
+ var _this21 = this;
2393
3347
  var merged = remoteOrders.map(function (order) {
2394
- return _this19.normalizeRemoteSyncedOrder(order);
3348
+ return _this21.normalizeRemoteSyncedOrder(order);
2395
3349
  });
2396
- var _iterator19 = _createForOfIteratorHelper(existingOrders),
2397
- _step19;
3350
+ var _iterator31 = _createForOfIteratorHelper(existingOrders),
3351
+ _step31;
2398
3352
  try {
2399
- for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {
2400
- var rawOrder = _step19.value;
3353
+ for (_iterator31.s(); !(_step31 = _iterator31.n()).done;) {
3354
+ var rawOrder = _step31.value;
2401
3355
  var order = this.normalizeOrderCollectionsForIngress(rawOrder, 'mergeRemoteSnapshotWithPendingOrders.existingSQLite');
2402
- if (!this.isPendingSyncOrder(order)) continue;
3356
+ if (!this.shouldProtectLocalOrderFromRemoteSnapshot(order)) continue;
2403
3357
  var matchIndex = this.findOrderIndexByIdentity(merged, order);
2404
3358
  if (matchIndex >= 0) {
2405
- merged[matchIndex] = this.mergeOrderRecords(order, merged[matchIndex]);
3359
+ if (this.isDraftOrder(order)) {
3360
+ merged[matchIndex] = this.mergeRemoteIdentityIntoDraftOrder(order, merged[matchIndex]);
3361
+ } else {
3362
+ merged[matchIndex] = this.mergeOrderRecords(order, merged[matchIndex]);
3363
+ }
2406
3364
  continue;
2407
3365
  }
2408
3366
  if (!this.getOrderStorageKey(order)) continue;
2409
3367
  merged.push(order);
2410
3368
  }
2411
3369
  } catch (err) {
2412
- _iterator19.e(err);
3370
+ _iterator31.e(err);
2413
3371
  } finally {
2414
- _iterator19.f();
3372
+ _iterator31.f();
2415
3373
  }
2416
3374
  return this.compactOrderListByIdentity(merged, 'mergeRemoteSnapshotWithPendingOrders').list;
2417
3375
  }
@@ -2427,10 +3385,10 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2427
3385
  }, {
2428
3386
  key: "runInOrderSQLiteSaveQueue",
2429
3387
  value: (function () {
2430
- var _runInOrderSQLiteSaveQueue = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee18(task) {
3388
+ var _runInOrderSQLiteSaveQueue = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee21(task) {
2431
3389
  var queuedTask;
2432
- return _regeneratorRuntime().wrap(function _callee18$(_context18) {
2433
- while (1) switch (_context18.prev = _context18.next) {
3390
+ return _regeneratorRuntime().wrap(function _callee21$(_context21) {
3391
+ while (1) switch (_context21.prev = _context21.next) {
2434
3392
  case 0:
2435
3393
  queuedTask = this.orderSQLiteSaveQueue.then(task, task);
2436
3394
  this.orderSQLiteSaveQueue = queuedTask.then(function () {
@@ -2438,14 +3396,14 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2438
3396
  }, function () {
2439
3397
  return undefined;
2440
3398
  });
2441
- return _context18.abrupt("return", queuedTask);
3399
+ return _context21.abrupt("return", queuedTask);
2442
3400
  case 3:
2443
3401
  case "end":
2444
- return _context18.stop();
3402
+ return _context21.stop();
2445
3403
  }
2446
- }, _callee18, this);
3404
+ }, _callee21, this);
2447
3405
  }));
2448
- function runInOrderSQLiteSaveQueue(_x11) {
3406
+ function runInOrderSQLiteSaveQueue(_x15) {
2449
3407
  return _runInOrderSQLiteSaveQueue.apply(this, arguments);
2450
3408
  }
2451
3409
  return runInOrderSQLiteSaveQueue;
@@ -2460,146 +3418,176 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2460
3418
  }, {
2461
3419
  key: "patchOrdersInSQLite",
2462
3420
  value: (function () {
2463
- var _patchOrdersInSQLite = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee20(orders, source) {
2464
- var _this20 = this;
3421
+ var _patchOrdersInSQLite = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee23(orders, source) {
3422
+ var _this22 = this;
2465
3423
  var mergeActions,
3424
+ options,
3425
+ forceWriteStorageKeys,
2466
3426
  ordersSnapshot,
2467
3427
  _this$filterRedundant2,
2468
3428
  toWrite,
2469
3429
  skipped,
2470
3430
  compactedToWrite,
2471
- _args20 = arguments;
2472
- return _regeneratorRuntime().wrap(function _callee20$(_context20) {
2473
- while (1) switch (_context20.prev = _context20.next) {
3431
+ _args23 = arguments;
3432
+ return _regeneratorRuntime().wrap(function _callee23$(_context23) {
3433
+ while (1) switch (_context23.prev = _context23.next) {
2474
3434
  case 0:
2475
- mergeActions = _args20.length > 2 && _args20[2] !== undefined ? _args20[2] : {};
2476
- if (!(!this.dbManager || orders.length === 0)) {
2477
- _context20.next = 3;
3435
+ mergeActions = _args23.length > 2 && _args23[2] !== undefined ? _args23[2] : {};
3436
+ options = _args23.length > 3 && _args23[3] !== undefined ? _args23[3] : {};
3437
+ forceWriteStorageKeys = _args23.length > 4 && _args23[4] !== undefined ? _args23[4] : new Set();
3438
+ if (!(orders.length === 0)) {
3439
+ _context23.next = 5;
2478
3440
  break;
2479
3441
  }
2480
- return _context20.abrupt("return");
2481
- case 3:
3442
+ return _context23.abrupt("return");
3443
+ case 5:
3444
+ if (this.dbManager) {
3445
+ _context23.next = 9;
3446
+ break;
3447
+ }
3448
+ if (!options.throwOnError) {
3449
+ _context23.next = 8;
3450
+ break;
3451
+ }
3452
+ throw new Error('订单 SQLite 数据库未初始化');
3453
+ case 8:
3454
+ return _context23.abrupt("return");
3455
+ case 9:
2482
3456
  ordersSnapshot = cloneDeep(orders).map(function (order) {
2483
- return _this20.normalizeOrderCollectionsForIngress(order, "".concat(source, ".sqliteIngress"));
3457
+ return _this22.normalizeOrderCollectionsForIngress(order, "".concat(source, ".sqliteIngress"));
2484
3458
  }).filter(function (order) {
2485
- return _this20.getOrderStorageKey(order);
3459
+ return _this22.getOrderStorageKey(order);
2486
3460
  });
2487
3461
  if (!(ordersSnapshot.length === 0)) {
2488
- _context20.next = 6;
3462
+ _context23.next = 12;
2489
3463
  break;
2490
3464
  }
2491
- return _context20.abrupt("return");
2492
- case 6:
2493
- _this$filterRedundant2 = this.filterRedundantPatchOrders(source, ordersSnapshot, mergeActions), toWrite = _this$filterRedundant2.toWrite, skipped = _this$filterRedundant2.skipped;
3465
+ return _context23.abrupt("return");
3466
+ case 12:
3467
+ _this$filterRedundant2 = this.filterRedundantPatchOrders(source, ordersSnapshot, mergeActions, forceWriteStorageKeys), toWrite = _this$filterRedundant2.toWrite, skipped = _this$filterRedundant2.skipped;
2494
3468
  if (!(toWrite.length === 0)) {
2495
- _context20.next = 9;
3469
+ _context23.next = 15;
2496
3470
  break;
2497
3471
  }
2498
- return _context20.abrupt("return");
2499
- case 9:
3472
+ return _context23.abrupt("return");
3473
+ case 15:
2500
3474
  compactedToWrite = this.compactOrderListByIdentity(toWrite, "".concat(source, ".sqlitePatch")).list;
2501
3475
  if (!(compactedToWrite.length === 0)) {
2502
- _context20.next = 12;
3476
+ _context23.next = 18;
2503
3477
  break;
2504
3478
  }
2505
- return _context20.abrupt("return");
2506
- case 12:
2507
- _context20.prev = 12;
2508
- _context20.next = 15;
2509
- return this.runInOrderSQLiteSaveQueue( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee19() {
2510
- var writeMethod, _iterator20, _step20, order;
2511
- return _regeneratorRuntime().wrap(function _callee19$(_context19) {
2512
- while (1) switch (_context19.prev = _context19.next) {
3479
+ return _context23.abrupt("return");
3480
+ case 18:
3481
+ _context23.prev = 18;
3482
+ _context23.next = 21;
3483
+ return this.runInOrderSQLiteSaveQueue( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee22() {
3484
+ var writeMethod, _iterator32, _step32, order;
3485
+ return _regeneratorRuntime().wrap(function _callee22$(_context22) {
3486
+ while (1) switch (_context22.prev = _context22.next) {
2513
3487
  case 0:
2514
3488
  writeMethod = 'none';
2515
- _this20.logInfo('patchOrdersInSQLite-开始', {
3489
+ _this22.logInfo('patchOrdersInSQLite-开始', {
2516
3490
  source: source,
2517
3491
  count: compactedToWrite.length,
2518
3492
  dedupedCount: skipped.length
2519
3493
  });
2520
- if (!(typeof _this20.dbManager.bulkUpdate === 'function')) {
2521
- _context19.next = 8;
3494
+ if (!(typeof _this22.dbManager.bulkUpdate === 'function')) {
3495
+ _context22.next = 8;
2522
3496
  break;
2523
3497
  }
2524
3498
  writeMethod = 'bulkUpdate';
2525
- _context19.next = 6;
2526
- return _this20.dbManager.bulkUpdate(INDEXDB_STORE_NAME, compactedToWrite);
3499
+ _context22.next = 6;
3500
+ return _this22.dbManager.bulkUpdate(INDEXDB_STORE_NAME, compactedToWrite);
2527
3501
  case 6:
2528
- _context19.next = 33;
3502
+ _context22.next = 37;
2529
3503
  break;
2530
3504
  case 8:
2531
- if (!(typeof _this20.dbManager.bulkAdd === 'function')) {
2532
- _context19.next = 14;
3505
+ if (!(typeof _this22.dbManager.bulkAdd === 'function')) {
3506
+ _context22.next = 14;
2533
3507
  break;
2534
3508
  }
2535
3509
  writeMethod = 'bulkAdd';
2536
- _context19.next = 12;
2537
- return _this20.dbManager.bulkAdd(INDEXDB_STORE_NAME, compactedToWrite);
3510
+ _context22.next = 12;
3511
+ return _this22.dbManager.bulkAdd(INDEXDB_STORE_NAME, compactedToWrite);
2538
3512
  case 12:
2539
- _context19.next = 33;
3513
+ _context22.next = 37;
2540
3514
  break;
2541
3515
  case 14:
2542
- if (!(typeof _this20.dbManager.update === 'function')) {
2543
- _context19.next = 33;
3516
+ if (!(typeof _this22.dbManager.update === 'function')) {
3517
+ _context22.next = 35;
2544
3518
  break;
2545
3519
  }
2546
3520
  writeMethod = 'update';
2547
- _iterator20 = _createForOfIteratorHelper(compactedToWrite);
2548
- _context19.prev = 17;
2549
- _iterator20.s();
3521
+ _iterator32 = _createForOfIteratorHelper(compactedToWrite);
3522
+ _context22.prev = 17;
3523
+ _iterator32.s();
2550
3524
  case 19:
2551
- if ((_step20 = _iterator20.n()).done) {
2552
- _context19.next = 25;
3525
+ if ((_step32 = _iterator32.n()).done) {
3526
+ _context22.next = 25;
2553
3527
  break;
2554
3528
  }
2555
- order = _step20.value;
2556
- _context19.next = 23;
2557
- return _this20.dbManager.update(INDEXDB_STORE_NAME, order);
3529
+ order = _step32.value;
3530
+ _context22.next = 23;
3531
+ return _this22.dbManager.update(INDEXDB_STORE_NAME, order);
2558
3532
  case 23:
2559
- _context19.next = 19;
3533
+ _context22.next = 19;
2560
3534
  break;
2561
3535
  case 25:
2562
- _context19.next = 30;
3536
+ _context22.next = 30;
2563
3537
  break;
2564
3538
  case 27:
2565
- _context19.prev = 27;
2566
- _context19.t0 = _context19["catch"](17);
2567
- _iterator20.e(_context19.t0);
3539
+ _context22.prev = 27;
3540
+ _context22.t0 = _context22["catch"](17);
3541
+ _iterator32.e(_context22.t0);
2568
3542
  case 30:
2569
- _context19.prev = 30;
2570
- _iterator20.f();
2571
- return _context19.finish(30);
3543
+ _context22.prev = 30;
3544
+ _iterator32.f();
3545
+ return _context22.finish(30);
2572
3546
  case 33:
2573
- _this20.recordRecentSqliteWrite(source, compactedToWrite);
2574
- _this20.logInfo('patchOrdersInSQLite-完成', {
3547
+ _context22.next = 37;
3548
+ break;
3549
+ case 35:
3550
+ if (!options.throwOnError) {
3551
+ _context22.next = 37;
3552
+ break;
3553
+ }
3554
+ throw new Error('订单 SQLite 数据库不支持写入');
3555
+ case 37:
3556
+ _this22.recordRecentSqliteWrite(source, compactedToWrite);
3557
+ _this22.logInfo('patchOrdersInSQLite-完成', {
2575
3558
  source: source,
2576
3559
  count: compactedToWrite.length,
2577
3560
  writeMethod: writeMethod,
2578
3561
  dedupedCount: skipped.length
2579
3562
  });
2580
- case 35:
3563
+ case 39:
2581
3564
  case "end":
2582
- return _context19.stop();
3565
+ return _context22.stop();
2583
3566
  }
2584
- }, _callee19, null, [[17, 27, 30, 33]]);
3567
+ }, _callee22, null, [[17, 27, 30, 33]]);
2585
3568
  })));
2586
- case 15:
2587
- _context20.next = 20;
3569
+ case 21:
3570
+ _context23.next = 28;
2588
3571
  break;
2589
- case 17:
2590
- _context20.prev = 17;
2591
- _context20.t0 = _context20["catch"](12);
3572
+ case 23:
3573
+ _context23.prev = 23;
3574
+ _context23.t0 = _context23["catch"](18);
2592
3575
  this.logError('增量保存订单到 SQLite 失败', {
2593
- error: _context20.t0 instanceof Error ? _context20.t0.message : String(_context20.t0),
3576
+ error: _context23.t0 instanceof Error ? _context23.t0.message : String(_context23.t0),
2594
3577
  orderCount: ordersSnapshot.length
2595
3578
  });
2596
- case 20:
3579
+ if (!options.throwOnError) {
3580
+ _context23.next = 28;
3581
+ break;
3582
+ }
3583
+ throw _context23.t0;
3584
+ case 28:
2597
3585
  case "end":
2598
- return _context20.stop();
3586
+ return _context23.stop();
2599
3587
  }
2600
- }, _callee20, this, [[12, 17]]);
3588
+ }, _callee23, this, [[18, 23]]);
2601
3589
  }));
2602
- function patchOrdersInSQLite(_x12, _x13) {
3590
+ function patchOrdersInSQLite(_x16, _x17) {
2603
3591
  return _patchOrdersInSQLite.apply(this, arguments);
2604
3592
  }
2605
3593
  return patchOrdersInSQLite;
@@ -2614,98 +3602,135 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2614
3602
  }, {
2615
3603
  key: "updateOrderInSQLite",
2616
3604
  value: (function () {
2617
- var _updateOrderInSQLite = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee22(order, source) {
2618
- var _this21 = this;
2619
- var orderSnapshot, _orderSnapshot$order_3;
2620
- return _regeneratorRuntime().wrap(function _callee22$(_context22) {
2621
- while (1) switch (_context22.prev = _context22.next) {
3605
+ var _updateOrderInSQLite = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee25(order, source) {
3606
+ var _this23 = this;
3607
+ var options,
3608
+ orderSnapshot,
3609
+ _orderSnapshot$order_3,
3610
+ _args25 = arguments;
3611
+ return _regeneratorRuntime().wrap(function _callee25$(_context25) {
3612
+ while (1) switch (_context25.prev = _context25.next) {
2622
3613
  case 0:
2623
- if (!(!this.dbManager || !this.getOrderStorageKey(order))) {
2624
- _context22.next = 2;
3614
+ options = _args25.length > 2 && _args25[2] !== undefined ? _args25[2] : {};
3615
+ if (this.getOrderStorageKey(order)) {
3616
+ _context25.next = 5;
2625
3617
  break;
2626
3618
  }
2627
- return _context22.abrupt("return");
2628
- case 2:
3619
+ if (!options.throwOnError) {
3620
+ _context25.next = 4;
3621
+ break;
3622
+ }
3623
+ throw new Error('订单缺少可用的 SQLite 存储主键');
3624
+ case 4:
3625
+ return _context25.abrupt("return");
3626
+ case 5:
3627
+ if (this.dbManager) {
3628
+ _context25.next = 9;
3629
+ break;
3630
+ }
3631
+ if (!options.throwOnError) {
3632
+ _context25.next = 8;
3633
+ break;
3634
+ }
3635
+ throw new Error('订单 SQLite 数据库未初始化');
3636
+ case 8:
3637
+ return _context25.abrupt("return");
3638
+ case 9:
2629
3639
  orderSnapshot = this.normalizeOrderCollectionsForIngress(cloneDeep(order), "".concat(source, ".sqliteIngress"));
2630
- _context22.prev = 3;
2631
- _context22.next = 6;
2632
- return this.runInOrderSQLiteSaveQueue( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee21() {
3640
+ _context25.prev = 10;
3641
+ _context25.next = 13;
3642
+ return this.runInOrderSQLiteSaveQueue( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee24() {
2633
3643
  var _orderSnapshot$order_, _orderSnapshot$order_2;
2634
3644
  var writeMethod;
2635
- return _regeneratorRuntime().wrap(function _callee21$(_context21) {
2636
- while (1) switch (_context21.prev = _context21.next) {
3645
+ return _regeneratorRuntime().wrap(function _callee24$(_context24) {
3646
+ while (1) switch (_context24.prev = _context24.next) {
2637
3647
  case 0:
2638
3648
  writeMethod = 'none';
2639
- _this21.logInfo('updateOrderInSQLite-开始', {
3649
+ _this23.logInfo('updateOrderInSQLite-开始', {
2640
3650
  source: source,
2641
3651
  orderId: (_orderSnapshot$order_ = orderSnapshot.order_id) !== null && _orderSnapshot$order_ !== void 0 ? _orderSnapshot$order_ : null,
2642
- storageKey: _this21.getOrderStorageKey(orderSnapshot)
3652
+ storageKey: _this23.getOrderStorageKey(orderSnapshot)
2643
3653
  });
2644
- if (!(typeof _this21.dbManager.update === 'function')) {
2645
- _context21.next = 8;
3654
+ if (!(typeof _this23.dbManager.update === 'function')) {
3655
+ _context24.next = 8;
2646
3656
  break;
2647
3657
  }
2648
3658
  writeMethod = 'update';
2649
- _context21.next = 6;
2650
- return _this21.dbManager.update(INDEXDB_STORE_NAME, orderSnapshot);
3659
+ _context24.next = 6;
3660
+ return _this23.dbManager.update(INDEXDB_STORE_NAME, orderSnapshot);
2651
3661
  case 6:
2652
- _context21.next = 18;
3662
+ _context24.next = 22;
2653
3663
  break;
2654
3664
  case 8:
2655
- if (!(typeof _this21.dbManager.bulkUpdate === 'function')) {
2656
- _context21.next = 14;
3665
+ if (!(typeof _this23.dbManager.bulkUpdate === 'function')) {
3666
+ _context24.next = 14;
2657
3667
  break;
2658
3668
  }
2659
3669
  writeMethod = 'bulkUpdate';
2660
- _context21.next = 12;
2661
- return _this21.dbManager.bulkUpdate(INDEXDB_STORE_NAME, [orderSnapshot]);
3670
+ _context24.next = 12;
3671
+ return _this23.dbManager.bulkUpdate(INDEXDB_STORE_NAME, [orderSnapshot]);
2662
3672
  case 12:
2663
- _context21.next = 18;
3673
+ _context24.next = 22;
2664
3674
  break;
2665
3675
  case 14:
2666
- if (!(typeof _this21.dbManager.bulkAdd === 'function')) {
2667
- _context21.next = 18;
3676
+ if (!(typeof _this23.dbManager.bulkAdd === 'function')) {
3677
+ _context24.next = 20;
2668
3678
  break;
2669
3679
  }
2670
3680
  writeMethod = 'bulkAdd';
2671
- _context21.next = 18;
2672
- return _this21.dbManager.bulkAdd(INDEXDB_STORE_NAME, [orderSnapshot]);
3681
+ _context24.next = 18;
3682
+ return _this23.dbManager.bulkAdd(INDEXDB_STORE_NAME, [orderSnapshot]);
2673
3683
  case 18:
2674
- _this21.recordRecentSqliteWrite(source, [orderSnapshot]);
2675
- _this21.logInfo('updateOrderInSQLite-完成', {
3684
+ _context24.next = 22;
3685
+ break;
3686
+ case 20:
3687
+ if (!options.throwOnError) {
3688
+ _context24.next = 22;
3689
+ break;
3690
+ }
3691
+ throw new Error('订单 SQLite 数据库不支持写入');
3692
+ case 22:
3693
+ _this23.recordRecentSqliteWrite(source, [orderSnapshot]);
3694
+ _this23.logInfo('updateOrderInSQLite-完成', {
2676
3695
  source: source,
2677
3696
  orderId: (_orderSnapshot$order_2 = orderSnapshot.order_id) !== null && _orderSnapshot$order_2 !== void 0 ? _orderSnapshot$order_2 : null,
2678
3697
  writeMethod: writeMethod
2679
3698
  });
2680
- case 20:
3699
+ case 24:
2681
3700
  case "end":
2682
- return _context21.stop();
3701
+ return _context24.stop();
2683
3702
  }
2684
- }, _callee21);
3703
+ }, _callee24);
2685
3704
  })));
2686
- case 6:
2687
- _context22.next = 11;
3705
+ case 13:
3706
+ _context25.next = 20;
2688
3707
  break;
2689
- case 8:
2690
- _context22.prev = 8;
2691
- _context22.t0 = _context22["catch"](3);
3708
+ case 15:
3709
+ _context25.prev = 15;
3710
+ _context25.t0 = _context25["catch"](10);
2692
3711
  this.logError('单条保存订单到 SQLite 失败', {
2693
- error: _context22.t0 instanceof Error ? _context22.t0.message : String(_context22.t0),
3712
+ error: _context25.t0 instanceof Error ? _context25.t0.message : String(_context25.t0),
2694
3713
  orderId: (_orderSnapshot$order_3 = orderSnapshot.order_id) !== null && _orderSnapshot$order_3 !== void 0 ? _orderSnapshot$order_3 : null
2695
3714
  });
2696
- case 11:
3715
+ if (!options.throwOnError) {
3716
+ _context25.next = 20;
3717
+ break;
3718
+ }
3719
+ throw _context25.t0;
3720
+ case 20:
2697
3721
  case "end":
2698
- return _context22.stop();
3722
+ return _context25.stop();
2699
3723
  }
2700
- }, _callee22, this, [[3, 8]]);
3724
+ }, _callee25, this, [[10, 15]]);
2701
3725
  }));
2702
- function updateOrderInSQLite(_x14, _x15) {
3726
+ function updateOrderInSQLite(_x18, _x19) {
2703
3727
  return _updateOrderInSQLite.apply(this, arguments);
2704
3728
  }
2705
3729
  return updateOrderInSQLite;
2706
3730
  }()
2707
3731
  /**
2708
- * 全量快照替换 orders 表(clear + bulkAdd),用于 SSE 全量拉取与营业日窗口裁剪。
3732
+ * 全量快照替换 orders 表(clear + bulkAdd),并保留本地 draft / need_sync / pending 支付订单。
3733
+ * 用于 SSE 全量拉取与营业日窗口裁剪。
2709
3734
  *
2710
3735
  * @example
2711
3736
  * await this.replaceOrdersSnapshotInSQLite(orderList)
@@ -2714,100 +3739,163 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2714
3739
  }, {
2715
3740
  key: "replaceOrdersSnapshotInSQLite",
2716
3741
  value: (function () {
2717
- var _replaceOrdersSnapshotInSQLite = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee24(orderList, source) {
2718
- var _this22 = this;
2719
- var remoteSnapshot, mergedSnapshot;
2720
- return _regeneratorRuntime().wrap(function _callee24$(_context24) {
2721
- while (1) switch (_context24.prev = _context24.next) {
3742
+ var _replaceOrdersSnapshotInSQLite = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee27(orderList, source) {
3743
+ var _this24 = this;
3744
+ var protectedOrdersBeforeRemoteFetch,
3745
+ remoteSnapshot,
3746
+ mergedSnapshot,
3747
+ _args27 = arguments;
3748
+ return _regeneratorRuntime().wrap(function _callee27$(_context27) {
3749
+ while (1) switch (_context27.prev = _context27.next) {
2722
3750
  case 0:
3751
+ protectedOrdersBeforeRemoteFetch = _args27.length > 2 && _args27[2] !== undefined ? _args27[2] : [];
2723
3752
  if (this.dbManager) {
2724
- _context24.next = 2;
3753
+ _context27.next = 3;
2725
3754
  break;
2726
3755
  }
2727
- return _context24.abrupt("return", this.compactOrderListByIdentity(orderList.map(function (order) {
2728
- return _this22.normalizeRemoteSyncedOrder(order);
3756
+ return _context27.abrupt("return", this.compactOrderListByIdentity(orderList.map(function (order) {
3757
+ return _this24.normalizeRemoteSyncedOrder(order);
2729
3758
  }), "".concat(source, ".snapshotNoDb")).list);
2730
- case 2:
3759
+ case 3:
2731
3760
  remoteSnapshot = cloneDeep(orderList).map(function (order) {
2732
- return _this22.normalizeOrderCollectionsForIngress(order, "".concat(source, ".remoteIngress"));
3761
+ return _this24.normalizeOrderCollectionsForIngress(order, "".concat(source, ".remoteIngress"));
2733
3762
  });
2734
3763
  mergedSnapshot = this.compactOrderListByIdentity(remoteSnapshot.map(function (order) {
2735
- return _this22.normalizeRemoteSyncedOrder(order);
3764
+ return _this24.normalizeRemoteSyncedOrder(order);
2736
3765
  }), "".concat(source, ".remoteSnapshot")).list;
2737
- _context24.prev = 4;
2738
- _context24.next = 7;
2739
- return this.runInOrderSQLiteSaveQueue( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee23() {
2740
- var existingOrders, orderListSnapshot;
2741
- return _regeneratorRuntime().wrap(function _callee23$(_context23) {
2742
- while (1) switch (_context23.prev = _context23.next) {
3766
+ _context27.prev = 5;
3767
+ _context27.next = 8;
3768
+ return this.runInOrderSQLiteSaveQueue( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee26() {
3769
+ var existingOrders, protectedLocalOrders, _iterator33, _step33, rawCurrentOrder, currentOrder, protectedIndex, currentNeedsProtection, orderListSnapshot;
3770
+ return _regeneratorRuntime().wrap(function _callee26$(_context26) {
3771
+ while (1) switch (_context26.prev = _context26.next) {
2743
3772
  case 0:
2744
- if (!(typeof _this22.dbManager.getAll === 'function')) {
2745
- _context23.next = 6;
3773
+ if (!(typeof _this24.dbManager.getAll === 'function')) {
3774
+ _context26.next = 6;
2746
3775
  break;
2747
3776
  }
2748
- _context23.next = 3;
2749
- return _this22.dbManager.getAll(INDEXDB_STORE_NAME);
3777
+ _context26.next = 3;
3778
+ return _this24.dbManager.getAll(INDEXDB_STORE_NAME);
2750
3779
  case 3:
2751
- _context23.t0 = _context23.sent;
2752
- _context23.next = 7;
3780
+ _context26.t0 = _context26.sent;
3781
+ _context26.next = 7;
2753
3782
  break;
2754
3783
  case 6:
2755
- _context23.t0 = [];
3784
+ _context26.t0 = [];
2756
3785
  case 7:
2757
- existingOrders = _context23.t0;
2758
- orderListSnapshot = _this22.mergeRemoteSnapshotWithPendingOrders(remoteSnapshot, existingOrders || []);
2759
- mergedSnapshot = _this22.compactOrderListByIdentity(orderListSnapshot, "".concat(source, ".sqliteSnapshot")).list;
2760
- _this22.logInfo('replaceOrdersSnapshotInSQLite-开始', {
3786
+ existingOrders = _context26.t0;
3787
+ protectedLocalOrders = protectedOrdersBeforeRemoteFetch.map(function (order) {
3788
+ return _this24.normalizeOrderCollectionsForIngress(order, "".concat(source, ".protectedBeforeRemoteFetch"));
3789
+ }).filter(function (order) {
3790
+ return _this24.shouldProtectLocalOrderFromRemoteSnapshot(order);
3791
+ });
3792
+ _iterator33 = _createForOfIteratorHelper(existingOrders || []);
3793
+ _context26.prev = 10;
3794
+ _iterator33.s();
3795
+ case 12:
3796
+ if ((_step33 = _iterator33.n()).done) {
3797
+ _context26.next = 23;
3798
+ break;
3799
+ }
3800
+ rawCurrentOrder = _step33.value;
3801
+ currentOrder = _this24.normalizeOrderCollectionsForIngress(rawCurrentOrder, "".concat(source, ".currentSQLite"));
3802
+ protectedIndex = _this24.findOrderIndexByIdentity(protectedLocalOrders, currentOrder);
3803
+ currentNeedsProtection = _this24.shouldProtectLocalOrderFromRemoteSnapshot(currentOrder);
3804
+ if (!(protectedIndex >= 0)) {
3805
+ _context26.next = 20;
3806
+ break;
3807
+ }
3808
+ if (currentNeedsProtection) {
3809
+ protectedLocalOrders[protectedIndex] = currentOrder;
3810
+ } else {
3811
+ protectedLocalOrders.splice(protectedIndex, 1);
3812
+ }
3813
+ return _context26.abrupt("continue", 21);
3814
+ case 20:
3815
+ if (currentNeedsProtection) protectedLocalOrders.push(currentOrder);
3816
+ case 21:
3817
+ _context26.next = 12;
3818
+ break;
3819
+ case 23:
3820
+ _context26.next = 28;
3821
+ break;
3822
+ case 25:
3823
+ _context26.prev = 25;
3824
+ _context26.t1 = _context26["catch"](10);
3825
+ _iterator33.e(_context26.t1);
3826
+ case 28:
3827
+ _context26.prev = 28;
3828
+ _iterator33.f();
3829
+ return _context26.finish(28);
3830
+ case 31:
3831
+ orderListSnapshot = _this24.mergeRemoteSnapshotWithPendingOrders(remoteSnapshot, protectedLocalOrders);
3832
+ mergedSnapshot = _this24.compactOrderListByIdentity(orderListSnapshot, "".concat(source, ".sqliteSnapshot")).list;
3833
+ _this24.logInfo('replaceOrdersSnapshotInSQLite-开始', {
2761
3834
  source: source,
2762
3835
  count: mergedSnapshot.length,
2763
3836
  remoteCount: remoteSnapshot.length,
2764
- preservedPendingCount: mergedSnapshot.length - remoteSnapshot.length
3837
+ protectedBeforeRemoteFetchCount: protectedOrdersBeforeRemoteFetch.length,
3838
+ protectedLocalOrderCount: protectedLocalOrders.length,
3839
+ preservedLocalUnsyncedCount: mergedSnapshot.length - remoteSnapshot.length,
3840
+ protectedPendingPaymentCount: protectedLocalOrders.reduce(function (count, order) {
3841
+ return count + _this24.getIdentifiedPendingPayments(order).length;
3842
+ }, 0),
3843
+ protectedPendingPaymentIdentities: protectedLocalOrders.flatMap(function (order) {
3844
+ return _this24.getIdentifiedPendingPayments(order).map(function (payment) {
3845
+ var _order$order_id5, _external_sale_number5;
3846
+ return {
3847
+ order_id: (_order$order_id5 = order.order_id) !== null && _order$order_id5 !== void 0 ? _order$order_id5 : null,
3848
+ external_sale_number: (_external_sale_number5 = order.external_sale_number) !== null && _external_sale_number5 !== void 0 ? _external_sale_number5 : null,
3849
+ payment_identities: getOrderPaymentIdentityKeys(payment)
3850
+ };
3851
+ });
3852
+ })
2765
3853
  });
2766
- _context23.next = 13;
2767
- return _this22.dbManager.clear(INDEXDB_STORE_NAME);
2768
- case 13:
2769
- _this22.logInfo('replaceOrdersSnapshotInSQLite-clear完成', {
3854
+ _context26.next = 36;
3855
+ return _this24.dbManager.clear(INDEXDB_STORE_NAME);
3856
+ case 36:
3857
+ _this24.logInfo('replaceOrdersSnapshotInSQLite-clear完成', {
2770
3858
  count: mergedSnapshot.length
2771
3859
  });
2772
3860
  if (!(mergedSnapshot.length === 0)) {
2773
- _context23.next = 16;
3861
+ _context26.next = 39;
2774
3862
  break;
2775
3863
  }
2776
- return _context23.abrupt("return");
2777
- case 16:
2778
- _context23.next = 18;
2779
- return _this22.dbManager.bulkAdd(INDEXDB_STORE_NAME, mergedSnapshot);
2780
- case 18:
2781
- _this22.recordRecentSqliteWrite(source, mergedSnapshot);
2782
- _this22.logInfo('replaceOrdersSnapshotInSQLite-bulkAdd完成', {
3864
+ return _context26.abrupt("return");
3865
+ case 39:
3866
+ _context26.next = 41;
3867
+ return _this24.dbManager.bulkAdd(INDEXDB_STORE_NAME, mergedSnapshot);
3868
+ case 41:
3869
+ _this24.recordRecentSqliteWrite(source, mergedSnapshot);
3870
+ _this24.logInfo('replaceOrdersSnapshotInSQLite-bulkAdd完成', {
2783
3871
  source: source,
2784
3872
  count: mergedSnapshot.length
2785
3873
  });
2786
- case 20:
3874
+ case 43:
2787
3875
  case "end":
2788
- return _context23.stop();
3876
+ return _context26.stop();
2789
3877
  }
2790
- }, _callee23);
3878
+ }, _callee26, null, [[10, 25, 28, 31]]);
2791
3879
  })));
2792
- case 7:
2793
- _context24.next = 12;
3880
+ case 8:
3881
+ _context27.next = 13;
2794
3882
  break;
2795
- case 9:
2796
- _context24.prev = 9;
2797
- _context24.t0 = _context24["catch"](4);
3883
+ case 10:
3884
+ _context27.prev = 10;
3885
+ _context27.t0 = _context27["catch"](5);
2798
3886
  this.logError('全量保存订单到 SQLite 失败', {
2799
- error: _context24.t0 instanceof Error ? _context24.t0.message : String(_context24.t0),
3887
+ error: _context27.t0 instanceof Error ? _context27.t0.message : String(_context27.t0),
2800
3888
  orderList: remoteSnapshot.length
2801
3889
  });
2802
- case 12:
2803
- return _context24.abrupt("return", mergedSnapshot);
2804
3890
  case 13:
3891
+ return _context27.abrupt("return", mergedSnapshot);
3892
+ case 14:
2805
3893
  case "end":
2806
- return _context24.stop();
3894
+ return _context27.stop();
2807
3895
  }
2808
- }, _callee24, this, [[4, 9]]);
3896
+ }, _callee27, this, [[5, 10]]);
2809
3897
  }));
2810
- function replaceOrdersSnapshotInSQLite(_x16, _x17) {
3898
+ function replaceOrdersSnapshotInSQLite(_x20, _x21) {
2811
3899
  return _replaceOrdersSnapshotInSQLite.apply(this, arguments);
2812
3900
  }
2813
3901
  return replaceOrdersSnapshotInSQLite;
@@ -2822,38 +3910,38 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2822
3910
  }, {
2823
3911
  key: "clear",
2824
3912
  value: (function () {
2825
- var _clear = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee26() {
2826
- var _this23 = this;
2827
- return _regeneratorRuntime().wrap(function _callee26$(_context26) {
2828
- while (1) switch (_context26.prev = _context26.next) {
3913
+ var _clear = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee29() {
3914
+ var _this25 = this;
3915
+ return _regeneratorRuntime().wrap(function _callee29$(_context29) {
3916
+ while (1) switch (_context29.prev = _context29.next) {
2829
3917
  case 0:
2830
3918
  this.store.list = [];
2831
3919
  this.store.map = new Map();
2832
3920
  if (!this.dbManager) {
2833
- _context26.next = 5;
3921
+ _context29.next = 5;
2834
3922
  break;
2835
3923
  }
2836
- _context26.next = 5;
2837
- return this.runInOrderSQLiteSaveQueue( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee25() {
2838
- return _regeneratorRuntime().wrap(function _callee25$(_context25) {
2839
- while (1) switch (_context25.prev = _context25.next) {
3924
+ _context29.next = 5;
3925
+ return this.runInOrderSQLiteSaveQueue( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee28() {
3926
+ return _regeneratorRuntime().wrap(function _callee28$(_context28) {
3927
+ while (1) switch (_context28.prev = _context28.next) {
2840
3928
  case 0:
2841
- _context25.next = 2;
2842
- return _this23.dbManager.clear(INDEXDB_STORE_NAME);
3929
+ _context28.next = 2;
3930
+ return _this25.dbManager.clear(INDEXDB_STORE_NAME);
2843
3931
  case 2:
2844
3932
  case "end":
2845
- return _context25.stop();
3933
+ return _context28.stop();
2846
3934
  }
2847
- }, _callee25);
3935
+ }, _callee28);
2848
3936
  })));
2849
3937
  case 5:
2850
3938
  this.setStorageItem(ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY, '');
2851
3939
  this.emitOrdersChanged([], 'clear');
2852
3940
  case 7:
2853
3941
  case "end":
2854
- return _context26.stop();
3942
+ return _context29.stop();
2855
3943
  }
2856
- }, _callee26, this);
3944
+ }, _callee29, this);
2857
3945
  }));
2858
3946
  function clear() {
2859
3947
  return _clear.apply(this, arguments);