@pisell/pisellos 2.3.37 → 2.3.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/dist/modules/Discount/index.d.ts +1 -0
  2. package/dist/modules/Discount/index.js +40 -11
  3. package/dist/modules/Discount/types.d.ts +1 -0
  4. package/dist/modules/Holder/index.d.ts +48 -0
  5. package/dist/modules/Holder/index.js +640 -0
  6. package/dist/modules/Holder/types.d.ts +123 -0
  7. package/dist/modules/Holder/types.js +1 -0
  8. package/dist/modules/Holder/utils.d.ts +13 -0
  9. package/dist/modules/Holder/utils.js +34 -0
  10. package/dist/modules/OpenData/index.js +2 -2
  11. package/dist/modules/Order/index.d.ts +11 -28
  12. package/dist/modules/Order/index.js +513 -747
  13. package/dist/modules/Order/types.d.ts +10 -33
  14. package/dist/modules/Order/utils/orderCollectionIdentity.js +2 -7
  15. package/dist/modules/Order/utils.d.ts +10 -0
  16. package/dist/modules/Order/utils.js +40 -11
  17. package/dist/modules/Payment/index.d.ts +0 -2
  18. package/dist/modules/Payment/index.js +49 -78
  19. package/dist/modules/Payment/types.d.ts +24 -26
  20. package/dist/modules/Payment/types.js +0 -2
  21. package/dist/modules/Product/types.d.ts +1 -0
  22. package/dist/modules/ProductList/index.js +33 -14
  23. package/dist/modules/Quotation/index.d.ts +1 -1
  24. package/dist/modules/Quotation/index.js +2 -2
  25. package/dist/modules/ResourcePlanner/index.d.ts +24 -0
  26. package/dist/modules/ResourcePlanner/index.js +181 -0
  27. package/dist/modules/ResourcePlanner/planner.d.ts +14 -0
  28. package/dist/modules/ResourcePlanner/planner.js +1069 -0
  29. package/dist/modules/ResourcePlanner/types.d.ts +227 -0
  30. package/dist/modules/ResourcePlanner/types.js +1 -0
  31. package/dist/modules/Rules/index.js +48 -15
  32. package/dist/modules/SalesSummary/index.js +12 -13
  33. package/dist/modules/ScanOrderLogger/index.d.ts +2 -0
  34. package/dist/modules/ScanOrderLogger/index.js +15 -2
  35. package/dist/modules/ScanOrderLogger/providers/feishu.js +45 -27
  36. package/dist/modules/ScanOrderLogger/types.d.ts +1 -0
  37. package/dist/modules/Schedule/index.d.ts +3 -1
  38. package/dist/modules/Schedule/index.js +21 -16
  39. package/dist/modules/Summary/utils.js +38 -13
  40. package/dist/modules/index.d.ts +2 -0
  41. package/dist/modules/index.js +3 -1
  42. package/dist/plugins/window.d.ts +1 -0
  43. package/dist/server/index.d.ts +14 -16
  44. package/dist/server/index.js +1162 -1943
  45. package/dist/server/modules/order/index.d.ts +4 -49
  46. package/dist/server/modules/order/index.js +695 -1574
  47. package/dist/server/modules/order/types.d.ts +3 -11
  48. package/dist/server/modules/order/types.js +1 -1
  49. package/dist/solution/BaseSales/index.d.ts +10 -33
  50. package/dist/solution/BaseSales/index.js +385 -676
  51. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +1 -6
  52. package/dist/solution/BookingByStep/index.d.ts +17 -2
  53. package/dist/solution/BookingByStep/index.js +294 -215
  54. package/dist/solution/BookingByStep/types.d.ts +2 -1
  55. package/dist/solution/BookingByStep/types.js +3 -1
  56. package/dist/solution/BookingByStep/utils/capacity.js +17 -1
  57. package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  58. package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
  59. package/dist/solution/BookingTicket/index.js +1 -2
  60. package/dist/solution/Sales/index.d.ts +0 -1
  61. package/dist/solution/Sales/index.js +2 -10
  62. package/dist/solution/ScanOrder/index.d.ts +26 -14
  63. package/dist/solution/ScanOrder/index.js +1140 -737
  64. package/dist/solution/ScanOrder/types.d.ts +21 -1
  65. package/dist/solution/ScanOrder/utils.d.ts +8 -0
  66. package/dist/solution/ScanOrder/utils.js +66 -25
  67. package/dist/solution/ShopDiscount/index.d.ts +1 -0
  68. package/dist/solution/ShopDiscount/index.js +125 -87
  69. package/dist/solution/UnifiedBookingSales/index.d.ts +183 -0
  70. package/dist/solution/UnifiedBookingSales/index.js +1871 -0
  71. package/dist/solution/UnifiedBookingSales/types.d.ts +143 -0
  72. package/dist/solution/UnifiedBookingSales/types.js +11 -0
  73. package/dist/solution/VenueBooking/index.d.ts +39 -11
  74. package/dist/solution/VenueBooking/index.js +1177 -850
  75. package/dist/solution/VenueBooking/types.d.ts +3 -0
  76. package/dist/solution/VenueBooking/utils/resource.js +1 -0
  77. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  78. package/dist/solution/VenueBooking/utils/slotMerge.js +10 -5
  79. package/dist/solution/index.d.ts +1 -0
  80. package/dist/solution/index.js +2 -1
  81. package/dist/types/index.d.ts +1 -0
  82. package/lib/modules/Discount/index.d.ts +1 -0
  83. package/lib/modules/Discount/index.js +9 -0
  84. package/lib/modules/Discount/types.d.ts +1 -0
  85. package/lib/modules/Holder/index.d.ts +48 -0
  86. package/lib/modules/Holder/index.js +402 -0
  87. package/lib/modules/Holder/types.d.ts +123 -0
  88. package/lib/modules/Holder/types.js +17 -0
  89. package/lib/modules/Holder/utils.d.ts +13 -0
  90. package/lib/modules/Holder/utils.js +71 -0
  91. package/lib/modules/OpenData/index.js +1 -1
  92. package/lib/modules/Order/index.d.ts +11 -28
  93. package/lib/modules/Order/index.js +83 -187
  94. package/lib/modules/Order/types.d.ts +10 -33
  95. package/lib/modules/Order/utils/orderCollectionIdentity.js +0 -3
  96. package/lib/modules/Order/utils.d.ts +10 -0
  97. package/lib/modules/Order/utils.js +39 -10
  98. package/lib/modules/Payment/index.d.ts +0 -2
  99. package/lib/modules/Payment/index.js +12 -33
  100. package/lib/modules/Payment/types.d.ts +24 -26
  101. package/lib/modules/Product/types.d.ts +1 -0
  102. package/lib/modules/ProductList/index.js +40 -31
  103. package/lib/modules/Quotation/index.d.ts +1 -1
  104. package/lib/modules/Quotation/index.js +2 -2
  105. package/lib/modules/ResourcePlanner/index.d.ts +24 -0
  106. package/lib/modules/ResourcePlanner/index.js +148 -0
  107. package/lib/modules/ResourcePlanner/planner.d.ts +14 -0
  108. package/lib/modules/ResourcePlanner/planner.js +933 -0
  109. package/lib/modules/ResourcePlanner/types.d.ts +227 -0
  110. package/lib/modules/ResourcePlanner/types.js +17 -0
  111. package/lib/modules/Rules/index.js +34 -18
  112. package/lib/modules/SalesSummary/index.js +6 -7
  113. package/lib/modules/ScanOrderLogger/index.d.ts +2 -0
  114. package/lib/modules/ScanOrderLogger/index.js +13 -1
  115. package/lib/modules/ScanOrderLogger/providers/feishu.js +15 -6
  116. package/lib/modules/ScanOrderLogger/types.d.ts +1 -0
  117. package/lib/modules/Schedule/index.d.ts +3 -1
  118. package/lib/modules/Schedule/index.js +10 -8
  119. package/lib/modules/Summary/utils.js +21 -1
  120. package/lib/modules/index.d.ts +2 -0
  121. package/lib/modules/index.js +5 -1
  122. package/lib/plugins/window.d.ts +1 -0
  123. package/lib/server/index.d.ts +14 -16
  124. package/lib/server/index.js +88 -678
  125. package/lib/server/modules/order/index.d.ts +4 -49
  126. package/lib/server/modules/order/index.js +66 -657
  127. package/lib/server/modules/order/types.d.ts +3 -11
  128. package/lib/solution/BaseSales/index.d.ts +10 -33
  129. package/lib/solution/BaseSales/index.js +33 -201
  130. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +1 -6
  131. package/lib/solution/BookingByStep/index.d.ts +17 -2
  132. package/lib/solution/BookingByStep/index.js +60 -18
  133. package/lib/solution/BookingByStep/types.d.ts +2 -1
  134. package/lib/solution/BookingByStep/types.js +5 -0
  135. package/lib/solution/BookingByStep/utils/capacity.js +20 -1
  136. package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  137. package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
  138. package/lib/solution/BookingTicket/index.js +1 -2
  139. package/lib/solution/Sales/index.d.ts +0 -1
  140. package/lib/solution/Sales/index.js +3 -5
  141. package/lib/solution/ScanOrder/index.d.ts +26 -14
  142. package/lib/solution/ScanOrder/index.js +449 -182
  143. package/lib/solution/ScanOrder/types.d.ts +21 -1
  144. package/lib/solution/ScanOrder/utils.d.ts +8 -0
  145. package/lib/solution/ScanOrder/utils.js +31 -0
  146. package/lib/solution/ShopDiscount/index.d.ts +1 -0
  147. package/lib/solution/ShopDiscount/index.js +14 -0
  148. package/lib/solution/UnifiedBookingSales/index.d.ts +183 -0
  149. package/lib/solution/UnifiedBookingSales/index.js +1076 -0
  150. package/lib/solution/UnifiedBookingSales/types.d.ts +143 -0
  151. package/lib/solution/UnifiedBookingSales/types.js +33 -0
  152. package/lib/solution/VenueBooking/index.d.ts +39 -11
  153. package/lib/solution/VenueBooking/index.js +328 -115
  154. package/lib/solution/VenueBooking/types.d.ts +3 -0
  155. package/lib/solution/VenueBooking/utils/resource.js +1 -0
  156. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  157. package/lib/solution/VenueBooking/utils/slotMerge.js +6 -4
  158. package/lib/solution/index.d.ts +1 -0
  159. package/lib/solution/index.js +3 -1
  160. package/lib/types/index.d.ts +1 -0
  161. package/package.json +2 -2
  162. package/dist/modules/Order/payment-utils.d.ts +0 -26
  163. package/dist/modules/Order/payment-utils.js +0 -225
  164. package/dist/utils/payment-number.d.ts +0 -9
  165. package/dist/utils/payment-number.js +0 -69
  166. package/lib/modules/Order/payment-utils.d.ts +0 -26
  167. package/lib/modules/Order/payment-utils.js +0 -224
  168. package/lib/utils/payment-number.d.ts +0 -9
  169. package/lib/utils/payment-number.js +0 -64
