@pisell/pisellos 2.3.67 → 2.3.68

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 (85) hide show
  1. package/dist/core/index.d.ts +0 -7
  2. package/dist/core/index.js +65 -109
  3. package/dist/model/strategy/adapter/walletPass/evaluator.js +0 -1
  4. package/dist/model/strategy/adapter/walletPass/utils.js +0 -2
  5. package/dist/modules/BaseModule.d.ts +1 -0
  6. package/dist/modules/BaseModule.js +24 -28
  7. package/dist/modules/Customer/index.d.ts +4 -0
  8. package/dist/modules/Customer/index.js +91 -59
  9. package/dist/modules/Customer/types.d.ts +2 -0
  10. package/dist/modules/Order/index.d.ts +22 -2
  11. package/dist/modules/Order/index.js +313 -142
  12. package/dist/modules/Order/types.d.ts +13 -1
  13. package/dist/modules/Order/utils/orderCollectionIdentity.d.ts +15 -0
  14. package/dist/modules/Order/utils/orderCollectionIdentity.js +75 -0
  15. package/dist/modules/Order/utils.js +0 -1
  16. package/dist/modules/Payment/index.d.ts +4 -0
  17. package/dist/modules/Payment/index.js +14 -4
  18. package/dist/modules/Payment/walletpass.js +52 -18
  19. package/dist/modules/Quotation/index.d.ts +0 -6
  20. package/dist/modules/Quotation/index.js +19 -75
  21. package/dist/modules/Rules/index.js +46 -31
  22. package/dist/plugins/request.d.ts +0 -1
  23. package/dist/server/index.d.ts +2 -8
  24. package/dist/server/index.js +143 -212
  25. package/dist/server/modules/floor-plan/index.d.ts +0 -4
  26. package/dist/server/modules/floor-plan/index.js +98 -240
  27. package/dist/server/modules/menu/index.js +23 -48
  28. package/dist/server/modules/order/index.d.ts +8 -17
  29. package/dist/server/modules/order/index.js +453 -506
  30. package/dist/server/modules/products/index.d.ts +2 -8
  31. package/dist/server/modules/products/index.js +75 -167
  32. package/dist/server/modules/resource/index.js +13 -21
  33. package/dist/server/utils/small-ticket.js +2 -1
  34. package/dist/solution/BaseSales/index.d.ts +3 -1
  35. package/dist/solution/BaseSales/index.js +99 -82
  36. package/dist/solution/BaseSales/utils.js +31 -20
  37. package/dist/solution/BookingTicket/index.d.ts +6 -2
  38. package/dist/solution/BookingTicket/index.js +123 -75
  39. package/dist/solution/ScanOrder/utils.js +31 -20
  40. package/dist/solution/UnifiedBookingSales/index.d.ts +25 -0
  41. package/dist/solution/UnifiedBookingSales/index.js +640 -321
  42. package/dist/solution/UnifiedBookingSales/types.d.ts +7 -0
  43. package/lib/core/index.d.ts +0 -7
  44. package/lib/core/index.js +2 -20
  45. package/lib/model/strategy/adapter/walletPass/evaluator.js +0 -1
  46. package/lib/model/strategy/adapter/walletPass/utils.js +0 -1
  47. package/lib/modules/BaseModule.d.ts +1 -0
  48. package/lib/modules/BaseModule.js +24 -37
  49. package/lib/modules/Customer/index.d.ts +4 -0
  50. package/lib/modules/Customer/index.js +11 -0
  51. package/lib/modules/Customer/types.d.ts +2 -0
  52. package/lib/modules/Order/index.d.ts +22 -2
  53. package/lib/modules/Order/index.js +212 -54
  54. package/lib/modules/Order/types.d.ts +13 -1
  55. package/lib/modules/Order/utils/orderCollectionIdentity.d.ts +15 -0
  56. package/lib/modules/Order/utils/orderCollectionIdentity.js +70 -0
  57. package/lib/modules/Order/utils.js +0 -1
  58. package/lib/modules/Payment/index.d.ts +4 -0
  59. package/lib/modules/Payment/index.js +7 -0
  60. package/lib/modules/Payment/walletpass.js +27 -2
  61. package/lib/modules/Quotation/index.d.ts +0 -6
  62. package/lib/modules/Quotation/index.js +5 -49
  63. package/lib/modules/Rules/index.js +17 -1
  64. package/lib/plugins/request.d.ts +0 -1
  65. package/lib/server/index.d.ts +2 -8
  66. package/lib/server/index.js +20 -58
  67. package/lib/server/modules/floor-plan/index.d.ts +0 -4
  68. package/lib/server/modules/floor-plan/index.js +6 -54
  69. package/lib/server/modules/menu/index.js +5 -31
  70. package/lib/server/modules/order/index.d.ts +8 -17
  71. package/lib/server/modules/order/index.js +106 -199
  72. package/lib/server/modules/products/index.d.ts +2 -8
  73. package/lib/server/modules/products/index.js +24 -97
  74. package/lib/server/modules/resource/index.js +2 -7
  75. package/lib/server/utils/small-ticket.js +1 -1
  76. package/lib/solution/BaseSales/index.d.ts +3 -1
  77. package/lib/solution/BaseSales/index.js +29 -16
  78. package/lib/solution/BaseSales/utils.js +29 -18
  79. package/lib/solution/BookingTicket/index.d.ts +6 -2
  80. package/lib/solution/BookingTicket/index.js +53 -14
  81. package/lib/solution/ScanOrder/utils.js +29 -18
  82. package/lib/solution/UnifiedBookingSales/index.d.ts +25 -0
  83. package/lib/solution/UnifiedBookingSales/index.js +188 -0
  84. package/lib/solution/UnifiedBookingSales/types.d.ts +7 -0
  85. package/package.json +1 -1
