@pisell/pisellos 2.2.197 → 2.2.199
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/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +7 -3
- package/dist/modules/Cart/utils/cartProduct.js +11 -1
- package/dist/modules/Cart/utils/changePrice.js +11 -11
- package/dist/modules/Order/index.d.ts +16 -0
- package/dist/modules/Order/index.js +1232 -568
- package/dist/modules/Order/types.d.ts +1 -0
- package/dist/modules/Order/utils.d.ts +33 -2
- package/dist/modules/Order/utils.js +112 -55
- package/dist/modules/Payment/walletpass.js +14 -7
- package/dist/modules/SalesSummary/utils.js +394 -149
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.js +294 -190
- package/dist/server/modules/order/index.d.ts +8 -0
- package/dist/server/modules/order/index.js +536 -317
- package/dist/server/modules/order/types.d.ts +2 -0
- package/dist/solution/BaseSales/index.js +2 -1
- package/dist/solution/BaseSales/types.d.ts +1 -0
- package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +19 -4
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/ScanOrder/types.d.ts +1 -0
- package/dist/solution/ScanOrder/utils.js +26 -9
- package/dist/solution/VenueBooking/index.js +2 -1
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +4 -1
- package/lib/modules/Cart/utils/cartProduct.js +11 -1
- package/lib/modules/Cart/utils/changePrice.js +12 -20
- package/lib/modules/Order/index.d.ts +16 -0
- package/lib/modules/Order/index.js +525 -18
- package/lib/modules/Order/types.d.ts +1 -0
- package/lib/modules/Order/utils.d.ts +33 -2
- package/lib/modules/Order/utils.js +44 -9
- package/lib/modules/Payment/walletpass.js +7 -3
- package/lib/modules/SalesSummary/utils.js +256 -46
- package/lib/server/index.d.ts +3 -0
- package/lib/server/index.js +82 -3
- package/lib/server/modules/order/index.d.ts +8 -0
- package/lib/server/modules/order/index.js +106 -4
- package/lib/server/modules/order/types.d.ts +2 -0
- package/lib/solution/BaseSales/index.js +2 -1
- package/lib/solution/BaseSales/types.d.ts +1 -0
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +15 -1
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/ScanOrder/types.d.ts +1 -0
- package/lib/solution/ScanOrder/utils.js +28 -10
- package/lib/solution/VenueBooking/index.js +2 -1
- package/package.json +1 -1
|
@@ -44,6 +44,7 @@ var ORDER_SQLITE_DEDUPE_MS = 15e3;
|
|
|
44
44
|
var ORDER_SILENT_REFRESH_MIN_INTERVAL_MS = 3e4;
|
|
45
45
|
var ORDER_BUSINESS_WRITE_SOURCES = /* @__PURE__ */ new Set([
|
|
46
46
|
"upsertOrdersFromRemote",
|
|
47
|
+
"upsertPendingSyncOrders",
|
|
47
48
|
"overwriteExistingOrder"
|
|
48
49
|
]);
|
|
49
50
|
var OrderModule = class extends import_BaseModule.BaseModule {
|
|
@@ -484,6 +485,53 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
484
485
|
this.logInfo("upsertOrdersFromRemote-开始", { count: freshOrders.length });
|
|
485
486
|
await this.mergeOrdersToStore(freshOrders, "upsertOrdersFromRemote");
|
|
486
487
|
}
|
|
488
|
+
/**
|
|
489
|
+
* 将本地待同步订单按 SQLite storage key 合并进 store 并落库。
|
|
490
|
+
* checkout 离线兜底可能没有 order_id,但通常会有 external_sale_number。
|
|
491
|
+
*/
|
|
492
|
+
async upsertPendingSyncOrders(pendingOrders) {
|
|
493
|
+
if (!(pendingOrders == null ? void 0 : pendingOrders.length)) {
|
|
494
|
+
this.logInfo("upsertPendingSyncOrders-订单列表为空", {});
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
const pendingMap = /* @__PURE__ */ new Map();
|
|
498
|
+
for (const order of pendingOrders) {
|
|
499
|
+
const storageKey = this.getOrderStorageKey(order);
|
|
500
|
+
if (!storageKey)
|
|
501
|
+
continue;
|
|
502
|
+
pendingMap.set(storageKey, order);
|
|
503
|
+
}
|
|
504
|
+
if (pendingMap.size === 0) {
|
|
505
|
+
this.logError("upsertPendingSyncOrders-订单缺少可落库标识", {
|
|
506
|
+
count: pendingOrders.length
|
|
507
|
+
});
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
this.logInfo("upsertPendingSyncOrders-开始", { count: pendingMap.size });
|
|
511
|
+
const patchedOrders = [...pendingMap.values()];
|
|
512
|
+
const mergeActions = {};
|
|
513
|
+
const updatedList = this.store.list.map((order) => {
|
|
514
|
+
const storageKey = this.getOrderStorageKey(order);
|
|
515
|
+
if (!storageKey || !pendingMap.has(storageKey))
|
|
516
|
+
return order;
|
|
517
|
+
const pendingOrder = pendingMap.get(storageKey);
|
|
518
|
+
pendingMap.delete(storageKey);
|
|
519
|
+
mergeActions[storageKey] = "update";
|
|
520
|
+
return pendingOrder;
|
|
521
|
+
});
|
|
522
|
+
for (const [storageKey, order] of pendingMap.entries()) {
|
|
523
|
+
mergeActions[storageKey] = "insert";
|
|
524
|
+
updatedList.push(order);
|
|
525
|
+
}
|
|
526
|
+
this.store.list = updatedList;
|
|
527
|
+
this.syncOrdersMap();
|
|
528
|
+
await this.patchOrdersInSQLite(patchedOrders, "upsertPendingSyncOrders", mergeActions);
|
|
529
|
+
this.logInfo("upsertPendingSyncOrders-结束", {
|
|
530
|
+
count: patchedOrders.length,
|
|
531
|
+
storeOrderCountAfter: this.store.list.length
|
|
532
|
+
});
|
|
533
|
+
this.core.effects.emit(import_types.OrderHooks.onOrdersChanged, this.store.list);
|
|
534
|
+
}
|
|
487
535
|
/**
|
|
488
536
|
* 通过 SSE 按自定义 query 拉取订单(支持 select/with 精简字段)
|
|
489
537
|
*/
|
|
@@ -778,12 +826,32 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
778
826
|
const id = order == null ? void 0 : order.order_id;
|
|
779
827
|
if (id === void 0 || id === null)
|
|
780
828
|
continue;
|
|
781
|
-
freshMap.set(this.getIdKey(id), order);
|
|
829
|
+
freshMap.set(this.getIdKey(id), this.normalizeRemoteSyncedOrder(order));
|
|
830
|
+
}
|
|
831
|
+
const freshStorageKeyMap = /* @__PURE__ */ new Map();
|
|
832
|
+
for (const order of freshMap.values()) {
|
|
833
|
+
const storageKey = this.getOrderStorageKey(order);
|
|
834
|
+
if (!storageKey)
|
|
835
|
+
continue;
|
|
836
|
+
freshStorageKeyMap.set(storageKey, order);
|
|
782
837
|
}
|
|
783
838
|
const uniqueFreshCount = freshMap.size;
|
|
784
839
|
const patchedOrders = [...freshMap.values()];
|
|
785
840
|
const mergeActions = {};
|
|
786
841
|
const updatedList = this.store.list.map((order) => {
|
|
842
|
+
const storageKey = this.getOrderStorageKey(order);
|
|
843
|
+
if (storageKey && freshStorageKeyMap.has(storageKey)) {
|
|
844
|
+
const fresh2 = freshStorageKeyMap.get(storageKey);
|
|
845
|
+
freshStorageKeyMap.delete(storageKey);
|
|
846
|
+
const freshId = fresh2.order_id;
|
|
847
|
+
if (freshId !== void 0 && freshId !== null) {
|
|
848
|
+
freshMap.delete(this.getIdKey(freshId));
|
|
849
|
+
mergeActions[this.getIdKey(freshId)] = "update";
|
|
850
|
+
} else {
|
|
851
|
+
mergeActions[storageKey] = "update";
|
|
852
|
+
}
|
|
853
|
+
return fresh2;
|
|
854
|
+
}
|
|
787
855
|
const id = order.order_id;
|
|
788
856
|
if (id === void 0 || id === null)
|
|
789
857
|
return order;
|
|
@@ -960,6 +1028,33 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
960
1028
|
return [];
|
|
961
1029
|
}
|
|
962
1030
|
}
|
|
1031
|
+
isPendingSyncOrder(order) {
|
|
1032
|
+
return Number(order == null ? void 0 : order.need_sync) === 1;
|
|
1033
|
+
}
|
|
1034
|
+
normalizeRemoteSyncedOrder(order) {
|
|
1035
|
+
if (this.isPendingSyncOrder(order))
|
|
1036
|
+
return order;
|
|
1037
|
+
return {
|
|
1038
|
+
...order,
|
|
1039
|
+
need_sync: 0
|
|
1040
|
+
};
|
|
1041
|
+
}
|
|
1042
|
+
mergeRemoteSnapshotWithPendingOrders(remoteOrders, existingOrders) {
|
|
1043
|
+
const merged = remoteOrders.map((order) => this.normalizeRemoteSyncedOrder(order));
|
|
1044
|
+
const remoteStorageKeys = new Set(
|
|
1045
|
+
merged.map((order) => this.getOrderStorageKey(order)).filter(Boolean)
|
|
1046
|
+
);
|
|
1047
|
+
for (const order of existingOrders) {
|
|
1048
|
+
if (!this.isPendingSyncOrder(order))
|
|
1049
|
+
continue;
|
|
1050
|
+
const storageKey = this.getOrderStorageKey(order);
|
|
1051
|
+
if (!storageKey || remoteStorageKeys.has(storageKey))
|
|
1052
|
+
continue;
|
|
1053
|
+
merged.push(order);
|
|
1054
|
+
remoteStorageKeys.add(storageKey);
|
|
1055
|
+
}
|
|
1056
|
+
return merged;
|
|
1057
|
+
}
|
|
963
1058
|
/**
|
|
964
1059
|
* 串行执行订单 SQLite 写入任务,避免快照替换与增量 upsert 并发交错。
|
|
965
1060
|
*
|
|
@@ -1083,12 +1178,19 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1083
1178
|
if (!this.dbManager) {
|
|
1084
1179
|
return;
|
|
1085
1180
|
}
|
|
1086
|
-
const
|
|
1181
|
+
const remoteSnapshot = (0, import_lodash_es.cloneDeep)(orderList);
|
|
1087
1182
|
try {
|
|
1088
1183
|
await this.runInOrderSQLiteSaveQueue(async () => {
|
|
1184
|
+
const existingOrders = typeof this.dbManager.getAll === "function" ? await this.dbManager.getAll(INDEXDB_STORE_NAME) : [];
|
|
1185
|
+
const orderListSnapshot = this.mergeRemoteSnapshotWithPendingOrders(
|
|
1186
|
+
remoteSnapshot,
|
|
1187
|
+
existingOrders || []
|
|
1188
|
+
);
|
|
1089
1189
|
this.logInfo("replaceOrdersSnapshotInSQLite-开始", {
|
|
1090
1190
|
source,
|
|
1091
|
-
count: orderListSnapshot.length
|
|
1191
|
+
count: orderListSnapshot.length,
|
|
1192
|
+
remoteCount: remoteSnapshot.length,
|
|
1193
|
+
preservedPendingCount: orderListSnapshot.length - remoteSnapshot.length
|
|
1092
1194
|
});
|
|
1093
1195
|
await this.dbManager.clear(INDEXDB_STORE_NAME);
|
|
1094
1196
|
this.logInfo("replaceOrdersSnapshotInSQLite-clear完成", {
|
|
@@ -1107,7 +1209,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1107
1209
|
} catch (error) {
|
|
1108
1210
|
this.logError("全量保存订单到 SQLite 失败", {
|
|
1109
1211
|
error: error instanceof Error ? error.message : String(error),
|
|
1110
|
-
orderList:
|
|
1212
|
+
orderList: remoteSnapshot.length
|
|
1111
1213
|
});
|
|
1112
1214
|
}
|
|
1113
1215
|
}
|
|
@@ -393,6 +393,8 @@ export interface OrderData {
|
|
|
393
393
|
/** 本地辅助字段 */
|
|
394
394
|
shop_id?: number;
|
|
395
395
|
create_date?: string;
|
|
396
|
+
/** 本地待同步标记:1 表示需要后续同步到云端 */
|
|
397
|
+
need_sync?: 0 | 1 | number;
|
|
396
398
|
/** 兼容:部分场景仍使用顶层 total_amount */
|
|
397
399
|
total_amount?: OrderMoneyString | number;
|
|
398
400
|
/** 扩展字段(物流、标签等);使用 any 以便筛选与数据源扩展 */
|
|
@@ -1301,7 +1301,7 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
|
|
|
1301
1301
|
if (!((_b = tempOrder == null ? void 0 : tempOrder.products) == null ? void 0 : _b.length))
|
|
1302
1302
|
return [];
|
|
1303
1303
|
const products = (_c = tempOrder == null ? void 0 : tempOrder.products) == null ? void 0 : _c.filter((n) => n.product_id);
|
|
1304
|
-
|
|
1304
|
+
const walletProducts = products.map((product) => {
|
|
1305
1305
|
const metadata = product.metadata || {};
|
|
1306
1306
|
return {
|
|
1307
1307
|
product_id: product.product_id,
|
|
@@ -1345,6 +1345,7 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
|
|
|
1345
1345
|
})
|
|
1346
1346
|
};
|
|
1347
1347
|
});
|
|
1348
|
+
return walletProducts;
|
|
1348
1349
|
}
|
|
1349
1350
|
async initWalletData(params) {
|
|
1350
1351
|
if (!this.store.order)
|
|
@@ -73,15 +73,29 @@ function normalizeBundleItems(bundleItems, preferPriceField = false) {
|
|
|
73
73
|
const unitSelling = preferPriceField ? bundleItem.price ?? bundleItem.bundle_selling_price ?? bundleItem.custom_price ?? bundleItem.product_price ?? "0" : bundleItem.bundle_selling_price ?? bundleItem.price ?? bundleItem.custom_price ?? bundleItem.product_price ?? "0";
|
|
74
74
|
const unitStr = toPriceString(unitSelling, "0.00");
|
|
75
75
|
const num = toSafePositiveInt((bundleItem == null ? void 0 : bundleItem.num) ?? (bundleItem == null ? void 0 : bundleItem.quantity), 1);
|
|
76
|
-
|
|
76
|
+
const magnitudeSource = {
|
|
77
|
+
...bundleItem,
|
|
78
|
+
option: normalizeOptionItems(bundleItem == null ? void 0 : bundleItem.option),
|
|
79
|
+
bundle_selling_price: unitStr,
|
|
80
|
+
// 计算 markdown 净额时,只传真实毛价;仅有 bundle_selling_price 时按历史净额兜底。
|
|
81
|
+
price: bundleItem.price ?? bundleItem.custom_price
|
|
82
|
+
};
|
|
83
|
+
const normalizedItem = {
|
|
77
84
|
...bundleItem,
|
|
78
85
|
num,
|
|
79
86
|
quantity: (bundleItem == null ? void 0 : bundleItem.quantity) ?? num,
|
|
87
|
+
// price 保留毛价(markdown 仍为正),由 price_type 决定符号。
|
|
80
88
|
price: bundleItem.price ?? unitStr,
|
|
81
89
|
bundle_selling_price: unitStr,
|
|
82
90
|
original_price: bundleItem.original_price ?? bundleItem.product_price ?? bundleItem.price ?? unitStr,
|
|
83
91
|
option: normalizeOptionItems(bundleItem == null ? void 0 : bundleItem.option)
|
|
84
92
|
};
|
|
93
|
+
normalizedItem.bundle_selling_price = (0, import_utils.getBundleSellingMagnitude)(magnitudeSource).toFixed(2);
|
|
94
|
+
if ((normalizedItem.price_type ?? normalizedItem.custom_price_type) === "markdown" && (normalizedItem.price_type_ext === "" || normalizedItem.price_type_ext === void 0 || normalizedItem.price_type_ext === null)) {
|
|
95
|
+
normalizedItem.custom_price = normalizedItem.custom_price ?? normalizedItem.price;
|
|
96
|
+
normalizedItem.price = normalizedItem.bundle_selling_price;
|
|
97
|
+
}
|
|
98
|
+
return normalizedItem;
|
|
85
99
|
});
|
|
86
100
|
}
|
|
87
101
|
function findVariantById(origin, variantId) {
|
|
@@ -311,7 +311,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
|
|
|
311
311
|
date: string;
|
|
312
312
|
status: string;
|
|
313
313
|
week: string;
|
|
314
|
-
weekNum: 0 |
|
|
314
|
+
weekNum: 0 | 1 | 2 | 3 | 5 | 4 | 6;
|
|
315
315
|
}[]>;
|
|
316
316
|
submitTimeSlot(timeSlots: TimeSliceItem): void;
|
|
317
317
|
private getScheduleDataByIds;
|
|
@@ -75,6 +75,7 @@ function createEmptySummary() {
|
|
|
75
75
|
shipping_tax_fee: "0.00",
|
|
76
76
|
tax_fee: "0.00",
|
|
77
77
|
surcharge_fee: "0.00",
|
|
78
|
+
surcharges: [],
|
|
78
79
|
discount_amount: "0.00",
|
|
79
80
|
deposit_amount: "0.00",
|
|
80
81
|
expect_amount: "0.00",
|
|
@@ -436,16 +437,33 @@ function normalizeOrderProduct(product) {
|
|
|
436
437
|
};
|
|
437
438
|
});
|
|
438
439
|
}
|
|
439
|
-
const normalizedBundle = bundleInput.map((item) =>
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
440
|
+
const normalizedBundle = bundleInput.map((item) => {
|
|
441
|
+
const magnitudeSource = {
|
|
442
|
+
...item,
|
|
443
|
+
// 计算 markdown 净额时,只把真实毛价交给 helper;若只有 bundle_selling_price,
|
|
444
|
+
// helper 会按历史净额兜底,避免 option 二次扣减。
|
|
445
|
+
price: item.price ?? item.custom_price
|
|
446
|
+
};
|
|
447
|
+
const normalizedItem = {
|
|
448
|
+
...item,
|
|
449
|
+
bundle_id: item.bundle_id ?? item.id,
|
|
450
|
+
bundle_product_id: item.bundle_product_id ?? item._bundle_product_id,
|
|
451
|
+
bundle_group_id: item.bundle_group_id ?? item.group_id,
|
|
452
|
+
// price 保留毛价(markdown 仍为 5),由 price_type 决定符号。
|
|
453
|
+
price: item.price ?? item.custom_price ?? item.bundle_selling_price ?? "0.00",
|
|
454
|
+
price_type: item.price_type ?? item.custom_price_type ?? "",
|
|
455
|
+
price_type_ext: item.price_type_ext ?? item.custom_price_type_ext ?? ""
|
|
456
|
+
};
|
|
457
|
+
normalizedItem.bundle_selling_price = (0, import_utils.getBundleSellingMagnitude)(magnitudeSource).toFixed(2);
|
|
458
|
+
if (normalizedItem.price_type === "markdown" && (normalizedItem.price_type_ext === "" || normalizedItem.price_type_ext === void 0 || normalizedItem.price_type_ext === null)) {
|
|
459
|
+
normalizedItem.custom_price = normalizedItem.custom_price ?? normalizedItem.price;
|
|
460
|
+
normalizedItem.price = normalizedItem.bundle_selling_price;
|
|
461
|
+
}
|
|
462
|
+
if ((normalizedItem.price_type === "markdown" || normalizedItem.price_type === "markup") && (normalizedItem.price_type_ext === "" || normalizedItem.price_type_ext === void 0 || normalizedItem.price_type_ext === null)) {
|
|
463
|
+
delete normalizedItem.original_total;
|
|
464
|
+
}
|
|
465
|
+
return normalizedItem;
|
|
466
|
+
});
|
|
449
467
|
const normalizedOptions = (0, import_utils.normalizeProductSkuOptions)((_e = product.product_sku) == null ? void 0 : _e.option);
|
|
450
468
|
const optionSum = (0, import_utils.sumOptionUnitPrice)(normalizedOptions);
|
|
451
469
|
const productSku = {
|
|
@@ -1395,7 +1395,8 @@ var _VenueBookingImpl = class extends import_BaseModule.BaseModule {
|
|
|
1395
1395
|
getOrderProducts() {
|
|
1396
1396
|
if (!this.store.order)
|
|
1397
1397
|
throw new Error("order 模块未初始化");
|
|
1398
|
-
|
|
1398
|
+
const products = this.store.order.getOrderProducts();
|
|
1399
|
+
return products;
|
|
1399
1400
|
}
|
|
1400
1401
|
async getSummary() {
|
|
1401
1402
|
this.logMethodStart("getSummary");
|