@pisell/pisellos 2.2.210 → 2.2.212
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/index.js +9 -0
- package/dist/modules/BookingContext/index.d.ts +13 -2
- package/dist/modules/BookingContext/index.js +198 -68
- package/dist/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +1 -0
- package/dist/modules/BookingContext/utils/cacheItemToBookingInput.js +3 -0
- package/dist/modules/Order/index.d.ts +36 -0
- package/dist/modules/Order/index.js +312 -127
- package/dist/modules/Order/types.d.ts +4 -1
- package/dist/modules/Order/utils.d.ts +1 -0
- package/dist/modules/Order/utils.js +12 -7
- package/dist/modules/Quotation/index.js +2 -1
- package/dist/modules/SalesSummary/index.d.ts +1 -0
- package/dist/modules/SalesSummary/index.js +29 -15
- package/dist/modules/SurchargeList/index.d.ts +16 -0
- package/dist/modules/SurchargeList/index.js +162 -0
- package/dist/modules/SurchargeList/types.d.ts +11 -0
- package/dist/modules/SurchargeList/types.js +1 -0
- package/dist/modules/index.d.ts +1 -0
- package/dist/modules/index.js +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.js +1075 -915
- package/dist/server/modules/order/index.d.ts +9 -0
- package/dist/server/modules/order/index.js +557 -411
- package/dist/server/modules/order/utils/filterBookings.js +25 -2
- package/dist/server/modules/order/utils/filterOrders.js +3 -2
- package/dist/server/test.json +713 -0
- package/dist/server/utils/small-ticket.d.ts +1 -1
- package/dist/server/utils/small-ticket.js +1 -1
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.js +22 -20
- package/lib/model/strategy/adapter/promotion/index.js +0 -49
- package/lib/modules/BookingContext/index.d.ts +13 -2
- package/lib/modules/BookingContext/index.js +99 -28
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +1 -0
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +3 -0
- package/lib/modules/Order/index.d.ts +36 -0
- package/lib/modules/Order/index.js +123 -1
- package/lib/modules/Order/types.d.ts +4 -1
- package/lib/modules/Order/utils.d.ts +1 -0
- package/lib/modules/Order/utils.js +12 -4
- package/lib/modules/Quotation/index.js +1 -1
- package/lib/modules/SalesSummary/index.d.ts +1 -0
- package/lib/modules/SalesSummary/index.js +11 -1
- package/lib/modules/SurchargeList/index.d.ts +16 -0
- package/lib/modules/SurchargeList/index.js +89 -0
- package/lib/modules/SurchargeList/types.d.ts +11 -0
- package/lib/modules/SurchargeList/types.js +17 -0
- package/lib/modules/index.d.ts +1 -0
- package/lib/modules/index.js +2 -0
- package/lib/server/index.d.ts +8 -0
- package/lib/server/index.js +134 -19
- package/lib/server/modules/order/index.d.ts +9 -0
- package/lib/server/modules/order/index.js +107 -19
- package/lib/server/modules/order/utils/filterBookings.js +17 -2
- package/lib/server/modules/order/utils/filterOrders.js +3 -2
- package/lib/server/test.json +713 -0
- package/lib/server/utils/small-ticket.d.ts +1 -1
- package/lib/server/utils/small-ticket.js +1 -35
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.js +12 -7
- package/package.json +1 -1
|
@@ -45,7 +45,8 @@ var ORDER_SILENT_REFRESH_MIN_INTERVAL_MS = 3e4;
|
|
|
45
45
|
var ORDER_BUSINESS_WRITE_SOURCES = /* @__PURE__ */ new Set([
|
|
46
46
|
"upsertOrdersFromRemote",
|
|
47
47
|
"upsertPendingSyncOrders",
|
|
48
|
-
"overwriteExistingOrder"
|
|
48
|
+
"overwriteExistingOrder",
|
|
49
|
+
"markOrderSyncedByExternalSaleNumber"
|
|
49
50
|
]);
|
|
50
51
|
var OrderModule = class extends import_BaseModule.BaseModule {
|
|
51
52
|
constructor(name, version) {
|
|
@@ -72,7 +73,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
72
73
|
async emitOrdersChanged(changedOrders = [], source) {
|
|
73
74
|
const payload = {
|
|
74
75
|
list: this.store.list,
|
|
75
|
-
changedOrders,
|
|
76
|
+
changedOrders: changedOrders.map((order) => this.normalizeOrderForMemoryList(order)),
|
|
76
77
|
source
|
|
77
78
|
};
|
|
78
79
|
await this.core.effects.emit(import_types.OrderHooks.onOrdersChanged, payload);
|
|
@@ -131,7 +132,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
131
132
|
}
|
|
132
133
|
}
|
|
133
134
|
if (Array.isArray((_b = options == null ? void 0 : options.initialState) == null ? void 0 : _b.list)) {
|
|
134
|
-
this.store.list = options.initialState.list;
|
|
135
|
+
this.store.list = options.initialState.list.map((order) => this.normalizeOrderForMemoryList(order));
|
|
135
136
|
this.syncOrdersMap();
|
|
136
137
|
this.emitOrdersChanged([], "initialState");
|
|
137
138
|
} else {
|
|
@@ -377,9 +378,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
377
378
|
const localOrder = orders.find((order) => this.isOrderLookupMatch(order, key));
|
|
378
379
|
if (!localOrder)
|
|
379
380
|
return null;
|
|
380
|
-
this.store.list = orders;
|
|
381
|
+
this.store.list = orders.map((order) => this.normalizeOrderForMemoryList(order));
|
|
381
382
|
this.syncOrdersMap();
|
|
382
|
-
return localOrder;
|
|
383
|
+
return this.normalizeOrderForMemoryList(localOrder);
|
|
383
384
|
}
|
|
384
385
|
async loadOrdersByServer() {
|
|
385
386
|
var _a;
|
|
@@ -402,16 +403,17 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
402
403
|
this.markOrderPulledAtNow();
|
|
403
404
|
this.lastServerFullFetchAtMs = Date.now();
|
|
404
405
|
} catch {
|
|
405
|
-
|
|
406
|
-
this.
|
|
406
|
+
this.logInfo("loadOrdersByServer-SSE拉取失败,保持当前内存订单");
|
|
407
|
+
return this.store.list;
|
|
407
408
|
}
|
|
408
409
|
}
|
|
409
|
-
await this.replaceOrdersSnapshotInSQLite(orderList, "loadOrdersByServer");
|
|
410
|
+
const mergedOrders = await this.replaceOrdersSnapshotInSQLite(orderList, "loadOrdersByServer");
|
|
411
|
+
const memoryOrders = mergedOrders.map((order) => this.normalizeOrderForMemoryList(order));
|
|
410
412
|
this.logInfo("loadOrdersByServer-结束", {
|
|
411
|
-
count:
|
|
413
|
+
count: memoryOrders.length
|
|
412
414
|
});
|
|
413
|
-
await this.core.effects.emit(import_types.OrderHooks.onOrdersLoaded,
|
|
414
|
-
return
|
|
415
|
+
await this.core.effects.emit(import_types.OrderHooks.onOrdersLoaded, memoryOrders);
|
|
416
|
+
return memoryOrders;
|
|
415
417
|
}
|
|
416
418
|
/**
|
|
417
419
|
* 静默全量刷新:后台重新拉取全量 SSE 订单数据并更新本地
|
|
@@ -453,6 +455,19 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
453
455
|
const ids = this.resourceIdIndex.get(String(resourceId)) || [];
|
|
454
456
|
return ids.map((id) => this.store.map.get(id)).filter((order) => !!order);
|
|
455
457
|
}
|
|
458
|
+
normalizeOrderForMemoryList(order) {
|
|
459
|
+
const externalSaleNumber = order == null ? void 0 : order.external_sale_number;
|
|
460
|
+
if ((order == null ? void 0 : order.order_id) !== void 0 && (order == null ? void 0 : order.order_id) !== null && (order == null ? void 0 : order.order_id) !== "") {
|
|
461
|
+
return order;
|
|
462
|
+
}
|
|
463
|
+
if (externalSaleNumber === void 0 || externalSaleNumber === null || externalSaleNumber === "") {
|
|
464
|
+
return order;
|
|
465
|
+
}
|
|
466
|
+
return {
|
|
467
|
+
...order,
|
|
468
|
+
order_id: externalSaleNumber
|
|
469
|
+
};
|
|
470
|
+
}
|
|
456
471
|
/**
|
|
457
472
|
* 仅覆盖本地已存在的订单;不存在则直接跳过,不落库、不 emit。
|
|
458
473
|
* 适用于"按 order_id 主动刷新本地订单详情"的代理场景。
|
|
@@ -499,6 +514,51 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
499
514
|
this.logInfo("upsertOrdersFromRemote-开始", { count: freshOrders.length });
|
|
500
515
|
await this.mergeOrdersToStore(freshOrders, "upsertOrdersFromRemote");
|
|
501
516
|
}
|
|
517
|
+
async markOrderSyncedByExternalSaleNumber(params) {
|
|
518
|
+
const externalSaleNumber = params.externalSaleNumber;
|
|
519
|
+
if (externalSaleNumber === void 0 || externalSaleNumber === null || externalSaleNumber === "") {
|
|
520
|
+
this.logError("markOrderSyncedByExternalSaleNumber-缺少 external_sale_number");
|
|
521
|
+
return { updated: false };
|
|
522
|
+
}
|
|
523
|
+
const key = this.getIdKey(externalSaleNumber);
|
|
524
|
+
const targetIndex = this.store.list.findIndex((order) => {
|
|
525
|
+
const value = order == null ? void 0 : order.external_sale_number;
|
|
526
|
+
if (value === void 0 || value === null || value === "")
|
|
527
|
+
return false;
|
|
528
|
+
return this.getIdKey(value) === key;
|
|
529
|
+
});
|
|
530
|
+
if (targetIndex < 0) {
|
|
531
|
+
this.logInfo("markOrderSyncedByExternalSaleNumber-本地订单不存在,跳过", {
|
|
532
|
+
external_sale_number: externalSaleNumber
|
|
533
|
+
});
|
|
534
|
+
return { updated: false };
|
|
535
|
+
}
|
|
536
|
+
const existing = this.store.list[targetIndex];
|
|
537
|
+
const nextOrder = this.normalizeRemoteSyncedOrder({
|
|
538
|
+
...existing,
|
|
539
|
+
...params.patch || {},
|
|
540
|
+
external_sale_number: existing.external_sale_number ?? externalSaleNumber,
|
|
541
|
+
need_sync: 0
|
|
542
|
+
});
|
|
543
|
+
const storageKey = this.getOrderStorageKey(nextOrder) || key;
|
|
544
|
+
this.store.list = this.store.list.map((order, index) => {
|
|
545
|
+
if (index !== targetIndex)
|
|
546
|
+
return order;
|
|
547
|
+
return nextOrder;
|
|
548
|
+
});
|
|
549
|
+
this.syncOrdersMap();
|
|
550
|
+
await this.patchOrdersInSQLite(
|
|
551
|
+
[nextOrder],
|
|
552
|
+
"markOrderSyncedByExternalSaleNumber",
|
|
553
|
+
{ [storageKey]: "update" }
|
|
554
|
+
);
|
|
555
|
+
this.logInfo("markOrderSyncedByExternalSaleNumber-完成", {
|
|
556
|
+
external_sale_number: externalSaleNumber,
|
|
557
|
+
order_id: nextOrder.order_id ?? null
|
|
558
|
+
});
|
|
559
|
+
await this.emitOrdersChanged([nextOrder], "markOrderSyncedByExternalSaleNumber");
|
|
560
|
+
return { updated: true, order: nextOrder };
|
|
561
|
+
}
|
|
502
562
|
/**
|
|
503
563
|
* 将本地待同步订单按 SQLite storage key 合并进 store 并落库。
|
|
504
564
|
* checkout 离线兜底可能没有 order_id,但通常会有 external_sale_number。
|
|
@@ -509,11 +569,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
509
569
|
return;
|
|
510
570
|
}
|
|
511
571
|
const pendingMap = /* @__PURE__ */ new Map();
|
|
572
|
+
const memoryPendingMap = /* @__PURE__ */ new Map();
|
|
512
573
|
for (const order of pendingOrders) {
|
|
513
574
|
const storageKey = this.getOrderStorageKey(order);
|
|
514
575
|
if (!storageKey)
|
|
515
576
|
continue;
|
|
516
577
|
pendingMap.set(storageKey, order);
|
|
578
|
+
memoryPendingMap.set(storageKey, this.normalizeOrderForMemoryList(order));
|
|
517
579
|
}
|
|
518
580
|
if (pendingMap.size === 0) {
|
|
519
581
|
this.logError("upsertPendingSyncOrders-订单缺少可落库标识", {
|
|
@@ -528,12 +590,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
528
590
|
const storageKey = this.getOrderStorageKey(order);
|
|
529
591
|
if (!storageKey || !pendingMap.has(storageKey))
|
|
530
592
|
return order;
|
|
531
|
-
const pendingOrder =
|
|
593
|
+
const pendingOrder = memoryPendingMap.get(storageKey);
|
|
532
594
|
pendingMap.delete(storageKey);
|
|
595
|
+
memoryPendingMap.delete(storageKey);
|
|
533
596
|
mergeActions[storageKey] = "update";
|
|
534
597
|
return pendingOrder;
|
|
535
598
|
});
|
|
536
|
-
for (const [storageKey, order] of
|
|
599
|
+
for (const [storageKey, order] of memoryPendingMap.entries()) {
|
|
537
600
|
mergeActions[storageKey] = "insert";
|
|
538
601
|
updatedList.push(order);
|
|
539
602
|
}
|
|
@@ -545,6 +608,11 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
545
608
|
storeOrderCountAfter: this.store.list.length
|
|
546
609
|
});
|
|
547
610
|
this.emitOrdersChanged(patchedOrders, "upsertPendingSyncOrders");
|
|
611
|
+
await this.core.effects.emit(import_types.OrderHooks.onOrdersChanged, {
|
|
612
|
+
list: this.store.list,
|
|
613
|
+
changedOrders: patchedOrders.map((order) => this.normalizeOrderForMemoryList(order)),
|
|
614
|
+
source: "upsertPendingSyncOrders"
|
|
615
|
+
});
|
|
548
616
|
}
|
|
549
617
|
/**
|
|
550
618
|
* 通过 SSE 按自定义 query 拉取订单(支持 select/with 精简字段)
|
|
@@ -581,21 +649,38 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
581
649
|
this.store.map.clear();
|
|
582
650
|
this.resourceIdIndex.clear();
|
|
583
651
|
for (const order of this.store.list) {
|
|
584
|
-
const
|
|
585
|
-
if (
|
|
652
|
+
const identityKeys = this.getOrderIdentityKeys(order);
|
|
653
|
+
if (identityKeys.length === 0)
|
|
586
654
|
continue;
|
|
587
|
-
|
|
655
|
+
for (const identityKey of identityKeys) {
|
|
656
|
+
this.store.map.set(identityKey, order);
|
|
657
|
+
}
|
|
588
658
|
const resourceIds = this.extractResourceIds(order);
|
|
659
|
+
const primaryIdentity = identityKeys[0];
|
|
589
660
|
for (const resourceId of resourceIds) {
|
|
590
661
|
const key = String(resourceId);
|
|
591
662
|
const existing = this.resourceIdIndex.get(key) || [];
|
|
592
|
-
if (existing.some((eid) => this.getIdKey(eid) ===
|
|
663
|
+
if (existing.some((eid) => this.getIdKey(eid) === primaryIdentity))
|
|
593
664
|
continue;
|
|
594
|
-
existing.push(
|
|
665
|
+
existing.push(primaryIdentity);
|
|
595
666
|
this.resourceIdIndex.set(key, existing);
|
|
596
667
|
}
|
|
597
668
|
}
|
|
598
669
|
}
|
|
670
|
+
getOrderIdentityKeys(order) {
|
|
671
|
+
const keys = [];
|
|
672
|
+
const id = order.order_id;
|
|
673
|
+
if (id !== void 0 && id !== null && id !== "") {
|
|
674
|
+
keys.push(this.getIdKey(id));
|
|
675
|
+
}
|
|
676
|
+
const externalSaleNumber = order == null ? void 0 : order.external_sale_number;
|
|
677
|
+
if (externalSaleNumber !== void 0 && externalSaleNumber !== null && externalSaleNumber !== "") {
|
|
678
|
+
const externalKey = this.getIdKey(externalSaleNumber);
|
|
679
|
+
if (!keys.includes(externalKey))
|
|
680
|
+
keys.push(externalKey);
|
|
681
|
+
}
|
|
682
|
+
return keys;
|
|
683
|
+
}
|
|
599
684
|
extractResourceIds(order) {
|
|
600
685
|
const ids = /* @__PURE__ */ new Set();
|
|
601
686
|
const visitResources = (resources) => {
|
|
@@ -1190,9 +1275,10 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1190
1275
|
*/
|
|
1191
1276
|
async replaceOrdersSnapshotInSQLite(orderList, source) {
|
|
1192
1277
|
if (!this.dbManager) {
|
|
1193
|
-
return;
|
|
1278
|
+
return orderList.map((order) => this.normalizeRemoteSyncedOrder(order));
|
|
1194
1279
|
}
|
|
1195
1280
|
const remoteSnapshot = (0, import_lodash_es.cloneDeep)(orderList);
|
|
1281
|
+
let mergedSnapshot = remoteSnapshot.map((order) => this.normalizeRemoteSyncedOrder(order));
|
|
1196
1282
|
try {
|
|
1197
1283
|
await this.runInOrderSQLiteSaveQueue(async () => {
|
|
1198
1284
|
const existingOrders = typeof this.dbManager.getAll === "function" ? await this.dbManager.getAll(INDEXDB_STORE_NAME) : [];
|
|
@@ -1200,6 +1286,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1200
1286
|
remoteSnapshot,
|
|
1201
1287
|
existingOrders || []
|
|
1202
1288
|
);
|
|
1289
|
+
mergedSnapshot = orderListSnapshot;
|
|
1203
1290
|
this.logInfo("replaceOrdersSnapshotInSQLite-开始", {
|
|
1204
1291
|
source,
|
|
1205
1292
|
count: orderListSnapshot.length,
|
|
@@ -1226,6 +1313,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1226
1313
|
orderList: remoteSnapshot.length
|
|
1227
1314
|
});
|
|
1228
1315
|
}
|
|
1316
|
+
return mergedSnapshot;
|
|
1229
1317
|
}
|
|
1230
1318
|
/**
|
|
1231
1319
|
* 清空订单模块的内存数据和本地 SQLite 订单表。
|
|
@@ -71,6 +71,21 @@ function bookingDateTimeString(datePart, timePart) {
|
|
|
71
71
|
}
|
|
72
72
|
return `${d} ${t}`.trim();
|
|
73
73
|
}
|
|
74
|
+
function resolveBookingTimeRange(booking) {
|
|
75
|
+
const start = toTimestamp(bookingDateTimeString(booking.start_date, booking.start_time));
|
|
76
|
+
if (!start)
|
|
77
|
+
return null;
|
|
78
|
+
const end = toTimestamp(
|
|
79
|
+
bookingDateTimeString(
|
|
80
|
+
booking.end_date || booking.start_date,
|
|
81
|
+
booking.end_time || booking.start_time
|
|
82
|
+
)
|
|
83
|
+
) || start;
|
|
84
|
+
return end >= start ? [start, end] : [end, start];
|
|
85
|
+
}
|
|
86
|
+
function isRangeOverlapping(left, right) {
|
|
87
|
+
return left[0] <= right[1] && left[1] >= right[0];
|
|
88
|
+
}
|
|
74
89
|
function parseDateRange(range) {
|
|
75
90
|
if (!Array.isArray(range) || range.length < 2)
|
|
76
91
|
return null;
|
|
@@ -178,8 +193,8 @@ function matchBooking(booking, orderInfo, ctx) {
|
|
|
178
193
|
if (ctx.appointmentStatusSet && !ctx.appointmentStatusSet.has(getBookingAppointmentStatus(booking)))
|
|
179
194
|
return false;
|
|
180
195
|
if (ctx.bookingTimeRange) {
|
|
181
|
-
const
|
|
182
|
-
if (
|
|
196
|
+
const bookingRange = resolveBookingTimeRange(booking);
|
|
197
|
+
if (!bookingRange || !isRangeOverlapping(bookingRange, ctx.bookingTimeRange))
|
|
183
198
|
return false;
|
|
184
199
|
}
|
|
185
200
|
if (ctx.afterExecutionTimeMs != null) {
|
|
@@ -335,8 +335,9 @@ function filterOrders(orders, filters) {
|
|
|
335
335
|
}
|
|
336
336
|
}
|
|
337
337
|
if (safeFilters.start_time || safeFilters.end_time) {
|
|
338
|
+
const isCreatedIsUndefined = order.created_at === void 0;
|
|
338
339
|
const orderTime = order.created_at ? typeof order.created_at === "number" ? order.created_at : (0, import_dayjs.default)(String(order.created_at)).valueOf() : 0;
|
|
339
|
-
if (safeFilters.start_time) {
|
|
340
|
+
if (safeFilters.start_time && !isCreatedIsUndefined) {
|
|
340
341
|
const startTs = (0, import_dayjs.default)(safeFilters.start_time).startOf("day").valueOf();
|
|
341
342
|
if (orderTime < startTs) {
|
|
342
343
|
rejected.push({
|
|
@@ -351,7 +352,7 @@ function filterOrders(orders, filters) {
|
|
|
351
352
|
return false;
|
|
352
353
|
}
|
|
353
354
|
}
|
|
354
|
-
if (safeFilters.end_time) {
|
|
355
|
+
if (safeFilters.end_time && !isCreatedIsUndefined) {
|
|
355
356
|
const endTs = (0, import_dayjs.default)(safeFilters.end_time).endOf("day").valueOf();
|
|
356
357
|
if (orderTime > endTs) {
|
|
357
358
|
rejected.push({
|