@pisell/pisellos 2.2.170 → 2.2.172

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.
@@ -1,9 +0,0 @@
1
- // 导出评估器
2
- export { PromotionEvaluator } from "./evaluator";
3
-
4
- // 导出适配器
5
- export { PromotionAdapter } from "./adapter";
6
- export { default } from "./adapter";
7
-
8
- // 导出策略配置示例常量
9
- export { X_ITEMS_FOR_Y_PRICE_STRATEGY, BUY_X_GET_Y_FREE_STRATEGY } from "./examples";
@@ -19,6 +19,8 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
19
19
  private rulesHooksOverride?;
20
20
  private orderHooks?;
21
21
  private otherParams?;
22
+ /** 是否将 tempOrder 写入 localStorage;默认 true,SalesSdk 等内存态场景可关闭。 */
23
+ private enableTempOrderPersist;
22
24
  /**
23
25
  * Populate `savedAmount` on each discount based on product-level discount details.
24
26
  * Only selected discounts get a non-zero value.
@@ -55,6 +57,23 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
55
57
  }): void;
56
58
  private getTempOrderStorageKey;
57
59
  private restoreTempOrderFromStorage;
60
+ /**
61
+ * 运行时切换 tempOrder localStorage 持久化。
62
+ *
63
+ * @example
64
+ * orderModule.setEnableTempOrderPersist(false);
65
+ * orderModule.addProductToOrder(product); // 不会写入 localStorage
66
+ */
67
+ setEnableTempOrderPersist(enabled: boolean): void;
68
+ /**
69
+ * 读取当前是否启用 tempOrder localStorage 持久化。
70
+ *
71
+ * @example
72
+ * if (orderModule.isTempOrderPersistEnabled()) {
73
+ * orderModule.persistTempOrder();
74
+ * }
75
+ */
76
+ isTempOrderPersistEnabled(): boolean;
58
77
  persistTempOrder(): void;
59
78
  private createDefaultTempOrderInstance;
60
79
  private createExternalSaleNumber;
@@ -157,7 +176,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
157
176
  updateOrderBooking(params: UpdateOrderBookingParams): any[];
158
177
  removeProductFromOrder(identity: OrderProductIdentity): Promise<OrderProduct[]>;
159
178
  /**
160
- * 仅清空购物车行(products / bookings / discount_list),不重置整单。
179
+ * 仅清空购物车行(products / bookings),不重置整单。
161
180
  * 用于「仅清空商品」;客户、备注、支付等协议字段保持不变。
162
181
  */
163
182
  clearOrderCartLines(): Promise<OrderTempOrder>;
@@ -185,7 +204,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
185
204
  private logSubmitBackendRejected;
186
205
  syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
187
206
  createOrder(params: CommitOrderParams['query']): {
188
- type: "virtual" | "appointment_booking";
207
+ type: "appointment_booking" | "virtual";
189
208
  platform: string;
190
209
  sales_channel: string;
191
210
  order_sales_channel: string;
@@ -26,7 +26,7 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
26
26
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
27
27
  import { BaseModule } from "../BaseModule";
28
28
  import { OrderHooks } from "./types";
29
- import { generateDuration, getAllDiscountList, mergeRelationForms, buildSubmitPayload, createDefaultTempOrder, createDefaultOrderRulesHooks, createEmptySummary, createUuidV4, formatDateTime, isTempOrder, normalizeBookingIsAll, normalizeBookingSubType, mapPaymentItemsToOrderPayments } from "./utils";
29
+ import { generateDuration, getAllDiscountList, mergeRelationForms, buildSubmitPayload, createDefaultTempOrder, createDefaultOrderRulesHooks, createEmptySummary, createUuidV4, formatDateTime, isTempOrder, normalizeBookingIsAll, normalizeBookingSubType, mapPaymentItemsToOrderPayments, normalizeOrderProductDiscountList } from "./utils";
30
30
  import { isNormalProduct } from "../Product/utils";
31
31
  import dayjs from 'dayjs';
32
32
  import { buildProductLineFingerprint, getProductIdentityIndex, getSafeProductNum, isIdentityMatch, normalizeOrderProduct } from "../../solution/ScanOrder/utils";
@@ -57,6 +57,8 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
57
57
  _defineProperty(_assertThisInitialized(_this), "rulesHooksOverride", void 0);
58
58
  _defineProperty(_assertThisInitialized(_this), "orderHooks", void 0);
59
59
  _defineProperty(_assertThisInitialized(_this), "otherParams", void 0);
60
+ /** 是否将 tempOrder 写入 localStorage;默认 true,SalesSdk 等内存态场景可关闭。 */
61
+ _defineProperty(_assertThisInitialized(_this), "enableTempOrderPersist", true);
60
62
  return _this;
61
63
  }
