@pisell/pisellos 2.3.61 → 2.3.62

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 (32) hide show
  1. package/dist/core/index.d.ts +7 -0
  2. package/dist/core/index.js +109 -66
  3. package/dist/modules/Quotation/index.d.ts +6 -0
  4. package/dist/modules/Quotation/index.js +75 -19
  5. package/dist/plugins/request.d.ts +1 -0
  6. package/dist/server/index.d.ts +6 -2
  7. package/dist/server/index.js +130 -90
  8. package/dist/server/modules/floor-plan/index.d.ts +4 -0
  9. package/dist/server/modules/floor-plan/index.js +240 -98
  10. package/dist/server/modules/menu/index.js +48 -23
  11. package/dist/server/modules/order/index.d.ts +12 -7
  12. package/dist/server/modules/order/index.js +248 -96
  13. package/dist/server/modules/products/index.d.ts +8 -2
  14. package/dist/server/modules/products/index.js +167 -75
  15. package/dist/server/modules/resource/index.js +21 -13
  16. package/lib/core/index.d.ts +7 -0
  17. package/lib/core/index.js +20 -3
  18. package/lib/model/strategy/adapter/promotion/index.js +51 -0
  19. package/lib/modules/Quotation/index.d.ts +6 -0
  20. package/lib/modules/Quotation/index.js +49 -5
  21. package/lib/plugins/request.d.ts +1 -0
  22. package/lib/server/index.d.ts +6 -2
  23. package/lib/server/index.js +18 -8
  24. package/lib/server/modules/floor-plan/index.d.ts +4 -0
  25. package/lib/server/modules/floor-plan/index.js +54 -6
  26. package/lib/server/modules/menu/index.js +31 -5
  27. package/lib/server/modules/order/index.d.ts +12 -7
  28. package/lib/server/modules/order/index.js +143 -28
  29. package/lib/server/modules/products/index.d.ts +8 -2
  30. package/lib/server/modules/products/index.js +97 -24
  31. package/lib/server/modules/resource/index.js +7 -2
  32. package/package.json +1 -1
@@ -42,6 +42,7 @@ import { getOrderPaymentIdentityKeys, isIdentifiedPendingOrderPayment, isPending
42
42
  */
43
43
  var INDEXDB_STORE_NAME = 'orders';
44
44
  var ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY = 'server_order_last_full_fetch_at';
45
+ var ORDER_LAST_FULL_FETCH_SHOP_ID_STORAGE_KEY = 'server_order_last_full_fetch_shop_id';
45
46
  var ORDER_SYNC_THROTTLE_MS_STORAGE_KEY = 'order_sync_throttle_ms';
46
47
  var DEFAULT_ORDER_SYNC_THROTTLE_MS = 2000;
47
48
  /** pubsub 回声写入去重窗口:业务 API 刚写入后,跳过同单 SQLite patch */
@@ -700,26 +701,78 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
700
701
  key: "preload",
701
702
  value: function () {
702
703
  var _preload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
703
- var orders;
704
+ var preloadStartedAt, cachedOrders, memoryOrders, orders;
704
705
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
705
706
  while (1) switch (_context4.prev = _context4.next) {
706
707
  case 0:
707
- _context4.next = 2;
708
- return this.loadOrdersByServer();
709
- case 2:
708
+ preloadStartedAt = Date.now();
709
+ cachedOrders = null;
710
+ if (!this.dbManager) {
711
+ _context4.next = 12;
712
+ break;
713
+ }
714
+ _context4.prev = 3;
715
+ _context4.next = 6;
716
+ return this.loadOrdersFromSQLite({
717
+ throwOnError: true
718
+ });
719
+ case 6:
720
+ cachedOrders = _context4.sent;
721
+ _context4.next = 12;
722
+ break;
723
+ case 9:
724
+ _context4.prev = 9;
725
+ _context4.t0 = _context4["catch"](3);
726
+ this.logWarning('preload-SQLite读取失败,回退远端全量拉取', {
727
+ error: _context4.t0 instanceof Error ? _context4.t0.message : String(_context4.t0)
728
+ });
729
+ case 12:
730
+ if (!(cachedOrders !== null && this.hasPulledOrdersToday())) {
731
+ _context4.next = 22;
732
+ break;
733
+ }
734
+ memoryOrders = this.normalizeOrdersForMemoryList(cachedOrders, 'preload.sqliteMemory');
735
+ this.store.list = cloneDeep(memoryOrders);
736
+ this.syncOrdersMap();
737
+ _context4.next = 18;
738
+ return this.core.effects.emit(OrderHooks.onOrdersLoaded, this.store.list);
739
+ case 18:
740
+ _context4.next = 20;
741
+ return this.emitOrdersChanged([], 'preload.sqlite');
742
+ case 20:
743
+ this.logInfo('预加载完成', {
744
+ trigger: 'preload',
745
+ source: 'SQLite',
746
+ orderCount: this.store.list.length,
747
+ duration: "".concat(Date.now() - preloadStartedAt, "ms")
748
+ });
749
+ return _context4.abrupt("return");
750
+ case 22:
751
+ _context4.next = 24;
752
+ return this.loadOrdersByServer({
753
+ trigger: 'preload'
754
+ });
755
+ case 24:
710
756
  orders = _context4.sent;
711
757
  this.store.list = cloneDeep(orders);
712
758
  this.syncOrdersMap();
713
- _context4.next = 7;
759
+ _context4.next = 29;
714
760
  return this.emitOrdersChanged([], 'preload');
715
- case 7:
716
- _context4.next = 9;
761
+ case 29:
762
+ _context4.next = 31;
717
763
  return this.core.effects.emit(OrderHooks.onOrdersSyncCompleted, null);
718
- case 9:
764
+ case 31:
765
+ this.logInfo('预加载完成', {
766
+ trigger: 'preload',
767
+ source: 'Server',
768
+ orderCount: this.store.list.length,
769
+ duration: "".concat(Date.now() - preloadStartedAt, "ms")
770
+ });
771
+ case 32:
719
772
  case "end":
720
773
  return _context4.stop();
721
774
  }
722
- }, _callee4, this);
775
+ }, _callee4, this, [[3, 9]]);
723
776
  }));
