@pisell/pisellos 2.3.73 → 2.3.74

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 (35) hide show
  1. package/dist/core/index.d.ts +7 -0
  2. package/dist/core/index.js +109 -65
  3. package/dist/modules/Order/index.d.ts +1 -1
  4. package/dist/modules/Quotation/index.d.ts +6 -0
  5. package/dist/modules/Quotation/index.js +75 -19
  6. package/dist/plugins/request.d.ts +1 -0
  7. package/dist/server/index.d.ts +8 -2
  8. package/dist/server/index.js +206 -140
  9. package/dist/server/modules/floor-plan/index.d.ts +4 -0
  10. package/dist/server/modules/floor-plan/index.js +240 -98
  11. package/dist/server/modules/menu/index.js +48 -23
  12. package/dist/server/modules/order/index.d.ts +17 -7
  13. package/dist/server/modules/order/index.js +419 -207
  14. package/dist/server/modules/products/index.d.ts +8 -2
  15. package/dist/server/modules/products/index.js +167 -75
  16. package/dist/server/modules/resource/index.js +21 -13
  17. package/dist/solution/BookingByStep/index.d.ts +1 -1
  18. package/lib/core/index.d.ts +7 -0
  19. package/lib/core/index.js +20 -2
  20. package/lib/modules/Order/index.d.ts +1 -1
  21. package/lib/modules/Quotation/index.d.ts +6 -0
  22. package/lib/modules/Quotation/index.js +49 -5
  23. package/lib/plugins/request.d.ts +1 -0
  24. package/lib/server/index.d.ts +8 -2
  25. package/lib/server/index.js +52 -17
  26. package/lib/server/modules/floor-plan/index.d.ts +4 -0
  27. package/lib/server/modules/floor-plan/index.js +54 -6
  28. package/lib/server/modules/menu/index.js +31 -5
  29. package/lib/server/modules/order/index.d.ts +17 -7
  30. package/lib/server/modules/order/index.js +197 -40
  31. package/lib/server/modules/products/index.d.ts +8 -2
  32. package/lib/server/modules/products/index.js +97 -24
  33. package/lib/server/modules/resource/index.js +7 -2
  34. package/lib/solution/BookingByStep/index.d.ts +1 -1
  35. package/package.json +1 -1
@@ -41,6 +41,7 @@ var import_payment_utils = require("../../../modules/Order/payment-utils");
41
41
  var INDEXDB_STORE_NAME = "orders";
42
42
  var ORDER_STORAGE_KEY_FIELD = "__order_storage_key";
43
43
  var ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY = "server_order_last_full_fetch_at";
44
+ var ORDER_LAST_FULL_FETCH_SHOP_ID_STORAGE_KEY = "server_order_last_full_fetch_shop_id";
44
45
  var ORDER_SYNC_THROTTLE_MS_STORAGE_KEY = "order_sync_throttle_ms";
45
46
  var DEFAULT_ORDER_SYNC_THROTTLE_MS = 2e3;
46
47
  var ORDER_SQLITE_DEDUPE_MS = 15e3;
@@ -192,18 +193,21 @@ var OrderModule = class extends import_BaseModule.BaseModule {
192
193
  * 仅记录计数与订单标识,不输出商品、预约、支付或客户明细。
193
194
  */
194
195
  normalizeOrderCollectionsForIngress(order, source) {
195
- const sourceOrder = (0, import_lodash_es.cloneDeep)(order);
196
- const sourceOrderRecord = sourceOrder;
196
+ const sourceOrderRecord = order;
197
+ let sourceOrder = sourceOrderRecord;
197
198
  if (Array.isArray(sourceOrderRecord.payments)) {
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
- });
199
+ sourceOrder = {
200
+ ...sourceOrderRecord,
201
+ payments: sourceOrderRecord.payments.map((payment) => {
202
+ if (!(0, import_payment_utils.isPendingOrderPayment)(payment) || (0, import_payment_utils.getOrderPaymentIdentityKeys)(payment).some((key) => key.startsWith("unique_payment_number:"))) {
203
+ return payment;
204
+ }
205
+ return {
206
+ ...payment,
207
+ [PENDING_PAYMENT_WITHOUT_UNIQUE_MARKER]: true
208
+ };
209
+ })
210
+ };
207
211
  }