@@ -119,23 +119,14 @@ export declare class OrderModule extends BaseModule implements Module {
119
119
  payment: Record<string, any>;
120
120
  previousPayment: Record<string, any>;
121
121
  } | null>;
122
- loadOrdersByServer(options?: {
123
- trigger?: string;
124
- }): Promise<OrderData[]>;
122
+ loadOrdersByServer(): Promise<OrderData[]>;
125
123
  /**
126
124
  * 静默全量刷新:后台重新拉取全量 SSE 订单数据并更新本地
127
125
  * 拿到完整数据后一次性替换 store,触发订单变更与同步完成事件
128
126
  * @returns 刷新后的订单列表
129
127
  */
130
- silentRefresh(options?: {
131
- trigger?: string;
132
- }): Promise<OrderData[]>;
128
+ silentRefresh(): Promise<OrderData[]>;
133
129
  private normalizeOrderForMemoryList;
134
- /**
135
- * 将已经完成集合规范化的订单转换为内存身份,不重复扫描 products/bookings/payments。
136
- */
137
- private prepareNormalizedOrderForMemoryList;
138
- private prepareNormalizedOrdersForMemoryList;
139
130
  private normalizeOrdersForMemoryList;
140
131
  private hasRealOrderId;
141
132
  private shouldKeepOrderInMemory;