724
777
  function preload() {
725
778
  return _preload.apply(this, arguments);
@@ -1052,18 +1105,32 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1052
1105
  var _loadOrdersByServer = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
1053
1106
  var _this5 = this,
1054
1107
  _this$store;
1055
- var orderList, protectedOrdersBeforeRemoteFetch, data, mergedOrders, memoryOrders;
1108
+ var options,
1109
+ orderList,
1110
+ hasFetchedRemoteSnapshot,
1111
+ trigger,
1112
+ protectedOrdersBeforeRemoteFetch,
1113
+ data,
1114
+ _yield$this$replaceOr,
1115
+ mergedOrders,
1116
+ isRemoteSnapshotPersisted,
1117
+ memoryOrders,
1118
+ _args8 = arguments;
1056
1119
  return _regeneratorRuntime().wrap(function _callee8$(_context8) {
1057
1120
  while (1) switch (_context8.prev = _context8.next) {
1058
1121
  case 0:
1122
+ options = _args8.length > 0 && _args8[0] !== undefined ? _args8[0] : {};
1059
1123
  orderList = [];
1060
- _context8.next = 3;
1124
+ hasFetchedRemoteSnapshot = false;
1125
+ trigger = options.trigger || 'unknown';
1126
+ _context8.next = 6;
1061
1127
  return this.loadOrdersFromSQLite();
1062
- case 3:
1128
+ case 6:
1063
1129
  protectedOrdersBeforeRemoteFetch = _context8.sent.filter(function (order) {
1064
1130
  return _this5.shouldProtectLocalOrderFromRemoteSnapshot(order);
1065
1131
  });
1066
1132
  this.logInfo('loadOrdersByServer-开始', {
1133
+ trigger: trigger,
1067
1134
  hasOrderDataSource: !!this.orderDataSource,
1068
1135
  query: ((_this$store = this.store) === null || _this$store === void 0 ? void 0 : _this$store.createdAtQuery) || null,
1069
1136
  protectedLocalOrderCount: protectedOrdersBeforeRemoteFetch.length,
@@ -1072,51 +1139,61 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1072
1139
  }, 0)
1073
1140
  });
1074
1141
  if (!this.orderDataSource) {
1075
- _context8.next = 20;
1142
+ _context8.next = 23;
1076
1143
  break;
1077
1144
  }
1078
- _context8.prev = 6;
1079
- _context8.next = 9;
1145
+ _context8.prev = 9;
1146
+ _context8.next = 12;
1080
1147
  return this.orderDataSource.run({
1081
1148
  sse: {
1082
1149
  query: this.store.createdAtQuery
1083
1150
  }
1084
1151
  });
1085
- case 9:
1152
+ case 12:
1086
1153
  data = _context8.sent;
1087
1154
  orderList = data || [];
1088
1155
  this.logInfo('loadOrdersByServer-SSE拉取成功', {
1156
+ trigger: trigger,
1089
1157
  count: orderList.length
1090
1158
  });
1091
- this.markOrderPulledAtNow();
1159
+ hasFetchedRemoteSnapshot = true;
1092
1160
  this.lastServerFullFetchAtMs = Date.now();
1093
- _context8.next = 20;
1161
+ _context8.next = 23;
1094
1162
  break;
1095
- case 16:
1096
- _context8.prev = 16;
1097
- _context8.t0 = _context8["catch"](6);
1163
+ case 19:
1164
+ _context8.prev = 19;
1165
+ _context8.t0 = _context8["catch"](9);
1098
1166
  this.logInfo('loadOrdersByServer-SSE拉取失败,保持当前内存订单');
1099
1167
  return _context8.abrupt("return", this.store.list);
1100
- case 20:
1101
- _context8.next = 22;
1168
+ case 23:
1169
+ if (hasFetchedRemoteSnapshot) {
1170
+ this.clearOrderSnapshotMarker();
1171
+ }
1172
+ _context8.next = 26;
1102
1173
  return this.replaceOrdersSnapshotInSQLite(orderList, 'loadOrdersByServer', protectedOrdersBeforeRemoteFetch);
1103
- case 22:
1104
- mergedOrders = _context8.sent;
1174
+ case 26:
1175
+ _yield$this$replaceOr = _context8.sent;
1176
+ mergedOrders = _yield$this$replaceOr.orders;
1177
+ isRemoteSnapshotPersisted = _yield$this$replaceOr.persisted;
1178
+ if (hasFetchedRemoteSnapshot && isRemoteSnapshotPersisted) {
1179
+ this.markOrderPulledAtNow();
1180
+ }
1105
1181
  memoryOrders = this.normalizeOrdersForMemoryList(mergedOrders, 'loadOrdersByServer.memory');
1106
1182
  this.logInfo('loadOrdersByServer-结束', {
1183
+ trigger: trigger,
1107
1184
  count: memoryOrders.length,
1108
1185
  persistedCount: mergedOrders.length,
1109
1186
  sqliteOnlyDraftCount: mergedOrders.length - memoryOrders.length
1110
1187
  });
1111
- _context8.next = 27;
1188
+ _context8.next = 34;
1112
1189
  return this.core.effects.emit(OrderHooks.onOrdersLoaded, memoryOrders);
1113
- case 27:
1190
+ case 34:
1114
1191
  return _context8.abrupt("return", memoryOrders);
1115
- case 28:
1192
+ case 35:
1116
1193
  case "end":
1117
1194
  return _context8.stop();
1118
1195
  }
1119
- }, _callee8, this, [[6, 16]]);
1196
+ }, _callee8, this, [[9, 19]]);
1120
1197
  }));
