@pisell/pisellos 2.2.260 → 2.2.261

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 (129) hide show
  1. package/dist/model/strategy/adapter/index.d.ts +0 -4
  2. package/dist/model/strategy/adapter/index.js +1 -5
  3. package/dist/model/strategy/adapter/promotion/adapter.d.ts +4 -0
  4. package/dist/model/strategy/adapter/promotion/adapter.js +23 -0
  5. package/dist/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
  6. package/dist/model/strategy/adapter/promotion/evaluator.js +279 -6
  7. package/dist/model/strategy/adapter/promotion/examples.d.ts +86 -0
  8. package/dist/model/strategy/adapter/promotion/examples.js +99 -0
  9. package/dist/model/strategy/adapter/promotion/index.d.ts +1 -1
  10. package/dist/model/strategy/adapter/promotion/index.js +1 -1
  11. package/dist/model/strategy/adapter/promotion/type.d.ts +90 -2
  12. package/dist/model/strategy/adapter/promotion/type.js +45 -0
  13. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +17 -13
  14. package/dist/modules/Order/index.d.ts +33 -2
  15. package/dist/modules/Order/index.js +615 -288
  16. package/dist/modules/Order/types.d.ts +20 -2
  17. package/dist/modules/Order/utils/bundleDiscountHydration.d.ts +5 -0
  18. package/dist/modules/Order/utils/bundleDiscountHydration.js +144 -0
  19. package/dist/modules/Order/utils.d.ts +4 -0
  20. package/dist/modules/Order/utils.js +116 -29
  21. package/dist/modules/Product/types.d.ts +0 -22
  22. package/dist/modules/ProductList/index.d.ts +1 -1
  23. package/dist/modules/ProductList/index.js +2 -4
  24. package/dist/modules/ProductList/types.d.ts +0 -2
  25. package/dist/modules/Rules/index.d.ts +4 -3
  26. package/dist/modules/Rules/index.js +42 -17
  27. package/dist/modules/Rules/types.d.ts +2 -1
  28. package/dist/modules/SalesSummary/index.d.ts +7 -3
  29. package/dist/modules/SalesSummary/index.js +67 -39
  30. package/dist/modules/SalesSummary/types.d.ts +1 -0
  31. package/dist/modules/SalesSummary/utils.js +2 -1
  32. package/dist/modules/SurchargeList/index.d.ts +6 -4
  33. package/dist/modules/SurchargeList/index.js +62 -39
  34. package/dist/modules/SurchargeList/types.d.ts +6 -2
  35. package/dist/server/index.d.ts +3 -50
  36. package/dist/server/index.js +1075 -1040
  37. package/dist/server/modules/order/index.d.ts +22 -3
  38. package/dist/server/modules/order/index.js +398 -316
  39. package/dist/server/modules/products/index.d.ts +7 -26
  40. package/dist/server/modules/products/index.js +76 -166
  41. package/dist/server/modules/products/types.d.ts +0 -14
  42. package/dist/solution/BaseSales/index.d.ts +22 -2
  43. package/dist/solution/BaseSales/index.js +995 -701
  44. package/dist/solution/BaseSales/types.d.ts +1 -0
  45. package/dist/solution/BaseSales/types.js +2 -1
  46. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
  47. package/dist/solution/BaseSales/utils/cartPromotion.js +74 -29
  48. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +6 -3
  49. package/dist/solution/BookingByStep/index.d.ts +1 -1
  50. package/dist/solution/BookingTicket/index.d.ts +9 -1
  51. package/dist/solution/BookingTicket/index.js +153 -6
  52. package/dist/solution/BookingTicket/types.d.ts +0 -2
  53. package/dist/solution/ScanOrder/index.js +31 -20
  54. package/dist/solution/VenueBooking/index.js +30 -19
  55. package/lib/model/strategy/adapter/index.d.ts +0 -4
  56. package/lib/model/strategy/adapter/index.js +2 -13
  57. package/lib/model/strategy/adapter/promotion/adapter.d.ts +4 -0
  58. package/lib/model/strategy/adapter/promotion/adapter.js +20 -0
  59. package/lib/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
  60. package/lib/model/strategy/adapter/promotion/evaluator.js +235 -0
  61. package/lib/model/strategy/adapter/promotion/examples.d.ts +86 -0
  62. package/lib/model/strategy/adapter/promotion/examples.js +91 -0
  63. package/lib/model/strategy/adapter/promotion/index.d.ts +1 -1
  64. package/lib/model/strategy/adapter/promotion/index.js +2 -0
  65. package/lib/model/strategy/adapter/promotion/type.d.ts +90 -2
  66. package/lib/model/strategy/adapter/promotion/type.js +2 -0
  67. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +11 -1
  68. package/lib/modules/Order/index.d.ts +33 -2
  69. package/lib/modules/Order/index.js +402 -64
  70. package/lib/modules/Order/types.d.ts +20 -2
  71. package/lib/modules/Order/utils/bundleDiscountHydration.d.ts +5 -0
  72. package/lib/modules/Order/utils/bundleDiscountHydration.js +139 -0
  73. package/lib/modules/Order/utils.d.ts +4 -0
  74. package/lib/modules/Order/utils.js +90 -3
  75. package/lib/modules/Product/types.d.ts +0 -22
  76. package/lib/modules/ProductList/index.d.ts +1 -1
  77. package/lib/modules/ProductList/index.js +2 -4
  78. package/lib/modules/ProductList/types.d.ts +0 -2
  79. package/lib/modules/Rules/index.d.ts +4 -3
  80. package/lib/modules/Rules/index.js +27 -7
  81. package/lib/modules/Rules/types.d.ts +2 -1
  82. package/lib/modules/SalesSummary/index.d.ts +7 -3
  83. package/lib/modules/SalesSummary/index.js +28 -11
  84. package/lib/modules/SalesSummary/types.d.ts +1 -0
  85. package/lib/modules/SalesSummary/utils.js +2 -0
  86. package/lib/modules/SurchargeList/index.d.ts +6 -4
  87. package/lib/modules/SurchargeList/index.js +41 -21
  88. package/lib/modules/SurchargeList/types.d.ts +6 -2
  89. package/lib/server/index.d.ts +3 -50
  90. package/lib/server/index.js +244 -215
  91. package/lib/server/modules/order/index.d.ts +22 -3
  92. package/lib/server/modules/order/index.js +103 -53
  93. package/lib/server/modules/products/index.d.ts +7 -26
  94. package/lib/server/modules/products/index.js +35 -113
  95. package/lib/server/modules/products/types.d.ts +0 -14
  96. package/lib/solution/BaseSales/index.d.ts +22 -2
  97. package/lib/solution/BaseSales/index.js +246 -60
  98. package/lib/solution/BaseSales/types.d.ts +1 -0
  99. package/lib/solution/BaseSales/types.js +2 -1
  100. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
  101. package/lib/solution/BaseSales/utils/cartPromotion.js +59 -16
  102. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +6 -6
  103. package/lib/solution/BookingByStep/index.d.ts +1 -1
  104. package/lib/solution/BookingTicket/index.d.ts +9 -1
  105. package/lib/solution/BookingTicket/index.js +101 -0
  106. package/lib/solution/BookingTicket/types.d.ts +0 -2
  107. package/lib/solution/ScanOrder/index.js +8 -0
  108. package/lib/solution/VenueBooking/index.js +8 -0
  109. package/package.json +1 -1
  110. package/dist/model/strategy/adapter/dataVariant/adapter.d.ts +0 -49
  111. package/dist/model/strategy/adapter/dataVariant/adapter.js +0 -152
  112. package/dist/model/strategy/adapter/dataVariant/evaluator.d.ts +0 -87
  113. package/dist/model/strategy/adapter/dataVariant/evaluator.js +0 -755
  114. package/dist/model/strategy/adapter/dataVariant/examples.d.ts +0 -39
  115. package/dist/model/strategy/adapter/dataVariant/examples.js +0 -282
  116. package/dist/model/strategy/adapter/dataVariant/index.d.ts +0 -4
  117. package/dist/model/strategy/adapter/dataVariant/index.js +0 -4
  118. package/dist/model/strategy/adapter/dataVariant/type.d.ts +0 -146
  119. package/dist/model/strategy/adapter/dataVariant/type.js +0 -54
  120. package/lib/model/strategy/adapter/dataVariant/adapter.d.ts +0 -49
  121. package/lib/model/strategy/adapter/dataVariant/adapter.js +0 -139
  122. package/lib/model/strategy/adapter/dataVariant/evaluator.d.ts +0 -87
  123. package/lib/model/strategy/adapter/dataVariant/evaluator.js +0 -564
  124. package/lib/model/strategy/adapter/dataVariant/examples.d.ts +0 -39
  125. package/lib/model/strategy/adapter/dataVariant/examples.js +0 -295
  126. package/lib/model/strategy/adapter/dataVariant/index.d.ts +0 -4
  127. package/lib/model/strategy/adapter/dataVariant/index.js +0 -38
  128. package/lib/model/strategy/adapter/dataVariant/type.d.ts +0 -146
  129. package/lib/model/strategy/adapter/dataVariant/type.js +0 -31
