@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.
- package/dist/core/index.d.ts +0 -7
- package/dist/core/index.js +65 -109
- package/dist/model/strategy/adapter/walletPass/evaluator.js +0 -1
- package/dist/model/strategy/adapter/walletPass/utils.js +0 -2
- package/dist/modules/BaseModule.d.ts +1 -0
- package/dist/modules/BaseModule.js +24 -28
- package/dist/modules/Customer/index.d.ts +4 -0
- package/dist/modules/Customer/index.js +91 -59
- package/dist/modules/Customer/types.d.ts +2 -0
- package/dist/modules/Order/index.d.ts +22 -2
- package/dist/modules/Order/index.js +313 -142
- package/dist/modules/Order/types.d.ts +13 -1
- package/dist/modules/Order/utils/orderCollectionIdentity.d.ts +15 -0
- package/dist/modules/Order/utils/orderCollectionIdentity.js +75 -0
- package/dist/modules/Order/utils.js +0 -1
- package/dist/modules/Payment/index.d.ts +4 -0
- package/dist/modules/Payment/index.js +14 -4
- package/dist/modules/Payment/walletpass.js +52 -18
- package/dist/modules/Quotation/index.d.ts +0 -6
- package/dist/modules/Quotation/index.js +19 -75
- package/dist/modules/Rules/index.js +46 -31
- package/dist/plugins/request.d.ts +0 -1
- package/dist/server/index.d.ts +2 -8
- package/dist/server/index.js +143 -212
- package/dist/server/modules/floor-plan/index.d.ts +0 -4
- package/dist/server/modules/floor-plan/index.js +98 -240
- package/dist/server/modules/menu/index.js +23 -48
- package/dist/server/modules/order/index.d.ts +8 -17
- package/dist/server/modules/order/index.js +453 -506
- package/dist/server/modules/products/index.d.ts +2 -8
- package/dist/server/modules/products/index.js +75 -167
- package/dist/server/modules/resource/index.js +13 -21
- package/dist/server/utils/small-ticket.js +2 -1
- package/dist/solution/BaseSales/index.d.ts +3 -1
- package/dist/solution/BaseSales/index.js +99 -82
- package/dist/solution/BaseSales/utils.js +31 -20
- package/dist/solution/BookingTicket/index.d.ts +6 -2
- package/dist/solution/BookingTicket/index.js +123 -75
- package/dist/solution/ScanOrder/utils.js +31 -20
- package/dist/solution/UnifiedBookingSales/index.d.ts +25 -0
- package/dist/solution/UnifiedBookingSales/index.js +640 -321
- package/dist/solution/UnifiedBookingSales/types.d.ts +7 -0
- package/lib/core/index.d.ts +0 -7
- package/lib/core/index.js +2 -20
- package/lib/model/strategy/adapter/walletPass/evaluator.js +0 -1
- package/lib/model/strategy/adapter/walletPass/utils.js +0 -1
- package/lib/modules/BaseModule.d.ts +1 -0
- package/lib/modules/BaseModule.js +24 -37
- package/lib/modules/Customer/index.d.ts +4 -0
- package/lib/modules/Customer/index.js +11 -0
- package/lib/modules/Customer/types.d.ts +2 -0
- package/lib/modules/Order/index.d.ts +22 -2
- package/lib/modules/Order/index.js +212 -54
- package/lib/modules/Order/types.d.ts +13 -1
- package/lib/modules/Order/utils/orderCollectionIdentity.d.ts +15 -0
- package/lib/modules/Order/utils/orderCollectionIdentity.js +70 -0
- package/lib/modules/Order/utils.js +0 -1
- package/lib/modules/Payment/index.d.ts +4 -0
- package/lib/modules/Payment/index.js +7 -0
- package/lib/modules/Payment/walletpass.js +27 -2
- package/lib/modules/Quotation/index.d.ts +0 -6
- package/lib/modules/Quotation/index.js +5 -49
- package/lib/modules/Rules/index.js +17 -1
- package/lib/plugins/request.d.ts +0 -1
- package/lib/server/index.d.ts +2 -8
- package/lib/server/index.js +20 -58
- package/lib/server/modules/floor-plan/index.d.ts +0 -4
- package/lib/server/modules/floor-plan/index.js +6 -54
- package/lib/server/modules/menu/index.js +5 -31
- package/lib/server/modules/order/index.d.ts +8 -17
- package/lib/server/modules/order/index.js +106 -199
- package/lib/server/modules/products/index.d.ts +2 -8
- package/lib/server/modules/products/index.js +24 -97
- package/lib/server/modules/resource/index.js +2 -7
- package/lib/server/utils/small-ticket.js +1 -1
- package/lib/solution/BaseSales/index.d.ts +3 -1
- package/lib/solution/BaseSales/index.js +29 -16
- package/lib/solution/BaseSales/utils.js +29 -18
- package/lib/solution/BookingTicket/index.d.ts +6 -2
- package/lib/solution/BookingTicket/index.js +53 -14
- package/lib/solution/ScanOrder/utils.js +29 -18
- package/lib/solution/UnifiedBookingSales/index.d.ts +25 -0
- package/lib/solution/UnifiedBookingSales/index.js +188 -0
- package/lib/solution/UnifiedBookingSales/types.d.ts +7 -0
- 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(
|
|
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(
|
|
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
|
-
*
|
|
294
|
+
* 当前订单拉取窗口:
|
|
295
|
+
* - 优先使用 createdAtQuery.sales_time_between(已按营业日边界初始化)
|
|
296
|
+
* - 无法解析时退化为自然日窗口
|
|
304
297
|
*/
|
|
305
|
-
private
|
|
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
|
-
*
|
|
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
|
|
196
|
-
|
|
195
|
+
const sourceOrder = (0, import_lodash_es.cloneDeep)(order);
|
|
196
|
+
const sourceOrderRecord = sourceOrder;
|
|
197
197
|
if (Array.isArray(sourceOrderRecord.payments)) {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
-
*
|
|
2140
|
+
* 当前订单拉取窗口:
|
|
2141
|
+
* - 优先使用 createdAtQuery.sales_time_between(已按营业日边界初始化)
|
|
2142
|
+
* - 无法解析时退化为自然日窗口
|
|
2219
2143
|
*/
|
|
2220
|
-
|
|
2221
|
-
var _a;
|
|
2144
|
+
getCurrentPullWindow() {
|
|
2145
|
+
var _a, _b;
|
|
2222
2146
|
const now = (0, import_dayjs.default)();
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
const
|
|
2226
|
-
const
|
|
2227
|
-
|
|
2228
|
-
|
|
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.
|
|
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(
|
|
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
|
-
|
|
2328
|
-
const normalizeStartedAt = performance.now();
|
|
2329
|
-
const normalizedOrders = (orders || []).map(
|
|
2204
|
+
return (orders || []).map(
|
|
2330
2205
|
(order) => this.normalizeOrderCollectionsForIngress(order, "loadOrdersFromSQLite")
|
|
2331
2206
|
);
|
|
2332
|
-
|
|
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
|
|
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
|
-
*
|
|
2475
|
+
* await this.replaceOrdersSnapshotInSQLite(orderList)
|
|
2564
2476
|
*/
|
|
2565
2477
|
async replaceOrdersSnapshotInSQLite(orderList, source, protectedOrdersBeforeRemoteFetch = []) {
|
|
2566
2478
|
if (!this.dbManager) {
|
|
2567
|
-
return
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
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
|
|
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.
|
|
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(
|
|
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(
|
|
339
|
-
trigger?: string;
|
|
340
|
-
}): Promise<ProductData[]>;
|
|
334
|
+
silentRefresh(): Promise<ProductData[]>;
|
|
341
335
|
/**
|
|
342
336
|
* 销毁同步资源(取消 pubsub 订阅、清除定时器)
|
|
343
337
|
*/
|