@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.
- package/dist/model/strategy/adapter/index.d.ts +0 -4
- package/dist/model/strategy/adapter/index.js +1 -5
- package/dist/model/strategy/adapter/promotion/adapter.d.ts +4 -0
- package/dist/model/strategy/adapter/promotion/adapter.js +23 -0
- package/dist/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
- package/dist/model/strategy/adapter/promotion/evaluator.js +279 -6
- package/dist/model/strategy/adapter/promotion/examples.d.ts +86 -0
- package/dist/model/strategy/adapter/promotion/examples.js +99 -0
- package/dist/model/strategy/adapter/promotion/index.d.ts +1 -1
- package/dist/model/strategy/adapter/promotion/index.js +1 -1
- package/dist/model/strategy/adapter/promotion/type.d.ts +90 -2
- package/dist/model/strategy/adapter/promotion/type.js +45 -0
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +17 -13
- package/dist/modules/Order/index.d.ts +33 -2
- package/dist/modules/Order/index.js +615 -288
- package/dist/modules/Order/types.d.ts +20 -2
- package/dist/modules/Order/utils/bundleDiscountHydration.d.ts +5 -0
- package/dist/modules/Order/utils/bundleDiscountHydration.js +144 -0
- package/dist/modules/Order/utils.d.ts +4 -0
- package/dist/modules/Order/utils.js +116 -29
- package/dist/modules/Product/types.d.ts +0 -22
- package/dist/modules/ProductList/index.d.ts +1 -1
- package/dist/modules/ProductList/index.js +2 -4
- package/dist/modules/ProductList/types.d.ts +0 -2
- package/dist/modules/Rules/index.d.ts +4 -3
- package/dist/modules/Rules/index.js +42 -17
- package/dist/modules/Rules/types.d.ts +2 -1
- package/dist/modules/SalesSummary/index.d.ts +7 -3
- package/dist/modules/SalesSummary/index.js +67 -39
- package/dist/modules/SalesSummary/types.d.ts +1 -0
- package/dist/modules/SalesSummary/utils.js +2 -1
- package/dist/modules/SurchargeList/index.d.ts +6 -4
- package/dist/modules/SurchargeList/index.js +62 -39
- package/dist/modules/SurchargeList/types.d.ts +6 -2
- package/dist/server/index.d.ts +3 -50
- package/dist/server/index.js +1075 -1040
- package/dist/server/modules/order/index.d.ts +22 -3
- package/dist/server/modules/order/index.js +398 -316
- package/dist/server/modules/products/index.d.ts +7 -26
- package/dist/server/modules/products/index.js +76 -166
- package/dist/server/modules/products/types.d.ts +0 -14
- package/dist/solution/BaseSales/index.d.ts +22 -2
- package/dist/solution/BaseSales/index.js +995 -701
- package/dist/solution/BaseSales/types.d.ts +1 -0
- package/dist/solution/BaseSales/types.js +2 -1
- package/dist/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
- package/dist/solution/BaseSales/utils/cartPromotion.js +74 -29
- package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +6 -3
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.d.ts +9 -1
- package/dist/solution/BookingTicket/index.js +153 -6
- package/dist/solution/BookingTicket/types.d.ts +0 -2
- package/dist/solution/ScanOrder/index.js +31 -20
- package/dist/solution/VenueBooking/index.js +30 -19
- package/lib/model/strategy/adapter/index.d.ts +0 -4
- package/lib/model/strategy/adapter/index.js +2 -13
- package/lib/model/strategy/adapter/promotion/adapter.d.ts +4 -0
- package/lib/model/strategy/adapter/promotion/adapter.js +20 -0
- package/lib/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
- package/lib/model/strategy/adapter/promotion/evaluator.js +235 -0
- package/lib/model/strategy/adapter/promotion/examples.d.ts +86 -0
- package/lib/model/strategy/adapter/promotion/examples.js +91 -0
- package/lib/model/strategy/adapter/promotion/index.d.ts +1 -1
- package/lib/model/strategy/adapter/promotion/index.js +2 -0
- package/lib/model/strategy/adapter/promotion/type.d.ts +90 -2
- package/lib/model/strategy/adapter/promotion/type.js +2 -0
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +11 -1
- package/lib/modules/Order/index.d.ts +33 -2
- package/lib/modules/Order/index.js +402 -64
- package/lib/modules/Order/types.d.ts +20 -2
- package/lib/modules/Order/utils/bundleDiscountHydration.d.ts +5 -0
- package/lib/modules/Order/utils/bundleDiscountHydration.js +139 -0
- package/lib/modules/Order/utils.d.ts +4 -0
- package/lib/modules/Order/utils.js +90 -3
- package/lib/modules/Product/types.d.ts +0 -22
- package/lib/modules/ProductList/index.d.ts +1 -1
- package/lib/modules/ProductList/index.js +2 -4
- package/lib/modules/ProductList/types.d.ts +0 -2
- package/lib/modules/Rules/index.d.ts +4 -3
- package/lib/modules/Rules/index.js +27 -7
- package/lib/modules/Rules/types.d.ts +2 -1
- package/lib/modules/SalesSummary/index.d.ts +7 -3
- package/lib/modules/SalesSummary/index.js +28 -11
- package/lib/modules/SalesSummary/types.d.ts +1 -0
- package/lib/modules/SalesSummary/utils.js +2 -0
- package/lib/modules/SurchargeList/index.d.ts +6 -4
- package/lib/modules/SurchargeList/index.js +41 -21
- package/lib/modules/SurchargeList/types.d.ts +6 -2
- package/lib/server/index.d.ts +3 -50
- package/lib/server/index.js +244 -215
- package/lib/server/modules/order/index.d.ts +22 -3
- package/lib/server/modules/order/index.js +103 -53
- package/lib/server/modules/products/index.d.ts +7 -26
- package/lib/server/modules/products/index.js +35 -113
- package/lib/server/modules/products/types.d.ts +0 -14
- package/lib/solution/BaseSales/index.d.ts +22 -2
- package/lib/solution/BaseSales/index.js +246 -60
- package/lib/solution/BaseSales/types.d.ts +1 -0
- package/lib/solution/BaseSales/types.js +2 -1
- package/lib/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
- package/lib/solution/BaseSales/utils/cartPromotion.js +59 -16
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +6 -6
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.d.ts +9 -1
- package/lib/solution/BookingTicket/index.js +101 -0
- package/lib/solution/BookingTicket/types.d.ts +0 -2
- package/lib/solution/ScanOrder/index.js +8 -0
- package/lib/solution/VenueBooking/index.js +8 -0
- package/package.json +1 -1
- package/dist/model/strategy/adapter/dataVariant/adapter.d.ts +0 -49
- package/dist/model/strategy/adapter/dataVariant/adapter.js +0 -152
- package/dist/model/strategy/adapter/dataVariant/evaluator.d.ts +0 -87
- package/dist/model/strategy/adapter/dataVariant/evaluator.js +0 -755
- package/dist/model/strategy/adapter/dataVariant/examples.d.ts +0 -39
- package/dist/model/strategy/adapter/dataVariant/examples.js +0 -282
- package/dist/model/strategy/adapter/dataVariant/index.d.ts +0 -4
- package/dist/model/strategy/adapter/dataVariant/index.js +0 -4
- package/dist/model/strategy/adapter/dataVariant/type.d.ts +0 -146
- package/dist/model/strategy/adapter/dataVariant/type.js +0 -54
- package/lib/model/strategy/adapter/dataVariant/adapter.d.ts +0 -49
- package/lib/model/strategy/adapter/dataVariant/adapter.js +0 -139
- package/lib/model/strategy/adapter/dataVariant/evaluator.d.ts +0 -87
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +0 -564
- package/lib/model/strategy/adapter/dataVariant/examples.d.ts +0 -39
- package/lib/model/strategy/adapter/dataVariant/examples.js +0 -295
- package/lib/model/strategy/adapter/dataVariant/index.d.ts +0 -4
- package/lib/model/strategy/adapter/dataVariant/index.js +0 -38
- package/lib/model/strategy/adapter/dataVariant/type.d.ts +0 -146
- package/lib/model/strategy/adapter/dataVariant/type.js +0 -31
|
@@ -136,3 +136,89 @@ export declare const BUY_X_GET_Y_FREE_STRATEGY: {
|
|
|
136
136
|
};
|
|
137
137
|
}[];
|
|
138
138
|
};
|
|
139
|
+
/**
|
|
140
|
+
* ITEM_REWARD 策略配置示例:儿童票触发婴儿票免费
|
|
141
|
+
*
|
|
142
|
+
* 业务规则:
|
|
143
|
+
* - 条件商品:儿童票(conditions.rules.productIdAndVariantId)
|
|
144
|
+
* - 奖励商品:购物车/订单内已经存在的婴儿票(actions[0].config.rewardTargets)
|
|
145
|
+
* - 本 action 不自动新增婴儿票;每次购物车变更后由统一促销链路重算
|
|
146
|
+
*
|
|
147
|
+
* 字段说明:
|
|
148
|
+
* - type: "ITEM_REWARD" 表示商品奖励 action
|
|
149
|
+
* - target: "product" 表示本期只奖励商品行
|
|
150
|
+
* - config.rewardTargets: 奖励对象数组,支持 { product_id, product_variant_id }
|
|
151
|
+
* - config.targetSelection: "consumer_best" 表示目标商品超额时选择节省金额最高的商品
|
|
152
|
+
* - value.rewardMethod:
|
|
153
|
+
* - "free": 目标商品最终价为 0
|
|
154
|
+
* - "percent_off": 百分比折扣,rewardValue 为 0-100
|
|
155
|
+
* - "amount_off": 每个目标商品固定减免 rewardValue
|
|
156
|
+
* - "fixed_price": 目标商品最终单价为 rewardValue
|
|
157
|
+
* - value.quantityRule:
|
|
158
|
+
* - "per_condition_quantity": 每满足 triggerQuantity 个条件商品,奖励 rewardQuantity 个目标商品
|
|
159
|
+
* - "all_targets": 满足条件后奖励全部目标商品
|
|
160
|
+
* - "max_per_order": 满足条件后每单最多奖励 maxRewardQuantity 个目标商品
|
|
161
|
+
*/
|
|
162
|
+
export declare const ITEM_REWARD_STRATEGY: {
|
|
163
|
+
metadata: {
|
|
164
|
+
id: string;
|
|
165
|
+
name: {
|
|
166
|
+
en: string;
|
|
167
|
+
'zh-CN': string;
|
|
168
|
+
'zh-HK': string;
|
|
169
|
+
};
|
|
170
|
+
type: string;
|
|
171
|
+
custom: {
|
|
172
|
+
display: {
|
|
173
|
+
product_card: {
|
|
174
|
+
text: {
|
|
175
|
+
en: string;
|
|
176
|
+
'zh-CN': string;
|
|
177
|
+
'zh-HK': string;
|
|
178
|
+
};
|
|
179
|
+
type: string;
|
|
180
|
+
};
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
conditions: {
|
|
185
|
+
operator: string;
|
|
186
|
+
rules: ({
|
|
187
|
+
type: string;
|
|
188
|
+
field: string;
|
|
189
|
+
value: string;
|
|
190
|
+
operator: string;
|
|
191
|
+
} | {
|
|
192
|
+
type: string;
|
|
193
|
+
field: string;
|
|
194
|
+
value: {
|
|
195
|
+
product_id: number;
|
|
196
|
+
product_variant_id: number;
|
|
197
|
+
}[];
|
|
198
|
+
operator: string;
|
|
199
|
+
})[];
|
|
200
|
+
actionIds: string[];
|
|
201
|
+
};
|
|
202
|
+
actions: {
|
|
203
|
+
id: string;
|
|
204
|
+
type: string;
|
|
205
|
+
value: {
|
|
206
|
+
rewardMethod: string;
|
|
207
|
+
rewardValue: number;
|
|
208
|
+
quantityRule: string;
|
|
209
|
+
triggerQuantity: number;
|
|
210
|
+
rewardQuantity: number;
|
|
211
|
+
maxRewardQuantity: number;
|
|
212
|
+
};
|
|
213
|
+
valueType: string;
|
|
214
|
+
target: string;
|
|
215
|
+
priority: number;
|
|
216
|
+
config: {
|
|
217
|
+
rewardTargets: {
|
|
218
|
+
product_id: number;
|
|
219
|
+
product_variant_id: number;
|
|
220
|
+
}[];
|
|
221
|
+
targetSelection: string;
|
|
222
|
+
};
|
|
223
|
+
}[];
|
|
224
|
+
};
|
|
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
var examples_exports = {};
|
|
21
21
|
__export(examples_exports, {
|
|
22
22
|
BUY_X_GET_Y_FREE_STRATEGY: () => BUY_X_GET_Y_FREE_STRATEGY,
|
|
23
|
+
ITEM_REWARD_STRATEGY: () => ITEM_REWARD_STRATEGY,
|
|
23
24
|
X_ITEMS_FOR_Y_PRICE_STRATEGY: () => X_ITEMS_FOR_Y_PRICE_STRATEGY
|
|
24
25
|
});
|
|
25
26
|
module.exports = __toCommonJS(examples_exports);
|
|
@@ -185,8 +186,98 @@ var BUY_X_GET_Y_FREE_STRATEGY = {
|
|
|
185
186
|
}
|
|
186
187
|
]
|
|
187
188
|
};
|
|
189
|
+
var ITEM_REWARD_STRATEGY = {
|
|
190
|
+
metadata: {
|
|
191
|
+
id: "STRATEGY_003",
|
|
192
|
+
name: {
|
|
193
|
+
en: "Infant ticket free with child ticket",
|
|
194
|
+
"zh-CN": "儿童票触发婴儿票免费",
|
|
195
|
+
"zh-HK": "兒童票觸發嬰兒票免費"
|
|
196
|
+
},
|
|
197
|
+
type: "promotion",
|
|
198
|
+
custom: {
|
|
199
|
+
display: {
|
|
200
|
+
product_card: {
|
|
201
|
+
text: {
|
|
202
|
+
en: "Infant ticket free",
|
|
203
|
+
"zh-CN": "婴儿票免费",
|
|
204
|
+
"zh-HK": "嬰兒票免費"
|
|
205
|
+
},
|
|
206
|
+
type: "tag"
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
conditions: {
|
|
212
|
+
operator: "and",
|
|
213
|
+
rules: [
|
|
214
|
+
{
|
|
215
|
+
type: "operator",
|
|
216
|
+
field: "currentDateTime",
|
|
217
|
+
value: "2023-01-01 00:00:00",
|
|
218
|
+
operator: ">="
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
type: "operator",
|
|
222
|
+
field: "currentDateTime",
|
|
223
|
+
value: "2030-01-01 00:00:00",
|
|
224
|
+
operator: "<="
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
type: "operator",
|
|
228
|
+
field: "productIdAndVariantId",
|
|
229
|
+
value: [
|
|
230
|
+
{
|
|
231
|
+
product_id: 1001,
|
|
232
|
+
// 条件商品:儿童票
|
|
233
|
+
product_variant_id: 0
|
|
234
|
+
// 0 = 匹配任意变体
|
|
235
|
+
}
|
|
236
|
+
],
|
|
237
|
+
operator: "product_match"
|
|
238
|
+
}
|
|
239
|
+
],
|
|
240
|
+
actionIds: ["1"]
|
|
241
|
+
},
|
|
242
|
+
actions: [
|
|
243
|
+
{
|
|
244
|
+
id: "1",
|
|
245
|
+
type: "ITEM_REWARD",
|
|
246
|
+
value: {
|
|
247
|
+
rewardMethod: "free",
|
|
248
|
+
// free | percent_off | amount_off | fixed_price
|
|
249
|
+
rewardValue: 0,
|
|
250
|
+
// free 可省略;其他 rewardMethod 使用
|
|
251
|
+
quantityRule: "per_condition_quantity",
|
|
252
|
+
// per_condition_quantity | all_targets | max_per_order
|
|
253
|
+
triggerQuantity: 1,
|
|
254
|
+
// N:每满足 N 个条件商品
|
|
255
|
+
rewardQuantity: 1,
|
|
256
|
+
// Y:奖励 Y 个目标商品
|
|
257
|
+
maxRewardQuantity: 1
|
|
258
|
+
// max_per_order 使用;本例保留为配置示意
|
|
259
|
+
},
|
|
260
|
+
valueType: "object",
|
|
261
|
+
target: "product",
|
|
262
|
+
priority: 1,
|
|
263
|
+
config: {
|
|
264
|
+
rewardTargets: [
|
|
265
|
+
{
|
|
266
|
+
product_id: 2001,
|
|
267
|
+
// 奖励对象:婴儿票
|
|
268
|
+
product_variant_id: 0
|
|
269
|
+
// 0 = 匹配任意变体
|
|
270
|
+
}
|
|
271
|
+
],
|
|
272
|
+
targetSelection: "consumer_best"
|
|
273
|
+
// consumer_best = 按可节省金额从高到低选择
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
]
|
|
277
|
+
};
|
|
188
278
|
// Annotate the CommonJS export names for ESM import in node:
|
|
189
279
|
0 && (module.exports = {
|
|
190
280
|
BUY_X_GET_Y_FREE_STRATEGY,
|
|
281
|
+
ITEM_REWARD_STRATEGY,
|
|
191
282
|
X_ITEMS_FOR_Y_PRICE_STRATEGY
|
|
192
283
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { PromotionEvaluator } from './evaluator';
|
|
2
2
|
export { PromotionAdapter } from './adapter';
|
|
3
3
|
export { default } from './adapter';
|
|
4
|
-
export { X_ITEMS_FOR_Y_PRICE_STRATEGY, BUY_X_GET_Y_FREE_STRATEGY, } from './examples';
|
|
4
|
+
export { X_ITEMS_FOR_Y_PRICE_STRATEGY, BUY_X_GET_Y_FREE_STRATEGY, ITEM_REWARD_STRATEGY, } from './examples';
|
|
@@ -30,6 +30,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
var promotion_exports = {};
|
|
31
31
|
__export(promotion_exports, {
|
|
32
32
|
BUY_X_GET_Y_FREE_STRATEGY: () => import_examples.BUY_X_GET_Y_FREE_STRATEGY,
|
|
33
|
+
ITEM_REWARD_STRATEGY: () => import_examples.ITEM_REWARD_STRATEGY,
|
|
33
34
|
PromotionAdapter: () => import_adapter.PromotionAdapter,
|
|
34
35
|
PromotionEvaluator: () => import_evaluator.PromotionEvaluator,
|
|
35
36
|
X_ITEMS_FOR_Y_PRICE_STRATEGY: () => import_examples.X_ITEMS_FOR_Y_PRICE_STRATEGY,
|
|
@@ -43,6 +44,7 @@ var import_examples = require("./examples");
|
|
|
43
44
|
// Annotate the CommonJS export names for ESM import in node:
|
|
44
45
|
0 && (module.exports = {
|
|
45
46
|
BUY_X_GET_Y_FREE_STRATEGY,
|
|
47
|
+
ITEM_REWARD_STRATEGY,
|
|
46
48
|
PromotionAdapter,
|
|
47
49
|
PromotionEvaluator,
|
|
48
50
|
X_ITEMS_FOR_Y_PRICE_STRATEGY
|
|
@@ -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
|
*
|
|
@@ -28,6 +28,8 @@ var PROMOTION_ACTION_TYPES = {
|
|
|
28
28
|
X_ITEMS_FOR_Y_PRICE: "X_ITEMS_FOR_Y_PRICE",
|
|
29
29
|
/** 买X送Y(买X件送Y件,可累计) */
|
|
30
30
|
BUY_X_GET_Y_FREE: "BUY_X_GET_Y_FREE",
|
|
31
|
+
/** 商品奖励(满足条件后,订单内指定目标商品享优惠) */
|
|
32
|
+
ITEM_REWARD: "ITEM_REWARD",
|
|
31
33
|
/** 固定折扣 */
|
|
32
34
|
DISCOUNT_RATE: "DISCOUNT_RATE",
|
|
33
35
|
/** 固定减价 */
|
|
@@ -142,6 +142,14 @@ function resolveMainProductPrice(product, fallback) {
|
|
|
142
142
|
const parsed = Number(value);
|
|
143
143
|
return Number.isFinite(parsed) ? parsed : fallback;
|
|
144
144
|
}
|
|
145
|
+
function mapOrderBundleToOtherBundle(bundle) {
|
|
146
|
+
return bundle.map((item) => {
|
|
147
|
+
return {
|
|
148
|
+
...item,
|
|
149
|
+
original_price: item.original_price ?? item.bundle_selling_price ?? item.price
|
|
150
|
+
};
|
|
151
|
+
});
|
|
152
|
+
}
|
|
145
153
|
function synthesizeProductResourceFromBooking(booking) {
|
|
146
154
|
const rows = booking == null ? void 0 : booking.resources;
|
|
147
155
|
if (!Array.isArray(rows) || rows.length === 0)
|
|
@@ -191,7 +199,9 @@ function buildCacheItemFromOrderLine(input) {
|
|
|
191
199
|
const other = {
|
|
192
200
|
product_variant_id: product.product_variant_id ?? 0,
|
|
193
201
|
option: (0, import_utils.getProductSkuOptions)(product),
|
|
194
|
-
bundle:
|
|
202
|
+
bundle: mapOrderBundleToOtherBundle(
|
|
203
|
+
Array.isArray(product.product_bundle) ? product.product_bundle : []
|
|
204
|
+
)
|
|
195
205
|
};
|
|
196
206
|
const extend = {
|
|
197
207
|
start_date: startDate ? (0, import_dayjs.default)(startDate) : void 0,
|
|
@@ -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[]
|
|
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: "
|
|
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';
|