1121
1198
  function loadOrdersByServer() {
1122
1199
  return _loadOrdersByServer.apply(this, arguments);
@@ -1132,53 +1209,76 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1132
1209
  key: "silentRefresh",
1133
1210
  value: (function () {
1134
1211
  var _silentRefresh = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
1135
- var startTime, elapsedSinceFullFetch, orders, errorMessage;
1212
+ var options,
1213
+ startTime,
1214
+ trigger,
1215
+ elapsedSinceFullFetch,
1216
+ orders,
1217
+ errorMessage,
1218
+ _args9 = arguments;
1136
1219
  return _regeneratorRuntime().wrap(function _callee9$(_context9) {
1137
1220
  while (1) switch (_context9.prev = _context9.next) {
1138
1221
  case 0:
1222
+ options = _args9.length > 0 && _args9[0] !== undefined ? _args9[0] : {};
1139
1223
  startTime = Date.now();
1224
+ trigger = options.trigger || 'background';
1140
1225
  elapsedSinceFullFetch = Date.now() - this.lastServerFullFetchAtMs;
1141
1226
  if (!(this.lastServerFullFetchAtMs > 0 && elapsedSinceFullFetch < ORDER_SILENT_REFRESH_MIN_INTERVAL_MS)) {
1142
- _context9.next = 4;
1227
+ _context9.next = 7;
1143
1228
  break;
1144
1229
  }
1230
+ this.logInfo('silentRefresh 跳过全量 SSE', {
1231
+ trigger: trigger,
1232
+ reason: 'within_min_interval',
1233
+ minIntervalMs: ORDER_SILENT_REFRESH_MIN_INTERVAL_MS,
1234
+ elapsedSinceFullFetchMs: elapsedSinceFullFetch,
1235
+ orderCount: this.store.list.length
1236
+ });
1145
1237
  return _context9.abrupt("return", this.store.list);
1146
- case 4:
1147
- this.logInfo('silentRefresh 开始');
1148
- _context9.prev = 5;
1238
+ case 7:
1239
+ this.logInfo('silentRefresh 开始', {
1240
+ trigger: trigger,
1241
+ elapsedSinceFullFetchMs: elapsedSinceFullFetch,
1242
+ orderCount: this.store.list.length
1243
+ });
1244
+ _context9.prev = 8;
1149
1245
  // 刷新前,需要更新当前营业日边界(store.createdAtQuery)
1150
1246
  this.updateCreateStore();
1151
- _context9.next = 9;
1152
- return this.loadOrdersByServer();
1153
- case 9:
1247
+ _context9.next = 12;
1248
+ return this.loadOrdersByServer({
1249
+ trigger: trigger
1250
+ });
1251
+ case 12:
1154
1252
  orders = _context9.sent;
1155
1253
  this.store.list = cloneDeep(orders);
1156
1254
  this.syncOrdersMap();
1157
- _context9.next = 14;
1255
+ _context9.next = 17;
1158
1256
  return this.emitOrdersChanged([], 'silentRefresh');
1159
- case 14:
1160
- _context9.next = 16;
1257
+ case 17:
1258
+ _context9.next = 19;
1161
1259
  return this.core.effects.emit(OrderHooks.onOrdersSyncCompleted, null);
1162
- case 16:
1260
+ case 19:
1163
1261
  this.logInfo('silentRefresh 完成', {
1262
+ trigger: trigger,
1164
1263
  orderCount: orders.length,
1165
1264
  duration: "".concat(Date.now() - startTime, "ms")
1166
1265
  });
1167
1266
  return _context9.abrupt("return", this.store.list);
1168
- case 20:
1169
- _context9.prev = 20;
1170
- _context9.t0 = _context9["catch"](5);
1267
+ case 23:
1268
+ _context9.prev = 23;
1269
+ _context9.t0 = _context9["catch"](8);
1171
1270
  errorMessage = _context9.t0 instanceof Error ? _context9.t0.message : String(_context9.t0);
1172
1271
  this.logError('silentRefresh 失败', {
1272
+ trigger: trigger,
1173
1273
  duration: "".concat(Date.now() - startTime, "ms"),
1174
1274
  error: errorMessage
1175
1275
  });
1176
1276
  return _context9.abrupt("return", this.store.list);
1177
- case 25:
1277
+ case 28:
1178
1278
  case "end":
1179
1279
  return _context9.stop();
1180
1280
  }
1181
- }, _callee9, this, [[5, 20]]);
1281
+ }, _callee9, this, [[8, 23]]);
1182
1282
  }));