@@ -12,6 +12,8 @@ export declare const PROMOTION_ACTION_TYPES: {
12
12
  readonly X_ITEMS_FOR_Y_PRICE: "X_ITEMS_FOR_Y_PRICE";
13
13
  /** 买X送Y(买X件送Y件,可累计) */
14
14
  readonly BUY_X_GET_Y_FREE: "BUY_X_GET_Y_FREE";
15
+ /** 商品奖励(满足条件后,订单内指定目标商品享优惠) */
16
+ readonly ITEM_REWARD: "ITEM_REWARD";
15
17
  /** 固定折扣 */
16
18
  readonly DISCOUNT_RATE: "DISCOUNT_RATE";
17
19
  /** 固定减价 */
@@ -66,6 +68,59 @@ export interface BuyXGetYFreeConfig {
66
68
  /** 可选的赠品列表 */
67
69
  giftProducts?: ProductIdentifier[];
68
70
  }
71
+ /**
72
+ * 商品奖励优惠方式
73
+ *
74
+ * - free: 目标商品最终价为 0
75
+ * - percent_off: 目标商品按百分比折扣,rewardValue 为 0-100
76
+ * - amount_off: 每个目标商品固定减免 rewardValue
77
+ * - fixed_price: 目标商品改为固定价 rewardValue
78
+ */
79
+ export type ItemRewardMethod = 'free' | 'percent_off' | 'amount_off' | 'fixed_price';
80
+ /**
81
+ * 商品奖励数量规则
82
+ *
83
+ * - per_condition_quantity: 每满足 N 个条件商品,奖励 Y 个目标商品
84
+ * - all_targets: 满足条件后奖励全部目标商品
85
+ * - max_per_order: 满足条件后每单最多奖励固定数量目标商品
86
+ */
87
+ export type ItemRewardQuantityRule = 'per_condition_quantity' | 'all_targets' | 'max_per_order';
88
+ /** 商品奖励目标选择规则 */
89
+ export type ItemRewardTargetSelection = 'consumer_best';
90
+ /**
91
+ * 商品奖励 - Action Value
92
+ *
93
+ * @example
94
+ * value: {
95
+ * rewardMethod: 'free',
96
+ * quantityRule: 'per_condition_quantity',
97
+ * triggerQuantity: 1,
98
+ * rewardQuantity: 1,
99
+ * }
100
+ */
101
+ export interface ItemRewardValue {
102
+ /** 奖励方式 */
103
+ rewardMethod: ItemRewardMethod;
104
+ /** 奖励值:percent_off/amount_off/fixed_price 使用,free 可省略 */
105
+ rewardValue?: number;
106
+ /** 奖励数量规则 */
107
+ quantityRule: ItemRewardQuantityRule;
108
+ /** 每满足 N 个条件商品;默认 1 */
109
+ triggerQuantity?: number;
110
+ /** 奖励 Y 个目标商品;默认 1 */
111
+ rewardQuantity?: number;
112
+ /** 每单最多奖励 Y 个目标商品;max_per_order 使用 */
113
+ maxRewardQuantity?: number;
114
+ }
115
+ /**
116
+ * 商品奖励 - Action Config
117
+ */
118
+ export interface ItemRewardConfig {
119
+ /** 奖励对象,本期支持指定商品/变体;product_variant_id=0 表示任意变体 */
120
+ rewardTargets?: ProductIdentifier[];
121
+ /** 目标商品超额时的选择规则;本期支持 consumer_best */
122
+ targetSelection?: ItemRewardTargetSelection;
123
+ }
69
124
  /**
70
125
  * 商品标识
71
126
  *
@@ -102,10 +157,19 @@ export interface BuyXGetYFreeAction extends Omit<ActionEffect, 'type' | 'value'
102
157
  valueType: 'object';
103
158
  config?: BuyXGetYFreeConfig;
104
159
  }
160
+ /**
161
+ * 商品奖励 Action
162
+ */
163
+ export interface ItemRewardAction extends Omit<ActionEffect, 'type' | 'value' | 'config'> {
164
+ type: typeof PROMOTION_ACTION_TYPES.ITEM_REWARD;
165
+ value: ItemRewardValue;
166
+ valueType: 'object';
167
+ config?: ItemRewardConfig;
168
+ }
105
169
  /**
106
170
  * 促销活动 Action 联合类型
107
171
  */
108
- export type PromotionAction = XItemsForYPriceAction | BuyXGetYFreeAction;
172
+ export type PromotionAction = XItemsForYPriceAction | BuyXGetYFreeAction | ItemRewardAction;
109
173
  /**
110
174
  * 促销相关运算符
111
175
  */
@@ -170,6 +234,8 @@ export interface PromotionProduct {
170
234
  quantity: number;
171
235
  /** 原价 */
172
236
  original_price?: number;
237
+ /** 内部字段:编辑态订单行只允许参与 ITEM_REWARD,避免旧促销误算历史行 */
238
+ _promotionOnlyForItemReward?: boolean;
173
239
  }
174
240
  /**
175
241
  * 促销活动适配器转换结果
@@ -195,7 +261,7 @@ export interface PromotionTransformResult {
195
261
  /**
196
262
  * Action 详情联合类型
197
263
  */
198
- export type PromotionActionDetail = XItemsForYPriceActionDetail | BuyXGetYFreeActionDetail;
264
+ export type PromotionActionDetail = XItemsForYPriceActionDetail | BuyXGetYFreeActionDetail | ItemRewardActionDetail;
199
265
  /**
200
266
  * X件Y元 Action 详情
201
267
  */
@@ -226,6 +292,28 @@ export interface BuyXGetYFreeActionDetail {
226
292
  /** 可选的赠品列表 */
227
293
  giftProducts: ProductIdentifier[];
228
294
  }
295
+ /**
296
+ * 商品奖励 Action 详情
297
+ */
298
+ export interface ItemRewardActionDetail {
299
+ type: typeof PROMOTION_ACTION_TYPES.ITEM_REWARD;
300
+ /** 奖励方式 */
301
+ rewardMethod: ItemRewardMethod;
302
+ /** 奖励值:percent_off/amount_off/fixed_price 使用,free 为 0 */
303
+ rewardValue: number;
304
+ /** 奖励数量规则 */
305
+ quantityRule: ItemRewardQuantityRule;
306
+ /** 每满足 N 个条件商品;默认 1 */
307
+ triggerQuantity: number;
308
+ /** 奖励 Y 个目标商品;默认 1 */
309
+ rewardQuantity: number;
310
+ /** 每单最多奖励 Y 个目标商品;max_per_order 使用 */
311
+ maxRewardQuantity?: number;
312
+ /** 奖励对象,本期支持指定商品/变体 */
313
+ rewardTargets: ProductIdentifier[];
314
+ /** 目标商品超额时的选择规则 */
315
+ targetSelection: ItemRewardTargetSelection;
316
+ }
229
317
  /**
230
318
  * X件Y元 - 业务层计算结果
231
319
  *
@@ -16,6 +16,8 @@ export var PROMOTION_ACTION_TYPES = {
16
16
  X_ITEMS_FOR_Y_PRICE: 'X_ITEMS_FOR_Y_PRICE',
17
17
  /** 买X送Y(买X件送Y件,可累计) */
18
18
  BUY_X_GET_Y_FREE: 'BUY_X_GET_Y_FREE',
19
+ /** 商品奖励(满足条件后,订单内指定目标商品享优惠) */
20
+ ITEM_REWARD: 'ITEM_REWARD',
19
21
  /** 固定折扣 */
20
22
  DISCOUNT_RATE: 'DISCOUNT_RATE',
21
23
  /** 固定减价 */
@@ -54,6 +56,41 @@ export var PROMOTION_ACTION_TYPES = {
54
56
  * 买X送Y - Action Config
55
57
  */
56
58
 
59
+ /**
60
+ * 商品奖励优惠方式
61
+ *
62
+ * - free: 目标商品最终价为 0
63
+ * - percent_off: 目标商品按百分比折扣,rewardValue 为 0-100
64
+ * - amount_off: 每个目标商品固定减免 rewardValue
65
+ * - fixed_price: 目标商品改为固定价 rewardValue
66
+ */
67
+
68
+ /**
69
+ * 商品奖励数量规则
70
+ *
71
+ * - per_condition_quantity: 每满足 N 个条件商品,奖励 Y 个目标商品
72
+ * - all_targets: 满足条件后奖励全部目标商品
73
+ * - max_per_order: 满足条件后每单最多奖励固定数量目标商品
74
+ */
75
+
76
+ /** 商品奖励目标选择规则 */
77
+
78
+ /**
79
+ * 商品奖励 - Action Value
80
+ *
81
+ * @example
82
+ * value: {
83
+ * rewardMethod: 'free',
84
+ * quantityRule: 'per_condition_quantity',
85
+ * triggerQuantity: 1,
86
+ * rewardQuantity: 1,
87
+ * }
88
+ */
89
+
90
+ /**
91
+ * 商品奖励 - Action Config
92
+ */
93
+
57
94
  // ============================================
58
95
  // 商品标识
59
96
  // ============================================
@@ -78,6 +115,10 @@ export var PROMOTION_ACTION_TYPES = {
78
115
  * 买X送Y Action
79
116
  */
80
117
 
118
+ /**
119
+ * 商品奖励 Action
120
+ */
121
+
81
122
  /**
82
123
  * 促销活动 Action 联合类型
83
124
  */
@@ -146,6 +187,10 @@ var obj = {
146
187
  * 买X送Y Action 详情
147
188
  */
148
189
 
190
+ /**
191
+ * 商品奖励 Action 详情
192
+ */
193
+
149
194
  // ============================================
150
195
  // 业务层输出类型(供参考)
151
196
  // ============================================
@@ -1,7 +1,3 @@
1
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
2
- 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."); }
3
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
4
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
5
1
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
6
2
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
7
3
  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); }
@@ -132,6 +128,14 @@ function resolveMainProductPrice(product, fallback) {
132
128
  var parsed = Number(value);
133
129
  return Number.isFinite(parsed) ? parsed : fallback;
134
130
  }
131
+ function mapOrderBundleToOtherBundle(bundle) {
132
+ return bundle.map(function (item) {
133
+ var _ref6, _item$original_price;
134
+ return _objectSpread(_objectSpread({}, item), {}, {
135
+ original_price: (_ref6 = (_item$original_price = item.original_price) !== null && _item$original_price !== void 0 ? _item$original_price : item.bundle_selling_price) !== null && _ref6 !== void 0 ? _ref6 : item.price
136
+ });
137
+ });
138
+ }
135
139
 
136
140
  /**
137
141
  * catalog 缺 product_resource 时,从 booking.resources 反推最小 product_resource 结构,
@@ -159,10 +163,10 @@ function synthesizeProductResourceFromBooking(booking) {
159
163
  });
160
164
  if (relationIdsByForm.size === 0) return undefined;
161
165
  return {
162
- resources: Array.from(relationIdsByForm.entries()).map(function (_ref6) {
163
- var _ref7 = _slicedToArray(_ref6, 2),
164
- formId = _ref7[0],
165
- relationIds = _ref7[1];
166
+ resources: Array.from(relationIdsByForm.entries()).map(function (_ref7) {
167
+ var _ref8 = _slicedToArray(_ref7, 2),
168
+ formId = _ref8[0],
169
+ relationIds = _ref8[1];
166
170
  return {
167
171
  id: formId,
168
172
  status: 1,
@@ -182,7 +186,7 @@ function synthesizeProductResourceFromBooking(booking) {
182
186
  * 调用方须传入与该行关联的 booking(通常 bookings[].product_uid === product.metadata.unique_identification_number)。
183
187
  */
184
188
  export function buildCacheItemFromOrderLine(input) {
185
- var _product$product_id, _product$selling_pric, _product$original_pri, _booking$metadata$hol, _booking$metadata2, _product$product_vari, _product$num, _ref8, _product$note, _booking$detail2, _product$metadata, _product$metadata2, _ref9, _extension_type, _booking$product2, _booking$product3, _price, _product$order_detail, _ref10, _booking$id;
189
+ var _product$product_id, _product$selling_pric, _product$original_pri, _booking$metadata$hol, _booking$metadata2, _product$product_vari, _product$num, _ref9, _product$note, _booking$detail2, _product$metadata, _product$metadata2, _ref10, _extension_type, _booking$product2, _booking$product3, _price, _product$order_detail, _ref11, _booking$id;
186
190
  var product = input.product,
187
191
  booking = input.booking,
188
192
  sourceProduct = input.sourceProduct;
@@ -202,7 +206,7 @@ export function buildCacheItemFromOrderLine(input) {
202
206
  var other = {
203
207
  product_variant_id: (_product$product_vari = product.product_variant_id) !== null && _product$product_vari !== void 0 ? _product$product_vari : 0,
204
208
  option: getProductSkuOptions(product),
205
- bundle: Array.isArray(product.product_bundle) ? _toConsumableArray(product.product_bundle) : []
209
+ bundle: mapOrderBundleToOtherBundle(Array.isArray(product.product_bundle) ? product.product_bundle : [])
206
210
  };
207
211
  var extend = _objectSpread({
208
212
  start_date: startDate ? dayjs(startDate) : undefined,
@@ -215,7 +219,7 @@ export function buildCacheItemFromOrderLine(input) {
215
219
  sub_type: booking.sub_type,
216
220
  quantity: (_product$num = product.num) !== null && _product$num !== void 0 ? _product$num : 1,
217
221
  product_name: productTitle,
218
- note: (_ref8 = (_product$note = product.note) !== null && _product$note !== void 0 ? _product$note : booking === null || booking === void 0 || (_booking$detail2 = booking.detail) === null || _booking$detail2 === void 0 ? void 0 : _booking$detail2.note) !== null && _ref8 !== void 0 ? _ref8 : '',
222
+ note: (_ref9 = (_product$note = product.note) !== null && _product$note !== void 0 ? _product$note : booking === null || booking === void 0 || (_booking$detail2 = booking.detail) === null || _booking$detail2 === void 0 ? void 0 : _booking$detail2.note) !== null && _ref9 !== void 0 ? _ref9 : '',
219
223
  price: mainProductPrice,
220
224
  total: selling,
221
225
  origin_total: original,
@@ -250,7 +254,7 @@ export function buildCacheItemFromOrderLine(input) {
250
254
  var base = _objectSpread(_objectSpread(_objectSpread({}, sourceProduct || {}), {}, {
251
255
  id: resolvedId,
252
256
  product_id: resolvedId,
253
- extension_type: (_ref9 = (_extension_type = sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.extension_type) !== null && _extension_type !== void 0 ? _extension_type : booking === null || booking === void 0 || (_booking$product2 = booking.product) === null || _booking$product2 === void 0 ? void 0 : _booking$product2.extension_type) !== null && _ref9 !== void 0 ? _ref9 : sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.extension_type,
257
+ extension_type: (_ref10 = (_extension_type = sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.extension_type) !== null && _extension_type !== void 0 ? _extension_type : booking === null || booking === void 0 || (_booking$product2 = booking.product) === null || _booking$product2 === void 0 ? void 0 : _booking$product2.extension_type) !== null && _ref10 !== void 0 ? _ref10 : sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.extension_type,
254
258
  title: productTitle || (sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.title) || (booking === null || booking === void 0 || (_booking$product3 = booking.product) === null || _booking$product3 === void 0 ? void 0 : _booking$product3.title),
255
259
  price: (_price = sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.price) !== null && _price !== void 0 ? _price : selling,
256
260
  selling_price: product.selling_price,
@@ -262,7 +266,7 @@ export function buildCacheItemFromOrderLine(input) {
262
266
  new: 0,
263
267
  autoClose: false,
264
268
  order_detail_id: (_product$order_detail = product.order_detail_id) !== null && _product$order_detail !== void 0 ? _product$order_detail : null,
265
- booking_id: (_ref10 = (_booking$id = booking.id) !== null && _booking$id !== void 0 ? _booking$id : booking.booking_id) !== null && _ref10 !== void 0 ? _ref10 : 0
269
+ booking_id: (_ref11 = (_booking$id = booking.id) !== null && _booking$id !== void 0 ? _booking$id : booking.booking_id) !== null && _ref11 !== void 0 ? _ref11 : 0
266
270
  });
267
271
  if ((sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.capacity) !== undefined) {
268
272
  base.capacity = sourceProduct.capacity;
@@ -154,10 +154,21 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
154
154
  private calculatePaymentTotal;
155
155
  private getDepositAmount;
156
156
  private normalizeDepositAmount;
157
+ private getLastOrderDepositSnapshot;
158
+ private getLastOrderSubmitSnapshot;
157
159
  private applyDepositAmountToSummary;
160
+ private applyLastOrderDepositSnapshot;
158
161
  private isDepositOrder;
159
162
  private getOrderExpectedAmount;
160
163
  private isDepositCovered;
164
+ getPaymentCompletion(payments?: OrderPaymentSource[]): {
165
+ isFullyPaid: boolean;
166
+ isOrderFullyPaid: boolean;
167
+ isDepositFullyPaid: boolean;
168
+ paymentStage: 'deposit' | 'normal';
169
+ depositAmount: string;
170
+ orderExpectedAmount: string;
171
+ };
161
172
  private calculateDepositPaidAmount;
162
173
  private resolveNextOrderPaymentType;
163
174
  private normalizePaymentSource;
@@ -186,6 +197,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
186
197
  private clearManualDepositOverride;
187
198
  private getOriginalSalesSnapshot;
188
199
  private isSnapshotPayableAmountUnchanged;
200
+ private hasShopDiscountChangedFromSnapshot;
189
201
  private restoreOriginalSnapshotIfProductsUnchanged;
190
202
  private clearPersistedAmountFieldsForFullRecalc;
191
203
  private getPaymentTargetAmount;
@@ -219,6 +231,8 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
219
231
  * const ids = this.collectBookingHolderRecords(booking);
220
232
  */
221
233
  private collectBookingHolderRecords;
234
+ private setProductHolderFromBooking;
235
+ private syncLinkedBookingHoldersToProducts;
222
236
  /**
223
237
  * 按 form_record 顺序读取 booking holder 的主字段名称。
224
238
  *
@@ -301,13 +315,27 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
301
315
  updateOrderPayment(paymentIdentity: string | number, updates: Partial<OrderPaymentData> & Record<string, any>): OrderPaymentData[];
302
316
  /** 从当前订单支付项中移除指定支付项。 */
303
317
  deleteOrderPayment(paymentIdentity: string | number): OrderPaymentData[];
318
+ private confirmPendingVoucherPaymentsInList;
319
+ private discardPendingVoucherPaymentsFromList;
320
+ private prepareVoucherPaymentsForSubmit;
321
+ private applyPaymentLifecycleChange;
322
+ confirmPendingVoucherPayments(options?: {
323
+ persist?: boolean;
324
+ recalculateSummary?: boolean;
325
+ }): OrderPaymentData[];
326
+ discardPendingVoucherPayments(options?: {
327
+ persist?: boolean;
328
+ recalculateSummary?: boolean;
329
+ }): OrderPaymentData[];
304
330
  /**
305
331
  * 覆盖当前订单中的 wallet pass 支付项。
306
332
  *
307
333
  * 判断口径与 PaymentModal 保持一致:voucher_id 存在且不为 0 的支付项
308
334
  * 视为 wallet pass;其它支付项保持不变。
309
335
  */
310
- updateVoucherOrderPayments(payments: OrderPaymentSource[]): OrderPaymentData[];
336
+ updateVoucherOrderPayments(payments: OrderPaymentSource[], options?: {
337
+ status?: 'paid' | 'payment_pending';
338
+ }): OrderPaymentData[];
311
339
  private shouldMergeProductToOrder;
312
340
  private hasOrderProductLineNote;
313
341
  /**
@@ -407,6 +435,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
407
435
  payments?: OrderPaymentSource[];
408
436
  paymentStatus?: SubmitSalesOrderParams['query']['payment_status'];
409
437
  smallTicketDataFlag?: number;
438
+ confirmPendingVoucherPayments?: boolean;
410
439
  enhancePayload?: SubmitPayloadEnhancer;
411
440
  }): Promise<T>;
412
441
  submitTempOrderAsync<T = any>(params?: {
@@ -418,6 +447,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
418
447
  payments?: OrderPaymentSource[];
419
448
  paymentStatus?: SubmitSalesOrderParams['query']['payment_status'];
420
449
  smallTicketDataFlag?: number;
450
+ confirmPendingVoucherPayments?: boolean;
421
451
  enhancePayload?: SubmitPayloadEnhancer;
422
452
  }): Promise<T>;
423
453
  private runSubmitTempOrder;
@@ -431,7 +461,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
431
461
  generateIdempotencyToken(): string;
432
462
  syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
433
463
  createOrder(params: CommitOrderParams['query']): {
434
- type: "virtual" | "appointment_booking";
464
+ type: "appointment_booking" | "virtual";
435
465
  platform: string;
436
466
  sales_channel: string;
437
467
  order_sales_channel: string;
@@ -497,5 +527,6 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
497
527
  private normalizeHydratedOrderProduct;
498
528
  getLastOrderInfo(): Record<string, any> | undefined;
499
529
  getOrderInfo(order_id: number): Promise<any>;
530
+ getVouchers(): any[];
500
531
  }
501
532
  export type { UpdateOrderBookingParams, UpdateOrderProductParams, UpdateOrderProductQuantityParams, } from './types';