@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.
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.js +109 -65
- package/dist/modules/Order/index.d.ts +1 -1
- package/dist/modules/Quotation/index.d.ts +6 -0
- package/dist/modules/Quotation/index.js +75 -19
- package/dist/plugins/request.d.ts +1 -0
- package/dist/server/index.d.ts +8 -2
- package/dist/server/index.js +206 -140
- package/dist/server/modules/floor-plan/index.d.ts +4 -0
- package/dist/server/modules/floor-plan/index.js +240 -98
- package/dist/server/modules/menu/index.js +48 -23
- package/dist/server/modules/order/index.d.ts +17 -7
- package/dist/server/modules/order/index.js +419 -207
- package/dist/server/modules/products/index.d.ts +8 -2
- package/dist/server/modules/products/index.js +167 -75
- package/dist/server/modules/resource/index.js +21 -13
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/lib/core/index.d.ts +7 -0
- package/lib/core/index.js +20 -2
- package/lib/modules/Order/index.d.ts +1 -1
- package/lib/modules/Quotation/index.d.ts +6 -0
- package/lib/modules/Quotation/index.js +49 -5
- package/lib/plugins/request.d.ts +1 -0
- package/lib/server/index.d.ts +8 -2
- package/lib/server/index.js +52 -17
- package/lib/server/modules/floor-plan/index.d.ts +4 -0
- package/lib/server/modules/floor-plan/index.js +54 -6
- package/lib/server/modules/menu/index.js +31 -5
- package/lib/server/modules/order/index.d.ts +17 -7
- package/lib/server/modules/order/index.js +197 -40
- package/lib/server/modules/products/index.d.ts +8 -2
- package/lib/server/modules/products/index.js +97 -24
- package/lib/server/modules/resource/index.js +7 -2
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- 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
|
|
196
|
-
|
|
196
|
+
const sourceOrderRecord = order;
|
|
197
|
+
let sourceOrder = sourceOrderRecord;
|
|
197
198
|
if (Array.isArray(sourceOrderRecord.payments)) {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
2142
|
-
* - 无法解析时退化为自然日窗口
|
|
2235
|
+
* 当前订单缓存可复用窗口。
|
|
2236
|
+
* start_time 模式使用精确的营业日起止时间;配置缺失或异常时退化为自然日。
|
|
2143
2237
|
*/
|
|
2144
|
-
|
|
2145
|
-
var _a
|
|
2238
|
+
getCurrentOrderCacheWindow() {
|
|
2239
|
+
var _a;
|
|
2146
2240
|
const now = (0, import_dayjs.default)();
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
const
|
|
2150
|
-
const
|
|
2151
|
-
|
|
2152
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
2480
|
-
|
|
2481
|
-
|
|
2482
|
-
|
|
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.
|
|
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(
|
|
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(
|
|
338
|
+
silentRefresh(options?: {
|
|
339
|
+
trigger?: string;
|
|
340
|
+
}): Promise<ProductData[]>;
|
|
335
341
|
/**
|
|
336
342
|
* 销毁同步资源(取消 pubsub 订阅、清除定时器)
|
|
337
343
|
*/
|