1183
1283
  function silentRefresh() {
1184
1284
  return _silentRefresh.apply(this, arguments);
@@ -3193,25 +3293,32 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3193
3293
  }
3194
3294
 
3195
3295
  /**
3196
- * 当前订单拉取窗口:
3197
- * - 优先使用 createdAtQuery.sales_time_between(已按营业日边界初始化)
3198
- * - 无法解析时退化为自然日窗口
3296
+ * 当前订单缓存可复用窗口。
3297
+ * start_time 模式使用精确的营业日起止时间;配置缺失或异常时退化为自然日。
3199
3298
  */
3200
3299
  }, {
3201
- key: "getCurrentPullWindow",
3202
- value: function getCurrentPullWindow() {
3203
- var _this$store2;
3300
+ key: "getCurrentOrderCacheWindow",
3301
+ value: function getCurrentOrderCacheWindow() {
3204
3302
  var now = dayjs();
3205
- var range = (_this$store2 = this.store) === null || _this$store2 === void 0 || (_this$store2 = _this$store2.createdAtQuery) === null || _this$store2 === void 0 ? void 0 : _this$store2.sales_time_between;
3206
- if (Array.isArray(range) && range.length >= 2) {
3207
- var _startAt = dayjs(range[0]);
3208
- var endExclusiveAt = dayjs(range[1]);
3209
- if (_startAt.isValid() && endExclusiveAt.isValid() && endExclusiveAt.isAfter(_startAt)) {
3210
- return {
3211
- startAt: _startAt,
3212
- endExclusiveAt: endExclusiveAt
3213
- };
3303
+ try {
3304
+ var _coreData$core;
3305
+ var appPlugin = this.core.getPlugin('app');
3306
+ var app = appPlugin === null || appPlugin === void 0 ? void 0 : appPlugin.getApp();
3307
+ var coreData = app === null || app === void 0 ? void 0 : app.data.store.getStore().getDataByModel('core');
3308
+ var boundary = coreData === null || coreData === void 0 || (_coreData$core = coreData.core) === null || _coreData$core === void 0 ? void 0 : _coreData$core.operating_day_boundary;
3309
+ if ((boundary === null || boundary === void 0 ? void 0 : boundary.type) === 'start_time') {
3310
+ var boundaryTime = String(boundary.time || '').trim();
3311
+ var todayBoundary = dayjs("".concat(now.format('YYYY-MM-DD'), " ").concat(boundaryTime));
3312
+ if (todayBoundary.isValid()) {
3313
+ var _startAt = now.isBefore(todayBoundary) ? todayBoundary.subtract(1, 'day') : todayBoundary;
3314
+ return {
3315
+ startAt: _startAt,
3316
+ endExclusiveAt: _startAt.add(1, 'day')
3317
+ };
3318
+ }
3214
3319
  }
3320
+ } catch (_unused6) {
3321
+ // 读取营业日配置失败时按自然日兜底,不影响启动。
3215
3322
  }
3216
3323
  var startAt = now.startOf('day');
3217
3324
  return {
@@ -3224,20 +3331,47 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3224
3331
  value: function hasPulledOrdersToday() {
3225
3332
  var lastFullFetchAt = this.getStorageItem(ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY);
3226
3333
  if (!lastFullFetchAt) return false;
3334
+ var currentShopId = this.getCurrentShopId();
3335
+ var lastFullFetchShopId = this.getStorageItem(ORDER_LAST_FULL_FETCH_SHOP_ID_STORAGE_KEY);
3336
+ if (!currentShopId || !lastFullFetchShopId || currentShopId !== lastFullFetchShopId) {
3337
+ return false;
3338
+ }
3227
3339
  var parsed = dayjs(lastFullFetchAt);
3228
3340
  if (!parsed.isValid()) return false;
3229
-
3230
- // 按当前拉取窗口判断,而不是自然日判断。
3231
- // 这样在营业日跨日边界(start_time)场景下也能正确判定是否需要重新拉取。
3232
- var _this$getCurrentPullW = this.getCurrentPullWindow(),
3233
- startAt = _this$getCurrentPullW.startAt,
3234
- endExclusiveAt = _this$getCurrentPullW.endExclusiveAt;
3341
+ var _this$getCurrentOrder = this.getCurrentOrderCacheWindow(),
3342
+ startAt = _this$getCurrentOrder.startAt,
3343
+ endExclusiveAt = _this$getCurrentOrder.endExclusiveAt;
3235
3344
  return (parsed.isAfter(startAt) || parsed.isSame(startAt)) && parsed.isBefore(endExclusiveAt);
3236
3345
  }
3237
3346
  }, {
3238
3347
  key: "markOrderPulledAtNow",
3239
3348
  value: function markOrderPulledAtNow() {
3349
+ var currentShopId = this.getCurrentShopId();
3350
+ if (!currentShopId) return;
3240
3351
  this.setStorageItem(ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY, dayjs().format('YYYY-MM-DD HH:mm:ss'));
3352
+ this.setStorageItem(ORDER_LAST_FULL_FETCH_SHOP_ID_STORAGE_KEY, currentShopId);
3353
+ }
3354
+ }, {
3355
+ key: "clearOrderSnapshotMarker",
3356
+ value: function clearOrderSnapshotMarker() {
3357
+ this.setStorageItem(ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY, '');
3358
+ this.setStorageItem(ORDER_LAST_FULL_FETCH_SHOP_ID_STORAGE_KEY, '');
3359
+ }
3360
+ }, {
3361
+ key: "getCurrentShopId",
3362
+ value: function getCurrentShopId() {
3363
+ try {
3364
+ var _coreData$core2;
3365
+ var appPlugin = this.core.getPlugin('app');
3366
+ var app = appPlugin === null || appPlugin === void 0 ? void 0 : appPlugin.getApp();
3367
+ if (!app) return null;
3368
+ var coreData = app.data.store.getStore().getDataByModel('core');
3369
+ var shopId = coreData === null || coreData === void 0 || (_coreData$core2 = coreData.core) === null || _coreData$core2 === void 0 ? void 0 : _coreData$core2.id;
3370
+ if (shopId === undefined || shopId === null || shopId === '') return null;
3371
+ return String(shopId);
3372
+ } catch (_unused7) {
3373
+ return null;
3374
+ }
3241
3375
  }
3242
3376
  }, {
3243
3377
  key: "getStorageItem",
@@ -3248,7 +3382,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3248
3382
  if (typeof globalThis !== 'undefined' && globalThis !== null && globalThis !== void 0 && globalThis.localStorage) {
3249
3383
  return globalThis.localStorage.getItem(key);
3250
3384
  }
3251
- } catch (_unused6) {
3385
+ } catch (_unused8) {
3252
3386
  // 忽略存储异常,避免影响主流程
3253
3387
  }
3254
3388
  return null;
@@ -3265,7 +3399,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3265
3399
  if (typeof globalThis !== 'undefined' && globalThis !== null && globalThis !== void 0 && globalThis.localStorage) {
3266
3400
  globalThis.localStorage.setItem(key, value);
3267
3401
  }
3268
- } catch (_unused7) {
3402
+ } catch (_unused9) {
3269
3403
  // 忽略存储异常,避免影响主流程
3270
3404
  }
3271
3405
  }
@@ -3274,33 +3408,42 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3274
3408
  value: function () {
3275
3409
  var _loadOrdersFromSQLite = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee20() {
3276
3410
  var _this20 = this;
3277
- var orders;
3411
+ var options,
3412
+ orders,
3413
+ _args20 = arguments;
3278
3414
  return _regeneratorRuntime().wrap(function _callee20$(_context20) {
3279
3415
  while (1) switch (_context20.prev = _context20.next) {
3280
3416
  case 0:
3417
+ options = _args20.length > 0 && _args20[0] !== undefined ? _args20[0] : {};
3281
3418
  if (this.dbManager) {
3282
- _context20.next = 2;
3419
+ _context20.next = 3;
3283
3420
  break;
3284
3421
  }
3285
3422
  return _context20.abrupt("return", []);
3286
- case 2:
3287
- _context20.prev = 2;
3288
- _context20.next = 5;
3423
+ case 3:
3424
+ _context20.prev = 3;
3425
+ _context20.next = 6;
3289
3426
  return this.dbManager.getAll(INDEXDB_STORE_NAME);
3290
- case 5:
3427
+ case 6:
3291
3428
  orders = _context20.sent;
3292
3429
  return _context20.abrupt("return", (orders || []).map(function (order) {
3293
3430
  return _this20.normalizeOrderCollectionsForIngress(order, 'loadOrdersFromSQLite');
3294
3431
  }));
3295
- case 9:
3296
- _context20.prev = 9;
3297
- _context20.t0 = _context20["catch"](2);
3432
+ case 10:
3433
+ _context20.prev = 10;
3434
+ _context20.t0 = _context20["catch"](3);
3435
+ if (!options.throwOnError) {
3436
+ _context20.next = 14;
3437
+ break;
3438
+ }
3439
+ throw _context20.t0;
3440
+ case 14:
3298
3441
  return _context20.abrupt("return", []);
3299
- case 12:
3442
+ case 15:
3300
3443
  case "end":
3301
3444
  return _context20.stop();
3302
3445
  }
3303
- }, _callee20, this, [[2, 9]]);
3446
+ }, _callee20, this, [[3, 10]]);
3304
3447
  }));