208
212
  const result = (0, import_orderCollectionIdentity.normalizeOrderCollections)(sourceOrder);
209
213
  const normalizedOrderRecord = result.order;
@@ -525,11 +529,65 @@ var OrderModule = class extends import_BaseModule.BaseModule {
525
529
  return DEFAULT_ORDER_SYNC_THROTTLE_MS;
526
530
  }
527
531
  async preload() {
528
- const orders = await this.loadOrdersByServer();
532
+ const preloadStartedAt = Date.now();
533
+ let cachedOrders = null;
534
+ let sqliteLoadTimings;
535
+ if (this.dbManager) {
536
+ try {
537
+ cachedOrders = await this.loadOrdersFromSQLite({
538
+ throwOnError: true,
539
+ onTiming: (timings) => {
540
+ sqliteLoadTimings = timings;
541
+ }
542
+ });
543
+ } catch (error) {
544
+ this.logWarning("preload-SQLite读取失败,回退远端全量拉取", {
545
+ error: error instanceof Error ? error.message : String(error)
546
+ });
547
+ }
548
+ }
549
+ if (cachedOrders !== null && this.hasPulledOrdersToday()) {
550
+ const memoryPrepareStartedAt = performance.now();
551
+ const memoryOrders = this.prepareNormalizedOrdersForMemoryList(cachedOrders);
552
+ const memoryPrepareMs = +(performance.now() - memoryPrepareStartedAt).toFixed(2);
553
+ this.store.list = memoryOrders;
554
+ const syncMapStartedAt = performance.now();
555
+ this.syncOrdersMap();
556
+ const syncMapMs = +(performance.now() - syncMapStartedAt).toFixed(2);
557
+ const onOrdersLoadedStartedAt = performance.now();
558
+ await this.core.effects.emit(import_types.OrderHooks.onOrdersLoaded, this.store.list);
559
+ const onOrdersLoadedMs = +(performance.now() - onOrdersLoadedStartedAt).toFixed(2);
560
+ const emitOrdersChangedStartedAt = performance.now();
561
+ await this.emitOrdersChanged([], "preload.sqlite");
562
+ const emitOrdersChangedMs = +(performance.now() - emitOrdersChangedStartedAt).toFixed(2);
563
+ this.logInfo("预加载完成", {
564
+ trigger: "preload",
565
+ source: "SQLite",
566
+ orderCount: this.store.list.length,
567
+ duration: `${Date.now() - preloadStartedAt}ms`,
568
+ stages: {
569
+ ...sqliteLoadTimings || {},
570
+ memoryPrepareMs,
571
+ syncMapMs,
572
+ onOrdersLoadedMs,
573
+ emitOrdersChangedMs
574
+ }
575
+ });
576
+ return;
577
+ }
578
+ const orders = await this.loadOrdersByServer({
579
+ trigger: "preload"
580
+ });
529
581
  this.store.list = (0, import_lodash_es.cloneDeep)(orders);
530
582
  this.syncOrdersMap();
531
583
  await this.emitOrdersChanged([], "preload");
532
584
  await this.core.effects.emit(import_types.OrderHooks.onOrdersSyncCompleted, null);
585
+ this.logInfo("预加载完成", {
586
+ trigger: "preload",
587
+ source: "Server",
588
+ orderCount: this.store.list.length,
589
+ duration: `${Date.now() - preloadStartedAt}ms`
590
+ });
533
591
  }
