@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.
Files changed (45) hide show
  1. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +7 -3
  2. package/dist/modules/Cart/utils/cartProduct.js +11 -1
  3. package/dist/modules/Cart/utils/changePrice.js +11 -11
  4. package/dist/modules/Order/index.d.ts +16 -0
  5. package/dist/modules/Order/index.js +1232 -568
  6. package/dist/modules/Order/types.d.ts +1 -0
  7. package/dist/modules/Order/utils.d.ts +33 -2
  8. package/dist/modules/Order/utils.js +112 -55
  9. package/dist/modules/Payment/walletpass.js +14 -7
  10. package/dist/modules/SalesSummary/utils.js +394 -149
  11. package/dist/server/index.d.ts +3 -0
  12. package/dist/server/index.js +294 -190
  13. package/dist/server/modules/order/index.d.ts +8 -0
  14. package/dist/server/modules/order/index.js +536 -317
  15. package/dist/server/modules/order/types.d.ts +2 -0
  16. package/dist/solution/BaseSales/index.js +2 -1
  17. package/dist/solution/BaseSales/types.d.ts +1 -0
  18. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +19 -4
  19. package/dist/solution/BookingByStep/index.d.ts +1 -1
  20. package/dist/solution/ScanOrder/types.d.ts +1 -0
  21. package/dist/solution/ScanOrder/utils.js +26 -9
  22. package/dist/solution/VenueBooking/index.js +2 -1
  23. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +4 -1
  24. package/lib/modules/Cart/utils/cartProduct.js +11 -1
  25. package/lib/modules/Cart/utils/changePrice.js +12 -20
  26. package/lib/modules/Order/index.d.ts +16 -0
  27. package/lib/modules/Order/index.js +525 -18
  28. package/lib/modules/Order/types.d.ts +1 -0
  29. package/lib/modules/Order/utils.d.ts +33 -2
  30. package/lib/modules/Order/utils.js +44 -9
  31. package/lib/modules/Payment/walletpass.js +7 -3
  32. package/lib/modules/SalesSummary/utils.js +256 -46
  33. package/lib/server/index.d.ts +3 -0
  34. package/lib/server/index.js +82 -3
  35. package/lib/server/modules/order/index.d.ts +8 -0
  36. package/lib/server/modules/order/index.js +106 -4
  37. package/lib/server/modules/order/types.d.ts +2 -0
  38. package/lib/solution/BaseSales/index.js +2 -1
  39. package/lib/solution/BaseSales/types.d.ts +1 -0
  40. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +15 -1
  41. package/lib/solution/BookingByStep/index.d.ts +1 -1
  42. package/lib/solution/ScanOrder/types.d.ts +1 -0
  43. package/lib/solution/ScanOrder/utils.js +28 -10
  44. package/lib/solution/VenueBooking/index.js +2 -1
  45. 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 orderListSnapshot = (0, import_lodash_es.cloneDeep)(orderList);
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: orderListSnapshot.length
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
- return products.map((product) => {
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)
@@ -126,6 +126,7 @@ export interface BaseSalesSummary {
126
126
  shipping_tax_fee: string;
127
127
  tax_fee: string;
128
128
  surcharge_fee: string;
129
+ surcharges?: any[];
129
130
  discount_amount: string;
130
131
  deposit_amount: string;
131
132
  deposit?: {
@@ -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
- return {
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 | 2 | 1 | 6 | 3 | 5 | 4;
314
+ weekNum: 0 | 1 | 2 | 3 | 5 | 4 | 6;
315
315
  }[]>;
316
316
  submitTimeSlot(timeSlots: TimeSliceItem): void;
317
317
  private getScheduleDataByIds;
@@ -115,6 +115,7 @@ export interface ScanOrderSummary {
115
115
  shipping_tax_fee: string;
116
116
  tax_fee: string;
117
117
  surcharge_fee: string;
118
+ surcharges: any[];
118
119
  discount_amount: string;
119
120
  deposit_amount: string;
120
121
  deposit?: {
@@ -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
- ...item,
441
- bundle_id: item.bundle_id ?? item.id,
442
- bundle_product_id: item.bundle_product_id ?? item._bundle_product_id,
443
- bundle_group_id: item.bundle_group_id ?? item.group_id,
444
- bundle_selling_price: item.bundle_selling_price ?? item.price ?? "0.00",
445
- price: item.price ?? item.custom_price ?? item.bundle_selling_price ?? "0.00",
446
- price_type: item.price_type ?? item.custom_price_type ?? "",
447
- price_type_ext: item.price_type_ext ?? item.custom_price_type_ext ?? ""
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
- return this.store.order.getOrderProducts();
1398
+ const products = this.store.order.getOrderProducts();
1399
+ return products;
1399
1400
  }
1400
1401
  async getSummary() {
1401
1402
  this.logMethodStart("getSummary");
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": false,
3
3
  "name": "@pisell/pisellos",
4
- "version": "2.2.197",
4
+ "version": "2.2.199",
5
5
  "description": "一个可扩展的前端模块化SDK框架,支持插件系统",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",