62
64
  _createClass(OrderModule, [{
@@ -94,10 +96,13 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
94
96
  this.rulesHooksOverride = (_otherParams$rules = otherParams.rules) === null || _otherParams$rules === void 0 ? void 0 : _otherParams$rules.hooks;
95
97
  this.orderHooks = options.hooks || ((_otherParams$order = otherParams.order) === null || _otherParams$order === void 0 ? void 0 : _otherParams$order.hooks) || ((_otherParams$hooks = otherParams.hooks) === null || _otherParams$hooks === void 0 ? void 0 : _otherParams$hooks.order);
96
98
  this.otherParams = otherParams;
99
+ this.enableTempOrderPersist = otherParams.enableTempOrderPersist !== false;
97
100
  this.registerDiscountModules(options);
98
- this.restoreTempOrderFromStorage();
101
+ if (this.enableTempOrderPersist) {
102
+ this.restoreTempOrderFromStorage();
103
+ }
99
104
  this.logInfo('OrderModule initialized successfully');
100
- case 21:
105
+ case 22:
101
106
  case "end":
102
107
  return _context.stop();
103
108
  }
@@ -360,8 +365,9 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
360
365
  var tempOrder = this.store.tempOrder;
361
366
  // 任意 products CRUD 后都应当重算 discount 状态;即使 products 为空,
362
367
  // 也需要让 Rules.calcDiscount 把 DiscountModule 的 isSelected / isAvailable /
363
- // appliedProductDetails / savedAmount 以及 tempOrder.discount_list 复位。
368
+ // appliedProductDetails / savedAmount 复位。
364
369
  if (!tempOrder) return;
370
+ delete tempOrder.discount_list;
365
371
  var rulesModule = this.store.rules;
366
372
  if (!rulesModule) return;
367
373
  var discountList = ((_this$store$discount7 = this.store.discount) === null || _this$store$discount7 === void 0 ? void 0 : _this$store$discount7.getDiscountList()) || [];
@@ -378,7 +384,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
378
384
  if (result !== null && result !== void 0 && result.productList) {
379
385
  tempOrder.products = (result.productList || []).map(function (product) {
380
386
  return _objectSpread(_objectSpread({}, product), {}, {
381
- discount_list: syncManualProductDiscountProductNum(product.discount_list, product.num)
387
+ discount_list: normalizeOrderProductDiscountList(syncManualProductDiscountProductNum(product.discount_list, product.num))
382
388
  });
383
389
  });
384
390
  }
@@ -386,9 +392,6 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
386
392
  var _this$store$discount8;
387
393
  OrderModule.populateSavedAmounts(result.productList || tempOrder.products, result.discountList);
388
394
  (_this$store$discount8 = this.store.discount) === null || _this$store$discount8 === void 0 || _this$store$discount8.setDiscountList(result.discountList);
389
- tempOrder.discount_list = result.discountList.filter(function (d) {
390
- return d.isSelected;
391
- });
392
395
  }
393
396
  }
394
397
 
@@ -438,9 +441,12 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
438
441
  // 否则(v1 或无 metadata)→ 走 legacyDiscount 反推分支,基于新的 source + options
439
442
  // 重算出含 option 的 main_product_*,并打上 price_schema_version: 2。
440
443
  // 幂等:多次 restore 不会重复叠加 option/bundle。
441
- parsedData.products[i] = normalizeOrderProduct(row);
444
+ var normalized = normalizeOrderProduct(row);
445
+ normalized.discount_list = normalizeOrderProductDiscountList(normalized.discount_list);
446
+ parsedData.products[i] = normalized;
442
447
  }
443
448
  }
449
+ delete parsedData.discount_list;
444
450
  var parsedRecord = parsedData;
445
451
  this.store.summary = parsedRecord.summary || createEmptySummary();
446
452
  delete parsedData.summary;
@@ -461,9 +467,37 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
461
467
  (_this$window = this.window) === null || _this$window === void 0 || (_this$window = _this$window.localStorage) === null || _this$window === void 0 || _this$window.removeItem(key);
462
468
  }
463
469
  }
