@pisell/pisellos 2.2.309 → 2.2.311

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 (122) hide show
  1. package/dist/model/strategy/adapter/promotion/index.js +0 -9
  2. package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +2 -0
  3. package/dist/model/strategy/adapter/walletPass/evaluator.js +4 -2
  4. package/dist/modules/BookingContext/index.js +4 -4
  5. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +58 -19
  6. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +24 -12
  7. package/dist/modules/Customer/index.js +6 -3
  8. package/dist/modules/Customer/types.d.ts +2 -0
  9. package/dist/modules/Discount/availability.d.ts +7 -0
  10. package/dist/modules/Discount/availability.js +49 -0
  11. package/dist/modules/Discount/entitlementPass.d.ts +34 -0
  12. package/dist/modules/Discount/entitlementPass.js +147 -0
  13. package/dist/modules/Discount/index.d.ts +2 -2
  14. package/dist/modules/Discount/index.js +37 -151
  15. package/dist/modules/Discount/types.d.ts +36 -5
  16. package/dist/modules/OpenData/index.d.ts +1 -1
  17. package/dist/modules/OpenData/index.js +21 -12
  18. package/dist/modules/Order/index.d.ts +32 -4
  19. package/dist/modules/Order/index.js +733 -373
  20. package/dist/modules/Order/types.d.ts +17 -0
  21. package/dist/modules/Order/utils/orderCollectionIdentity.js +16 -12
  22. package/dist/modules/Order/utils.d.ts +19 -5
  23. package/dist/modules/Order/utils.js +306 -86
  24. package/dist/modules/Payment/index.d.ts +0 -5
  25. package/dist/modules/Payment/index.js +35 -85
  26. package/dist/modules/Payment/types.d.ts +21 -1
  27. package/dist/modules/Payment/types.js +2 -0
  28. package/dist/modules/Payment/walletpass.d.ts +1 -1
  29. package/dist/modules/Payment/walletpass.js +80 -47
  30. package/dist/modules/ProductList/index.js +18 -5
  31. package/dist/modules/Rules/index.d.ts +2 -2
  32. package/dist/modules/Rules/index.js +480 -186
  33. package/dist/modules/Rules/types.d.ts +4 -0
  34. package/dist/server/index.js +8 -5
  35. package/dist/server/modules/floor-plan/index.js +34 -3
  36. package/dist/server/modules/order/index.js +6 -0
  37. package/dist/server/modules/order/types.d.ts +12 -0
  38. package/dist/server/modules/payment/index.d.ts +25 -6
  39. package/dist/server/modules/payment/index.js +660 -133
  40. package/dist/server/utils/small-ticket.d.ts +8 -5
  41. package/dist/server/utils/small-ticket.js +1269 -199
  42. package/dist/solution/BaseSales/index.d.ts +11 -2
  43. package/dist/solution/BaseSales/index.js +1463 -1173
  44. package/dist/solution/BaseSales/types.d.ts +7 -3
  45. package/dist/solution/BaseSales/utils/cartPromotion.js +141 -126
  46. package/dist/solution/BookingTicket/index.d.ts +11 -2
  47. package/dist/solution/BookingTicket/index.js +663 -542
  48. package/dist/solution/BookingTicket/types.d.ts +5 -1
  49. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +2 -0
  50. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +338 -147
  51. package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +8 -4
  52. package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +6 -0
  53. package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.js +19 -6
  54. package/dist/solution/ShopDiscount/index.d.ts +2 -0
  55. package/dist/solution/ShopDiscount/index.js +99 -42
  56. package/dist/solution/ShopDiscount/utils.d.ts +4 -2
  57. package/dist/solution/ShopDiscount/utils.js +43 -23
  58. package/dist/solution/UnifiedBookingSales/index.d.ts +2 -2
  59. package/dist/solution/UnifiedBookingSales/index.js +5 -5
  60. package/dist/utils/os-private-payload.d.ts +5 -0
  61. package/dist/utils/os-private-payload.js +17 -0
  62. package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +2 -0
  63. package/lib/model/strategy/adapter/walletPass/evaluator.js +2 -0
  64. package/lib/modules/BookingContext/index.js +3 -3
  65. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +35 -6
  66. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +13 -6
  67. package/lib/modules/Customer/index.js +5 -1
  68. package/lib/modules/Customer/types.d.ts +2 -0
  69. package/lib/modules/Discount/availability.d.ts +7 -0
  70. package/lib/modules/Discount/availability.js +43 -0
  71. package/lib/modules/Discount/entitlementPass.d.ts +34 -0
  72. package/lib/modules/Discount/entitlementPass.js +141 -0
  73. package/lib/modules/Discount/index.d.ts +2 -2
  74. package/lib/modules/Discount/index.js +23 -129
  75. package/lib/modules/Discount/types.d.ts +36 -5
  76. package/lib/modules/OpenData/index.d.ts +1 -1
  77. package/lib/modules/OpenData/index.js +11 -2
  78. package/lib/modules/Order/index.d.ts +32 -4
  79. package/lib/modules/Order/index.js +341 -71
  80. package/lib/modules/Order/types.d.ts +17 -0
  81. package/lib/modules/Order/utils/orderCollectionIdentity.js +14 -11
  82. package/lib/modules/Order/utils.d.ts +19 -5
  83. package/lib/modules/Order/utils.js +215 -13
  84. package/lib/modules/Payment/index.d.ts +0 -5
  85. package/lib/modules/Payment/index.js +3 -28
  86. package/lib/modules/Payment/types.d.ts +21 -1
  87. package/lib/modules/Payment/types.js +1 -0
  88. package/lib/modules/Payment/walletpass.d.ts +1 -1
  89. package/lib/modules/Payment/walletpass.js +29 -9
  90. package/lib/modules/ProductList/index.js +14 -1
  91. package/lib/modules/Rules/index.d.ts +2 -2
  92. package/lib/modules/Rules/index.js +357 -110
  93. package/lib/modules/Rules/types.d.ts +4 -0
  94. package/lib/server/index.js +8 -5
  95. package/lib/server/modules/floor-plan/index.js +29 -1
  96. package/lib/server/modules/order/index.js +6 -0
  97. package/lib/server/modules/order/types.d.ts +12 -0
  98. package/lib/server/modules/payment/index.d.ts +25 -6
  99. package/lib/server/modules/payment/index.js +350 -78
  100. package/lib/server/utils/small-ticket.d.ts +8 -5
  101. package/lib/server/utils/small-ticket.js +1009 -121
  102. package/lib/solution/BaseSales/index.d.ts +11 -2
  103. package/lib/solution/BaseSales/index.js +164 -30
  104. package/lib/solution/BaseSales/types.d.ts +7 -3
  105. package/lib/solution/BaseSales/utils/cartPromotion.js +12 -4
  106. package/lib/solution/BookingTicket/index.d.ts +11 -2
  107. package/lib/solution/BookingTicket/index.js +103 -41
  108. package/lib/solution/BookingTicket/types.d.ts +5 -1
  109. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +2 -0
  110. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +174 -42
  111. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +8 -4
  112. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +6 -0
  113. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +11 -3
  114. package/lib/solution/ShopDiscount/index.d.ts +2 -0
  115. package/lib/solution/ShopDiscount/index.js +55 -9
  116. package/lib/solution/ShopDiscount/utils.d.ts +4 -2
  117. package/lib/solution/ShopDiscount/utils.js +42 -25
  118. package/lib/solution/UnifiedBookingSales/index.d.ts +2 -2
  119. package/lib/solution/UnifiedBookingSales/index.js +5 -5
  120. package/lib/utils/os-private-payload.d.ts +5 -0
  121. package/lib/utils/os-private-payload.js +22 -0
  122. package/package.json +1 -1
