@pisell/pisellos 2.2.172 → 2.2.173

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.
@@ -0,0 +1,9 @@
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,13 +19,12 @@ 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;
24
22
  /**
25
23
  * Populate `savedAmount` on each discount based on product-level discount details.
26
24
  * Only selected discounts get a non-zero value.
27
25
  */
28
26
  static populateSavedAmounts(productList: Array<Record<string, any>>, discountList: Array<Record<string, any>>): void;
27
+ private applyProductDiscountPrices;
29
28
  constructor(name?: string, version?: string);
30
29
  initialize(core: PisellCore, options: ModuleOptions): Promise<void>;
31
30
  /**
@@ -55,25 +54,11 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
55
54
  cacheId?: string;
56
55
  salesSummaryModuleName?: string;
57
56
  }): void;
58
- private getTempOrderStorageKey;
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
- */
57
+ /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化。 */
58
+ setEnableTempOrderPersist(_enabled: boolean): void;
59
+ /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化。 */
76
60
  isTempOrderPersistEnabled(): boolean;
61
+ /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化;草稿保存请使用 IndexedDB saveDraft。 */
77
62
  persistTempOrder(): void;
78
63
  private createDefaultTempOrderInstance;
79
64
  private createExternalSaleNumber;
@@ -204,7 +189,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
204
189
  private logSubmitBackendRejected;
205
190
  syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
206
191
  createOrder(params: CommitOrderParams['query']): {
207
- type: "appointment_booking" | "virtual";
192
+ type: "virtual" | "appointment_booking";
208
193
  platform: string;
209
194
  sales_channel: string;
210
195
  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, normalizeOrderProductDiscountList } from "./utils";
29
+ import { composeLinePrice, generateDuration, getAllDiscountList, mergeRelationForms, buildSubmitPayload, createDefaultTempOrder, createDefaultOrderRulesHooks, createEmptySummary, createUuidV4, formatDateTime, isTempOrder, normalizeBookingIsAll, normalizeBookingSubType, mapPaymentItemsToOrderPayments, normalizeOrderProductDiscountList, sumOptionUnitPrice, clearTempOrderHolderAssignments } 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,11 +57,33 @@ 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);
62
60
  return _this;
63
61
  }