470
+
471
+ /**
472
+ * 运行时切换 tempOrder localStorage 持久化。
473
+ *
474
+ * @example
475
+ * orderModule.setEnableTempOrderPersist(false);
476
+ * orderModule.addProductToOrder(product); // 不会写入 localStorage
477
+ */
478
+ }, {
479
+ key: "setEnableTempOrderPersist",
480
+ value: function setEnableTempOrderPersist(enabled) {
481
+ this.enableTempOrderPersist = enabled;
482
+ }
483
+
484
+ /**
485
+ * 读取当前是否启用 tempOrder localStorage 持久化。
486
+ *
487
+ * @example
488
+ * if (orderModule.isTempOrderPersistEnabled()) {
489
+ * orderModule.persistTempOrder();
490
+ * }
491
+ */
492
+ }, {
493
+ key: "isTempOrderPersistEnabled",
494
+ value: function isTempOrderPersistEnabled() {
495
+ return this.enableTempOrderPersist;
496
+ }
464
497
  }, {
465
498
  key: "persistTempOrder",
466
499
  value: function persistTempOrder() {
500
+ if (!this.enableTempOrderPersist) return;
467
501
  var key = this.getTempOrderStorageKey();
468
502
  if (!key || !this.store.tempOrder) return;
469
503
  if (!this.window) return;
@@ -1598,6 +1632,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1598
1632
  productToAdd = (linked === null || linked === void 0 ? void 0 : linked.product) || product;
1599
1633
  incomingFingerprint = buildProductLineFingerprint(productToAdd.product_option_item, productToAdd.product_bundle);
1600
1634
  normalizedIncoming = normalizeOrderProduct(productToAdd);
1635
+ normalizedIncoming.discount_list = normalizeOrderProductDiscountList(normalizedIncoming.discount_list);
1601
1636
  hasIncomingGoodPass = this.hasGoodPassDiscount(normalizedIncoming);
1602
1637
  shouldForceNewLine = !!booking;
1603
1638
  matchedIndex = hasIncomingGoodPass || shouldForceNewLine ? -1 : tempOrder.products.findIndex(function (item) {
@@ -1610,10 +1645,10 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1610
1645
  matchedProduct = matchedIndex === -1 ? null : tempOrder.products[matchedIndex];
1611
1646
  existedFingerprint = matchedProduct ? buildProductLineFingerprint(matchedProduct.product_option_item, matchedProduct.product_bundle) : '';
1612
1647
  if (!matchedProduct) {
1613
- _context15.next = 16;
1648
+ _context15.next = 17;
1614
1649
  break;
1615
1650
  }
1616
- _context15.next = 13;
1651
+ _context15.next = 14;
1617
1652
  return this.shouldMergeProductToOrder({
1618
1653
  incomingProduct: productToAdd,
1619
1654
  normalizedIncoming: normalizedIncoming,
@@ -1624,13 +1659,13 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1624
1659
  tempOrder: tempOrder,
1625
1660
  booking: booking
1626
1661
  });
1627
- case 13:
1662
+ case 14:
1628
1663
  _context15.t0 = _context15.sent;
1629
- _context15.next = 17;
1664
+ _context15.next = 18;
1630
1665
  break;
1631
- case 16:
1632
- _context15.t0 = false;
1633
1666
  case 17:
1667
+ _context15.t0 = false;
1668
+ case 18:
1634
1669
  shouldMerge = _context15.t0;
1635
1670
  if (matchedIndex === -1 || !matchedProduct || !shouldMerge) {
1636
1671
  this.captureProductRuntime(tempOrder, productToAdd, normalizedIncoming);
@@ -1649,6 +1684,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1649
1684
  unique_identification_number: targetUid
1650
1685
  })
1651
1686
  }));