534
592
  getOrders() {
535
593
  return this.store.list;
@@ -750,13 +808,16 @@ var OrderModule = class extends import_BaseModule.BaseModule {
750
808
  this.logInfo("updateLocalPayment-变更事件完成", paymentContext);
751
809
  return { order: nextOrder, payment: nextPayment, previousPayment };
752
810
  }
753
- async loadOrdersByServer() {
811
+ async loadOrdersByServer(options = {}) {
754
812
  var _a;
755
813
  let orderList = [];
814
+ let hasFetchedRemoteSnapshot = false;
815
+ const trigger = options.trigger || "unknown";
756
816
  const protectedOrdersBeforeRemoteFetch = (await this.loadOrdersFromSQLite()).filter(
757
817
  (order) => this.shouldProtectLocalOrderFromRemoteSnapshot(order)
758
818
  );
759
819
  this.logInfo("loadOrdersByServer-开始", {
820
+ trigger,
760
821
  hasOrderDataSource: !!this.orderDataSource,
761
822
  query: ((_a = this.store) == null ? void 0 : _a.createdAtQuery) || null,
762
823
  protectedLocalOrderCount: protectedOrdersBeforeRemoteFetch.length,
@@ -774,25 +835,36 @@ var OrderModule = class extends import_BaseModule.BaseModule {
774
835
  });
775
836
  orderList = data || [];
776
837
  this.logInfo("loadOrdersByServer-SSE拉取成功", {
838
+ trigger,
777
839
  count: orderList.length
778
840
  });
779
- this.markOrderPulledAtNow();
841
+ hasFetchedRemoteSnapshot = true;
780
842
  this.lastServerFullFetchAtMs = Date.now();
781
843
  } catch {
782
844
  this.logInfo("loadOrdersByServer-SSE拉取失败,保持当前内存订单");
783
845
  return this.store.list;
784
846
  }
785
847
  }
786
- const mergedOrders = await this.replaceOrdersSnapshotInSQLite(
848
+ if (hasFetchedRemoteSnapshot) {
849
+ this.clearOrderSnapshotMarker();
850
+ }
851
+ const {
852
+ orders: mergedOrders,
853
+ persisted: isRemoteSnapshotPersisted
854
+ } = await this.replaceOrdersSnapshotInSQLite(
787
855
  orderList,
788
856
  "loadOrdersByServer",
789
857
  protectedOrdersBeforeRemoteFetch
790
858
  );
859
+ if (hasFetchedRemoteSnapshot && isRemoteSnapshotPersisted) {
860
+ this.markOrderPulledAtNow();
861
+ }
791
862
  const memoryOrders = this.normalizeOrdersForMemoryList(
792
863
  mergedOrders,
793
864
  "loadOrdersByServer.memory"
794
865
  );
795
866
  this.logInfo("loadOrdersByServer-结束", {
867
+ trigger,
796
868
  count: memoryOrders.length,
797
869
  persistedCount: mergedOrders.length,
798
870
  sqliteOnlyDraftCount: mergedOrders.length - memoryOrders.length
@@ -805,21 +877,34 @@ var OrderModule = class extends import_BaseModule.BaseModule {
805
877
  * 拿到完整数据后一次性替换 store,触发订单变更与同步完成事件
806
878
  * @returns 刷新后的订单列表
807
879
  */
808
- async silentRefresh() {
880
+ async silentRefresh(options = {}) {
809
881
  const startTime = Date.now();
882
+ const trigger = options.trigger || "background";
810
883
  const elapsedSinceFullFetch = Date.now() - this.lastServerFullFetchAtMs;
811
884
  if (this.lastServerFullFetchAtMs > 0 && elapsedSinceFullFetch < ORDER_SILENT_REFRESH_MIN_INTERVAL_MS) {
885
+ this.logInfo("silentRefresh 跳过全量 SSE", {
886
+ trigger,
887
+ reason: "within_min_interval",
888
+ minIntervalMs: ORDER_SILENT_REFRESH_MIN_INTERVAL_MS,
889
+ elapsedSinceFullFetchMs: elapsedSinceFullFetch,
890
+ orderCount: this.store.list.length
891
+ });
812
892
  return this.store.list;
813
893
  }
814
- this.logInfo("silentRefresh 开始");
894
+ this.logInfo("silentRefresh 开始", {
895
+ trigger,
896
+ elapsedSinceFullFetchMs: elapsedSinceFullFetch,
897
+ orderCount: this.store.list.length
898
+ });
815
899
  try {
816
900
  this.updateCreateStore();
817
- const orders = await this.loadOrdersByServer();
901
+ const orders = await this.loadOrdersByServer({ trigger });
818
902
  this.store.list = (0, import_lodash_es.cloneDeep)(orders);
819
903
  this.syncOrdersMap();
820
904
  await this.emitOrdersChanged([], "silentRefresh");
821
905
  await this.core.effects.emit(import_types.OrderHooks.onOrdersSyncCompleted, null);
822
906
  this.logInfo("silentRefresh 完成", {
907
+ trigger,
823
908
  orderCount: orders.length,
824
909
  duration: `${Date.now() - startTime}ms`
825
910
  });
@@ -827,6 +912,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
827
912
  } catch (error) {
828
913
  const errorMessage = error instanceof Error ? error.message : String(error);
829
914
  this.logError("silentRefresh 失败", {
915
+ trigger,
830
916
  duration: `${Date.now() - startTime}ms`,
831
917
  error: errorMessage
832
918
  });
@@ -835,6 +921,12 @@ var OrderModule = class extends import_BaseModule.BaseModule {
835
921
  }
836
922
  normalizeOrderForMemoryList(order, source = "normalizeOrderForMemoryList") {
837
923
  const normalizedOrder = this.normalizeOrderCollectionsForIngress(order, source);
924
+ return this.prepareNormalizedOrderForMemoryList(normalizedOrder);
925
+ }
926
+ /**
927
+ * 将已经完成集合规范化的订单转换为内存身份,不重复扫描 products/bookings/payments。
928
+ */
929
+ prepareNormalizedOrderForMemoryList(normalizedOrder) {
838
930
  const externalSaleNumber = normalizedOrder == null ? void 0 : normalizedOrder.external_sale_number;
839
931
  if (this.isDraftOrder(normalizedOrder) && !this.hasRealOrderId(normalizedOrder)) {
840
932
  return normalizedOrder;
@@ -850,6 +942,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
850
942
  order_id: externalSaleNumber
851
943
  };
852
944
  }
945
+ prepareNormalizedOrdersForMemoryList(orders) {
946
+ return orders.map((order) => this.prepareNormalizedOrderForMemoryList(order)).filter((order) => this.shouldKeepOrderInMemory(order));
947
+ }
853
948
  normalizeOrdersForMemoryList(orders, source) {
854
949
  return orders.map((order) => this.normalizeOrderForMemoryList(order, source)).filter((order) => this.shouldKeepOrderInMemory(order));
855
950
  }
@@ -2137,20 +2232,29 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2137
2232
  return { list, removedCount };
2138
2233
  }
2139
2234
  /**
2140
- * 当前订单拉取窗口:
2141
- * - 优先使用 createdAtQuery.sales_time_between(已按营业日边界初始化)
2142
- * - 无法解析时退化为自然日窗口
2235
+ * 当前订单缓存可复用窗口。
2236
+ * start_time 模式使用精确的营业日起止时间;配置缺失或异常时退化为自然日。
2143
2237
  */
2144
- getCurrentPullWindow() {
2145
- var _a, _b;
2238
+ getCurrentOrderCacheWindow() {
2239
+ var _a;
2146
2240
  const now = (0, import_dayjs.default)();
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 };
2241
+ try {
2242
+ const appPlugin = this.core.getPlugin("app");
2243
+ const app = appPlugin == null ? void 0 : appPlugin.getApp();
2244
+ const coreData = app == null ? void 0 : app.data.store.getStore().getDataByModel("core");
2245
+ const boundary = (_a = coreData == null ? void 0 : coreData.core) == null ? void 0 : _a.operating_day_boundary;
2246
+ if ((boundary == null ? void 0 : boundary.type) === "start_time") {
2247
+ const boundaryTime = String(boundary.time || "").trim();
2248
+ const todayBoundary = (0, import_dayjs.default)(`${now.format("YYYY-MM-DD")} ${boundaryTime}`);
2249
+ if (todayBoundary.isValid()) {
2250
+ const startAt2 = now.isBefore(todayBoundary) ? todayBoundary.subtract(1, "day") : todayBoundary;
2251
+ return {
2252
+ startAt: startAt2,
2253
+ endExclusiveAt: startAt2.add(1, "day")
2254
+ };
2255
+ }
2153
2256
  }
2257
+ } catch {
2154
2258
  }
2155
2259
  const startAt = now.startOf("day");
2156
2260
  return { startAt, endExclusiveAt: startAt.add(1, "day") };
@@ -2159,17 +2263,51 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2159
2263
  const lastFullFetchAt = this.getStorageItem(ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY);
2160
2264
  if (!lastFullFetchAt)
2161
2265
  return false;
2266
+ const currentShopId = this.getCurrentShopId();
2267
+ const lastFullFetchShopId = this.getStorageItem(
2268
+ ORDER_LAST_FULL_FETCH_SHOP_ID_STORAGE_KEY
2269
+ );
2270
+ if (!currentShopId || !lastFullFetchShopId || currentShopId !== lastFullFetchShopId) {
2271
+ return false;
2272
+ }
2162
2273
  const parsed = (0, import_dayjs.default)(lastFullFetchAt);
2163
2274
  if (!parsed.isValid())
2164
2275
  return false;
2165
- const { startAt, endExclusiveAt } = this.getCurrentPullWindow();
2276
+ const { startAt, endExclusiveAt } = this.getCurrentOrderCacheWindow();
2166
2277
  return (parsed.isAfter(startAt) || parsed.isSame(startAt)) && parsed.isBefore(endExclusiveAt);
2167
2278
  }
2168
2279
  markOrderPulledAtNow() {
2280
+ const currentShopId = this.getCurrentShopId();
2281
+ if (!currentShopId)
2282
+ return;
2169
2283
  this.setStorageItem(
2170
2284
  ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY,
2171
2285
  (0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss")
2172
2286
  );
2287
+ this.setStorageItem(
2288
+ ORDER_LAST_FULL_FETCH_SHOP_ID_STORAGE_KEY,
2289
+ currentShopId
2290
+ );
2291
+ }
2292
+ clearOrderSnapshotMarker() {
2293
+ this.setStorageItem(ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY, "");
2294
+ this.setStorageItem(ORDER_LAST_FULL_FETCH_SHOP_ID_STORAGE_KEY, "");
2295
+ }
2296
+ getCurrentShopId() {
2297
+ var _a;
2298
+ try {
2299
+ const appPlugin = this.core.getPlugin("app");
2300
+ const app = appPlugin == null ? void 0 : appPlugin.getApp();
2301
+ if (!app)
2302
+ return null;
2303
+ const coreData = app.data.store.getStore().getDataByModel("core");
2304
+ const shopId = (_a = coreData == null ? void 0 : coreData.core) == null ? void 0 : _a.id;
2305
+ if (shopId === void 0 || shopId === null || shopId === "")
2306
+ return null;
2307
+ return String(shopId);
2308
+ } catch {
2309
+ return null;
2310
+ }
2173
2311
  }
2174
2312
  getStorageItem(key) {
2175
2313
  var _a;
@@ -2196,15 +2334,29 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2196
2334
  } catch {
2197
2335
  }
2198
2336
  }
2199
- async loadOrdersFromSQLite() {
2337
+ async loadOrdersFromSQLite(options = {}) {
2338
+ var _a;
2200
2339
  if (!this.dbManager)
2201
2340
  return [];
2202
2341
  try {
2342
+ const loadStartedAt = performance.now();
2343
+ const rawReadStartedAt = performance.now();
2203
2344
  const orders = await this.dbManager.getAll(INDEXDB_STORE_NAME);
2204
- return (orders || []).map(
2345
+ const sqliteRawReadMs = +(performance.now() - rawReadStartedAt).toFixed(2);
2346
+ const normalizeStartedAt = performance.now();
2347
+ const normalizedOrders = (orders || []).map(
2205
2348
  (order) => this.normalizeOrderCollectionsForIngress(order, "loadOrdersFromSQLite")
2206
2349
  );
2207
- } catch {
2350
+ const sqliteNormalizeMs = +(performance.now() - normalizeStartedAt).toFixed(2);
2351
+ (_a = options.onTiming) == null ? void 0 : _a.call(options, {
2352
+ sqliteRawReadMs,
2353
+ sqliteNormalizeMs,
2354
+ sqliteLoadTotalMs: +(performance.now() - loadStartedAt).toFixed(2)
2355
+ });
2356
+ return normalizedOrders;
2357
+ } catch (error) {
2358
+ if (options.throwOnError)
2359
+ throw error;
2208
2360
  return [];
2209
2361
  }
2210
2362
  }
@@ -2472,14 +2624,17 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2472
2624
  * 用于 SSE 全量拉取与营业日窗口裁剪。
2473
2625
  *
2474
2626
  * @example
2475
- * await this.replaceOrdersSnapshotInSQLite(orderList)
2627
+ * const { orders, persisted } = await this.replaceOrdersSnapshotInSQLite(orderList, 'refresh')
2476
2628
  */
2477
2629
  async replaceOrdersSnapshotInSQLite(orderList, source, protectedOrdersBeforeRemoteFetch = []) {
2478
2630
  if (!this.dbManager) {
2479
- return this.compactOrderListByIdentity(
2480
- orderList.map((order) => this.normalizeRemoteSyncedOrder(order)),
2481
- `${source}.snapshotNoDb`
2482
- ).list;
2631
+ return {
2632
+ orders: this.compactOrderListByIdentity(
2633
+ orderList.map((order) => this.normalizeRemoteSyncedOrder(order)),
2634
+ `${source}.snapshotNoDb`
2635
+ ).list,
2636
+ persisted: false
2637
+ };
2483
2638
  }
2484
2639
  const remoteSnapshot = (0, import_lodash_es.cloneDeep)(orderList).map(
2485
2640
  (order) => this.normalizeOrderCollectionsForIngress(order, `${source}.remoteIngress`)
@@ -2488,6 +2643,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2488
2643
  remoteSnapshot.map((order) => this.normalizeRemoteSyncedOrder(order)),
2489
2644
  `${source}.remoteSnapshot`
2490
2645
  ).list;
2646
+ let persisted = false;
2491
2647
  try {
2492
2648
  await this.runInOrderSQLiteSaveQueue(async () => {
2493
2649
  const existingOrders = typeof this.dbManager.getAll === "function" ? await this.dbManager.getAll(INDEXDB_STORE_NAME) : [];
@@ -2552,13 +2708,14 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2552
2708
  count: mergedSnapshot.length
2553
2709
  });
2554
2710
  });
2711
+ persisted = true;
2555
2712
  } catch (error) {
2556
2713
  this.logError("全量保存订单到 SQLite 失败", {
2557
2714
  error: error instanceof Error ? error.message : String(error),
2558
2715
  orderList: remoteSnapshot.length
2559
2716
  });
2560
2717
  }
2561
- return mergedSnapshot;
2718
+ return { orders: mergedSnapshot, persisted };
2562
2719
  }
2563
2720
  /**
2564
2721
  * 清空订单模块的内存数据和本地 SQLite 订单表。
@@ -2574,7 +2731,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2574
2731
  await this.dbManager.clear(INDEXDB_STORE_NAME);
2575
2732
  });
2576
2733
  }
2577
- this.setStorageItem(ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY, "");
2734
+ this.clearOrderSnapshotMarker();
2578
2735
  this.emitOrdersChanged([], "clear");
2579
2736
  }
2580
2737
  };
@@ -25,6 +25,7 @@ export declare class ProductsModule extends BaseModule implements Module {
25
25
  private quotationBridgeLoadedKey?;
26
26
  private quotationBridgeRefreshPromise?;
27
27
  private quotationBridgeRefreshKey?;
28
+ private quotationBridgeUpdatedCallback?;
28
29
  private quotationScheduleCache;
29
30
  private quotationScheduleCacheSource;
30
31
  private quotationScheduleCacheLoaded;
@@ -72,6 +73,7 @@ export declare class ProductsModule extends BaseModule implements Module {
72
73
  scheduleModule?: any;
73
74
  channel?: string;
74
75
  customer_id?: number | string;
76
+ onQuotationUpdated?: () => void;
75
77
  }): Promise<void>;
76
78
  /**
77
79
  * 刷新桥接器内的报价单列表。
@@ -181,7 +183,9 @@ export declare class ProductsModule extends BaseModule implements Module {
181
183
  /**
182
184
  * 通过 ProductDataSource SSE 加载完整商品列表
183
185
  */
184
- loadProductsByServer(): Promise<any>;
186
+ loadProductsByServer(options?: {
187
+ trigger?: string;
188
+ }): Promise<any>;
185
189
  /**
186
190
  * 纯请求方法:通过 HTTP 接口获取商品列表(无副作用,不触发事件、不写 IndexDB)
187
191
  * @param params 查询参数
@@ -331,7 +335,9 @@ export declare class ProductsModule extends BaseModule implements Module {
331
335
  * 拿到完整数据后一次性替换 store,清除价格缓存,触发 onProductsSyncCompleted
332
336
  * @returns 刷新后的商品列表
333
337
  */
334
- silentRefresh(): Promise<ProductData[]>;
338
+ silentRefresh(options?: {
339
+ trigger?: string;
340
+ }): Promise<ProductData[]>;
335
341
  /**
336
342
  * 销毁同步资源(取消 pubsub 订阅、清除定时器)
337
343
  */