@@ -37,7 +37,6 @@ var import_dayjs = __toESM(require("dayjs"));
37
37
  var import_BaseModule = require("../../../modules/BaseModule");
38
38
  var import_orderCollectionIdentity = require("../../../modules/Order/utils/orderCollectionIdentity");
39
39
  var import_types = require("./types");
40
- var import_payment_utils = require("../../../modules/Order/payment-utils");
41
40
  var INDEXDB_STORE_NAME = "orders";
42
41
  var ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY = "server_order_last_full_fetch_at";
43
42
  var ORDER_SYNC_THROTTLE_MS_STORAGE_KEY = "order_sync_throttle_ms";
@@ -47,13 +46,10 @@ var ORDER_SILENT_REFRESH_MIN_INTERVAL_MS = 3e4;
47
46
  var ORDER_BUSINESS_WRITE_SOURCES = /* @__PURE__ */ new Set([
48
47
  "upsertOrdersFromRemote",
49
48
  "upsertPendingSyncOrders",
50
- "upsertLocalDraftOrders",
51
49
  "overwriteExistingOrder",
52
- "markOrderSyncedByExternalSaleNumber",
53
- "updateLocalPayment"
50
+ "markOrderSyncedByExternalSaleNumber"
54
51
  ]);
55
52
  var ORDER_MERGE_SELF_CHECK = false;
56
- var PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER = "__pisell_os_pending_payment_without_unique_number__";
57
53
  var ORDER_AUTHORITATIVE_COLLECTION_FIELDS = ["products", "bookings", "payments"];
58
54
  var ORDER_COLLECTION_KIND_BY_FIELD = {
59
55
  products: "product",
@@ -104,10 +100,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
104
100
  this.updateCreateStore();
105
101
  }