1687
+ normalizedProduct.discount_list = normalizeOrderProductDiscountList(normalizedProduct.discount_list);
1652
1688
  tempOrder.products[matchedIndex] = _objectSpread(_objectSpread(_objectSpread({}, targetProduct), normalizedProduct), {}, {
1653
1689
  metadata: _objectSpread(_objectSpread(_objectSpread({}, targetProduct.metadata || {}), normalizedProduct.metadata || {}), {}, {
1654
1690
  unique_identification_number: targetUid
@@ -1663,14 +1699,14 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1663
1699
  tempOrder.bookings = [].concat(_toConsumableArray(tempOrder.bookings || []), [linked.booking]);
1664
1700
  }
1665
1701
  this.applyDiscount();
1666
- _context15.next = 23;
1702
+ _context15.next = 24;
1667
1703
  return this.recalculateSummary({
1668
1704
  createIfMissing: true
1669
1705
  });
1670
- case 23:
1706
+ case 24:
1671
1707
  this.persistTempOrder();
1672
1708
  return _context15.abrupt("return", tempOrder.products);
1673
- case 25:
1709
+ case 26:
1674
1710
  case "end":
1675
1711
  return _context15.stop();
1676
1712
  }
@@ -1771,6 +1807,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1771
1807
  // normalizeOrderProduct 幂等:v2 metadata 存在 → 保留 main_product_* 折扣重算 composite;
1772
1808
  // 否则 → 把顶层 selling_price 视作 source,派生 main_product_* 并写 price_schema_version: 2。
1773
1809
  normalizedProduct = normalizeOrderProduct(nextProduct);
1810
+ normalizedProduct.discount_list = normalizeOrderProductDiscountList(normalizedProduct.discount_list);
1774
1811
  if (booking) {
1775
1812
  productUid = String(((_normalizedProduct$me = normalizedProduct.metadata) === null || _normalizedProduct$me === void 0 ? void 0 : _normalizedProduct$me.unique_identification_number) || ((_targetProduct$metada3 = targetProduct.metadata) === null || _targetProduct$metada3 === void 0 ? void 0 : _targetProduct$metada3.unique_identification_number) || unique_identification_number || createUuidV4());
1776
1813
  normalizedProduct.metadata = _objectSpread(_objectSpread({}, normalizedProduct.metadata || {}), {}, {
@@ -1795,14 +1832,14 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1795
1832
  tempOrder.products[productIndex] = normalizedProduct;
1796
1833
  this.captureProductRuntime(tempOrder, updates, tempOrder.products[productIndex], (_tempOrder$products$p = tempOrder.products[productIndex].metadata) === null || _tempOrder$products$p === void 0 ? void 0 : _tempOrder$products$p.unique_identification_number);
1797
1834
  this.applyDiscount();
1798
- _context16.next = 25;
1835
+ _context16.next = 26;
1799
1836
  return this.recalculateSummary({
1800
1837
  createIfMissing: true
1801
1838
  });
1802
- case 25:
1839
+ case 26:
1803
1840
  this.persistTempOrder();
1804
1841
  return _context16.abrupt("return", tempOrder.products);
1805
- case 27:
1842
+ case 28:
1806
1843
  case "end":
1807
1844
  return _context16.stop();
1808
1845
  }
@@ -1861,16 +1898,17 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1861
1898
  unique_identification_number: ((_targetProduct$metada4 = targetProduct.metadata) === null || _targetProduct$metada4 === void 0 ? void 0 : _targetProduct$metada4.unique_identification_number) || unique_identification_number
1862
1899
  })
1863
1900
  }));
1901
+ normalizedProduct.discount_list = normalizeOrderProductDiscountList(normalizedProduct.discount_list);
1864
1902
  tempOrder.products[productIndex] = normalizedProduct;
1865
1903
  this.applyDiscount();
1866
- _context17.next = 18;
1904
+ _context17.next = 19;
1867
1905
  return this.recalculateSummary({
1868
1906
  createIfMissing: true
1869
1907
  });
1870
- case 18:
1908
+ case 19:
1871
1909
  this.persistTempOrder();
1872
1910
  return _context17.abrupt("return", tempOrder.products);
1873
- case 20:
1911
+ case 21:
1874
1912
  case "end":
1875
1913
  return _context17.stop();
1876
1914
  }
@@ -1943,7 +1981,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1943
1981
  return removeProductFromOrder;
1944
1982
  }()
1945
1983
  /**
1946
- * 仅清空购物车行(products / bookings / discount_list),不重置整单。
1984
+ * 仅清空购物车行(products / bookings),不重置整单。
1947
1985
  * 用于「仅清空商品」;客户、备注、支付等协议字段保持不变。
1948
1986
  */
1949
1987
  }, {
@@ -1957,21 +1995,20 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1957
1995
  tempOrder = this.ensureTempOrder();
1958
1996
  tempOrder.products = [];
1959
1997
  tempOrder.bookings = [];
1960
- tempOrder.discount_list = [];
1961
1998
  if (tempOrder._extend && _typeof(tempOrder._extend) === 'object') {
1962
1999
  tempOrder._extend = _objectSpread(_objectSpread({}, tempOrder._extend), {}, {
1963
2000
  productsByUid: {}
1964
2001
  });
1965
2002
  }
1966
2003
  this.applyDiscount();
1967
- _context19.next = 8;
2004
+ _context19.next = 7;
1968
2005
  return this.recalculateSummary({
1969
2006
  createIfMissing: true
1970
2007
  });
1971
- case 8:
2008
+ case 7:
1972
2009
  this.persistTempOrder();
1973
2010
  return _context19.abrupt("return", tempOrder);
1974
- case 10:
2011
+ case 9:
1975
2012
  case "end":
1976
2013
  return _context19.stop();
1977
2014
  }
@@ -2717,6 +2754,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2717
2754
  var nextTempOrder = _objectSpread(_objectSpread({}, this.createDefaultTempOrderInstance()), raw || {});
2718
2755
  delete nextTempOrder.summary;
2719
2756
  delete nextTempOrder.lastOrderInfo;
2757
+ delete nextTempOrder.discount_list;
2720
2758
  nextTempOrder.metadata = raw.metadata && _typeof(raw.metadata) === 'object' ? _objectSpread({}, raw.metadata) : {};
2721
2759
  nextTempOrder.holder = raw.holder && _typeof(raw.holder) === 'object' ? _objectSpread({}, raw.holder) : null;