@@ -283,6 +274,7 @@ export declare class OrderModule extends BaseModule implements Module {
283
274
  * // => 'S-1001'
284
275
  */
285
276
  private getOrderStorageKey;
277
+ private getPersistedOrderStorageKey;
286
278
  private getOrderIdentityMatchKeys;
287
279
  private doOrdersShareIdentity;
288
280
  private findOrderIndexByIdentity;
@@ -299,14 +291,13 @@ export declare class OrderModule extends BaseModule implements Module {
299
291
  private logDuplicateOrders;
300
292
  private compactOrderListByIdentity;
301
293
  /**
302
- * 当前订单缓存可复用窗口。
303
- * start_time 模式使用精确的营业日起止时间;配置缺失或异常时退化为自然日。
294
+ * 当前订单拉取窗口:
295
+ * - 优先使用 createdAtQuery.sales_time_between(已按营业日边界初始化)
296
+ * - 无法解析时退化为自然日窗口
304
297
  */
305
- private getCurrentOrderCacheWindow;
298
+ private getCurrentPullWindow;
306
299
  private hasPulledOrdersToday;
307
300
  private markOrderPulledAtNow;
308
- private clearOrderSnapshotMarker;
309
- private getCurrentShopId;
310
301
  private getStorageItem;
311
302
  private setStorageItem;
312
303
  private loadOrdersFromSQLite;
@@ -344,7 +335,7 @@ export declare class OrderModule extends BaseModule implements Module {
344
335
  * 用于 SSE 全量拉取与营业日窗口裁剪。
345
336
  *
346
337
  * @example
347
- * const { orders, persisted } = await this.replaceOrdersSnapshotInSQLite(orderList, 'refresh')
338
+ * await this.replaceOrdersSnapshotInSQLite(orderList)
348
339
  */
349
340
  private replaceOrdersSnapshotInSQLite;
350
341
  /**
@@ -39,8 +39,8 @@ var import_orderCollectionIdentity = require("../../../modules/Order/utils/order
39
39
  var import_types = require("./types");
40
40
  var import_payment_utils = require("../../../modules/Order/payment-utils");
41
41
  var INDEXDB_STORE_NAME = "orders";
42
+ var ORDER_STORAGE_KEY_FIELD = "__order_storage_key";
42
43
  var ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY = "server_order_last_full_fetch_at";
43
- var ORDER_LAST_FULL_FETCH_SHOP_ID_STORAGE_KEY = "server_order_last_full_fetch_shop_id";
44
44
  var ORDER_SYNC_THROTTLE_MS_STORAGE_KEY = "order_sync_throttle_ms";
45
45
  var DEFAULT_ORDER_SYNC_THROTTLE_MS = 2e3;
46
46
  var ORDER_SQLITE_DEDUPE_MS = 15e3;
@@ -192,21 +192,18 @@ var OrderModule = class extends import_BaseModule.BaseModule {
192
192
  * 仅记录计数与订单标识,不输出商品、预约、支付或客户明细。
193
193
  */
194
194
  normalizeOrderCollectionsForIngress(order, source) {
195
- const sourceOrderRecord = order;
196
- let sourceOrder = sourceOrderRecord;
195
+ const sourceOrder = (0, import_lodash_es.cloneDeep)(order);
196
+ const sourceOrderRecord = sourceOrder;
197
197
  if (Array.isArray(sourceOrderRecord.payments)) {
198
- sourceOrder = {
199
- ...sourceOrderRecord,
200
- payments: sourceOrderRecord.payments.map((payment) => {
201
- if (!(0, import_payment_utils.isPendingOrderPayment)(payment) || (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment).some((key) => key.startsWith("unique_payment_number:"))) {
202
- return payment;
203
- }
204
- return {
205
- ...payment,
206
- [PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER]: true
207
- };
208
- })
209
- };
198
+ sourceOrderRecord.payments = sourceOrderRecord.payments.map((payment) => {
199
+ if (!(0, import_payment_utils.isPendingOrderPayment)(payment) || (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment).some((key) => key.startsWith("unique_payment_number:"))) {
200
+ return payment;
201
+ }
202
+ return {
203
+ ...payment,
204
+ [PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER]: true
205
+ };
206
+ });
210
207
  }
211
208
  const result = (0, import_orderCollectionIdentity.normalizeOrderCollections)(sourceOrder);
212
209
  const normalizedOrderRecord = result.order;
@@ -528,65 +525,11 @@ var OrderModule = class extends import_BaseModule.BaseModule {
528
525
  return DEFAULT_ORDER_SYNC_THROTTLE_MS;
529
526
  }
530
527
  async preload() {
531
- const preloadStartedAt = Date.now();
532
- let cachedOrders = null;
533
- let sqliteLoadTimings;
534
- if (this.dbManager) {
535
- try {
536
- cachedOrders = await this.loadOrdersFromSQLite({
537
- throwOnError: true,
538
- onTiming: (timings) => {
539
- sqliteLoadTimings = timings;
540
- }
541
- });
542
- } catch (error) {
543
- this.logWarning("preload-SQLite读取失败,回退远端全量拉取", {
544
- error: error instanceof Error ? error.message : String(error)
545
- });
546
- }
547
- }
548
- if (cachedOrders !== null && this.hasPulledOrdersToday()) {
549
- const memoryPrepareStartedAt = performance.now();
550
- const memoryOrders = this.prepareNormalizedOrdersForMemoryList(cachedOrders);
551
- const memoryPrepareMs = +(performance.now() - memoryPrepareStartedAt).toFixed(2);
552
- this.store.list = memoryOrders;
553
- const syncMapStartedAt = performance.now();
554
- this.syncOrdersMap();
555
- const syncMapMs = +(performance.now() - syncMapStartedAt).toFixed(2);
556
- const onOrdersLoadedStartedAt = performance.now();
557
- await this.core.effects.emit(import_types.OrderHooks.onOrdersLoaded, this.store.list);
558
- const onOrdersLoadedMs = +(performance.now() - onOrdersLoadedStartedAt).toFixed(2);
559
- const emitOrdersChangedStartedAt = performance.now();
560
- await this.emitOrdersChanged([], "preload.sqlite");
561
- const emitOrdersChangedMs = +(performance.now() - emitOrdersChangedStartedAt).toFixed(2);
562
- this.logInfo("预加载完成", {
563
- trigger: "preload",
564
- source: "SQLite",
565
- orderCount: this.store.list.length,
566
- duration: `${Date.now() - preloadStartedAt}ms`,
567
- stages: {
568
- ...sqliteLoadTimings || {},
569
- memoryPrepareMs,
570
- syncMapMs,
571
- onOrdersLoadedMs,
572
- emitOrdersChangedMs
573
- }
574
- });
575
- return;
576
- }
577
- const orders = await this.loadOrdersByServer({
578
- trigger: "preload"
579
- });
528
+ const orders = await this.loadOrdersByServer();
580
529
  this.store.list = (0, import_lodash_es.cloneDeep)(orders);
581
530
  this.syncOrdersMap();
582
531
  await this.emitOrdersChanged([], "preload");
583
532
  await this.core.effects.emit(import_types.OrderHooks.onOrdersSyncCompleted, null);
584
- this.logInfo("预加载完成", {
585
- trigger: "preload",
586
- source: "Server",
587
- orderCount: this.store.list.length,
588
- duration: `${Date.now() - preloadStartedAt}ms`
589
- });
590
533
  }
591
534
  getOrders() {
592
535
  return this.store.list;
@@ -807,16 +750,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
807
750
  this.logInfo("updateLocalPayment-变更事件完成", paymentContext);
808
751
  return { order: nextOrder, payment: nextPayment, previousPayment };
809
752
  }
810
- async loadOrdersByServer(options = {}) {
753
+ async loadOrdersByServer() {
811
754
  var _a;
812
755
  let orderList = [];
813
- let hasFetchedRemoteSnapshot = false;
814
- const trigger = options.trigger || "unknown";
815
756
  const protectedOrdersBeforeRemoteFetch = (await this.loadOrdersFromSQLite()).filter(
816
757
  (order) => this.shouldProtectLocalOrderFromRemoteSnapshot(order)
817
758
  );
818
759
  this.logInfo("loadOrdersByServer-开始", {
819
- trigger,
820
760
  hasOrderDataSource: !!this.orderDataSource,
821
761
  query: ((_a = this.store) == null ? void 0 : _a.createdAtQuery) || null,
822
762
  protectedLocalOrderCount: protectedOrdersBeforeRemoteFetch.length,
@@ -834,36 +774,25 @@ var OrderModule = class extends import_BaseModule.BaseModule {
834
774
  });
835
775
  orderList = data || [];
836
776
  this.logInfo("loadOrdersByServer-SSE拉取成功", {
837
- trigger,
838
777
  count: orderList.length
839
778
  });
840
- hasFetchedRemoteSnapshot = true;
779
+ this.markOrderPulledAtNow();
841
780
  this.lastServerFullFetchAtMs = Date.now();
842
781
  } catch {
843
782
  this.logInfo("loadOrdersByServer-SSE拉取失败,保持当前内存订单");
844
783
  return this.store.list;
845
784
  }
846
785
  }
847
- if (hasFetchedRemoteSnapshot) {
848
- this.clearOrderSnapshotMarker();
849
- }
850
- const {
851
- orders: mergedOrders,
852
- persisted: isRemoteSnapshotPersisted
853
- } = await this.replaceOrdersSnapshotInSQLite(
786
+ const mergedOrders = await this.replaceOrdersSnapshotInSQLite(
854
787
  orderList,
855
788
  "loadOrdersByServer",
856
789
  protectedOrdersBeforeRemoteFetch
857
790
  );
858
- if (hasFetchedRemoteSnapshot && isRemoteSnapshotPersisted) {
859
- this.markOrderPulledAtNow();
860
- }
861
791
  const memoryOrders = this.normalizeOrdersForMemoryList(
862
792
  mergedOrders,
863
793
  "loadOrdersByServer.memory"
864
794
  );
865
795
  this.logInfo("loadOrdersByServer-结束", {
866
- trigger,
867
796
  count: memoryOrders.length,
868
797
  persistedCount: mergedOrders.length,
869
798
  sqliteOnlyDraftCount: mergedOrders.length - memoryOrders.length
@@ -876,34 +805,21 @@ var OrderModule = class extends import_BaseModule.BaseModule {
876
805
  * 拿到完整数据后一次性替换 store,触发订单变更与同步完成事件
877
806
  * @returns 刷新后的订单列表
878
807
  */
879
- async silentRefresh(options = {}) {
808
+ async silentRefresh() {
880
809
  const startTime = Date.now();
881
- const trigger = options.trigger || "background";
882
810
  const elapsedSinceFullFetch = Date.now() - this.lastServerFullFetchAtMs;
883
811
  if (this.lastServerFullFetchAtMs > 0 && elapsedSinceFullFetch < ORDER_SILENT_REFRESH_MIN_INTERVAL_MS) {
884
- this.logInfo("silentRefresh 跳过全量 SSE", {
885
- trigger,
886
- reason: "within_min_interval",
887
- minIntervalMs: ORDER_SILENT_REFRESH_MIN_INTERVAL_MS,
888
- elapsedSinceFullFetchMs: elapsedSinceFullFetch,
889
- orderCount: this.store.list.length
890
- });
891
812
  return this.store.list;
892
813
  }
893
- this.logInfo("silentRefresh 开始", {
894
- trigger,
895
- elapsedSinceFullFetchMs: elapsedSinceFullFetch,
896
- orderCount: this.store.list.length
897
- });
814
+ this.logInfo("silentRefresh 开始");
898
815
  try {
899
816
  this.updateCreateStore();
900
- const orders = await this.loadOrdersByServer({ trigger });
817
+ const orders = await this.loadOrdersByServer();
901
818
  this.store.list = (0, import_lodash_es.cloneDeep)(orders);
902
819
  this.syncOrdersMap();
903
820
  await this.emitOrdersChanged([], "silentRefresh");
904
821
  await this.core.effects.emit(import_types.OrderHooks.onOrdersSyncCompleted, null);
905
822
  this.logInfo("silentRefresh 完成", {
906
- trigger,
907
823
  orderCount: orders.length,
908
824
  duration: `${Date.now() - startTime}ms`
909
825
  });
@@ -911,7 +827,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
911
827
  } catch (error) {
912
828
  const errorMessage = error instanceof Error ? error.message : String(error);
913
829
  this.logError("silentRefresh 失败", {
914
- trigger,
915
830
  duration: `${Date.now() - startTime}ms`,
916
831
  error: errorMessage
917
832
  });
@@ -920,12 +835,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
920
835
  }
921
836
  normalizeOrderForMemoryList(order, source = "normalizeOrderForMemoryList") {
922
837
  const normalizedOrder = this.normalizeOrderCollectionsForIngress(order, source);
923
- return this.prepareNormalizedOrderForMemoryList(normalizedOrder);
924
- }
925
- /**
926
- * 将已经完成集合规范化的订单转换为内存身份,不重复扫描 products/bookings/payments。
927
- */
928
- prepareNormalizedOrderForMemoryList(normalizedOrder) {
929
838
  const externalSaleNumber = normalizedOrder == null ? void 0 : normalizedOrder.external_sale_number;
930
839
  if (this.isDraftOrder(normalizedOrder) && !this.hasRealOrderId(normalizedOrder)) {
931
840
  return normalizedOrder;
@@ -941,9 +850,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
941
850
  order_id: externalSaleNumber
942
851
  };
943
852
  }
944
- prepareNormalizedOrdersForMemoryList(orders) {
945
- return orders.map((order) => this.prepareNormalizedOrderForMemoryList(order)).filter((order) => this.shouldKeepOrderInMemory(order));
946
- }
947
853
  normalizeOrdersForMemoryList(orders, source) {
948
854
  return orders.map((order) => this.normalizeOrderForMemoryList(order, source)).filter((order) => this.shouldKeepOrderInMemory(order));
949
855
  }
@@ -1628,6 +1534,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1628
1534
  const patchedOrders = [];
1629
1535
  const remoteProductMembershipChanges = [];
1630
1536
  const forceWriteStorageKeys = /* @__PURE__ */ new Set();
1537
+ const storageKeyMigrations = [];
1631
1538
  const mergeActions = {};
1632
1539
  const existingProductsHaveStableIdentity = this.store.list.map(
1633
1540
  (order) => this.doProductsHaveStableMembershipIdentity(
@@ -1652,6 +1559,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1652
1559
  const mergeKey = storageKey || (fresh.order_id !== void 0 && fresh.order_id !== null ? this.getIdKey(fresh.order_id) : "");
1653
1560
  if (matchIndex >= 0) {
1654
1561
  const existingOrder = updatedList[matchIndex];
1562
+ const previousStorageKey = this.getPersistedOrderStorageKey(existingOrder);
1655
1563
  if (this.isPendingSyncOrder(existingOrder) && this.isRemoteEchoMergeSource(source)) {
1656
1564
  this.logInfo("mergeOrdersToStore-跳过 pending 订单远端覆盖", {
1657
1565
  source,
@@ -1713,6 +1621,14 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1713
1621
  }
1714
1622
  }
1715
1623
  }
1624
+ const nextStorageKey = this.getOrderStorageKey(mergedOrder);
1625
+ if (previousStorageKey && nextStorageKey && previousStorageKey !== nextStorageKey) {
1626
+ storageKeyMigrations.push({
1627
+ orderId: mergedOrder.order_id ?? existingOrder.order_id ?? fresh.order_id ?? null,
1628
+ from: previousStorageKey,
1629
+ to: nextStorageKey
1630
+ });
1631
+ }
1716
1632
  updatedList[adjustedMatchIndex] = mergedOrder;
1717
1633
  existingProductsHaveStableIdentity[adjustedMatchIndex] = mergedProductsHaveStableIdentity;
1718
1634
  if (membershipChange) {
@@ -1750,7 +1666,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1750
1666
  patchedOrders,
1751
1667
  source,
1752
1668
  mergeActions,
1753
- {},
1669
+ { storageKeyMigrations },
1754
1670
  forceWriteStorageKeys
1755
1671
  );
1756
1672
  this.logInfo("mergeOrdersToStore-结束", {
@@ -1955,6 +1871,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1955
1871
  }
1956
1872
  return "";
1957
1873
  }
1874
+ getPersistedOrderStorageKey(order) {
1875
+ const persistedStorageKey = order == null ? void 0 : order[ORDER_STORAGE_KEY_FIELD];
1876
+ if (persistedStorageKey !== void 0 && persistedStorageKey !== null && persistedStorageKey !== "") {
1877
+ return String(persistedStorageKey);
1878
+ }
1879
+ return this.getOrderStorageKey(order);
1880
+ }
1958
1881
  getOrderIdentityMatchKeys(order) {
1959
1882
  return this.getOrderIdentityEntries(order).map((entry) => `${entry.field}:${entry.key}`);
1960
1883
  }
@@ -2214,29 +2137,20 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2214
2137
  return { list, removedCount };
2215
2138
  }
2216
2139
  /**
2217
- * 当前订单缓存可复用窗口。
2218
- * start_time 模式使用精确的营业日起止时间;配置缺失或异常时退化为自然日。
2140
+ * 当前订单拉取窗口:
2141
+ * - 优先使用 createdAtQuery.sales_time_between(已按营业日边界初始化)
2142
+ * - 无法解析时退化为自然日窗口
2219
2143
  */
2220
- getCurrentOrderCacheWindow() {
2221
- var _a;
2144
+ getCurrentPullWindow() {
2145
+ var _a, _b;
2222
2146
  const now = (0, import_dayjs.default)();
2223
- try {
2224
- const appPlugin = this.core.getPlugin("app");
2225
- const app = appPlugin == null ? void 0 : appPlugin.getApp();
2226
- const coreData = app == null ? void 0 : app.data.store.getStore().getDataByModel("core");
2227
- const boundary = (_a = coreData == null ? void 0 : coreData.core) == null ? void 0 : _a.operating_day_boundary;
2228
- if ((boundary == null ? void 0 : boundary.type) === "start_time") {
2229
- const boundaryTime = String(boundary.time || "").trim();
2230
- const todayBoundary = (0, import_dayjs.default)(`${now.format("YYYY-MM-DD")} ${boundaryTime}`);
2231
- if (todayBoundary.isValid()) {
2232
- const startAt2 = now.isBefore(todayBoundary) ? todayBoundary.subtract(1, "day") : todayBoundary;
2233
- return {
2234
- startAt: startAt2,
2235
- endExclusiveAt: startAt2.add(1, "day")
2236
- };
2237
- }
2147
+ const range = (_b = (_a = this.store) == null ? void 0 : _a.createdAtQuery) == null ? void 0 : _b.sales_time_between;
2148
+ if (Array.isArray(range) && range.length >= 2) {
2149
+ const startAt2 = (0, import_dayjs.default)(range[0]);
2150
+ const endExclusiveAt = (0, import_dayjs.default)(range[1]);
2151
+ if (startAt2.isValid() && endExclusiveAt.isValid() && endExclusiveAt.isAfter(startAt2)) {
2152
+ return { startAt: startAt2, endExclusiveAt };
2238
2153
  }
2239
- } catch {
2240
2154
  }
2241
2155
  const startAt = now.startOf("day");
2242
2156
  return { startAt, endExclusiveAt: startAt.add(1, "day") };
@@ -2245,51 +2159,17 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2245
2159
  const lastFullFetchAt = this.getStorageItem(ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY);
2246
2160
  if (!lastFullFetchAt)
2247
2161
  return false;
2248
- const currentShopId = this.getCurrentShopId();
2249
- const lastFullFetchShopId = this.getStorageItem(
2250
- ORDER_LAST_FULL_FETCH_SHOP_ID_STORAGE_KEY
2251
- );
2252
- if (!currentShopId || !lastFullFetchShopId || currentShopId !== lastFullFetchShopId) {
2253
- return false;
2254
- }
2255
2162
  const parsed = (0, import_dayjs.default)(lastFullFetchAt);
2256
2163
  if (!parsed.isValid())
2257
2164
  return false;
2258
- const { startAt, endExclusiveAt } = this.getCurrentOrderCacheWindow();
2165
+ const { startAt, endExclusiveAt } = this.getCurrentPullWindow();
2259
2166
  return (parsed.isAfter(startAt) || parsed.isSame(startAt)) && parsed.isBefore(endExclusiveAt);
2260
2167
  }
2261
2168
  markOrderPulledAtNow() {
2262
- const currentShopId = this.getCurrentShopId();
2263
- if (!currentShopId)
2264
- return;
2265
2169
  this.setStorageItem(
2266
2170
  ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY,
2267
2171
  (0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss")
2268
2172
  );
2269
- this.setStorageItem(
2270
- ORDER_LAST_FULL_FETCH_SHOP_ID_STORAGE_KEY,
2271
- currentShopId
2272
- );
2273
- }
2274
- clearOrderSnapshotMarker() {
2275
- this.setStorageItem(ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY, "");
2276
- this.setStorageItem(ORDER_LAST_FULL_FETCH_SHOP_ID_STORAGE_KEY, "");
2277
- }
2278
- getCurrentShopId() {
2279
- var _a;
2280
- try {
2281
- const appPlugin = this.core.getPlugin("app");
2282
- const app = appPlugin == null ? void 0 : appPlugin.getApp();
2283
- if (!app)
2284
- return null;
2285
- const coreData = app.data.store.getStore().getDataByModel("core");
2286
- const shopId = (_a = coreData == null ? void 0 : coreData.core) == null ? void 0 : _a.id;
2287
- if (shopId === void 0 || shopId === null || shopId === "")
2288
- return null;
2289
- return String(shopId);
2290
- } catch {
2291
- return null;
2292
- }
2293
2173
  }
2294
2174
  getStorageItem(key) {
2295
2175
  var _a;
@@ -2316,29 +2196,15 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2316
2196
  } catch {
2317
2197
  }
2318
2198
  }
2319
- async loadOrdersFromSQLite(options = {}) {
2320
- var _a;
2199
+ async loadOrdersFromSQLite() {
2321
2200
  if (!this.dbManager)
2322
2201
  return [];
2323
2202
  try {
2324
- const loadStartedAt = performance.now();
2325
- const rawReadStartedAt = performance.now();
2326
2203
  const orders = await this.dbManager.getAll(INDEXDB_STORE_NAME);
2327
- const sqliteRawReadMs = +(performance.now() - rawReadStartedAt).toFixed(2);
2328
- const normalizeStartedAt = performance.now();
2329
- const normalizedOrders = (orders || []).map(
2204
+ return (orders || []).map(
2330
2205
  (order) => this.normalizeOrderCollectionsForIngress(order, "loadOrdersFromSQLite")
2331
2206
  );
2332
- const sqliteNormalizeMs = +(performance.now() - normalizeStartedAt).toFixed(2);
2333
- (_a = options.onTiming) == null ? void 0 : _a.call(options, {
2334
- sqliteRawReadMs,
2335
- sqliteNormalizeMs,
2336
- sqliteLoadTotalMs: +(performance.now() - loadStartedAt).toFixed(2)
2337
- });
2338
- return normalizedOrders;
2339
- } catch (error) {
2340
- if (options.throwOnError)
2341
- throw error;
2207
+ } catch {
2342
2208
  return [];
2343
2209
  }
2344
2210
  }
@@ -2442,7 +2308,18 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2442
2308
  throw new Error("订单 SQLite 数据库未初始化");
2443
2309
  return;
2444
2310
  }
2445
- const ordersSnapshot = (0, import_lodash_es.cloneDeep)(orders).map((order) => this.normalizeOrderCollectionsForIngress(order, `${source}.sqliteIngress`)).filter((order) => this.getOrderStorageKey(order));
2311
+ const migrationTargetStorageKeys = new Set(
2312
+ (options.storageKeyMigrations || []).map((migration) => migration.to)
2313
+ );
2314
+ const ordersSnapshot = (0, import_lodash_es.cloneDeep)(orders).map((order) => this.normalizeOrderCollectionsForIngress(order, `${source}.sqliteIngress`)).map((order) => {
2315
+ const storageKey = this.getOrderStorageKey(order);
2316
+ if (!storageKey || !migrationTargetStorageKeys.has(storageKey))
2317
+ return order;
2318
+ return {
2319
+ ...order,
2320
+ [ORDER_STORAGE_KEY_FIELD]: storageKey
2321
+ };
2322
+ }).filter((order) => this.getOrderStorageKey(order));
2446
2323
  if (ordersSnapshot.length === 0) {
2447
2324
  return;
2448
2325
  }
@@ -2459,6 +2336,17 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2459
2336
  if (compactedToWrite.length === 0) {
2460
2337
  return;
2461
2338
  }
2339
+ const writtenStorageKeys = new Set(
2340
+ compactedToWrite.map((order) => this.getOrderStorageKey(order)).filter(Boolean)
2341
+ );
2342
+ const storageKeyMigrations = /* @__PURE__ */ new Map();
2343
+ for (const migration of options.storageKeyMigrations || []) {
2344
+ if (!writtenStorageKeys.has(migration.to))
2345
+ continue;
2346
+ if (writtenStorageKeys.has(migration.from))
2347
+ continue;
2348
+ storageKeyMigrations.set(migration.from, migration);
2349
+ }
2462
2350
  try {
2463
2351
  await this.runInOrderSQLiteSaveQueue(async () => {
2464
2352
  let writeMethod = "none";
@@ -2482,6 +2370,30 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2482
2370
  throw new Error("订单 SQLite 数据库不支持写入");
2483
2371
  }
2484
2372
  this.recordRecentSqliteWrite(source, compactedToWrite);
2373
+ if (writeMethod !== "none") {
2374
+ for (const migration of storageKeyMigrations.values()) {
2375
+ try {
2376
+ await this.dbManager.delete(INDEXDB_STORE_NAME, migration.from);
2377
+ this.recentSqliteWriteByStorageKey.delete(migration.from);
2378
+ for (const order of orders) {
2379
+ if (this.getOrderStorageKey(order) !== migration.to)
2380
+ continue;
2381
+ const orderRecord = order;
2382
+ if (String(orderRecord[ORDER_STORAGE_KEY_FIELD] ?? "") !== migration.from)
2383
+ continue;
2384
+ orderRecord[ORDER_STORAGE_KEY_FIELD] = migration.to;
2385
+ }
2386
+ } catch (error) {
2387
+ this.logError("删除订单旧 SQLite storage key 失败", {
2388
+ source,
2389
+ order_id: migration.orderId,
2390
+ oldStorageKey: migration.from,
2391
+ newStorageKey: migration.to,
2392
+ error: error instanceof Error ? error.message : String(error)
2393
+ });
2394
+ }
2395
+ }
2396
+ }
2485
2397
  this.logInfo("patchOrdersInSQLite-完成", {
2486
2398
  source,
2487
2399
  count: compactedToWrite.length,
@@ -2560,17 +2472,14 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2560
2472
  * 用于 SSE 全量拉取与营业日窗口裁剪。
2561
2473
  *
2562
2474
  * @example
2563
- * const { orders, persisted } = await this.replaceOrdersSnapshotInSQLite(orderList, 'refresh')
2475
+ * await this.replaceOrdersSnapshotInSQLite(orderList)
2564
2476
  */
2565
2477
  async replaceOrdersSnapshotInSQLite(orderList, source, protectedOrdersBeforeRemoteFetch = []) {
2566
2478
  if (!this.dbManager) {
2567
- return {
2568
- orders: this.compactOrderListByIdentity(
2569
- orderList.map((order) => this.normalizeRemoteSyncedOrder(order)),
2570
- `${source}.snapshotNoDb`
2571
- ).list,
2572
- persisted: false
2573
- };
2479
+ return this.compactOrderListByIdentity(
2480
+ orderList.map((order) => this.normalizeRemoteSyncedOrder(order)),
2481
+ `${source}.snapshotNoDb`
2482
+ ).list;
2574
2483
  }
2575
2484
  const remoteSnapshot = (0, import_lodash_es.cloneDeep)(orderList).map(
2576
2485
  (order) => this.normalizeOrderCollectionsForIngress(order, `${source}.remoteIngress`)
@@ -2579,7 +2488,6 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2579
2488
  remoteSnapshot.map((order) => this.normalizeRemoteSyncedOrder(order)),
2580
2489
  `${source}.remoteSnapshot`
2581
2490
  ).list;
2582
- let persisted = false;
2583
2491
  try {
2584
2492
  await this.runInOrderSQLiteSaveQueue(async () => {
2585
2493
  const existingOrders = typeof this.dbManager.getAll === "function" ? await this.dbManager.getAll(INDEXDB_STORE_NAME) : [];
@@ -2644,14 +2552,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2644
2552
  count: mergedSnapshot.length
2645
2553
  });
2646
2554
  });
2647
- persisted = true;
2648
2555
  } catch (error) {
2649
2556
  this.logError("全量保存订单到 SQLite 失败", {
2650
2557
  error: error instanceof Error ? error.message : String(error),
2651
2558
  orderList: remoteSnapshot.length
2652
2559
  });
2653
2560
  }
2654
- return { orders: mergedSnapshot, persisted };
2561
+ return mergedSnapshot;
2655
2562
  }
2656
2563
  /**
2657
2564
  * 清空订单模块的内存数据和本地 SQLite 订单表。
@@ -2667,7 +2574,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2667
2574
  await this.dbManager.clear(INDEXDB_STORE_NAME);
2668
2575
  });
2669
2576
  }
2670
- this.clearOrderSnapshotMarker();
2577
+ this.setStorageItem(ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY, "");
2671
2578
  this.emitOrdersChanged([], "clear");
2672
2579
  }
2673
2580
  };
@@ -25,7 +25,6 @@ export declare class ProductsModule extends BaseModule implements Module {
25
25
  private quotationBridgeLoadedKey?;
26
26
  private quotationBridgeRefreshPromise?;
27
27
  private quotationBridgeRefreshKey?;
28
- private quotationBridgeUpdatedCallback?;
29
28
  private quotationScheduleCache;
30
29
  private quotationScheduleCacheSource;
31
30
  private quotationScheduleCacheLoaded;
@@ -73,7 +72,6 @@ export declare class ProductsModule extends BaseModule implements Module {
73
72
  scheduleModule?: any;
74
73
  channel?: string;
75
74
  customer_id?: number | string;
76
- onQuotationUpdated?: () => void;
77
75
  }): Promise<void>;
78
76
  /**
79
77
  * 刷新桥接器内的报价单列表。
@@ -183,9 +181,7 @@ export declare class ProductsModule extends BaseModule implements Module {
183
181
  /**
184
182
  * 通过 ProductDataSource SSE 加载完整商品列表
185
183
  */
186
- loadProductsByServer(options?: {
187
- trigger?: string;
188
- }): Promise<any>;
184
+ loadProductsByServer(): Promise<any>;
189
185
  /**
190
186
  * 纯请求方法:通过 HTTP 接口获取商品列表(无副作用,不触发事件、不写 IndexDB)
191
187
  * @param params 查询参数
@@ -335,9 +331,7 @@ export declare class ProductsModule extends BaseModule implements Module {
335
331
  * 拿到完整数据后一次性替换 store,清除价格缓存,触发 onProductsSyncCompleted
336
332
  * @returns 刷新后的商品列表
337
333
  */
338
- silentRefresh(options?: {
339
- trigger?: string;
340
- }): Promise<ProductData[]>;
334
+ silentRefresh(): Promise<ProductData[]>;
341
335
  /**
342
336
  * 销毁同步资源(取消 pubsub 订阅、清除定时器)
343
337
  */