@pisell/pisellos 2.2.315 → 2.2.316
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/model/strategy/adapter/promotion/evaluator.js +89 -104
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +28 -4
- package/dist/modules/Holder/utils.d.ts +2 -0
- package/dist/modules/Holder/utils.js +32 -2
- package/dist/modules/OpenData/contactInfo.d.ts +20 -0
- package/dist/modules/OpenData/contactInfo.js +70 -0
- package/dist/modules/OpenData/index.d.ts +1 -0
- package/dist/modules/OpenData/index.js +1 -0
- package/dist/modules/OpenData/types.d.ts +9 -0
- package/dist/modules/Order/holderRelations.d.ts +14 -0
- package/dist/modules/Order/holderRelations.js +154 -0
- package/dist/modules/Order/index.d.ts +2 -2
- package/dist/modules/Order/index.js +89 -44
- package/dist/modules/Order/types.d.ts +19 -1
- package/dist/modules/Order/types.js +2 -0
- package/dist/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
- package/dist/modules/Order/utils/discountProductLineIdentity.js +142 -7
- package/dist/modules/Order/utils/orderCollectionIdentity.js +24 -10
- package/dist/modules/Order/utils.d.ts +2 -1
- package/dist/modules/Order/utils.js +36 -10
- package/dist/modules/Rules/index.js +62 -61
- package/dist/server/index.js +36 -28
- package/dist/server/modules/order/index.d.ts +4 -0
- package/dist/server/modules/order/index.js +255 -190
- package/dist/server/modules/order/types.d.ts +3 -0
- package/dist/server/modules/products/index.d.ts +28 -7
- package/dist/server/modules/products/index.js +1297 -770
- package/dist/server/modules/products/replication.d.ts +8 -0
- package/dist/server/modules/products/replication.js +69 -0
- package/dist/server/modules/products/types.d.ts +12 -1
- package/dist/server/modules/products/types.js +4 -0
- package/dist/shared/receipt/small-ticket.js +24 -12
- package/dist/shared/receipt/templateVisibility.d.ts +3 -0
- package/dist/shared/receipt/templateVisibility.js +6 -2
- package/dist/shared/sales/loadSalesOrderSnapshot.js +1 -1
- package/dist/solution/BaseSales/index.d.ts +4 -0
- package/dist/solution/BaseSales/index.js +1116 -935
- package/dist/solution/BaseSales/types.d.ts +2 -1
- package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
- package/dist/solution/BaseSales/utils/parseSalesResponse.js +7 -3
- package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +14 -4
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.d.ts +15 -1
- package/dist/solution/BookingTicket/index.js +784 -501
- package/dist/solution/ScanOrder/index.js +65 -31
- package/dist/solution/ScanOrder/types.d.ts +3 -0
- package/dist/solution/UnifiedBookingSales/index.js +1 -1
- package/lib/model/strategy/adapter/promotion/evaluator.js +9 -14
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +17 -1
- package/lib/modules/Holder/utils.d.ts +2 -0
- package/lib/modules/Holder/utils.js +27 -1
- package/lib/modules/OpenData/contactInfo.d.ts +20 -0
- package/lib/modules/OpenData/contactInfo.js +56 -0
- package/lib/modules/OpenData/index.d.ts +1 -0
- package/lib/modules/OpenData/index.js +12 -0
- package/lib/modules/OpenData/types.d.ts +9 -0
- package/lib/modules/Order/holderRelations.d.ts +14 -0
- package/lib/modules/Order/holderRelations.js +98 -0
- package/lib/modules/Order/index.d.ts +2 -2
- package/lib/modules/Order/index.js +44 -12
- package/lib/modules/Order/types.d.ts +19 -1
- package/lib/modules/Order/types.js +1 -0
- package/lib/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
- package/lib/modules/Order/utils/discountProductLineIdentity.js +51 -2
- package/lib/modules/Order/utils/orderCollectionIdentity.js +5 -0
- package/lib/modules/Order/utils.d.ts +2 -1
- package/lib/modules/Order/utils.js +28 -6
- package/lib/modules/Rules/index.js +2 -1
- package/lib/server/index.js +8 -2
- package/lib/server/modules/order/index.d.ts +4 -0
- package/lib/server/modules/order/index.js +46 -4
- package/lib/server/modules/order/types.d.ts +3 -0
- package/lib/server/modules/products/index.d.ts +28 -7
- package/lib/server/modules/products/index.js +226 -63
- package/lib/server/modules/products/replication.d.ts +8 -0
- package/lib/server/modules/products/replication.js +30 -0
- package/lib/server/modules/products/types.d.ts +12 -1
- package/lib/server/modules/products/types.js +3 -0
- package/lib/shared/receipt/small-ticket.js +22 -13
- package/lib/shared/receipt/templateVisibility.d.ts +3 -0
- package/lib/shared/receipt/templateVisibility.js +6 -2
- package/lib/shared/sales/loadSalesOrderSnapshot.js +1 -1
- package/lib/solution/BaseSales/index.d.ts +4 -0
- package/lib/solution/BaseSales/index.js +68 -2
- package/lib/solution/BaseSales/types.d.ts +2 -1
- package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +4 -0
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +16 -8
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.d.ts +15 -1
- package/lib/solution/BookingTicket/index.js +132 -3
- package/lib/solution/ScanOrder/index.js +59 -20
- package/lib/solution/ScanOrder/types.d.ts +3 -0
- package/lib/solution/UnifiedBookingSales/index.js +1 -1
- package/package.json +1 -1
|
@@ -289,6 +289,7 @@ class OrderModule extends _BaseModule.BaseModule {
|
|
|
289
289
|
const existingRecord = existing;
|
|
290
290
|
const incomingRecord = incoming;
|
|
291
291
|
const uidRemaps = [];
|
|
292
|
+
this.applyHolderRelationsSnapshot(reconciled, existing, incoming);
|
|
292
293
|
for (const field of ORDER_AUTHORITATIVE_COLLECTION_FIELDS) {
|
|
293
294
|
if (!Array.isArray(incomingRecord[field])) continue;
|
|
294
295
|
reconciled[field] = this.mergeAuthoritativeOrderCollection(field, existingRecord[field], incomingRecord[field], uidRemaps);
|
|
@@ -365,7 +366,7 @@ class OrderModule extends _BaseModule.BaseModule {
|
|
|
365
366
|
continue;
|
|
366
367
|
}
|
|
367
368
|
|
|
368
|
-
//
|
|
369
|
+
// 远端商品成员或 Holder 关系确实变化时必须落库,避免被回声窗口跳过。
|
|
369
370
|
if (forceWriteStorageKeys.has(storageKey)) {
|
|
370
371
|
toWrite.push(order);
|
|
371
372
|
continue;
|
|
@@ -1339,6 +1340,7 @@ class OrderModule extends _BaseModule.BaseModule {
|
|
|
1339
1340
|
if (matchIndex >= 0) {
|
|
1340
1341
|
const existingOrder = updatedList[matchIndex];
|
|
1341
1342
|
const reconciledDraftOrder = this.preserveExistingBusinessCodeForDraft(existingOrder, draftOrder);
|
|
1343
|
+
this.applyHolderRelationsSnapshot(reconciledDraftOrder, existingOrder, draftOrder);
|
|
1342
1344
|
const mergedOrder = this.mergeOrderRecords(existingOrder, reconciledDraftOrder);
|
|
1343
1345
|
const nextOrder = {
|
|
1344
1346
|
...mergedOrder,
|
|
@@ -1617,7 +1619,10 @@ class OrderModule extends _BaseModule.BaseModule {
|
|
|
1617
1619
|
const hasSingleId = routeInfo.hasSingleId;
|
|
1618
1620
|
const normalizedBody = this.normalizeOrderSyncPayload(msg.body || msg.data);
|
|
1619
1621
|
if (routeInfo.route === 'bodyUpsert' && normalizedBody) {
|
|
1620
|
-
|
|
1622
|
+
const orderKey = this.getIdKey(normalizedBody.order_id);
|
|
1623
|
+
const previousBody = upsertOrders.get(orderKey);
|
|
1624
|
+
if (previousBody) this.applyHolderRelationsSnapshot(normalizedBody, previousBody, normalizedBody);
|
|
1625
|
+
upsertOrders.set(orderKey, normalizedBody);
|
|
1621
1626
|
return;
|
|
1622
1627
|
}
|
|
1623
1628
|
if (hasBatchIds) refreshIds.push(...routeInfo.batchIds);else if (routeInfo.route === 'httpRefresh.singleId' && singleId !== null) refreshIds.push(singleId);else if (routeInfo.route === 'httpRefresh.relationIds') refreshIds.push(...routeInfo.batchIds);
|
|
@@ -1810,6 +1815,9 @@ class OrderModule extends _BaseModule.BaseModule {
|
|
|
1810
1815
|
const mergedStorageKey = this.getOrderStorageKey(mergedOrder);
|
|
1811
1816
|
if (mergedStorageKey) forceWriteStorageKeys.add(mergedStorageKey);
|
|
1812
1817
|
}
|
|
1818
|
+
if (nextStorageKey && !(0, _lodashEs.isEqual)(existingOrder.holder_relations, mergedOrder.holder_relations)) {
|
|
1819
|
+
forceWriteStorageKeys.add(nextStorageKey);
|
|
1820
|
+
}
|
|
1813
1821
|
// 合并后身份字段可能新增(如挂单拿到 order_id),同步登记到索引,
|
|
1814
1822
|
// 供同批后续 fresh 命中同一槽位,避免重复插入
|
|
1815
1823
|
this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, adjustedMatchIndex);
|
|
@@ -2110,6 +2118,38 @@ class OrderModule extends _BaseModule.BaseModule {
|
|
|
2110
2118
|
const incomingIdentityKeys = new Set(incomingPayments.flatMap(payment => (0, _paymentUtils.getOrderPaymentIdentityKeys)(payment)));
|
|
2111
2119
|
return existingPayments.filter(payment => (0, _paymentUtils.isIdentifiedPendingOrderPayment)(payment) && !(0, _paymentUtils.getOrderPaymentIdentityKeys)(payment).some(key => incomingIdentityKeys.has(key)));
|
|
2112
2120
|
}
|
|
2121
|
+
|
|
2122
|
+
/** 关系数组是完整快照,不能拼接或按商品子项生成 UID;扩展字段整体保留。 */
|
|
2123
|
+
applyHolderRelationsSnapshot(target, existing, incoming) {
|
|
2124
|
+
if (Array.isArray(incoming.holder_relations)) {
|
|
2125
|
+
target.holder_relations = (0, _lodashEs.cloneDeep)(incoming.holder_relations);
|
|
2126
|
+
} else if (Array.isArray(existing.holder_relations)) {
|
|
2127
|
+
target.holder_relations = (0, _lodashEs.cloneDeep)(existing.holder_relations);
|
|
2128
|
+
} else {
|
|
2129
|
+
delete target.holder_relations;
|
|
2130
|
+
}
|
|
2131
|
+
}
|
|
2132
|
+
|
|
2133
|
+
/** 全量拉取缺少关系字段时,仍保留同一订单已有的关系快照。 */
|
|
2134
|
+
preserveOmittedHolderRelations(incomingOrders, existingOrders) {
|
|
2135
|
+
const existingByIdentity = new Map();
|
|
2136
|
+
for (const order of existingOrders) {
|
|
2137
|
+
if (!Array.isArray(order.holder_relations)) continue;
|
|
2138
|
+
for (const key of this.getOrderIdentityMatchKeys(order)) {
|
|
2139
|
+
existingByIdentity.set(key, order);
|
|
2140
|
+
}
|
|
2141
|
+
}
|
|
2142
|
+
return incomingOrders.map(order => {
|
|
2143
|
+
if (Array.isArray(order.holder_relations)) return order;
|
|
2144
|
+
const existingOrder = this.getOrderIdentityMatchKeys(order).map(key => existingByIdentity.get(key)).find(Boolean);
|
|
2145
|
+
if (!existingOrder) return order;
|
|
2146
|
+
const nextOrder = {
|
|
2147
|
+
...order
|
|
2148
|
+
};
|
|
2149
|
+
this.applyHolderRelationsSnapshot(nextOrder, existingOrder, order);
|
|
2150
|
+
return nextOrder;
|
|
2151
|
+
});
|
|
2152
|
+
}
|
|
2113
2153
|
mergeOrderRecords(existing, incoming) {
|
|
2114
2154
|
const preferred = this.pickPreferredOrder(existing, incoming);
|
|
2115
2155
|
const secondary = preferred === existing ? incoming : existing;
|
|
@@ -2152,6 +2192,7 @@ class OrderModule extends _BaseModule.BaseModule {
|
|
|
2152
2192
|
if (Object.prototype.hasOwnProperty.call(incomingRecord, 'order_meta_list')) {
|
|
2153
2193
|
mergedRecord.order_meta_list = (0, _lodashEs.cloneDeep)(incomingRecord.order_meta_list);
|
|
2154
2194
|
}
|
|
2195
|
+
this.applyHolderRelationsSnapshot(merged, existing, incoming);
|
|
2155
2196
|
|
|
2156
2197
|
// 子项数组遵循完整快照语义:incoming 自有且为数组(包括 [])时权威替换;
|
|
2157
2198
|
// 字段缺席或不是数组时视为稀疏 patch,继续保留 existing。
|
|
@@ -2593,7 +2634,7 @@ class OrderModule extends _BaseModule.BaseModule {
|
|
|
2593
2634
|
async replaceOrdersSnapshotInSQLite(orderList, source, protectedOrdersBeforeRemoteFetch = []) {
|
|
2594
2635
|
if (!this.dbManager) {
|
|
2595
2636
|
return {
|
|
2596
|
-
orders: this.compactOrderListByIdentity(orderList.map(order => this.normalizeRemoteSyncedOrder(order)), `${source}.snapshotNoDb`).list,
|
|
2637
|
+
orders: this.compactOrderListByIdentity(this.preserveOmittedHolderRelations(orderList, this.store.list).map(order => this.normalizeRemoteSyncedOrder(order)), `${source}.snapshotNoDb`).list,
|
|
2597
2638
|
persisted: false
|
|
2598
2639
|
};
|
|
2599
2640
|
}
|
|
@@ -2603,6 +2644,7 @@ class OrderModule extends _BaseModule.BaseModule {
|
|
|
2603
2644
|
try {
|
|
2604
2645
|
await this.runInOrderSQLiteSaveQueue(async () => {
|
|
2605
2646
|
const existingOrders = typeof this.dbManager.getAll === 'function' ? await this.dbManager.getAll(INDEXDB_STORE_NAME) : [];
|
|
2647
|
+
const remoteSnapshotWithHolderRelations = this.preserveOmittedHolderRelations(remoteSnapshot, [...protectedOrdersBeforeRemoteFetch, ...(existingOrders || [])]);
|
|
2606
2648
|
const protectedLocalOrders = protectedOrdersBeforeRemoteFetch.map(order => this.normalizeOrderCollectionsForIngress(order, `${source}.protectedBeforeRemoteFetch`)).filter(order => this.shouldProtectLocalOrderFromRemoteSnapshot(order));
|
|
2607
2649
|
for (const rawCurrentOrder of existingOrders || []) {
|
|
2608
2650
|
const currentOrder = this.normalizeOrderCollectionsForIngress(rawCurrentOrder, `${source}.currentSQLite`);
|
|
@@ -2618,7 +2660,7 @@ class OrderModule extends _BaseModule.BaseModule {
|
|
|
2618
2660
|
}
|
|
2619
2661
|
if (currentNeedsProtection) protectedLocalOrders.push(currentOrder);
|
|
2620
2662
|
}
|
|
2621
|
-
const orderListSnapshot = this.mergeRemoteSnapshotWithPendingOrders(
|
|
2663
|
+
const orderListSnapshot = this.mergeRemoteSnapshotWithPendingOrders(remoteSnapshotWithHolderRelations, protectedLocalOrders);
|
|
2622
2664
|
mergedSnapshot = this.compactOrderListByIdentity(orderListSnapshot, `${source}.sqliteSnapshot`).list;
|
|
2623
2665
|
this.logInfo('replaceOrdersSnapshotInSQLite-开始', {
|
|
2624
2666
|
source,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ScheduleEventResource } from '../resource/types';
|
|
2
|
+
import type { OrderHolderRelation } from '../../../modules/Order/types';
|
|
2
3
|
/**
|
|
3
4
|
* Order 模块主键类型(对齐标准 Sales 协议的 order_id)
|
|
4
5
|
*/
|
|
@@ -448,6 +449,8 @@ export interface OrderData {
|
|
|
448
449
|
contacts_info?: unknown[];
|
|
449
450
|
/** 订单级主体参数 */
|
|
450
451
|
holder?: Record<string, unknown> | null;
|
|
452
|
+
/** 非预约商品 Holder 关系完整快照;缺席表示本次回包未提供 */
|
|
453
|
+
holder_relations?: OrderHolderRelation[];
|
|
451
454
|
/** 订单前端扩展快照 */
|
|
452
455
|
order_meta_list?: {
|
|
453
456
|
point_cards_snapshot?: Array<{
|
|
@@ -3,6 +3,7 @@ import { BaseModule } from '../../../modules/BaseModule';
|
|
|
3
3
|
import { ProductData } from '../../../modules/Product/types';
|
|
4
4
|
import type { RouteDefinition } from '../../types';
|
|
5
5
|
import { ProductIdScope, type ProductSnapshot, ProductFormatter, ProductFormatterContext } from './types';
|
|
6
|
+
import type { CommittedProducts, ReplicatedProducts } from './types';
|
|
6
7
|
/**
|
|
7
8
|
* Products 模块 - 用于获取和管理完整的商品详细数据
|
|
8
9
|
* 相比 ProductList 模块,Products 会获取所有详细信息并缓存
|
|
@@ -40,6 +41,26 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
40
41
|
private productIndexDBSaveQueue;
|
|
41
42
|
/** 最近一次智能定价评估提取的 schedule 变价时间点(HH:mm),供 Server 订阅定时刷新使用 */
|
|
42
43
|
private lastScheduleTimePoints;
|
|
44
|
+
private committedProductState?;
|
|
45
|
+
private productReplicationSourceGeneration;
|
|
46
|
+
private productPersistenceFailed;
|
|
47
|
+
private runtimeSyncMode;
|
|
48
|
+
private runtimeSyncGeneration;
|
|
49
|
+
private requestReplicaRefresh?;
|
|
50
|
+
private replicaApplyQueue;
|
|
51
|
+
private productSyncQueue;
|
|
52
|
+
private replicaPriceDirtyIds;
|
|
53
|
+
/** Installed after initial preload; initial cache/network loading stays unchanged. */
|
|
54
|
+
setRuntimeSyncMode(mode: 'normal' | 'memoryReplica', requestRefresh?: (trigger: string) => Promise<void>): Promise<void>;
|
|
55
|
+
isMemoryReplica(): boolean;
|
|
56
|
+
/** Read persisted data once on the main screen to establish a committed baseline. */
|
|
57
|
+
enableProductReplicationSource(): Promise<void>;
|
|
58
|
+
/** Release the extra catalog without changing the normal product store or persistence. */
|
|
59
|
+
disableProductReplicationSource(): void;
|
|
60
|
+
getCommittedProductSnapshot(): CommittedProducts | null;
|
|
61
|
+
private recordProductCommit;
|
|
62
|
+
applyReplicatedProducts(change: ReplicatedProducts): Promise<void>;
|
|
63
|
+
private refreshFromReplica;
|
|
43
64
|
constructor(name?: string, version?: string);
|
|
44
65
|
initialize(core: PisellCore, options: any): Promise<void>;
|
|
45
66
|
/**
|
|
@@ -230,7 +251,10 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
230
251
|
* 根据 ID 列表删除商品(用于 pubsub 同步删除场景)
|
|
231
252
|
* 同时更新 store.list、store.map、IndexDB 和价格缓存
|
|
232
253
|
*/
|
|
233
|
-
removeProductsByIds(ids: number[]
|
|
254
|
+
removeProductsByIds(ids: number[], options?: {
|
|
255
|
+
skipIndexDB?: boolean;
|
|
256
|
+
skipEmit?: boolean;
|
|
257
|
+
}): Promise<void>;
|
|
234
258
|
/**
|
|
235
259
|
* 重新从服务器加载全量商品列表并更新本地 store
|
|
236
260
|
* 用于 pubsub 同步 create / update / batch_update 场景
|
|
@@ -261,13 +285,8 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
261
285
|
* await this.replaceProductsSnapshotInIndexDB(list, 'loadProductsByServer')
|
|
262
286
|
*/
|
|
263
287
|
private replaceProductsSnapshotInIndexDB;
|
|
264
|
-
/**
|
|
265
|
-
* 增量 upsert 商品到 IndexDB,不清空表;用于 pubsub 批次合并后的变更商品。
|
|
266
|
-
*
|
|
267
|
-
* @example
|
|
268
|
-
* await this.patchProductsInIndexDB(changedProducts, 'pubsub.processProductSyncMessages', mergeActions)
|
|
269
|
-
*/
|
|
270
288
|
private patchProductsInIndexDB;
|
|
289
|
+
private persistProductDelta;
|
|
271
290
|
/**
|
|
272
291
|
* 同步更新商品 Map 缓存
|
|
273
292
|
* 将 list 中的商品同步到 map,以 id 为 key
|
|
@@ -309,6 +328,7 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
309
328
|
* Server 层监听该事件后对变更商品增量执行 prepareProductsWithPrice 并更新缓存
|
|
310
329
|
*/
|
|
311
330
|
private processProductSyncMessages;
|
|
331
|
+
private processProductSyncBatch;
|
|
312
332
|
/**
|
|
313
333
|
* 通过 SSE 按 ids 增量拉取商品数据
|
|
314
334
|
* 请求 GET /shop/core/stream?type=product&ids={ids}
|
|
@@ -342,6 +362,7 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
342
362
|
* 销毁同步资源(取消 pubsub 订阅、清除定时器)
|
|
343
363
|
*/
|
|
344
364
|
destroyProductSync(): void;
|
|
365
|
+
destroy(): void;
|
|
345
366
|
/**
|
|
346
367
|
* 获取模块的路由定义
|
|
347
368
|
* Products 模块暂不提供路由,由 Server 层统一处理
|