106
102
  if (Array.isArray((_a = options == null ? void 0 : options.initialState) == null ? void 0 : _a.list)) {
107
- this.store.list = this.normalizeOrdersForMemoryList(
108
- options.initialState.list,
109
- "initialState"
110
- );
103
+ this.store.list = options.initialState.list.map((order) => this.normalizeOrderForMemoryList(order));
111
104
  this.syncOrdersMap();
112
105
  this.emitOrdersChanged([], "initialState");
113
106
  } else {
@@ -173,35 +166,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
173
166
  * 仅记录计数与订单标识,不输出商品、预约、支付或客户明细。
174
167
  */
175
168
  normalizeOrderCollectionsForIngress(order, source) {
176
- const sourceOrder = (0, import_lodash_es.cloneDeep)(order);
177
- const sourceOrderRecord = sourceOrder;
178
- if (Array.isArray(sourceOrderRecord.payments)) {
179
- sourceOrderRecord.payments = sourceOrderRecord.payments.map((payment) => {
180
- if (!(0, import_payment_utils.isPendingOrderPayment)(payment) || (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment).some((key) => key.startsWith("unique_payment_number:"))) {
181
- return payment;
182
- }
183
- return {
184
- ...payment,
185
- [PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER]: true
186
- };
187
- });
188
- }
189
- const result = (0, import_orderCollectionIdentity.normalizeOrderCollections)(sourceOrder);
190
- const normalizedOrderRecord = result.order;
191
- if (Array.isArray(normalizedOrderRecord.payments)) {
192
- normalizedOrderRecord.payments = normalizedOrderRecord.payments.map(
193
- (payment) => {
194
- if (!(payment == null ? void 0 : payment[PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER]))
195
- return payment;
196
- const nextPayment = { ...payment };
197
- const metadata = { ...nextPayment.metadata || {} };
198
- delete metadata.unique_payment_number;
199
- delete nextPayment[PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER];
200
- nextPayment.metadata = metadata;
201
- return nextPayment;
202
- }
203
- );
204
- }
169
+ const result = (0, import_orderCollectionIdentity.normalizeOrderCollections)(order);
205
170
  const kinds = ["product", "booking", "payment"];
206
171
  const hasChanges = kinds.some((kind) => {
207
172
  const stats = result.stats[kind];
@@ -237,16 +202,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
237
202
  /**
238
203
  * incoming 决定权威成员集合;同一持久化行仍从 existing 补齐 incoming 省略的本地展示字段。
239
204
  */
240
- mergeAuthoritativeOrderCollection(field, existing, incoming, uidRemaps = [], options = {}) {
205
+ mergeAuthoritativeOrderCollection(field, existing, incoming, uidRemaps = []) {
241
206
  const kind = ORDER_COLLECTION_KIND_BY_FIELD[field];
242
207
  const existingItems = Array.isArray(existing) ? existing : [];
243
- if (field === "payments" && options.preserveIdentifiedPendingPayments) {
244
- return (0, import_payment_utils.mergeOrderPaymentListsByIdentity)(
245
- existingItems,
246
- incoming,
247
- { preserveUnmatchedExistingWhen: import_payment_utils.isIdentifiedPendingOrderPayment }
248
- );
249
- }
250
208
  return incoming.map((incomingItem) => {
251
209
  const existingItem = existingItems.find(
252
210
  (item) => (0, import_orderCollectionIdentity.isSameOrderCollectionItem)(kind, item, incomingItem)
@@ -502,11 +460,17 @@ var OrderModule = class extends import_BaseModule.BaseModule {
502
460
  return DEFAULT_ORDER_SYNC_THROTTLE_MS;
503
461
  }
504
462
  async preload() {
505
- const orders = await this.loadOrdersByServer();
506
- this.store.list = (0, import_lodash_es.cloneDeep)(orders);
507
- this.syncOrdersMap();
508
- await this.emitOrdersChanged([], "preload");
509
- await this.core.effects.emit(import_types.OrderHooks.onOrdersSyncCompleted, null);
463
+ const getData = async () => {
464
+ const orders = await this.loadOrdersByServer();
465
+ if (orders.length === 0) {
466
+ return;
467
+ }
468
+ this.store.list = (0, import_lodash_es.cloneDeep)(orders);
469
+ this.syncOrdersMap();
470
+ this.emitOrdersChanged([], "preload");
471
+ this.core.effects.emit(import_types.OrderHooks.onOrdersSyncCompleted, null);
472
+ };
473
+ getData();
510
474
  }
511
475
  getOrders() {
512
476
  return this.store.list;
@@ -518,27 +482,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
518
482
  getOrderByOrderId(orderId) {
519
483
  return this.store.map.get(this.getIdKey(orderId));
520
484
  }
521
- buildLocalPaymentOrderLogContext(order) {
522
- if (!order)
523
- return {};
524
- return {
525
- order_id: order.order_id ?? null,
526
- external_sale_number: order.external_sale_number ?? null,
527
- order_number: order.order_number ?? null,
528
- shop_order_number: order.shop_order_number ?? null,
529
- shop_full_order_number: order.shop_full_order_number ?? null,
530
- order_status: order.status ?? null,
531
- payment_status: order.payment_status ?? null,
532
- is_draft_order: Number(order.is_draft_order || 0),
533
- need_sync: Number(order.need_sync || 0),
534
- platform: order.platform ?? null,
535
- business_code: order.business_code ?? null,
536
- order_sales_channel: order.order_sales_channel ?? null,
537
- sales_channel: order.sales_channel ?? null,
538
- order_type: order.type ?? null,
539
- payments_count: Array.isArray(order.payments) ? order.payments.length : 0
540
- };
541
- }
542
485
  getLocalOrderFromMemoryByLookup(lookup) {
543
486
  const key = this.getIdKey(lookup);
544
487
  const memoryOrderById = this.store.map.get(key);
@@ -547,200 +490,28 @@ var OrderModule = class extends import_BaseModule.BaseModule {
547
490
  const memoryOrder = this.store.list.find((order) => this.isOrderLookupMatch(order, key));
548
491
  return memoryOrder || null;
549
492
  }
550
- async getLocalOrderByLookup(lookup, options = {}) {
493
+ async getLocalOrderByLookup(lookup) {
551
494
  const key = this.getIdKey(lookup);
552
- const logContext = {
553
- operation_id: options.operationId,
554
- lookup: key,
555
- memory_order_count: this.store.list.length
556
- };
557
- if (options.operationId) {
558
- this.logInfo("getLocalOrderByLookup-localPayment-开始", logContext);
559
- }
560
495
  const memoryOrderById = this.store.map.get(key);
561
- if (memoryOrderById) {
562
- if (options.operationId) {
563
- this.logInfo("getLocalOrderByLookup-localPayment-命中内存映射", {
564
- ...logContext,
565
- ...this.buildLocalPaymentOrderLogContext(memoryOrderById)
566
- });
567
- }
496
+ if (memoryOrderById)
568
497
  return memoryOrderById;
569
- }
570
498
  const memoryOrder = this.store.list.find((order) => this.isOrderLookupMatch(order, key));
571
- if (memoryOrder) {
572
- if (options.operationId) {
573
- this.logInfo("getLocalOrderByLookup-localPayment-命中内存列表", {
574
- ...logContext,
575
- ...this.buildLocalPaymentOrderLogContext(memoryOrder)
576
- });
577
- }
499
+ if (memoryOrder)
578
500
  return memoryOrder;
579
- }
580
- if (options.operationId) {
581
- this.logInfo("getLocalOrderByLookup-localPayment-开始读取SQLite", logContext);
582
- }
583
501
  const orders = await this.loadOrdersFromSQLite();
584
502
  const localOrder = orders.find((order) => this.isOrderLookupMatch(order, key));
585
- if (!localOrder) {
586
- if (options.operationId) {
587
- this.logWarning("getLocalOrderByLookup-localPayment-SQLite未命中", {
588
- ...logContext,
589
- sqlite_order_count: orders.length
590
- });
591
- }
503
+ if (!localOrder)
592
504
  return null;
593
- }
594
- this.store.list = this.normalizeOrdersForMemoryList(
595
- orders,
596
- "getLocalOrderByLookup.sqliteMemory"
597
- );
505
+ this.store.list = orders.map((order) => this.normalizeOrderForMemoryList(order));
598
506
  this.syncOrdersMap();
599
- const normalizedOrder = this.normalizeOrderForMemoryList(localOrder);
600
- if (options.operationId) {
601
- this.logInfo("getLocalOrderByLookup-localPayment-SQLite命中", {
602
- ...logContext,
603
- sqlite_order_count: orders.length,
604
- ...this.buildLocalPaymentOrderLogContext(normalizedOrder)
605
- });
606
- }
607
- return normalizedOrder;
608
- }
609
- async getLocalPayment(params) {
610
- const logContext = {
611
- operation_id: params.operationId,
612
- sale_id: params.saleId,
613
- payment_number: params.paymentNumber
614
- };
615
- this.logInfo("getLocalPayment-开始", logContext);
616
- try {
617
- const order = await this.getLocalOrderByLookup(params.saleId, {
618
- operationId: params.operationId
619
- });
620
- if (!order) {
621
- this.logWarning("getLocalPayment-订单未命中", logContext);
622
- return null;
623
- }
624
- const payments = order.payments || [];
625
- const match = (0, import_payment_utils.resolveOrderPaymentIdentity)(
626
- payments,
627
- params.paymentNumber,
628
- "compat"
629
- );
630
- if (!match) {
631
- this.logWarning("getLocalPayment-支付项未命中", {
632
- ...logContext,
633
- ...this.buildLocalPaymentOrderLogContext(order),
634
- payments
635
- });
636
- return null;
637
- }
638
- this.logInfo("getLocalPayment-支付项命中", {
639
- ...logContext,
640
- ...this.buildLocalPaymentOrderLogContext(order),
641
- matched_by: match.matchedBy,
642
- payment_index: match.index,
643
- payment: match.payment
644
- });
645
- return {
646
- order,
647
- payment: match.payment,
648
- paymentIndex: match.index,
649
- matchedBy: match.matchedBy
650
- };
651
- } catch (error) {
652
- this.logError("getLocalPayment-查询失败", {
653
- ...logContext,
654
- error: error instanceof Error ? error.message : String(error)
655
- });
656
- throw error;
657
- }
658
- }
659
- async updateLocalPayment(params) {
660
- const logContext = {
661
- operation_id: params.operationId,
662
- sale_id: params.saleId,
663
- payment_number: params.paymentNumber,
664
- incoming_payment_update: params.updates
665
- };
666
- this.logInfo("updateLocalPayment-开始", logContext);
667
- const found = await this.getLocalPayment(params);
668
- if (!found) {
669
- this.logWarning("updateLocalPayment-支付项未命中", logContext);
670
- return null;
671
- }
672
- const previousPayment = (0, import_lodash_es.cloneDeep)(found.payment);
673
- const nextPayment = (0, import_payment_utils.mergeOrderPaymentRecord)(found.payment, {
674
- ...params.updates,
675
- updated_at: params.updates.updated_at || (0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss")
676
- });
677
- const nextOrder = {
678
- ...found.order,
679
- payments: (found.order.payments || []).map((payment, index) => index === found.paymentIndex ? nextPayment : payment),
680
- updated_at: (0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss")
681
- };
682
- const paymentContext = {
683
- ...logContext,
684
- matched_by: found.matchedBy,
685
- payment_index: found.paymentIndex,
686
- ...this.buildLocalPaymentOrderLogContext(nextOrder),
687
- previous_payment: previousPayment,
688
- payment: nextPayment
689
- };
690
- this.logInfo("updateLocalPayment-支付项合并完成", paymentContext);
691
- const targetIndex = this.findOrderIndexByIdentity(this.store.list, found.order);
692
- const shouldKeepInMemory = this.shouldKeepOrderInMemory(nextOrder);
693
- if (targetIndex < 0 && shouldKeepInMemory) {
694
- this.logError("updateLocalPayment-订单Store索引未命中", paymentContext);
695
- return null;
696
- }
697
- const previousList = this.store.list;
698
- this.store.list = shouldKeepInMemory ? this.store.list.map((order, index) => index === targetIndex ? nextOrder : order) : this.store.list.filter((_, index) => index !== targetIndex);
699
- this.syncOrdersMap();
700
- const storageOrder = this.withoutSyntheticDraftOrderId(nextOrder);
701
- try {
702
- this.logInfo("updateLocalPayment-SQLite写入开始", {
703
- ...paymentContext,
704
- storage_order_id: storageOrder.order_id ?? null
705
- });
706
- await this.updateOrderInSQLite(storageOrder, "updateLocalPayment", { throwOnError: true });
707
- this.logInfo("updateLocalPayment-SQLite写入完成", {
708
- ...paymentContext,
709
- storage_order_id: storageOrder.order_id ?? null
710
- });
711
- } catch (error) {
712
- this.store.list = previousList;
713
- this.syncOrdersMap();
714
- this.logError("updateLocalPayment-SQLite写入失败并回滚内存", {
715
- ...paymentContext,
716
- storage_order_id: storageOrder.order_id ?? null,
717
- error: error instanceof Error ? error.message : String(error)
718
- });
719
- throw error;
720
- }
721
- if (shouldKeepInMemory || targetIndex >= 0) {
722
- await this.emitOrdersChanged(
723
- shouldKeepInMemory ? [nextOrder] : [],
724
- shouldKeepInMemory ? "updateLocalPayment" : "updateLocalPayment.sqliteOnlyDraft"
725
- );
726
- }
727
- this.logInfo("updateLocalPayment-变更事件完成", paymentContext);
728
- return { order: nextOrder, payment: nextPayment, previousPayment };
507
+ return this.normalizeOrderForMemoryList(localOrder);
729
508
  }
730
509
  async loadOrdersByServer() {
731
510
  var _a;
732
511
  let orderList = [];
733
- const protectedOrdersBeforeRemoteFetch = (await this.loadOrdersFromSQLite()).filter(
734
- (order) => this.shouldProtectLocalOrderFromRemoteSnapshot(order)
735
- );
736
512
  this.logInfo("loadOrdersByServer-开始", {
737
513
  hasOrderDataSource: !!this.orderDataSource,
738
- query: ((_a = this.store) == null ? void 0 : _a.createdAtQuery) || null,
739
- protectedLocalOrderCount: protectedOrdersBeforeRemoteFetch.length,
740
- protectedPendingPaymentCount: protectedOrdersBeforeRemoteFetch.reduce(
741
- (count, order) => count + this.getIdentifiedPendingPayments(order).length,
742
- 0
743
- )
514
+ query: ((_a = this.store) == null ? void 0 : _a.createdAtQuery) || null
744
515
  });
745
516
  if (this.orderDataSource) {
746
517
  try {
@@ -760,19 +531,10 @@ var OrderModule = class extends import_BaseModule.BaseModule {
760
531
  return this.store.list;
761
532
  }
762
533
  }
763
- const mergedOrders = await this.replaceOrdersSnapshotInSQLite(
764
- orderList,
765
- "loadOrdersByServer",
766
- protectedOrdersBeforeRemoteFetch
767
- );
768
- const memoryOrders = this.normalizeOrdersForMemoryList(
769
- mergedOrders,
770
- "loadOrdersByServer.memory"
771
- );
534
+ const mergedOrders = await this.replaceOrdersSnapshotInSQLite(orderList, "loadOrdersByServer");
535
+ const memoryOrders = mergedOrders.map((order) => this.normalizeOrderForMemoryList(order));
772
536
  this.logInfo("loadOrdersByServer-结束", {
773
- count: memoryOrders.length,
774
- persistedCount: mergedOrders.length,
775
- sqliteOnlyDraftCount: mergedOrders.length - memoryOrders.length
537
+ count: memoryOrders.length
776
538
  });
777
539
  await this.core.effects.emit(import_types.OrderHooks.onOrdersLoaded, memoryOrders);
778
540
  return memoryOrders;
@@ -792,14 +554,18 @@ var OrderModule = class extends import_BaseModule.BaseModule {
792
554
  try {
793
555
  this.updateCreateStore();
794
556
  const orders = await this.loadOrdersByServer();
795
- this.store.list = (0, import_lodash_es.cloneDeep)(orders);
796
- this.syncOrdersMap();
797
- await this.emitOrdersChanged([], "silentRefresh");
798
- await this.core.effects.emit(import_types.OrderHooks.onOrdersSyncCompleted, null);
799
- this.logInfo("silentRefresh 完成", {
800
- orderCount: orders.length,
801
- duration: `${Date.now() - startTime}ms`
802
- });
557
+ if (orders.length > 0) {
558
+ this.store.list = (0, import_lodash_es.cloneDeep)(orders);
559
+ this.syncOrdersMap();
560
+ this.emitOrdersChanged([], "silentRefresh");
561
+ await this.core.effects.emit(import_types.OrderHooks.onOrdersSyncCompleted, null);
562
+ this.logInfo("silentRefresh 完成", {
563
+ orderCount: orders.length,
564
+ duration: `${Date.now() - startTime}ms`
565
+ });
566
+ } else {
567
+ this.logInfo("silentRefresh: 服务器未返回数据");
568
+ }
803
569
  return this.store.list;
804
570
  } catch (error) {
805
571
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -813,9 +579,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
813
579
  normalizeOrderForMemoryList(order, source = "normalizeOrderForMemoryList") {
814
580
  const normalizedOrder = this.normalizeOrderCollectionsForIngress(order, source);
815
581
  const externalSaleNumber = normalizedOrder == null ? void 0 : normalizedOrder.external_sale_number;
816
- if (this.isDraftOrder(normalizedOrder) && !this.hasRealOrderId(normalizedOrder)) {
817
- return normalizedOrder;
818
- }
819
582
  if ((normalizedOrder == null ? void 0 : normalizedOrder.order_id) !== void 0 && (normalizedOrder == null ? void 0 : normalizedOrder.order_id) !== null && (normalizedOrder == null ? void 0 : normalizedOrder.order_id) !== "") {
820
583
  return normalizedOrder;
821
584
  }
@@ -827,27 +590,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
827
590
  order_id: externalSaleNumber
828
591
  };
829
592
  }
830
- normalizeOrdersForMemoryList(orders, source) {
831
- return orders.map((order) => this.normalizeOrderForMemoryList(order, source)).filter((order) => this.shouldKeepOrderInMemory(order));
832
- }
833
- hasRealOrderId(order) {
834
- if (!order || this.isBlankIdentityValue(order.order_id))
835
- return false;
836
- const externalSaleNumber = order.external_sale_number;
837
- return !(this.isDraftOrder(order) && !this.isBlankIdentityValue(externalSaleNumber) && String(order.order_id) === String(externalSaleNumber));
838
- }
839
- shouldKeepOrderInMemory(order) {
840
- return !this.isDraftOrder(order) || this.hasRealOrderId(order);
841
- }
842
- withoutSyntheticDraftOrderId(order) {
843
- const externalSaleNumber = order.external_sale_number;
844
- if (Number(order.is_draft_order || 0) !== 1 || order.order_id === void 0 || externalSaleNumber === void 0 || String(order.order_id) !== String(externalSaleNumber)) {
845
- return order;
846
- }
847
- const next = { ...order };
848
- delete next.order_id;
849
- return next;
850
- }
851
593
  /**
852
594
  * 仅覆盖本地已存在的订单;不存在则直接跳过,不落库、不 emit。
853
595
  * 适用于"按 order_id 主动刷新本地订单详情"的代理场景。
@@ -896,13 +638,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
896
638
  * 将远端拉取的订单合并进本地 store(已存在则更新,不存在则追加),落库并 emit onOrdersChanged。
897
639
  * 供 /update/localOrder 等在「本地尚无该单」时写入新建单。
898
640
  */
899
- async upsertOrdersFromRemote(freshOrders, source = "upsertOrdersFromRemote") {
641
+ async upsertOrdersFromRemote(freshOrders) {
900
642
  if (!(freshOrders == null ? void 0 : freshOrders.length)) {
901
643
  this.logInfo("upsertOrdersFromRemote-订单列表为空", {});
902
644
  return;
903
645
  }
904
- this.logInfo("upsertOrdersFromRemote-开始", { count: freshOrders.length, source });
905
- await this.mergeOrdersToStore(freshOrders, source);
646
+ this.logInfo("upsertOrdersFromRemote-开始", { count: freshOrders.length });
647
+ await this.mergeOrdersToStore(freshOrders, "upsertOrdersFromRemote");
906
648
  }
907
649
  async markOrderSyncedByExternalSaleNumber(params) {
908
650
  const externalSaleNumber = params.externalSaleNumber;
@@ -928,8 +670,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
928
670
  ...existing,
929
671
  ...params.patch || {},
930
672
  external_sale_number: existing.external_sale_number ?? externalSaleNumber,
931
- need_sync: 0,
932
- is_draft_order: 0
673
+ need_sync: 0
933
674
  });
934
675
  const storageKey = this.getOrderStorageKey(nextOrder) || key;
935
676
  this.store.list = this.store.list.map((order, index) => {
@@ -954,7 +695,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
954
695
  * 将本地待同步订单按 SQLite storage key 合并进 store 并落库。
955
696
  * checkout 离线兜底可能没有 order_id,但通常会有 external_sale_number。
956
697
  */
957
- async upsertPendingSyncOrders(pendingOrders, options = {}) {
698
+ async upsertPendingSyncOrders(pendingOrders) {
958
699
  if (!(pendingOrders == null ? void 0 : pendingOrders.length)) {
959
700
  this.logInfo("upsertPendingSyncOrders-订单列表为空", {});
960
701
  return;
@@ -966,19 +707,14 @@ var OrderModule = class extends import_BaseModule.BaseModule {
966
707
  order,
967
708
  "upsertPendingSyncOrders.incoming"
968
709
  );
969
- const pendingOrder = {
970
- ...normalizedOrder,
971
- need_sync: 1,
972
- is_draft_order: 0
973
- };
974
- const storageKey = this.getOrderStorageKey(pendingOrder);
710
+ const storageKey = this.getOrderStorageKey(normalizedOrder);
975
711
  if (!storageKey)
976
712
  continue;
977
- pendingMap.set(storageKey, pendingOrder);
713
+ pendingMap.set(storageKey, normalizedOrder);
978
714
  memoryPendingMap.set(
979
715
  storageKey,
980
716
  this.normalizeOrderForMemoryList(
981
- pendingOrder,
717
+ normalizedOrder,
982
718
  "upsertPendingSyncOrders.memory"
983
719
  )
984
720
  );
@@ -1009,12 +745,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1009
745
  if (matchIndex >= 0) {
1010
746
  const existingOrder = updatedList[matchIndex];
1011
747
  const mergedOrder = this.mergeOrderRecords(existingOrder, pendingOrder);
1012
- const nextOrder = {
1013
- ...mergedOrder,
1014
- need_sync: 1,
1015
- is_draft_order: 0
1016
- };
1017
- updatedList[matchIndex] = nextOrder;
748
+ updatedList[matchIndex] = mergedOrder;
1018
749
  const pendingSnapshot = pendingMap.get(storageKey);
1019
750
  if (pendingSnapshot) {
1020
751
  pendingMap.set(
@@ -1022,7 +753,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1022
753
  this.reconcileOverwriteOrderCollections(existingOrder, pendingSnapshot)
1023
754
  );
1024
755
  }
1025
- this.registerOrderIdentityKeys(identityKeyToIndex, nextOrder, matchIndex);
756
+ this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, matchIndex);
1026
757
  mergeActions[storageKey] = "update";
1027
758
  continue;
1028
759
  }
@@ -1032,125 +763,15 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1032
763
  mergeActions[storageKey] = "insert";
1033
764
  }
1034
765
  const patchedOrders = [...pendingMap.values()];
1035
- const previousList = this.store.list;
1036
766
  this.store.list = this.runOrderStoreSelfCheck(updatedList, "upsertPendingSyncOrders.store");
1037
767
  this.syncOrdersMap();
1038
- try {
1039
- await this.patchOrdersInSQLite(
1040
- patchedOrders,
1041
- "upsertPendingSyncOrders",
1042
- mergeActions,
1043
- options
1044
- );
1045
- } catch (error) {
1046
- this.store.list = previousList;
1047
- this.syncOrdersMap();
1048
- throw error;
1049
- }
768
+ await this.patchOrdersInSQLite(patchedOrders, "upsertPendingSyncOrders", mergeActions);
1050
769
  this.logInfo("upsertPendingSyncOrders-结束", {
1051
770
  count: patchedOrders.length,
1052
771
  storeOrderCountAfter: this.store.list.length
1053
772
  });
1054
773
  await this.emitOrdersChanged(patchedOrders, "upsertPendingSyncOrders");
1055
774
  }
1056
- /**
1057
- * 将 POS 草稿订单按 SQLite storage key 落库。
1058
- * 只有具备真实 order_id 的草稿进入 store;其余草稿仅供本地恢复查询。
1059
- */
1060
- async upsertLocalDraftOrders(draftOrders) {
1061
- if (!(draftOrders == null ? void 0 : draftOrders.length)) {
1062
- this.logInfo("upsertLocalDraftOrders-订单列表为空", {});
1063
- return;
1064
- }
1065
- const draftMap = /* @__PURE__ */ new Map();
1066
- const memoryDraftMap = /* @__PURE__ */ new Map();
1067
- for (const order of draftOrders) {
1068
- const draftOrder = {
1069
- ...order,
1070
- need_sync: 0,
1071
- is_draft_order: 1
1072
- };
1073
- const storageKey = this.getOrderStorageKey(draftOrder);
1074
- if (!storageKey)
1075
- continue;
1076
- draftMap.set(storageKey, draftOrder);
1077
- const memoryDraftOrder = this.normalizeOrderForMemoryList(draftOrder);
1078
- if (this.shouldKeepOrderInMemory(memoryDraftOrder)) {
1079
- memoryDraftMap.set(storageKey, memoryDraftOrder);
1080
- }
1081
- }
1082
- if (draftMap.size === 0) {
1083
- this.logError("upsertLocalDraftOrders-订单缺少可落库标识", {
1084
- count: draftOrders.length
1085
- });
1086
- return;
1087
- }
1088
- this.logInfo("upsertLocalDraftOrders-开始", {
1089
- count: draftMap.size,
1090
- memoryDraftCount: memoryDraftMap.size,
1091
- sqliteOnlyDraftCount: draftMap.size - memoryDraftMap.size
1092
- });
1093
- const patchedOrders = [...draftMap.values()];
1094
- const mergeActions = {};
1095
- const updatedList = this.store.list.filter((order) => this.shouldKeepOrderInMemory(order));
1096
- const identityKeyToIndex = /* @__PURE__ */ new Map();
1097
- for (let index = 0; index < updatedList.length; index += 1) {
1098
- for (const key of this.getOrderIdentityMatchKeys(updatedList[index])) {
1099
- if (!identityKeyToIndex.has(key))
1100
- identityKeyToIndex.set(key, index);
1101
- }
1102
- }
1103
- for (const [storageKey, draftOrder] of memoryDraftMap.entries()) {
1104
- const matchIndex = this.lookupOrderIndexByIdentityKeys(
1105
- identityKeyToIndex,
1106
- this.getOrderIdentityMatchKeys(draftOrder)
1107
- );
1108
- if (matchIndex >= 0) {
1109
- const mergedOrder = this.mergeOrderRecords(updatedList[matchIndex], draftOrder);
1110
- const nextOrder = {
1111
- ...mergedOrder,
1112
- need_sync: 0,
1113
- is_draft_order: 1
1114
- };
1115
- updatedList[matchIndex] = nextOrder;
1116
- this.registerOrderIdentityKeys(identityKeyToIndex, nextOrder, matchIndex);
1117
- mergeActions[storageKey] = "update";
1118
- continue;
1119
- }
1120
- const insertIndex = updatedList.length;
1121
- updatedList.push(draftOrder);
1122
- this.registerOrderIdentityKeys(identityKeyToIndex, draftOrder, insertIndex);
1123
- mergeActions[storageKey] = "insert";
1124
- }
1125
- const previousList = this.store.list;
1126
- this.store.list = this.runOrderStoreSelfCheck(updatedList, "upsertLocalDraftOrders.store");
1127
- this.syncOrdersMap();
1128
- try {
1129
- await this.patchOrdersInSQLite(
1130
- patchedOrders,
1131
- "upsertLocalDraftOrders",
1132
- mergeActions,
1133
- { throwOnError: true }
1134
- );
1135
- } catch (error) {
1136
- this.store.list = previousList;
1137
- this.syncOrdersMap();
1138
- throw error;
1139
- }
1140
- this.logInfo("upsertLocalDraftOrders-结束", {
1141
- count: patchedOrders.length,
1142
- storeOrderCountAfter: this.store.list.length
1143
- });
1144
- const removedLegacyMemoryDraft = previousList.some(
1145
- (order) => !this.shouldKeepOrderInMemory(order)
1146
- );
1147
- if (memoryDraftMap.size > 0 || removedLegacyMemoryDraft) {
1148
- await this.emitOrdersChanged(
1149
- patchedOrders.filter((order) => this.shouldKeepOrderInMemory(order)),
1150
- "upsertLocalDraftOrders"
1151
- );
1152
- }
1153
- }
1154
775
  /**
1155
776
  * 通过 SSE 按自定义 query 拉取订单(支持 select/with 精简字段)
1156
777
  */
@@ -1183,7 +804,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1183
804
  super.destroy();
1184
805
  }
1185
806
  syncOrdersMap() {
1186
- this.store.list = this.store.list.filter((order) => this.shouldKeepOrderInMemory(order));
1187
807
  this.store.map.clear();
1188
808
  for (const order of this.store.list) {
1189
809
  const primaryIdentity = this.getOrderMapKey(order);
@@ -1506,43 +1126,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1506
1126
  });
1507
1127
  continue;
1508
1128
  }
1509
- if (this.isDraftOrder(existingOrder) && this.shouldProtectDraftOrderFromIncoming(source)) {
1510
- this.logInfo("mergeOrdersToStore-跳过 draft 订单远端覆盖", {
1511
- source,
1512
- order_id: existingOrder.order_id ?? fresh.order_id ?? null,
1513
- external_sale_number: existingOrder.external_sale_number ?? fresh.external_sale_number ?? null,
1514
- local_is_draft_order: existingOrder.is_draft_order ?? null,
1515
- remote_is_draft_order: fresh.is_draft_order ?? null,
1516
- reason: "protect_draft_order_from_remote_echo"
1517
- });
1518
- continue;
1519
- }
1520
- let mergedOrder = this.mergeOrderRecords(existingOrder, fresh);
1521
- let adjustedMatchIndex = matchIndex;
1522
- const duplicateIndexes = /* @__PURE__ */ new Set();
1523
- for (const key of freshIdentityKeys) {
1524
- const duplicateIndex = identityKeyToIndex.get(key);
1525
- if (duplicateIndex === void 0 || duplicateIndex === matchIndex)
1526
- continue;
1527
- duplicateIndexes.add(duplicateIndex);
1528
- }
1529
- if (duplicateIndexes.size > 0) {
1530
- for (const duplicateIndex of [...duplicateIndexes].sort((left, right) => right - left)) {
1531
- mergedOrder = this.mergeOrderRecords(mergedOrder, updatedList[duplicateIndex]);
1532
- updatedList.splice(duplicateIndex, 1);
1533
- if (duplicateIndex < adjustedMatchIndex)
1534
- adjustedMatchIndex -= 1;
1535
- }
1536
- identityKeyToIndex.clear();
1537
- for (let index = 0; index < updatedList.length; index += 1) {
1538
- for (const key of this.getOrderIdentityMatchKeys(updatedList[index])) {
1539
- if (!identityKeyToIndex.has(key))
1540
- identityKeyToIndex.set(key, index);
1541
- }
1542
- }
1543
- }
1544
- updatedList[adjustedMatchIndex] = mergedOrder;
1545
- this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, adjustedMatchIndex);
1129
+ const mergedOrder = this.mergeOrderRecords(existingOrder, fresh);
1130
+ updatedList[matchIndex] = mergedOrder;
1131
+ this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, matchIndex);
1546
1132
  patchedOrders.push(mergedOrder);
1547
1133
  if (mergeKey)
1548
1134
  mergeActions[mergeKey] = "update";
@@ -1734,72 +1320,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1734
1320
  return right;
1735
1321
  return left;
1736
1322
  }
1737
- getProductIdentityKeys(product) {
1738
- var _a;
1739
- const record = product;
1740
- if (!record)
1741
- return [];
1742
- const keys = [];
1743
- const metadataUid = (_a = record.metadata) == null ? void 0 : _a.unique_identification_number;
1744
- if (!this.isBlankIdentityValue(metadataUid))
1745
- keys.push(`uid:${String(metadataUid)}`);
1746
- const topLevelUid = record.unique_identification_number;
1747
- if (!this.isBlankIdentityValue(topLevelUid))
1748
- keys.push(`uid:${String(topLevelUid)}`);
1749
- const orderDetailId = record.order_detail_id;
1750
- if (!this.isBlankIdentityValue(orderDetailId))
1751
- keys.push(`detail:${String(orderDetailId)}`);
1752
- const bookingUid = record.booking_uid;
1753
- if (!this.isBlankIdentityValue(bookingUid))
1754
- keys.push(`booking:${String(bookingUid)}`);
1755
- return keys;
1756
- }
1757
- mergeOrderProductLists(preferred, secondary) {
1758
- const preferredList = Array.isArray(preferred) ? preferred : [];
1759
- const secondaryList = Array.isArray(secondary) ? secondary : [];
1760
- if (secondaryList.length === 0)
1761
- return preferredList;
1762
- if (preferredList.length === 0)
1763
- return secondaryList;
1764
- const seenKeys = /* @__PURE__ */ new Set();
1765
- for (const item of preferredList) {
1766
- const keys = this.getProductIdentityKeys(item);
1767
- for (const key of keys)
1768
- seenKeys.add(key);
1769
- }
1770
- const result = [...preferredList];
1771
- for (const item of secondaryList) {
1772
- const keys = this.getProductIdentityKeys(item);
1773
- if (keys.length === 0 || keys.some((key) => seenKeys.has(key)))
1774
- continue;
1775
- for (const key of keys)
1776
- seenKeys.add(key);
1777
- result.push((0, import_lodash_es.cloneDeep)(item));
1778
- }
1779
- return result;
1780
- }
1781
- mergeOrderPaymentLists(existing, incoming) {
1782
- const existingList = Array.isArray(existing) ? existing : [];
1783
- const incomingList = Array.isArray(incoming) ? incoming : [];
1784
- if (incomingList.length === 0)
1785
- return (0, import_lodash_es.cloneDeep)(existingList);
1786
- return (0, import_payment_utils.mergeOrderPaymentListsByIdentity)(existingList, incomingList);
1787
- }
1788
- getIdentifiedPendingPayments(order) {
1789
- const payments = Array.isArray(order == null ? void 0 : order.payments) ? order.payments : [];
1790
- return payments.filter((payment) => (0, import_payment_utils.isIdentifiedPendingOrderPayment)(payment));
1791
- }
1792
- shouldProtectLocalOrderFromRemoteSnapshot(order) {
1793
- return this.isPendingSyncOrder(order) || this.isDraftOrder(order) || this.getIdentifiedPendingPayments(order).length > 0;
1794
- }
1795
- getUnmatchedIdentifiedPendingPayments(existing, incoming) {
1796
- const existingPayments = Array.isArray(existing) ? existing : [];
1797
- const incomingPayments = Array.isArray(incoming) ? incoming : [];
1798
- const incomingIdentityKeys = new Set(
1799
- incomingPayments.flatMap((payment) => (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment))
1800
- );
1801
- return existingPayments.filter((payment) => (0, import_payment_utils.isIdentifiedPendingOrderPayment)(payment) && !(0, import_payment_utils.getOrderPaymentIdentityKeys)(payment).some((key) => incomingIdentityKeys.has(key)));
1802
- }
1803
1323
  mergeOrderRecords(existing, incoming) {
1804
1324
  const preferred = this.pickPreferredOrder(existing, incoming);
1805
1325
  const secondary = preferred === existing ? incoming : existing;
@@ -1829,8 +1349,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1829
1349
  "contacts_info",
1830
1350
  "phone",
1831
1351
  "email",
1832
- "relation_forms",
1833
- "is_draft_order"
1352
+ "relation_forms"
1834
1353
  ];
1835
1354
  const mergedRecord = merged;
1836
1355
  const preferredRecord = preferred;
@@ -1858,26 +1377,11 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1858
1377
  }
1859
1378
  for (const field of ORDER_AUTHORITATIVE_COLLECTION_FIELDS) {
1860
1379
  if (Array.isArray(incomingRecord[field])) {
1861
- if (field === "payments") {
1862
- const preservedPending = this.getUnmatchedIdentifiedPendingPayments(
1863
- existingRecord[field],
1864
- incomingRecord[field]
1865
- );
1866
- if (preservedPending.length > 0) {
1867
- this.logInfo("mergeOrderRecords-保留本地 pending 支付项", {
1868
- order_id: existing.order_id ?? incoming.order_id ?? null,
1869
- external_sale_number: existingRecord.external_sale_number ?? incomingRecord.external_sale_number ?? null,
1870
- preserved_pending_count: preservedPending.length,
1871
- preserved_payment_identities: preservedPending.map((payment) => (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment))
1872
- });
1873
- }
1874
- }
1875
1380
  mergedRecord[field] = this.mergeAuthoritativeOrderCollection(
1876
1381
  field,
1877
1382
  existingRecord[field],
1878
1383
  incomingRecord[field],
1879
- childUidRemaps,
1880
- { preserveIdentifiedPendingPayments: field === "payments" }
1384
+ childUidRemaps
1881
1385
  );
1882
1386
  continue;
1883
1387
  }
@@ -1912,8 +1416,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1912
1416
  external_sale_number: order.external_sale_number ?? null,
1913
1417
  shop_order_number: order.shop_order_number ?? null,
1914
1418
  shop_full_order_number: order.shop_full_order_number ?? null,
1915
- need_sync: order.need_sync ?? null,
1916
- is_draft_order: order.is_draft_order ?? null
1419
+ need_sync: order.need_sync ?? null
1917
1420
  }))
1918
1421
  }));
1919
1422
  }
@@ -2030,48 +1533,18 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2030
1533
  isPendingSyncOrder(order) {
2031
1534
  return Number(order == null ? void 0 : order.need_sync) === 1;
2032
1535
  }
2033
- isDraftOrder(order) {
2034
- return Number(order == null ? void 0 : order.is_draft_order) === 1;
2035
- }
2036
- shouldProtectDraftOrderFromIncoming(source) {
2037
- return source !== "checkoutSync";
2038
- }
2039
1536
  normalizeRemoteSyncedOrder(order) {
2040
1537
  const normalizedOrder = this.normalizeOrderCollectionsForIngress(
2041
1538
  order,
2042
1539
  "normalizeRemoteSyncedOrder"
2043
1540
  );
2044
1541
  if (this.isPendingSyncOrder(normalizedOrder))
2045
- return {
2046
- ...normalizedOrder,
2047
- is_draft_order: 0
2048
- };
1542
+ return normalizedOrder;
2049
1543
  return {
2050
1544
  ...normalizedOrder,
2051
- need_sync: 0,
2052
- is_draft_order: 0
1545
+ need_sync: 0
2053
1546
  };
2054
1547
  }
2055
- mergeRemoteIdentityIntoDraftOrder(draftOrder, remoteOrder) {
2056
- const merged = {
2057
- ...this.withoutSyntheticDraftOrderId(draftOrder)
2058
- };
2059
- const remote = remoteOrder;
2060
- for (const field of [
2061
- "order_id",
2062
- "order_number",
2063
- "shop_order_number",
2064
- "shop_full_order_number"
2065
- ]) {
2066
- if (this.isBlankIdentityValue(merged[field]) && !this.isBlankIdentityValue(remote[field])) {
2067
- merged[field] = remote[field];
2068
- }
2069
- }
2070
- return this.normalizeOrderCollectionsForIngress(
2071
- merged,
2072
- "mergeRemoteIdentityIntoDraftOrder"
2073
- );
2074
- }
2075
1548
  mergeRemoteSnapshotWithPendingOrders(remoteOrders, existingOrders) {
2076
1549
  const merged = remoteOrders.map((order) => this.normalizeRemoteSyncedOrder(order));
2077
1550
  for (const rawOrder of existingOrders) {
@@ -2079,18 +1552,11 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2079
1552
  rawOrder,
2080
1553
  "mergeRemoteSnapshotWithPendingOrders.existingSQLite"
2081
1554
  );
2082
- if (!this.shouldProtectLocalOrderFromRemoteSnapshot(order))
1555
+ if (!this.isPendingSyncOrder(order))
2083
1556
  continue;
2084
1557
  const matchIndex = this.findOrderIndexByIdentity(merged, order);
2085
1558
  if (matchIndex >= 0) {
2086
- if (this.isDraftOrder(order)) {
2087
- merged[matchIndex] = this.mergeRemoteIdentityIntoDraftOrder(
2088
- order,
2089
- merged[matchIndex]
2090
- );
2091
- } else {
2092
- merged[matchIndex] = this.mergeOrderRecords(order, merged[matchIndex]);
2093
- }
1559
+ merged[matchIndex] = this.mergeOrderRecords(order, merged[matchIndex]);
2094
1560
  continue;
2095
1561
  }
2096
1562
  if (!this.getOrderStorageKey(order))
@@ -2118,13 +1584,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2118
1584
  * @example
2119
1585
  * await this.patchOrdersInSQLite(freshOrders)
2120
1586
  */
2121
- async patchOrdersInSQLite(orders, source, mergeActions = {}, options = {}) {
2122
- if (orders.length === 0) {
2123
- return;
2124
- }
2125
- if (!this.dbManager) {
2126
- if (options.throwOnError)
2127
- throw new Error("订单 SQLite 数据库未初始化");
1587
+ async patchOrdersInSQLite(orders, source, mergeActions = {}) {
1588
+ if (!this.dbManager || orders.length === 0) {
2128
1589
  return;
2129
1590
  }
2130
1591
  const ordersSnapshot = (0, import_lodash_es.cloneDeep)(orders).map((order) => this.normalizeOrderCollectionsForIngress(order, `${source}.sqliteIngress`)).filter((order) => this.getOrderStorageKey(order));
@@ -2162,8 +1623,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2162
1623
  for (const order of compactedToWrite) {
2163
1624
  await this.dbManager.update(INDEXDB_STORE_NAME, order);
2164
1625
  }
2165
- } else if (options.throwOnError) {
2166
- throw new Error("订单 SQLite 数据库不支持写入");
2167
1626
  }
2168
1627
  this.recordRecentSqliteWrite(source, compactedToWrite);
2169
1628
  this.logInfo("patchOrdersInSQLite-完成", {
@@ -2178,8 +1637,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2178
1637
  error: error instanceof Error ? error.message : String(error),
2179
1638
  orderCount: ordersSnapshot.length
2180
1639
  });
2181
- if (options.throwOnError)
2182
- throw error;
2183
1640
  }
2184
1641
  }
2185
1642
  /**
@@ -2188,15 +1645,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2188
1645
  * @example
2189
1646
  * await this.updateOrderInSQLite(freshOrder)
2190
1647
  */
2191
- async updateOrderInSQLite(order, source, options = {}) {
2192
- if (!this.getOrderStorageKey(order)) {
2193
- if (options.throwOnError)
2194
- throw new Error("订单缺少可用的 SQLite 存储主键");
2195
- return;
2196
- }
2197
- if (!this.dbManager) {
2198
- if (options.throwOnError)
2199
- throw new Error("订单 SQLite 数据库未初始化");
1648
+ async updateOrderInSQLite(order, source) {
1649
+ if (!this.dbManager || !this.getOrderStorageKey(order)) {
2200
1650
  return;
2201
1651
  }
2202
1652
  const orderSnapshot = this.normalizeOrderCollectionsForIngress(
@@ -2220,8 +1670,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2220
1670
  } else if (typeof this.dbManager.bulkAdd === "function") {
2221
1671
  writeMethod = "bulkAdd";
2222
1672
  await this.dbManager.bulkAdd(INDEXDB_STORE_NAME, [orderSnapshot]);
2223
- } else if (options.throwOnError) {
2224
- throw new Error("订单 SQLite 数据库不支持写入");
2225
1673
  }
2226
1674
  this.recordRecentSqliteWrite(source, [orderSnapshot]);
2227
1675
  this.logInfo("updateOrderInSQLite-完成", {
@@ -2235,18 +1683,15 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2235
1683
  error: error instanceof Error ? error.message : String(error),
2236
1684
  orderId: orderSnapshot.order_id ?? null
2237
1685
  });
2238
- if (options.throwOnError)
2239
- throw error;
2240
1686
  }
2241
1687
  }
2242
1688
  /**
2243
- * 全量快照替换 orders 表(clear + bulkAdd),并保留本地 draft / need_sync / pending 支付订单。
2244
- * 用于 SSE 全量拉取与营业日窗口裁剪。
1689
+ * 全量快照替换 orders 表(clear + bulkAdd),用于 SSE 全量拉取与营业日窗口裁剪。
2245
1690
  *
2246
1691
  * @example
2247
1692
  * await this.replaceOrdersSnapshotInSQLite(orderList)
2248
1693
  */
2249
- async replaceOrdersSnapshotInSQLite(orderList, source, protectedOrdersBeforeRemoteFetch = []) {
1694
+ async replaceOrdersSnapshotInSQLite(orderList, source) {
2250
1695
  if (!this.dbManager) {
2251
1696
  return this.compactOrderListByIdentity(
2252
1697
  orderList.map((order) => this.normalizeRemoteSyncedOrder(order)),
@@ -2263,52 +1708,16 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2263
1708
  try {
2264
1709
  await this.runInOrderSQLiteSaveQueue(async () => {
2265
1710
  const existingOrders = typeof this.dbManager.getAll === "function" ? await this.dbManager.getAll(INDEXDB_STORE_NAME) : [];
2266
- const protectedLocalOrders = protectedOrdersBeforeRemoteFetch.map((order) => this.normalizeOrderCollectionsForIngress(
2267
- order,
2268
- `${source}.protectedBeforeRemoteFetch`
2269
- )).filter((order) => this.shouldProtectLocalOrderFromRemoteSnapshot(order));
2270
- for (const rawCurrentOrder of existingOrders || []) {
2271
- const currentOrder = this.normalizeOrderCollectionsForIngress(
2272
- rawCurrentOrder,
2273
- `${source}.currentSQLite`
2274
- );
2275
- const protectedIndex = this.findOrderIndexByIdentity(
2276
- protectedLocalOrders,
2277
- currentOrder
2278
- );
2279
- const currentNeedsProtection = this.shouldProtectLocalOrderFromRemoteSnapshot(currentOrder);
2280
- if (protectedIndex >= 0) {
2281
- if (currentNeedsProtection) {
2282
- protectedLocalOrders[protectedIndex] = currentOrder;
2283
- } else {
2284
- protectedLocalOrders.splice(protectedIndex, 1);
2285
- }
2286
- continue;
2287
- }
2288
- if (currentNeedsProtection)
2289
- protectedLocalOrders.push(currentOrder);
2290
- }
2291
1711
  const orderListSnapshot = this.mergeRemoteSnapshotWithPendingOrders(
2292
1712
  remoteSnapshot,
2293
- protectedLocalOrders
1713
+ existingOrders || []
2294
1714
  );
2295
1715
  mergedSnapshot = this.compactOrderListByIdentity(orderListSnapshot, `${source}.sqliteSnapshot`).list;
2296
1716
  this.logInfo("replaceOrdersSnapshotInSQLite-开始", {
2297
1717
  source,
2298
1718
  count: mergedSnapshot.length,
2299
1719
  remoteCount: remoteSnapshot.length,
2300
- protectedBeforeRemoteFetchCount: protectedOrdersBeforeRemoteFetch.length,
2301
- protectedLocalOrderCount: protectedLocalOrders.length,
2302
- preservedLocalUnsyncedCount: mergedSnapshot.length - remoteSnapshot.length,
2303
- protectedPendingPaymentCount: protectedLocalOrders.reduce(
2304
- (count, order) => count + this.getIdentifiedPendingPayments(order).length,
2305
- 0
2306
- ),
2307
- protectedPendingPaymentIdentities: protectedLocalOrders.flatMap((order) => this.getIdentifiedPendingPayments(order).map((payment) => ({
2308
- order_id: order.order_id ?? null,
2309
- external_sale_number: order.external_sale_number ?? null,
2310
- payment_identities: (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment)
2311
- })))
1720
+ preservedPendingCount: mergedSnapshot.length - remoteSnapshot.length
2312
1721
  });
2313
1722
  await this.dbManager.clear(INDEXDB_STORE_NAME);
2314
1723
  this.logInfo("replaceOrdersSnapshotInSQLite-clear完成", {