64
62
  _createClass(OrderModule, [{
63
+ key: "applyProductDiscountPrices",
64
+ value: function applyProductDiscountPrices(products) {
65
+ return (products || []).map(function (product) {
66
+ var _product$metadata, _product$metadata$sou, _product$metadata2, _product$metadata3, _product$original_pri;
67
+ if ((_product$metadata = product.metadata) !== null && _product$metadata !== void 0 && _product$metadata.is_manual_discount) return product;
68
+ var totalPerUnitDiscount = (product.discount_list || []).reduce(function (sum, discount) {
69
+ return sum + Number(discount.amount || 0);
70
+ }, 0);
71
+ var optionSum = sumOptionUnitPrice(product.product_option_item);
72
+ var sourcePrice = (_product$metadata$sou = (_product$metadata2 = product.metadata) === null || _product$metadata2 === void 0 ? void 0 : _product$metadata2.source_product_price) !== null && _product$metadata$sou !== void 0 ? _product$metadata$sou : ((_product$metadata3 = product.metadata) === null || _product$metadata3 === void 0 ? void 0 : _product$metadata3.main_product_original_price) != null ? new Decimal(Number(product.metadata.main_product_original_price) || 0).minus(optionSum).toFixed(2) : (_product$original_pri = product.original_price) !== null && _product$original_pri !== void 0 ? _product$original_pri : '0';
73
+ var newSourceSellingPrice = new Decimal(Number(sourcePrice) || 0).minus(totalPerUnitDiscount).toDecimalPlaces(2).toString();
74
+ var newMainSellingPrice = new Decimal(Number(newSourceSellingPrice) || 0).plus(optionSum).toDecimalPlaces(2).toFixed(2);
75
+ if (product.metadata) {
76
+ product.metadata.main_product_selling_price = newMainSellingPrice;
77
+ product.metadata.price_schema_version = 2;
78
+ }
79
+ product.selling_price = composeLinePrice({
80
+ mainPrice: newMainSellingPrice,
81
+ bundle: product.product_bundle
82
+ });
83
+ return product;
84
+ });
85
+ }
86
+ }, {
65
87
  key: "initialize",
66
88
  value: function () {
67
89
  var _initialize = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(core, options) {
@@ -96,13 +118,9 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
96
118
  this.rulesHooksOverride = (_otherParams$rules = otherParams.rules) === null || _otherParams$rules === void 0 ? void 0 : _otherParams$rules.hooks;
97
119
  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);
98
120
  this.otherParams = otherParams;
99
- this.enableTempOrderPersist = otherParams.enableTempOrderPersist !== false;
100
121
  this.registerDiscountModules(options);
101
- if (this.enableTempOrderPersist) {
102
- this.restoreTempOrderFromStorage();
103
- }
104
122
  this.logInfo('OrderModule initialized successfully');
105
- case 22:
123
+ case 20:
106
124
  case "end":
107
125
  return _context.stop();
108
126
  }
@@ -382,11 +400,11 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
382
400
  orderTotalAmount: Number(((_this$store$summary2 = this.store.summary) === null || _this$store$summary2 === void 0 ? void 0 : _this$store$summary2.total_amount) || 0)
383
401
  });
384
402
  if (result !== null && result !== void 0 && result.productList) {
385
- tempOrder.products = (result.productList || []).map(function (product) {
403
+ tempOrder.products = this.applyProductDiscountPrices((result.productList || []).map(function (product) {
386
404
  return _objectSpread(_objectSpread({}, product), {}, {
387
405
  discount_list: normalizeOrderProductDiscountList(syncManualProductDiscountProductNum(product.discount_list, product.num))
388
406
  });
389
- });
407
+ }));
390
408
  }
391
409
  if (result !== null && result !== void 0 && result.discountList) {
392
410
  var _this$store$discount8;
@@ -401,107 +419,25 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
401
419
  value: function initTempOrder(params) {
402
420
  if (params.cacheId !== undefined) this.cacheId = params.cacheId;
403
421
  if (params.salesSummaryModuleName !== undefined) this.salesSummaryModuleName = params.salesSummaryModuleName;
404
- this.restoreTempOrderFromStorage();
405
422
  }
406
423
 
407
- // ─── TempOrder: localStorage 持久化 ───
408
- }, {
409
- key: "getTempOrderStorageKey",
410
- value: function getTempOrderStorageKey() {
411
- if (!this.cacheId) return null;
412
- return "scanOrder:tempOrder:".concat(this.cacheId);
413
- }
414
- }, {
415
- key: "restoreTempOrderFromStorage",
416
- value: function restoreTempOrderFromStorage() {
417
- var key = this.getTempOrderStorageKey();
418
- if (!key) return;
419
- if (!this.window) return;
420
- var cachedData = this.window.localStorage.getItem(key);
421
- if (!cachedData) return;
422
- try {
423
- var parsedData = JSON.parse(cachedData);
424
- if (!isTempOrder(parsedData)) {
425
- this.window.localStorage.removeItem(key);
426
- return;
427
- }
428
- if (Array.isArray(parsedData.products)) {
429
- for (var i = 0; i < parsedData.products.length; i++) {
430
- var p = parsedData.products[i];
431
- if (!p || _typeof(p) !== 'object') continue;
432
- if (!Array.isArray(p.product_option_item)) {
433
- p.product_option_item = [];
434
- }
435
- if (!Array.isArray(p.product_bundle)) {
436
- p.product_bundle = [];
437
- }
438
- var row = p;
439
- // 价格 schema 迁移:重跑 normalizeOrderProduct。
440
- // `metadata.price_schema_version === 2` → 已是新语义,保留现有 main_product_* 折扣;
441
- // 否则(v1 或无 metadata)→ 走 legacyDiscount 反推分支,基于新的 source + options
442
- // 重算出含 option 的 main_product_*,并打上 price_schema_version: 2。
443
- // 幂等:多次 restore 不会重复叠加 option/bundle。
444
- var normalized = normalizeOrderProduct(row);
445
- normalized.discount_list = normalizeOrderProductDiscountList(normalized.discount_list);
446
- parsedData.products[i] = normalized;
447
- }
448
- }
449
- delete parsedData.discount_list;
450
- var parsedRecord = parsedData;
451
- this.store.summary = parsedRecord.summary || createEmptySummary();
452
- delete parsedData.summary;
453
- if (parsedRecord.lastOrderInfo) {
454
- this.store.lastOrderInfo = parsedRecord.lastOrderInfo;
455
- delete parsedData.lastOrderInfo;
456
- }
457
- if (!parsedData._extend || _typeof(parsedData._extend) !== 'object') {
458
- parsedData._extend = {
459
- productsByUid: {}
460
- };
461
- } else if (!parsedData._extend.productsByUid) {
462
- parsedData._extend.productsByUid = {};
463
- }
464
- this.store.tempOrder = parsedData;
465
- } catch (_unused2) {
466
- var _this$window;
467
- (_this$window = this.window) === null || _this$window === void 0 || (_this$window = _this$window.localStorage) === null || _this$window === void 0 || _this$window.removeItem(key);
468
- }
469
- }
470
-
471
- /**
472
- * 运行时切换 tempOrder localStorage 持久化。
473
- *
474
- * @example
475
- * orderModule.setEnableTempOrderPersist(false);
476
- * orderModule.addProductToOrder(product); // 不会写入 localStorage
477
- */
424
+ /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化。 */
478
425
  }, {
479
426
  key: "setEnableTempOrderPersist",
480
- value: function setEnableTempOrderPersist(enabled) {
481
- this.enableTempOrderPersist = enabled;
482
- }
427
+ value: function setEnableTempOrderPersist(_enabled) {}
483
428
 
484
- /**
485
- * 读取当前是否启用 tempOrder localStorage 持久化。
486
- *
487
- * @example
488
- * if (orderModule.isTempOrderPersistEnabled()) {
489
- * orderModule.persistTempOrder();
490
- * }
491
- */
429
+ /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化。 */
492
430
  }, {
493
431
  key: "isTempOrderPersistEnabled",
494
432
  value: function isTempOrderPersistEnabled() {
495
- return this.enableTempOrderPersist;
433
+ return false;
496
434
  }
435
+
436
+ /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化;草稿保存请使用 IndexedDB saveDraft。 */
497
437
  }, {
498
438
  key: "persistTempOrder",
499
439
  value: function persistTempOrder() {
500
- if (!this.enableTempOrderPersist) return;
501
- var key = this.getTempOrderStorageKey();
502
- if (!key || !this.store.tempOrder) return;
503
- if (!this.window) return;
504
- this.window.localStorage.setItem(key, JSON.stringify(this.store.tempOrder));
440
+ // no-op: OrderModule 的刷新恢复不再依赖 localStorage。
505
441
  }
506
442
 
507
443
  // ─── TempOrder: 创建 & 获取 ───
@@ -1131,11 +1067,11 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1131
1067
  }, {
1132
1068
  key: "removeLinkedBookingsForProduct",
1133
1069
  value: function removeLinkedBookingsForProduct(tempOrder, product) {
1134
- var _product$metadata,
1135
- _product$metadata2,
1070
+ var _product$metadata4,
1071
+ _product$metadata5,
1136
1072
  _this4 = this;
1137
- var productUid = (product === null || product === void 0 || (_product$metadata = product.metadata) === null || _product$metadata === void 0 ? void 0 : _product$metadata.unique_identification_number) || (product === null || product === void 0 ? void 0 : product.unique_identification_number);
1138
- var bookingUid = (product === null || product === void 0 ? void 0 : product.booking_uid) || (product === null || product === void 0 || (_product$metadata2 = product.metadata) === null || _product$metadata2 === void 0 ? void 0 : _product$metadata2.booking_uid);
1073
+ var productUid = (product === null || product === void 0 || (_product$metadata4 = product.metadata) === null || _product$metadata4 === void 0 ? void 0 : _product$metadata4.unique_identification_number) || (product === null || product === void 0 ? void 0 : product.unique_identification_number);
1074
+ var bookingUid = (product === null || product === void 0 ? void 0 : product.booking_uid) || (product === null || product === void 0 || (_product$metadata5 = product.metadata) === null || _product$metadata5 === void 0 ? void 0 : _product$metadata5.booking_uid);
1139
1075
  if (!productUid && !bookingUid) return;
1140
1076
  tempOrder.bookings = (tempOrder.bookings || []).filter(function (booking) {
1141
1077
  var currentBookingUid = _this4.getBookingUniqueIdentificationNumber(booking);
@@ -1379,11 +1315,13 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1379
1315
  }, {
1380
1316
  key: "setOrderCustomer",
1381
1317
  value: function setOrderCustomer(patch, snapshot) {
1318
+ var _tempOrder$customer_i2, _tempOrder$customer_i3;
1382
1319
  if (!patch) {
1383
1320
  this.clearOrderCustomer();
1384
1321
  return;
1385
1322
  }
1386
1323
  var tempOrder = this.ensureTempOrder();
1324
+ var previousCustomerId = (_tempOrder$customer_i2 = tempOrder.customer_id) !== null && _tempOrder$customer_i2 !== void 0 ? _tempOrder$customer_i2 : null;
1387
1325
  tempOrder.customer_id = patch.customer_id || patch.id || null;
1388
1326
  tempOrder.customer_name = String(patch.customer_name || '');
1389
1327
  tempOrder.country_calling_code = String(patch.country_calling_code || '');
@@ -1401,6 +1339,10 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1401
1339
  var extend = this.ensureExtend(tempOrder);
1402
1340
  if (snapshot === null) delete extend.customerSnapshot;else extend.customerSnapshot = cloneDeep(snapshot);
1403
1341
  }
1342
+ var nextCustomerId = (_tempOrder$customer_i3 = tempOrder.customer_id) !== null && _tempOrder$customer_i3 !== void 0 ? _tempOrder$customer_i3 : null;
1343
+ if (String(previousCustomerId !== null && previousCustomerId !== void 0 ? previousCustomerId : '') !== String(nextCustomerId !== null && nextCustomerId !== void 0 ? nextCustomerId : '')) {
1344
+ clearTempOrderHolderAssignments(tempOrder);
1345
+ }
1404
1346
  this.persistTempOrder();
1405
1347
  this.saveDraftInBackground();
1406
1348
  this.emitOrderCustomerChange();
@@ -1431,6 +1373,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1431
1373
  key: "clearOrderCustomer",
1432
1374
  value: function clearOrderCustomer() {
1433
1375
  var tempOrder = this.ensureTempOrder();
1376
+ clearTempOrderHolderAssignments(tempOrder);
1434
1377
  tempOrder.customer_id = null;
1435
1378
  tempOrder.customer_name = '';
1436
1379
  tempOrder.country_calling_code = '';
@@ -2755,6 +2698,16 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2755
2698
  delete nextTempOrder.summary;
2756
2699
  delete nextTempOrder.lastOrderInfo;
2757
2700
  delete nextTempOrder.discount_list;
2701
+ delete nextTempOrder.shop_id;
2702
+ delete nextTempOrder.create_date;
2703
+ delete nextTempOrder.total_amount;
2704
+ delete nextTempOrder.expect_amount;
2705
+ delete nextTempOrder.paid_amount;
2706
+ delete nextTempOrder.shop_note;
2707
+ delete nextTempOrder.start_time;
2708
+ delete nextTempOrder.tax_fee;
2709
+ delete nextTempOrder.total_refund_amount;
2710
+ delete nextTempOrder.holder_id;
2758
2711
  nextTempOrder.metadata = raw.metadata && _typeof(raw.metadata) === 'object' ? _objectSpread({}, raw.metadata) : {};
2759
2712
  nextTempOrder.holder = raw.holder && _typeof(raw.holder) === 'object' ? _objectSpread({}, raw.holder) : null;
2760
2713
  nextTempOrder.products = Array.isArray(raw.products) ? raw.products.map(function (p) {
@@ -500,10 +500,11 @@ export interface OrderModuleAPI {
500
500
  updateOrderProductQuantity: (params: UpdateOrderProductQuantityParams) => Promise<OrderProduct[]>;
501
501
  updateOrderBooking: (params: UpdateOrderBookingParams) => any[];
502
502
  removeProductFromOrder: (identity: OrderProductIdentity) => Promise<OrderProduct[]>;
503
+ /** @deprecated no-op;OrderModule 不再负责 tempOrder localStorage 持久化。 */
503
504
  persistTempOrder: () => void;
504
- /** 运行时切换 tempOrder localStorage 持久化开关。 */
505
+ /** @deprecated no-op;OrderModule 不再负责 tempOrder localStorage 持久化。 */
505
506
  setEnableTempOrderPersist: (enabled: boolean) => void;
506
- /** 当前是否启用 tempOrder localStorage 持久化。 */
507
+ /** @deprecated 固定返回 false;OrderModule 不再负责 tempOrder localStorage 持久化。 */
507
508
  isTempOrderPersistEnabled: () => boolean;
508
509
  submitTempOrder: <T = any>(params?: {
509
510
  cacheId?: string;
@@ -160,6 +160,22 @@ export declare function formatV1Product(products: OrderSubmitProduct[]): {
160
160
  session: null;
161
161
  unique: string;
162
162
  }[];
163
+ /**
164
+ * 判断 holder_id 是否已分配(非空)。
165
+ *
166
+ * @example
167
+ * hasAssignedHolderId(12); // true
168
+ * hasAssignedHolderId([]); // false
169
+ */
170
+ export declare function hasAssignedHolderId(value: unknown): boolean;
171
+ /**
172
+ * 清空 tempOrder 购物车行上的 holder 分配(products / bookings / runtime origin)。
173
+ * 移除或更换下单客户时调用,与 booking 页换客户清 holder 行为对齐。
174
+ *
175
+ * @example
176
+ * clearTempOrderHolderAssignments(tempOrder);
177
+ */
178
+ export declare function clearTempOrderHolderAssignments(tempOrder: OrderTempOrder): boolean;
163
179
  export { createEmptySummary } from '../../solution/ScanOrder/utils';
164
180
  export { buildManualProductDiscountItem, ensureManualProductDiscountList, findManualProductDiscountItem, mergeManualProductDiscountIntoList, resolveManualDiscountMessage, resolveManualDiscountOriginTotal, resolveManualDiscountReasonFromSources, resolveSafeProductNum, shouldBuildManualProductDiscount, syncManualProductDiscountProductNum, stripManualProductDiscountItems, } from './utils/manualProductDiscount';
165
181
  export type { ManualProductDiscountItem } from './utils/manualProductDiscount';
@@ -229,7 +229,7 @@ export function createDefaultOrderRulesHooks() {
229
229
  id: product.product_id,
230
230
  // Rules 引擎用 _id 作为 processedProductsMap 键;必须与购物车行级 identity 一致,
231
231
  // 否则同 SKU 不同小料会在 calcDiscount 重组时互相覆盖。
232
- // 不透明 identity 契约下,normalizeOrderProduct / restoreTempOrderFromStorage 已保证唯一值存在;
232
+ // 不透明 identity 契约下,normalizeOrderProduct / hydrate 已保证唯一值存在;
233
233
  // 留 fingerprint 分支仅作 Rules 单测里直接传裸 product 时的兜底。
234
234
  _id: (_product$metadata = product.metadata) !== null && _product$metadata !== void 0 && _product$metadata.unique_identification_number ? "".concat(product.product_id, "_").concat(product.product_variant_id, "_").concat(product.metadata.unique_identification_number) : "".concat(product.product_id, "_").concat(product.product_variant_id, "_").concat(buildProductLineFingerprint(product.product_option_item, product.product_bundle)),
235
235
  // Rules 内部 getProductTotalPrice / getProductOriginTotalPrice 会各自再叠加 bundle + option,
@@ -820,5 +820,84 @@ export function formatV1Product(products) {
820
820
  };
821
821
  });
822
822
  }
823
+
824
+ /**
825
+ * 判断 holder_id 是否已分配(非空)。
826
+ *
827
+ * @example
828
+ * hasAssignedHolderId(12); // true
829
+ * hasAssignedHolderId([]); // false
830
+ */
831
+ export function hasAssignedHolderId(value) {
832
+ if (value === undefined || value === null || value === '') return false;
833
+ if (Array.isArray(value)) return value.length > 0;
834
+ return true;
835
+ }
836
+
837
+ /**
838
+ * 清空 tempOrder 购物车行上的 holder 分配(products / bookings / runtime origin)。
839
+ * 移除或更换下单客户时调用,与 booking 页换客户清 holder 行为对齐。
840
+ *
841
+ * @example
842
+ * clearTempOrderHolderAssignments(tempOrder);
843
+ */
844
+ export function clearTempOrderHolderAssignments(tempOrder) {
845
+ var _tempOrder$_extend;
846
+ var changed = false;
847
+ var resetHolderField = function resetHolderField(target) {
848
+ var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'holder_id';
849
+ if (!hasAssignedHolderId(target[key])) return;
850
+ target[key] = null;
851
+ changed = true;
852
+ };
853
+ var _iterator4 = _createForOfIteratorHelper(tempOrder.products || []),
854
+ _step4;
855
+ try {
856
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
857
+ var product = _step4.value;
858
+ if (product.metadata && _typeof(product.metadata) === 'object') {
859
+ resetHolderField(product.metadata);
860
+ }
861
+ }
862
+ } catch (err) {
863
+ _iterator4.e(err);
864
+ } finally {
865
+ _iterator4.f();
866
+ }
867
+ var _iterator5 = _createForOfIteratorHelper(tempOrder.bookings || []),
868
+ _step5;
869
+ try {
870
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
871
+ var booking = _step5.value;
872
+ var bookingRecord = booking;
873
+ if (booking.metadata && _typeof(booking.metadata) === 'object') {
874
+ resetHolderField(booking.metadata);
875
+ }
876
+ if (bookingRecord.holder !== undefined && bookingRecord.holder !== null) {
877
+ delete bookingRecord.holder;
878
+ changed = true;
879
+ }
880
+ }
881
+ } catch (err) {
882
+ _iterator5.e(err);
883
+ } finally {
884
+ _iterator5.f();
885
+ }
886
+ var productsByUid = (_tempOrder$_extend = tempOrder._extend) === null || _tempOrder$_extend === void 0 ? void 0 : _tempOrder$_extend.productsByUid;
887
+ if (productsByUid && _typeof(productsByUid) === 'object') {
888
+ for (var _i4 = 0, _Object$values = Object.values(productsByUid); _i4 < _Object$values.length; _i4++) {
889
+ var entry = _Object$values[_i4];
890
+ var origin = entry === null || entry === void 0 ? void 0 : entry.origin;
891
+ if (!origin || _typeof(origin) !== 'object') continue;
892
+ if (origin.metadata && _typeof(origin.metadata) === 'object') {
893
+ resetHolderField(origin.metadata);
894
+ }
895
+ if (origin._extend && _typeof(origin._extend) === 'object') {
896
+ resetHolderField(origin._extend);
897
+ }
898
+ }
899
+ }
900
+ return changed;
901
+ }
823
902
  export { createEmptySummary } from "../../solution/ScanOrder/utils";
824
903
  export { buildManualProductDiscountItem, ensureManualProductDiscountList, findManualProductDiscountItem, mergeManualProductDiscountIntoList, resolveManualDiscountMessage, resolveManualDiscountOriginTotal, resolveManualDiscountReasonFromSources, resolveSafeProductNum, shouldBuildManualProductDiscount, syncManualProductDiscountProductNum, stripManualProductDiscountItems } from "./utils/manualProductDiscount";