2722
2760
  nextTempOrder.products = Array.isArray(raw.products) ? raw.products.map(function (p) {
@@ -2734,9 +2772,6 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2734
2772
  nextTempOrder.surcharges = Array.isArray(raw.surcharges) ? raw.surcharges.map(function (s) {
2735
2773
  return _objectSpread({}, s || {});
2736
2774
  }) : [];
2737
- nextTempOrder.discount_list = Array.isArray(raw.discount_list) ? raw.discount_list.map(function (d) {
2738
- return _objectSpread({}, d || {});
2739
- }) : [];
2740
2775
  nextTempOrder.relation_forms = Array.isArray(raw.relation_forms) ? raw.relation_forms.map(function (f) {
2741
2776
  return _objectSpread({}, f || {});
2742
2777
  }) : [];
@@ -2769,6 +2804,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2769
2804
  row.metadata.unique_identification_number = createUuidV4();
2770
2805
  }
2771
2806
  var normalized = normalizeOrderProduct(row);
2807
+ normalized.discount_list = normalizeOrderProductDiscountList(normalized.discount_list);
2772
2808
  var result = _objectSpread(_objectSpread(_objectSpread({}, row), normalized), {}, {
2773
2809
  metadata: _objectSpread(_objectSpread({}, row.metadata), normalized.metadata)
2774
2810
  });
@@ -6,6 +6,8 @@ import type { UnavailableReason } from '../Rules/types';
6
6
  import type { SubmitPayloadEnhancer } from './utils';
7
7
  import type { PaymentItem } from '../Payment/types';
8
8
  import type { ICustomer } from '../AccountList/types';
9
+ import type { OrderProductDiscountItem } from '../../server/modules/order/types';
10
+ export type { OrderProductDiscountItem } from '../../server/modules/order/types';
9
11
  export declare enum OrderHooks {
10
12
  OnOrderCreate = "order:onOrderCreate",
11
13
  OnOrderUpdate = "order:onOrderUpdate",
@@ -74,7 +76,7 @@ export interface OrderProduct extends OrderProductIdentity {
74
76
  original_price: string;
75
77
  tax_fee: string;
76
78
  is_charge_tax: number;
77
- discount_list: any[];
79
+ discount_list: OrderProductDiscountItem[];
78
80
  product_bundle: any[];
79
81
  booking_uid?: string;
80
82
  metadata: Record<string, any>;
@@ -149,7 +151,7 @@ export interface OrderTempOrder {
149
151
  bookings: any[];
150
152
  payments: any[];
151
153
  surcharges: any[];
152
- discount_list: any[];
154
+ discount_list?: any[];
153
155
  relation_forms: any[];
154
156
  contacts: any[];
155
157
  contacts_info: Record<string, any> | null;
@@ -165,7 +167,7 @@ export interface OrderSubmitProduct extends Omit<OrderProduct, 'unique_identific
165
167
  payment_price: string;
166
168
  product_sku: Record<string, any>;
167
169
  }
168
- export interface OrderSubmitPayload extends Omit<OrderTempOrder, 'platform' | 'products' | '_extend' | 'customer'> {
170
+ export interface OrderSubmitPayload extends Omit<OrderTempOrder, 'platform' | 'products' | '_extend' | 'customer' | 'discount_list'> {
169
171
  platform: string;
170
172
  request_unique_idempotency_token?: string;
171
173
  form_record_ids?: Array<{
@@ -296,7 +298,6 @@ export interface SubmitSalesOrderParams {
296
298
  bookings: OrderSubmitBooking[];
297
299
  payments: any[];
298
300
  surcharges?: any[];
299
- discount_list: any[];
300
301
  relation_forms: any[];
301
302
  form_record_ids?: OrderSubmitFormRecord[];
302
303
  contacts: any[];
@@ -500,6 +501,10 @@ export interface OrderModuleAPI {
500
501
  updateOrderBooking: (params: UpdateOrderBookingParams) => any[];
501
502
  removeProductFromOrder: (identity: OrderProductIdentity) => Promise<OrderProduct[]>;
502
503
  persistTempOrder: () => void;
504
+ /** 运行时切换 tempOrder localStorage 持久化开关。 */
505
+ setEnableTempOrderPersist: (enabled: boolean) => void;
506
+ /** 当前是否启用 tempOrder localStorage 持久化。 */
507
+ isTempOrderPersistEnabled: () => boolean;
503
508
  submitTempOrder: <T = any>(params?: {
504
509
  cacheId?: string;
505
510
  platform?: string;
@@ -1,6 +1,6 @@
1
1
  import Decimal from 'decimal.js';
2
2
  import { CartItem } from "../Cart";
3
- import type { OrderSubmitPayload, OrderSubmitProduct, OrderSummary, OrderTempOrder } from './types';
3
+ import type { OrderProductDiscountItem, OrderSubmitPayload, OrderSubmitProduct, OrderSummary, OrderTempOrder } from './types';
4
4
  import type { RulesParamsHooks } from '../Rules/types';
5
5
  import type { MapOrderPaymentsOptions, OrderPaymentData, OrderPaymentSource } from './types';
6
6
  /**
@@ -67,6 +67,11 @@ export declare function sumOptionUnitPrice(options?: Array<{
67
67
  */
68
68
  /** Rules calcDiscount 用手动价标记;undefined 表示交给 Rules 用 total/origin_total 推断 */
69
69
  export declare function resolveRulesManualDiscountFlag(metadata: Record<string, any> | null | undefined): boolean | undefined;
70
+ /**
71
+ * 商品行折扣只保留后端 OrderProductDiscountItem 协议字段。
72
+ * Rules/券计算过程中的 `_num`、`config` 等运行态字段不应进入 tempOrder 或提交 payload。
73
+ */
74
+ export declare function normalizeOrderProductDiscountList(discountList?: unknown[] | null): OrderProductDiscountItem[];
70
75
  /**
71
76
  * 手动改价(price_override)时行级 original_price(composite 单价):
72
77
  * 购物车划线价应对齐 metadata.origin._extend.origin_total(改价前单价 composite,如 40),
@@ -1,10 +1,9 @@
1
1
  var _excluded = ["unique_identification_number"],
2
2
  _excluded2 = ["num", "product_option_item", "surcharge_fee", "discount_amount", "discount_type", "discountway", "product_discount_reason", "discount_per"],
3
- _excluded3 = ["_extend", "relation_id", "table_form_id", "resource_id", "summary", "lastOrderInfo", "paid_amount", "shop_id", "shop_note", "shop_service_type", "start_time", "customer", "tax_fee", "total_amount", "total_refund_amount", "create_date", "holder_id"],
3
+ _excluded3 = ["_extend", "relation_id", "table_form_id", "resource_id", "summary", "lastOrderInfo", "paid_amount", "shop_id", "shop_note", "shop_service_type", "start_time", "customer", "discount_list", "tax_fee", "total_amount", "total_refund_amount", "create_date", "holder_id"],
4
4
  _excluded4 = ["collect_pax", "table_occupancy_duration"];
5
5
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
6
6
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
7
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
8
7
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
9
8
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
10
9
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
@@ -14,6 +13,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
14
13
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
14
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
16
15
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
16
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
17
17
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
18
18
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
19
19
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
@@ -126,6 +126,45 @@ export function resolveRulesManualDiscountFlag(metadata) {
126
126
  }
127
127
  return undefined;
128
128
  }
129
+ function normalizeOrderProductDiscountAmount(amount) {
130
+ if (amount === undefined || amount === null) return undefined;
131
+ return String(amount);
132
+ }
133
+
134
+ /**
135
+ * 商品行折扣只保留后端 OrderProductDiscountItem 协议字段。
136
+ * Rules/券计算过程中的 `_num`、`config` 等运行态字段不应进入 tempOrder 或提交 payload。
137
+ */
138
+ export function normalizeOrderProductDiscountList(discountList) {
139
+ if (!Array.isArray(discountList)) return [];
140
+ return discountList.filter(function (item) {
141
+ return !!item && _typeof(item) === 'object';
142
+ }).map(function (item) {
143
+ var normalized = {
144
+ discount_id: Number.isFinite(Number(item.discount_id)) ? Number(item.discount_id) : 0
145
+ };
146
+ if (item.order_discount_id === null) {
147
+ normalized.order_discount_id = null;
148
+ } else if (item.order_discount_id !== undefined) {
149
+ var orderDiscountId = Number(item.order_discount_id);
150
+ if (Number.isFinite(orderDiscountId)) {
151
+ normalized.order_discount_id = orderDiscountId;
152
+ }
153
+ }
154
+ if (item.type !== undefined) normalized.type = item.type;
155
+ var amount = normalizeOrderProductDiscountAmount(item.amount);
156
+ if (amount !== undefined) normalized.amount = amount;
157
+ if (item.discount && _typeof(item.discount) === 'object') {
158
+ normalized.discount = _objectSpread({}, item.discount);
159
+ }
160
+ if (item.metadata === null) {
161
+ normalized.metadata = null;
162
+ } else if (item.metadata && _typeof(item.metadata) === 'object') {
163
+ normalized.metadata = _objectSpread({}, item.metadata);
164
+ }
165
+ return normalized;
166
+ });
167
+ }
129
168
 
130
169
  /**
131
170
  * 手动改价(price_override)时行级 original_price(composite 单价):
@@ -480,7 +519,7 @@ function normalizeSubmitProduct(product) {
480
519
  } : {}), {}, {
481
520
  product_quantity: toBundleNumber(num !== null && num !== void 0 ? num : submitProduct.product_quantity, 1),
482
521
  product_sku: productSku,
483
- discount_list: submitProduct.discount_list || [],
522
+ discount_list: normalizeOrderProductDiscountList(submitProduct.discount_list),
484
523
  product_bundle: formatSubmitBundleItems(submitProduct.product_bundle),
485
524
  metadata: cleanMetadata,
486
525
  // 出站兼容:后端消费 payment_price 字段,这里从 selling_price 直接派生。
@@ -594,7 +633,6 @@ export function createDefaultTempOrder(params) {
594
633
  bookings: [],
595
634
  payments: [],
596
635
  surcharges: [],
597
- discount_list: [],
598
636
  relation_forms: [],
599
637
  contacts: [],
600
638
  contacts_info: null,
@@ -631,6 +669,7 @@ export function buildSubmitPayload(params) {
631
669
  _shopServiceType = _ref9.shop_service_type,
632
670
  _startTime = _ref9.start_time,
633
671
  _customer = _ref9.customer,
672
+ _discountList = _ref9.discount_list,
634
673
  _rootTaxFee = _ref9.tax_fee,
635
674
  _totalAmount = _ref9.total_amount,
636
675
  _totalRefundAmount = _ref9.total_refund_amount,
@@ -677,7 +716,6 @@ export function buildSubmitPayload(params) {
677
716
  return normalizeSubmitBooking(booking);
678
717
  }),
679
718
  payments: tempOrder.payments || [],
680
- // discount_list: tempOrder.discount_list || [],
681
719
  relation_forms: tempOrder.relation_forms || [],
682
720
  // contacts: tempOrder.contacts || [],
683
721
  contacts_info: tempOrder.contacts_info && !Array.isArray(tempOrder.contacts_info) ? tempOrder.contacts_info : null,
@@ -130,8 +130,10 @@ export var QuotationModule = /*#__PURE__*/function (_BaseModule) {
130
130
  try {
131
131
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
132
132
  var quotation = _step.value;
133
- if (!this.isQuotationVisibleForCustomer(quotation, customer_id)) continue;
134
- if (!this.isQuotationActiveAt(quotation, datetime)) continue;
133
+ var visible = this.isQuotationVisibleForCustomer(quotation, customer_id);
134
+ if (!visible) continue;
135
+ var active = this.isQuotationActiveAt(quotation, datetime);
136
+ if (!active) continue;
135
137
  var match = this.findProductData(quotation.product_data, productId, variantId);
136
138
  if (!match) continue;
137
139
  if (match.value === 0) continue;
@@ -248,16 +250,25 @@ export var QuotationModule = /*#__PURE__*/function (_BaseModule) {
248
250
  var _quotation$schedule,
249
251
  _this3 = this;
250
252
  if (!((_quotation$schedule = quotation.schedule) !== null && _quotation$schedule !== void 0 && _quotation$schedule.length)) return false;
251
- var scheduleItems = quotation.schedule.map(function (s) {
253
+ var scheduleItems = [];
254
+ quotation.schedule.forEach(function (s) {
252
255
  var _this3$scheduleResolv;
253
256
  var full = (_this3$scheduleResolv = _this3.scheduleResolver) === null || _this3$scheduleResolv === void 0 ? void 0 : _this3$scheduleResolv.call(_this3, s.id);
254
- if (full) return full;
255
- return _objectSpread(_objectSpread({}, s), {}, {
257
+ if (full) {
258
+ scheduleItems.push(full);
259
+ return;
260
+ }
261
+ if (_this3.scheduleResolver) {
262
+ return;
263
+ }
264
+ var fallbackSchedule = _objectSpread(_objectSpread({}, s), {}, {
256
265
  repeat_type: s.repeat_type || 'none',
257
266
  repeat_rule: s.repeat_rule || null,
258
267
  time_slot: s.time_slot || []
259
268
  });
269
+ scheduleItems.push(fallbackSchedule);
260
270
  });
271
+ if (!scheduleItems.length) return false;
261
272
  return getDateIsInSchedule(datetime, scheduleItems);
262
273
  }
263
274
  }, {
@@ -205,9 +205,13 @@ export var ScheduleModule = /*#__PURE__*/function (_BaseModule) {
205
205
  }, {
206
206
  key: "getScheduleListByIds",
207
207
  value: function getScheduleListByIds(ids) {
208
- return this.store.scheduleList.filter(function (n) {
209
- return ids.includes(n.id);
208
+ var idSet = new Set(ids.map(function (id) {
209
+ return String(id);
210
+ }));
211
+ var list = this.store.scheduleList.filter(function (n) {
212
+ return idSet.has(String(n.id));
210
213
  });
214
+ return list;
211
215
  }
212
216
  }, {
213
217
  key: "setAvailabilityScheduleDateList",
@@ -1608,26 +1608,30 @@ var Server = /*#__PURE__*/function () {
1608
1608
  case 6:
1609
1609
  _context18.prev = 6;
1610
1610
  _context18.next = 9;
1611
+ return this.schedule.loadAllSchedule();
1612
+ case 9:
1613
+ this.products.clearPriceCache();
1614
+ _context18.next = 12;
1611
1615
  return this.products.setupQuotationPriceBridge({
1612
1616
  scheduleModule: this.schedule,
1613
1617
  channel: (_this$core$context = this.core.context) === null || _this$core$context === void 0 ? void 0 : _this$core$context.channel
1614
1618
  });
1615
- case 9:
1619
+ case 12:
1616
1620
  this.logInfo('Products 报价单价格桥接初始化完成');
1617
- _context18.next = 16;
1621
+ _context18.next = 19;
1618
1622
  break;
1619
- case 12:
1620
- _context18.prev = 12;
1623
+ case 15:
1624
+ _context18.prev = 15;
1621
1625
  _context18.t0 = _context18["catch"](6);
1622
1626
  errorMessage = _context18.t0 instanceof Error ? _context18.t0.message : String(_context18.t0);
1623
1627
  this.logError('Products 报价单价格桥接初始化失败', {
1624
1628
  error: errorMessage
1625
1629
  });
1626
- case 16:
1630
+ case 19:
1627
1631
  case "end":
1628
1632
  return _context18.stop();
1629
1633
  }
1630
- }, _callee18, this, [[6, 12]]);
1634
+ }, _callee18, this, [[6, 15]]);
1631
1635
  }));
1632
1636
  function setupProductsQuotationPriceBridge() {
1633
1637
  return _setupProductsQuotationPriceBridge.apply(this, arguments);
@@ -277,7 +277,7 @@ export var ProductsModule = /*#__PURE__*/function (_BaseModule) {
277
277
  value: (function () {
278
278
  var _setupQuotationPriceBridge = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(params) {
279
279
  var _this$otherParams;
280
- var channel, quotation, _params$scheduleModul, _params$scheduleModul2, scheduleList, scheduleMap;
280
+ var channel, quotation;
281
281
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
282
282
  while (1) switch (_context3.prev = _context3.next) {
283
283
  case 0:
@@ -301,14 +301,15 @@ export var ProductsModule = /*#__PURE__*/function (_BaseModule) {
301
301
  this.quotationPriceBridge = quotation;
302
302
  case 10:
303
303
  if (params.scheduleModule) {
304
- scheduleList = ((_params$scheduleModul = (_params$scheduleModul2 = params.scheduleModule).getScheduleList) === null || _params$scheduleModul === void 0 ? void 0 : _params$scheduleModul.call(_params$scheduleModul2)) || [];
305
- scheduleMap = new Map(scheduleList.map(function (schedule) {
306
- return [schedule.id, schedule];
307
- }));
308
304
  this.quotationPriceBridge.setScheduleResolver(function (id) {
309
- var _params$scheduleModul3, _params$scheduleModul4;
310
- if (scheduleMap.has(id)) return scheduleMap.get(id);
311
- var schedules = ((_params$scheduleModul3 = (_params$scheduleModul4 = params.scheduleModule).getScheduleByIds) === null || _params$scheduleModul3 === void 0 ? void 0 : _params$scheduleModul3.call(_params$scheduleModul4, [id])) || [];
305
+ var _params$scheduleModul, _params$scheduleModul2, _params$scheduleModul3, _params$scheduleModul4, _params$scheduleModul5, _params$scheduleModul6;
306
+ var scheduleId = String(id);
307
+ var scheduleList = ((_params$scheduleModul = (_params$scheduleModul2 = params.scheduleModule).getScheduleList) === null || _params$scheduleModul === void 0 ? void 0 : _params$scheduleModul.call(_params$scheduleModul2)) || [];
308
+ var schedule = scheduleList.find(function (item) {
309
+ return String(item.id) === scheduleId;
310
+ });
311
+ if (schedule) return schedule;
312
+ var schedules = ((_params$scheduleModul3 = (_params$scheduleModul4 = params.scheduleModule).getScheduleListByIds) === null || _params$scheduleModul3 === void 0 ? void 0 : _params$scheduleModul3.call(_params$scheduleModul4, [id])) || ((_params$scheduleModul5 = (_params$scheduleModul6 = params.scheduleModule).getScheduleByIds) === null || _params$scheduleModul5 === void 0 ? void 0 : _params$scheduleModul5.call(_params$scheduleModul6, [id])) || [];
312
313
  return schedules[0];
313
314
  });
314
315
  }