3305
3448
  function loadOrdersFromSQLite() {
3306
3449
  return _loadOrdersFromSQLite.apply(this, arguments);
@@ -3740,7 +3883,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3740
3883
  * 用于 SSE 全量拉取与营业日窗口裁剪。
3741
3884
  *
3742
3885
  * @example
3743
- * await this.replaceOrdersSnapshotInSQLite(orderList)
3886
+ * const { orders, persisted } = await this.replaceOrdersSnapshotInSQLite(orderList, 'refresh')
3744
3887
  */
3745
3888
  )
3746
3889
  }, {
@@ -3751,6 +3894,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3751
3894
  var protectedOrdersBeforeRemoteFetch,
3752
3895
  remoteSnapshot,
3753
3896
  mergedSnapshot,
3897
+ persisted,
3754
3898
  _args27 = arguments;
3755
3899
  return _regeneratorRuntime().wrap(function _callee27$(_context27) {
3756
3900
  while (1) switch (_context27.prev = _context27.next) {
@@ -3760,9 +3904,12 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3760
3904
  _context27.next = 3;
3761
3905
  break;
3762
3906
  }
3763
- return _context27.abrupt("return", this.compactOrderListByIdentity(orderList.map(function (order) {
3764
- return _this24.normalizeRemoteSyncedOrder(order);
3765
- }), "".concat(source, ".snapshotNoDb")).list);
3907
+ return _context27.abrupt("return", {
3908
+ orders: this.compactOrderListByIdentity(orderList.map(function (order) {
3909
+ return _this24.normalizeRemoteSyncedOrder(order);
3910
+ }), "".concat(source, ".snapshotNoDb")).list,
3911
+ persisted: false
3912
+ });
3766
3913
  case 3:
3767
3914
  remoteSnapshot = cloneDeep(orderList).map(function (order) {
3768
3915
  return _this24.normalizeOrderCollectionsForIngress(order, "".concat(source, ".remoteIngress"));
@@ -3770,8 +3917,9 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3770
3917
  mergedSnapshot = this.compactOrderListByIdentity(remoteSnapshot.map(function (order) {
3771
3918
  return _this24.normalizeRemoteSyncedOrder(order);
3772
3919
  }), "".concat(source, ".remoteSnapshot")).list;
3773
- _context27.prev = 5;
3774
- _context27.next = 8;
3920
+ persisted = false;
3921
+ _context27.prev = 6;
3922
+ _context27.next = 9;
3775
3923
  return this.runInOrderSQLiteSaveQueue( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee26() {
3776
3924
  var existingOrders, protectedLocalOrders, _iterator33, _step33, rawCurrentOrder, currentOrder, protectedIndex, currentNeedsProtection, orderListSnapshot;
3777
3925
  return _regeneratorRuntime().wrap(function _callee26$(_context26) {
@@ -3884,23 +4032,27 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3884
4032
  }
3885
4033
  }, _callee26, null, [[10, 25, 28, 31]]);
3886
4034
  })));
3887
- case 8:
3888
- _context27.next = 13;
4035
+ case 9:
4036
+ persisted = true;
4037
+ _context27.next = 15;
3889
4038
  break;
3890
- case 10:
3891
- _context27.prev = 10;
3892
- _context27.t0 = _context27["catch"](5);
4039
+ case 12:
4040
+ _context27.prev = 12;
4041
+ _context27.t0 = _context27["catch"](6);
3893
4042
  this.logError('全量保存订单到 SQLite 失败', {
3894
4043
  error: _context27.t0 instanceof Error ? _context27.t0.message : String(_context27.t0),
3895
4044
  orderList: remoteSnapshot.length
3896
4045
  });
3897
- case 13:
3898
- return _context27.abrupt("return", mergedSnapshot);
3899
- case 14:
4046
+ case 15:
4047
+ return _context27.abrupt("return", {
4048
+ orders: mergedSnapshot,
4049
+ persisted: persisted
4050
+ });
4051
+ case 16:
3900
4052
  case "end":
3901
4053
  return _context27.stop();
3902
4054
  }
3903
- }, _callee27, this, [[5, 10]]);
4055
+ }, _callee27, this, [[6, 12]]);
3904
4056
  }));
3905
4057
  function replaceOrdersSnapshotInSQLite(_x20, _x21) {
3906
4058
  return _replaceOrdersSnapshotInSQLite.apply(this, arguments);
@@ -3942,7 +4094,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3942
4094
  }, _callee28);
3943
4095
  })));
3944
4096
  case 5:
3945
- this.setStorageItem(ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY, '');
4097
+ this.clearOrderSnapshotMarker();
3946
4098
  this.emitOrdersChanged([], 'clear');
3947
4099
  case 7:
3948
4100
  case "end":
@@ -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
  */