@@ -7,8 +7,10 @@ exports.default = exports.ShopDiscountImpl = void 0;
7
7
  var _BaseModule = require("../../modules/BaseModule");
8
8
  var _Discount = require("../../modules/Discount");
9
9
  var _Rules = require("../../modules/Rules");
10
+ var _entitlementPass = require("../../modules/Discount/entitlementPass");
10
11
  var _utils = require("./utils");
11
12
  var _types = require("../../modules/Rules/types");
13
+ var _availability = require("../../modules/Discount/availability");
12
14
  var _decimal = _interopRequireDefault(require("decimal.js"));
13
15
  var _lodashEs = require("lodash-es");
14
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -125,7 +127,8 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
125
127
  customerId: customer.id,
126
128
  action: 'create',
127
129
  with_good_pass: 1,
128
- with_discount_card: 1
130
+ with_discount_card: 1,
131
+ with_entitlement_pass: 1
129
132
  });
130
133
  });
131
134
  }
@@ -347,6 +350,7 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
347
350
  const {
348
351
  productList: newProductList,
349
352
  discountList: newDiscountList,
353
+ evaluatedDiscountList,
350
354
  isAvailable,
351
355
  unavailableReason
352
356
  } = rulesModule.isDiscountListAvailable({
@@ -361,6 +365,7 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
361
365
  productList: this.store.productList || [],
362
366
  discountList: this.getDiscountList()
363
367
  };
368
+ let isAccepted = isAvailable;
364
369
  if (isAvailable) {
365
370
  this.setDiscountList(newDiscountList || []);
366
371
  this.store.originalDiscountList = newDiscountList || [];
@@ -368,12 +373,34 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
368
373
  if (this.isWalkIn() && resultDiscountList.length && this.options.otherParams?.platform === 'shop' && !((resultDiscountList[0].customer_id || 1) === 1)) {
369
374
  await this.getCustomerWallet(resultDiscountList[0].customer_id);
370
375
  }
376
+ } else {
377
+ const scannedIds = new Set(withScanList.map(discount => String(discount.id)));
378
+ const retainedScannedDiscounts = (evaluatedDiscountList || withScanList).filter(discount => scannedIds.has(String(discount.id)) && !(0, _availability.getDiscountLifecycleReason)(discount));
379
+ if (retainedScannedDiscounts.length) {
380
+ const retainedDiscounts = new Map(this.getDiscountList().map(discount => [String(discount.id), discount]));
381
+ retainedScannedDiscounts.forEach(discount => {
382
+ retainedDiscounts.set(String(discount.id), {
383
+ ...discount,
384
+ isScan: true,
385
+ isAvailable: false,
386
+ isSelected: false,
387
+ reasonCode: discount.reasonCode || 'product_not_applicable',
388
+ appliedProductDetails: [],
389
+ savedAmount: 0
390
+ });
391
+ });
392
+ this.setDiscountList([...retainedDiscounts.values()]);
393
+ this.store.originalDiscountList = this.getDiscountList();
394
+ await this.store.discount?.setOriginalDiscountList(this.getDiscountList());
395
+ isAccepted = true;
396
+ }
371
397
  }
372
398
  return {
373
399
  type: "clientCalc",
374
400
  isAvailable: isAvailable || false,
401
+ isAccepted: Boolean(isAccepted),
375
402
  productList: newProductList || this.store.productList || [],
376
- discountList: newDiscountList || this.getDiscountList(),
403
+ discountList: this.getDiscountList(),
377
404
  unavailableReason
378
405
  };
379
406
  } catch (error) {
@@ -416,7 +443,7 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
416
443
  if (item.booking_id) {
417
444
  const product = this.hooks?.getProduct(item);
418
445
  (item.discount_list || []).forEach(discount => {
419
- if (discount.id && ['good_pass', 'discount_card'].includes(discount.type)) {
446
+ if (discount.id && ['entitlement_pass', 'good_pass', 'discount_card'].includes(discount.type)) {
420
447
  const index = editModeDiscountList.findIndex(n => n.id === (discount.discount?.resource_id || discount.id));
421
448
  if (index !== -1) {
422
449
  editModeDiscountList[index] = {
@@ -522,6 +549,8 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
522
549
  with_good_pass: 1,
523
550
  with_discount_card: 1,
524
551
  with_wallet_pass_holder: 1,
552
+ with_entitlement_pass: 1,
553
+ filter_order_wallet_pass_usage: 0,
525
554
  request_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
526
555
  ...(orderId ? {
527
556
  order_id: orderId
@@ -530,17 +559,34 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
530
559
  const goodPassList = prepareConfigResult?.discountList || [];
531
560
  const scanDiscount = this.getDiscountList()?.filter(item => item.isScan);
532
561
 
533
- // goodPassList 里可能有 scanDiscount 重合的部分,goodPassList 需要剔除
534
- const scanDiscountIds = scanDiscount.map(n => n.id);
535
- const newGoodPassList = goodPassList?.filter(n => !scanDiscountIds.includes(n.id));
536
- const newDiscountList = [...scanDiscount, ...(newGoodPassList || [])];
562
+ // 扫码 Entitlement Pass 与客户列表重复时保留扫码选择状态,但刷新实时余额。
563
+ // 其他券继续沿用原来的“保留扫码结果、剔除列表重复项”行为。
564
+ const scanDiscountById = new Map(scanDiscount.map(discount => [String(discount.id), discount]));
565
+ const refreshedScanEntitlementIds = new Set();
566
+ const newGoodPassList = goodPassList.flatMap(discount => {
567
+ const key = String(discount.id);
568
+ const scannedDiscount = scanDiscountById.get(key);
569
+ if (!scannedDiscount) return [discount];
570
+ if ((0, _entitlementPass.isEntitlementPass)(scannedDiscount) && (0, _entitlementPass.isEntitlementPass)(discount)) {
571
+ refreshedScanEntitlementIds.add(key);
572
+ return [{
573
+ ...discount,
574
+ isScan: true,
575
+ isSelected: scannedDiscount.isSelected ?? discount.isSelected,
576
+ isManualSelect: scannedDiscount.isManualSelect ?? discount.isManualSelect
577
+ }];
578
+ }
579
+ return [];
580
+ });
581
+ const retainedScanDiscounts = scanDiscount.filter(discount => !refreshedScanEntitlementIds.has(String(discount.id)));
582
+ const newDiscountList = [...retainedScanDiscounts, ...newGoodPassList];
537
583
 
538
584
  // 存储原始优惠券列表
539
585
  this.store.originalDiscountList = newDiscountList;
540
586
  await this.store.discount?.setOriginalDiscountList(newDiscountList);
541
587
 
542
- // 根据当前预约时间过滤优惠券列表
543
- const filteredDiscountList = this.filterDiscountListByBookingTime(newDiscountList, this.store.currentBookingTime);
588
+ // 日程限制交给 Rules 计算可用状态,展示列表保留当前不可用的卡券。
589
+ const filteredDiscountList = newDiscountList;
544
590
  this.store.filteredDiscountList = filteredDiscountList;
545
591
  this.setDiscountList(filteredDiscountList || []);
546
592
  if (this.store.productList?.length) {
@@ -59,12 +59,14 @@ export interface ScheduleItem {
59
59
  }
60
60
  export declare const getDateIsInSchedule: (dateTime: string, scheduleList: ScheduleItem[]) => boolean;
61
61
  /**
62
- * 根据预约时间过滤优惠券列表
62
+ * 根据商品使用时间过滤优惠券列表(预约开始时间或普通商品的当前时间)
63
63
  * @param discountList 优惠券列表
64
- * @param bookingTime 预约时间 (格式: YYYY-MM-DD HH:mm:ss)
64
+ * @param bookingTime 使用时间 (格式: YYYY-MM-DD HH:mm:ss),未确定时不提前过滤
65
65
  * @returns 过滤后的优惠券列表
66
66
  */
67
67
  export declare const filterDiscountListByBookingTime: (discountList: Discount[], bookingTime: string | null) => Discount[];
68
+ /** 与抵扣计算共用时间判断,区分未开始、有效期不匹配和日程限制。 */
69
+ export declare const getDiscountTimeUnavailableReason: (discount: Discount, useTime: string) => 'not_started' | 'time_limit' | 'outside_schedule' | undefined;
68
70
  /**
69
71
  * 判断是否是订单级别的固定金额折扣卡
70
72
  * @param discount 折扣
@@ -3,10 +3,15 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.uniqueById = exports.isOrderLevelFixedAmountDiscount = exports.isNormalProductByDurationSchedule = exports.isAllNormalProduct = exports.getDiscountListAmountTotal = exports.getDiscountListAmount = exports.getDiscountAmount = exports.getDateIsInSchedule = exports.filterDiscountListByBookingTime = exports.calculateOrderLevelDiscountAllocation = void 0;
6
+ exports.uniqueById = exports.isOrderLevelFixedAmountDiscount = exports.isNormalProductByDurationSchedule = exports.isAllNormalProduct = exports.getDiscountTimeUnavailableReason = exports.getDiscountListAmountTotal = exports.getDiscountListAmount = exports.getDiscountAmount = exports.getDateIsInSchedule = exports.filterDiscountListByBookingTime = exports.calculateOrderLevelDiscountAllocation = void 0;
7
7
  var _decimal = _interopRequireDefault(require("decimal.js"));
8
8
  var _dayjs = _interopRequireDefault(require("dayjs"));
9
+ var _isSameOrAfter = _interopRequireDefault(require("dayjs/plugin/isSameOrAfter"));
10
+ var _isSameOrBefore = _interopRequireDefault(require("dayjs/plugin/isSameOrBefore"));
11
+ var _entitlementPass = require("../../modules/Discount/entitlementPass");
9
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+ _dayjs.default.extend(_isSameOrAfter.default);
14
+ _dayjs.default.extend(_isSameOrBefore.default);
10
15
  const uniqueById = (arr, key = 'id') => {
11
16
  const seen = new Set();
12
17
  return arr.filter(item => !seen.has(item[key]) && seen.add(item[key]));
@@ -35,8 +40,8 @@ const isAllNormalProduct = items => {
35
40
  */
36
41
  exports.isAllNormalProduct = isAllNormalProduct;
37
42
  const getDiscountAmount = (discount, total, price) => {
38
- // 商品券
39
- if (discount.tag === 'good_pass') {
43
+ // 商品券和 Entitlement Pass 都是全额抵扣。
44
+ if ((0, _entitlementPass.isFullCoveragePass)(discount)) {
40
45
  return new _decimal.default(price).minus(new _decimal.default(price || 0)).toNumber();
41
46
  }
42
47
 
@@ -376,41 +381,53 @@ const isInWeeklyRepeatForDate = (targetDate, startDate, repeatRule) => {
376
381
  };
377
382
 
378
383
  /**
379
- * 根据预约时间过滤优惠券列表
384
+ * 根据商品使用时间过滤优惠券列表(预约开始时间或普通商品的当前时间)
380
385
  * @param discountList 优惠券列表
381
- * @param bookingTime 预约时间 (格式: YYYY-MM-DD HH:mm:ss)
386
+ * @param bookingTime 使用时间 (格式: YYYY-MM-DD HH:mm:ss),未确定时不提前过滤
382
387
  * @returns 过滤后的优惠券列表
383
388
  */
384
389
  const filterDiscountListByBookingTime = (discountList, bookingTime) => {
385
- if (!bookingTime) {
386
- return discountList;
387
- }
388
- return discountList.filter(discount => {
390
+ if (!bookingTime) return discountList;
391
+ return discountList.filter(discount => !getDiscountTimeUnavailableReason(discount, bookingTime));
392
+ };
393
+
394
+ /** 与抵扣计算共用时间判断,区分未开始、有效期不匹配和日程限制。 */
395
+ exports.filterDiscountListByBookingTime = filterDiscountListByBookingTime;
396
+ const getDiscountTimeUnavailableReason = (discount, useTime) => {
397
+ const useTimeDayjs = (0, _dayjs.default)(useTime);
398
+ if (!useTimeDayjs.isValid()) return 'time_limit';
399
+ try {
389
400
  if (discount?.metadata?.validity_type === "custom_schedule_validity") {
390
- return getDateIsInSchedule(bookingTime, discount.custom_schedule_snapshot?.data || []);
401
+ return getDateIsInSchedule(useTime, discount.custom_schedule_snapshot?.data || []) ? undefined : 'outside_schedule';
391
402
  }
392
- try {
393
- const isHasStart = !!discount.start_date && !!discount.start_time;
394
- const startDate = (0, _dayjs.default)(`${discount.start_date} ${discount.start_time}`);
395
- const bookingTimeDayjs = (0, _dayjs.default)(bookingTime);
396
-
397
- // 判断预约时间是否在开始时间之后
398
- const isAfterStart = isHasStart ? bookingTimeDayjs.isSameOrAfter(startDate) : true;
399
-
400
- // 判断预约时间是否在过期时间之前(expire_time 为空时为长期有效)
401
- const isBeforeExpire = discount.expire_time ? bookingTimeDayjs.isSameOrBefore((0, _dayjs.default)(discount.expire_time)) : true;
402
- return isAfterStart && isBeforeExpire;
403
- } catch (error) {
404
- return true;
403
+ const isHasStart = !!discount.start_date && !!discount.start_time;
404
+ const startDate = (0, _dayjs.default)(`${discount.start_date} ${discount.start_time}`);
405
+
406
+ // 开始时刻包含在有效期内。
407
+ if (isHasStart) {
408
+ if (!startDate.isValid()) return 'time_limit';
409
+ if (useTimeDayjs.isBefore(startDate)) return 'not_started';
405
410
  }
406
- });
411
+
412
+ // 到期时刻不再可用;expire_time 为空时为长期有效。
413
+ const expireTime = discount.expire_time ? (0, _dayjs.default)(discount.expire_time) : null;
414
+ const isBeforeExpire = expireTime ? expireTime.isValid() && useTimeDayjs.isBefore(expireTime) : true;
415
+ if (!isBeforeExpire) return 'time_limit';
416
+ const validity = discount.extension_data?.find(field => field.field_key === 'valid_times')?.value;
417
+ if (validity?.restrict_use_by_schedule === true && !getDateIsInSchedule(useTime, discount.custom_schedule_snapshot?.data || [])) {
418
+ return 'outside_schedule';
419
+ }
420
+ return undefined;
421
+ } catch (error) {
422
+ return 'time_limit';
423
+ }
407
424
  };
408
425
  /**
409
426
  * 判断是否是订单级别的固定金额折扣卡
410
427
  * @param discount 折扣
411
428
  * @returns 是否是订单级别的固定金额折扣卡
412
429
  */
413
- exports.filterDiscountListByBookingTime = filterDiscountListByBookingTime;
430
+ exports.getDiscountTimeUnavailableReason = getDiscountTimeUnavailableReason;
414
431
  const isOrderLevelFixedAmountDiscount = discount => {
415
432
  return discount.tag === 'product_discount_card' && discount?.metadata?.discount_card_type === 'fixed_amount' && discount?.metadata?.discount_calculation_mode === 'order_level';
416
433
  };
@@ -127,8 +127,8 @@ export declare class UnifiedBookingSalesImpl extends BookingTicket {
127
127
  */
128
128
  clearSessionStorageOrderSnapshot(): void;
129
129
  /**
130
- * H5/Kiosk 不能把已收款订单留在本地等待重试,必须直接等待云端 checkout。
131
- * 其它平台保持 WebPOS/POS 的本地待同步任务;显式 true 仍可强制使用本地任务。
130
+ * PC/H5/Kiosk 结账默认直接等待云端 checkout;POS/WebPOS 仍保持本地待同步。
131
+ * 显式传 checkoutSyncTaskEnabled: true 时仍可回退到本地同步模式。
132
132
  */
133
133
  protected shouldUseCheckoutSyncTask(): boolean;
134
134
  /** UnifiedBookingSales 的真实结账默认请求收据数据,供云端确认后再本地打印。 */
@@ -159,7 +159,7 @@ function buildPlannerDiscountResult(params) {
159
159
  const productDiscounts = [...(Array.isArray(product.discount_list) ? product.discount_list : []), ...(Array.isArray(product.product_bundle) ? product.product_bundle.flatMap(bundle => bundle?.discount_list || []) : [])];
160
160
  productDiscounts.forEach(discount => {
161
161
  const type = discount.tag || discount.type;
162
- if (!['good_pass', 'discount_card', 'product_discount_card'].includes(type)) return;
162
+ if (!['entitlement_pass', 'good_pass', 'discount_card', 'product_discount_card'].includes(type)) return;
163
163
  const discountId = resolvePlannerDiscountId(discount);
164
164
  applications.push({
165
165
  discountId,
@@ -201,7 +201,7 @@ function isLocalOrderId(orderId) {
201
201
  }
202
202
  function isCustomerBoundDiscount(discount) {
203
203
  const type = discount?.type ?? discount?.tag;
204
- return type === 'good_pass' || type === 'discount_card' || type === 'product_discount_card';
204
+ return type === 'entitlement_pass' || type === 'good_pass' || type === 'discount_card' || type === 'product_discount_card';
205
205
  }
206
206
  function filterCustomerBoundDiscounts(discountList) {
207
207
  if (!Array.isArray(discountList)) return [];
@@ -1580,14 +1580,14 @@ class UnifiedBookingSalesImpl extends _BookingTicket.BookingTicket {
1580
1580
  }
1581
1581
 
1582
1582
  /**
1583
- * H5/Kiosk 不能把已收款订单留在本地等待重试,必须直接等待云端 checkout。
1584
- * 其它平台保持 WebPOS/POS 的本地待同步任务;显式 true 仍可强制使用本地任务。
1583
+ * PC/H5/Kiosk 结账默认直接等待云端 checkout;POS/WebPOS 仍保持本地待同步。
1584
+ * 显式传 checkoutSyncTaskEnabled: true 时仍可回退到本地同步模式。
1585
1585
  */
1586
1586
  shouldUseCheckoutSyncTask() {
1587
1587
  const configured = this.otherParams?.checkoutSyncTaskEnabled;
1588
1588
  if (configured === true) return true;
1589
1589
  const platform = (0, _platform.normalizeRuntimePlatform)(this.otherParams?.platform);
1590
- return platform !== 'h5' && platform !== 'kiosk';
1590
+ return !(0, _platform.isCustomerUserPlatform)(platform) && platform !== 'kiosk';
1591
1591
  }
1592
1592
 
1593
1593
  /** UnifiedBookingSales 的真实结账默认请求收据数据,供云端确认后再本地打印。 */
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Remove top-level fields reserved for communication with the PisellOS proxy.
3
+ * Nested business payloads are intentionally left untouched.
4
+ */
5
+ export declare function stripOsPrivatePayloadFields<T>(data: T): T;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.stripOsPrivatePayloadFields = stripOsPrivatePayloadFields;
7
+ var _lodashEs = require("lodash-es");
8
+ const OS_PRIVATE_FIELD_PREFIX = '_os_';
9
+
10
+ /**
11
+ * Remove top-level fields reserved for communication with the PisellOS proxy.
12
+ * Nested business payloads are intentionally left untouched.
13
+ */
14
+ function stripOsPrivatePayloadFields(data) {
15
+ const next = (0, _lodashEs.cloneDeep)(data);
16
+ if (!next || typeof next !== 'object' || Array.isArray(next)) return next;
17
+ const record = next;
18
+ Object.keys(record).forEach(key => {
19
+ if (key.startsWith(OS_PRIVATE_FIELD_PREFIX)) delete record[key];
20
+ });
21
+ return next;
22
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": false,
3
3
  "name": "@pisell/pisellos",
4
- "version": "2.2.309",
4
+ "version": "2.2.311",
5
5
  "description": "一个可扩展的前端模块化SDK框架,支持插件系统",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",