@pisell/pisellos 2.2.272 → 2.2.274
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/core/index.d.ts +0 -2
- package/dist/core/index.js +0 -7
- package/dist/model/strategy/adapter/promotion/adapter.d.ts +0 -4
- package/dist/model/strategy/adapter/promotion/adapter.js +0 -23
- package/dist/model/strategy/adapter/promotion/evaluator.d.ts +0 -17
- package/dist/model/strategy/adapter/promotion/evaluator.js +6 -279
- package/dist/model/strategy/adapter/promotion/examples.d.ts +0 -86
- package/dist/model/strategy/adapter/promotion/examples.js +0 -99
- package/dist/model/strategy/adapter/promotion/index.d.ts +1 -1
- package/dist/model/strategy/adapter/promotion/index.js +9 -0
- package/dist/model/strategy/adapter/promotion/type.d.ts +2 -90
- package/dist/model/strategy/adapter/promotion/type.js +0 -45
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +16 -12
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +6 -3
- package/dist/modules/OpenData/index.d.ts +0 -2
- package/dist/modules/OpenData/index.js +0 -8
- package/dist/modules/Order/index.d.ts +12 -31
- package/dist/modules/Order/index.js +562 -778
- package/dist/modules/Order/types.d.ts +22 -36
- package/dist/modules/Order/types.js +11 -0
- package/dist/modules/Order/utils/orderCollectionIdentity.js +2 -7
- package/dist/modules/Order/utils.js +6 -10
- package/dist/modules/Payment/index.d.ts +0 -2
- package/dist/modules/Payment/index.js +50 -79
- package/dist/modules/Payment/types.d.ts +27 -29
- package/dist/modules/Payment/types.js +3 -5
- package/dist/modules/Rules/index.d.ts +0 -1
- package/dist/modules/Rules/index.js +39 -55
- package/dist/modules/SalesSummary/utils.js +7 -1
- package/dist/server/index.d.ts +0 -16
- package/dist/server/index.js +1036 -1933
- package/dist/server/modules/order/index.d.ts +4 -49
- package/dist/server/modules/order/index.js +695 -1574
- package/dist/server/modules/order/types.d.ts +3 -11
- package/dist/server/modules/order/types.js +1 -1
- package/dist/solution/BaseSales/index.d.ts +25 -59
- package/dist/solution/BaseSales/index.js +490 -767
- package/dist/solution/BaseSales/utils/cartPromotion.d.ts +1 -3
- package/dist/solution/BaseSales/utils/cartPromotion.js +36 -93
- package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +1 -6
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.d.ts +5 -21
- package/dist/solution/BookingTicket/index.js +49 -126
- package/dist/solution/BookingTicket/types.d.ts +3 -0
- package/dist/solution/BookingTicket/utils/addProductDecision.js +6 -0
- package/dist/solution/BookingTicket/utils/cartView.js +44 -32
- package/dist/solution/BookingTicket/utils/weighingProductSku.d.ts +5 -0
- package/dist/solution/BookingTicket/utils/weighingProductSku.js +45 -0
- package/dist/solution/Sales/index.d.ts +0 -1
- package/dist/solution/Sales/index.js +2 -10
- package/dist/solution/ScanOrder/index.js +20 -31
- package/dist/solution/VenueBooking/index.js +19 -30
- package/dist/types/index.d.ts +0 -1
- package/lib/core/index.d.ts +0 -2
- package/lib/core/index.js +0 -4
- package/lib/model/strategy/adapter/promotion/adapter.d.ts +0 -4
- package/lib/model/strategy/adapter/promotion/adapter.js +0 -20
- package/lib/model/strategy/adapter/promotion/evaluator.d.ts +0 -17
- package/lib/model/strategy/adapter/promotion/evaluator.js +0 -235
- package/lib/model/strategy/adapter/promotion/examples.d.ts +0 -86
- package/lib/model/strategy/adapter/promotion/examples.js +0 -91
- package/lib/model/strategy/adapter/promotion/index.d.ts +1 -1
- package/lib/model/strategy/adapter/promotion/index.js +49 -0
- package/lib/model/strategy/adapter/promotion/type.d.ts +2 -90
- package/lib/model/strategy/adapter/promotion/type.js +0 -2
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +5 -2
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +2 -1
- package/lib/modules/OpenData/index.d.ts +0 -2
- package/lib/modules/OpenData/index.js +0 -5
- package/lib/modules/Order/index.d.ts +12 -31
- package/lib/modules/Order/index.js +142 -201
- package/lib/modules/Order/types.d.ts +22 -36
- package/lib/modules/Order/utils/orderCollectionIdentity.js +0 -3
- package/lib/modules/Order/utils.js +4 -11
- package/lib/modules/Payment/index.d.ts +0 -2
- package/lib/modules/Payment/index.js +13 -34
- package/lib/modules/Payment/types.d.ts +27 -29
- package/lib/modules/Payment/types.js +3 -3
- package/lib/modules/Rules/index.d.ts +0 -1
- package/lib/modules/Rules/index.js +22 -41
- package/lib/modules/SalesSummary/utils.js +5 -1
- package/lib/server/index.d.ts +0 -16
- package/lib/server/index.js +18 -670
- package/lib/server/modules/order/index.d.ts +4 -49
- package/lib/server/modules/order/index.js +66 -657
- package/lib/server/modules/order/types.d.ts +3 -11
- package/lib/solution/BaseSales/index.d.ts +25 -59
- package/lib/solution/BaseSales/index.js +79 -246
- package/lib/solution/BaseSales/utils/cartPromotion.d.ts +1 -3
- package/lib/solution/BaseSales/utils/cartPromotion.js +17 -65
- package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +1 -6
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.d.ts +5 -21
- package/lib/solution/BookingTicket/index.js +8 -59
- package/lib/solution/BookingTicket/types.d.ts +3 -0
- package/lib/solution/BookingTicket/utils/addProductDecision.js +4 -0
- package/lib/solution/BookingTicket/utils/cartView.js +43 -30
- package/lib/solution/BookingTicket/utils/weighingProductSku.d.ts +5 -0
- package/lib/solution/BookingTicket/utils/weighingProductSku.js +63 -0
- package/lib/solution/Sales/index.d.ts +0 -1
- package/lib/solution/Sales/index.js +3 -5
- package/lib/solution/ScanOrder/index.js +0 -8
- package/lib/solution/VenueBooking/index.js +0 -8
- package/lib/types/index.d.ts +0 -1
- package/package.json +1 -1
- package/dist/modules/Order/payment-utils.d.ts +0 -26
- package/dist/modules/Order/payment-utils.js +0 -225
- package/dist/utils/payment-number.d.ts +0 -9
- package/dist/utils/payment-number.js +0 -69
- package/lib/modules/Order/payment-utils.d.ts +0 -26
- package/lib/modules/Order/payment-utils.js +0 -224
- package/lib/utils/payment-number.d.ts +0 -9
- package/lib/utils/payment-number.js +0 -64
|
@@ -41,10 +41,6 @@ import { composeLinePrice, createUuidV4, getProductSkuOptions, normalizeSubmitCo
|
|
|
41
41
|
import dayjs from 'dayjs';
|
|
42
42
|
import { ItemRuleEvaluator } from "../../model/strategy/adapter/itemRule";
|
|
43
43
|
export * from "./types";
|
|
44
|
-
function isItemRewardProductDiscount(discount) {
|
|
45
|
-
var _discount$metadata, _discount$metadata2;
|
|
46
|
-
return (discount === null || discount === void 0 ? void 0 : discount.type) === 'product' && (discount === null || discount === void 0 || (_discount$metadata = discount.metadata) === null || _discount$metadata === void 0 ? void 0 : _discount$metadata.source) === 'promotion' && (discount === null || discount === void 0 || (_discount$metadata2 = discount.metadata) === null || _discount$metadata2 === void 0 ? void 0 : _discount$metadata2.actionType) === 'ITEM_REWARD';
|
|
47
|
-
}
|
|
48
44
|
export var ScanOrderImpl = /*#__PURE__*/function (_BaseModule) {
|
|
49
45
|
_inherits(ScanOrderImpl, _BaseModule);
|
|
50
46
|
var _super = _createSuper(ScanOrderImpl);
|
|
@@ -1181,7 +1177,7 @@ export var ScanOrderImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
1181
1177
|
_iterator3.s();
|
|
1182
1178
|
case 19:
|
|
1183
1179
|
if ((_step3 = _iterator3.n()).done) {
|
|
1184
|
-
_context15.next =
|
|
1180
|
+
_context15.next = 33;
|
|
1185
1181
|
break;
|
|
1186
1182
|
}
|
|
1187
1183
|
product = _step3.value;
|
|
@@ -1189,15 +1185,8 @@ export var ScanOrderImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
1189
1185
|
_context15.next = 23;
|
|
1190
1186
|
break;
|
|
1191
1187
|
}
|
|
1192
|
-
return _context15.abrupt("continue",
|
|
1188
|
+
return _context15.abrupt("continue", 31);
|
|
1193
1189
|
case 23:
|
|
1194
|
-
if (!(product.discount_list || []).some(isItemRewardProductDiscount)) {
|
|
1195
|
-
_context15.next = 26;
|
|
1196
|
-
break;
|
|
1197
|
-
}
|
|
1198
|
-
product.discount_list = (product.discount_list || []).filter(isItemRewardProductDiscount);
|
|
1199
|
-
return _context15.abrupt("continue", 34);
|
|
1200
|
-
case 26:
|
|
1201
1190
|
product.discount_list = (product.discount_list || []).filter(function (pd) {
|
|
1202
1191
|
var _pd$discount$resource, _pd$discount;
|
|
1203
1192
|
var rid = (_pd$discount$resource = (_pd$discount = pd.discount) === null || _pd$discount === void 0 ? void 0 : _pd$discount.resource_id) !== null && _pd$discount$resource !== void 0 ? _pd$discount$resource : pd.id;
|
|
@@ -1221,47 +1210,47 @@ export var ScanOrderImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
1221
1210
|
mainPrice: newMainSellingPrice,
|
|
1222
1211
|
bundle: product.product_bundle
|
|
1223
1212
|
});
|
|
1224
|
-
case
|
|
1213
|
+
case 31:
|
|
1225
1214
|
_context15.next = 19;
|
|
1226
1215
|
break;
|
|
1227
|
-
case
|
|
1228
|
-
_context15.next =
|
|
1216
|
+
case 33:
|
|
1217
|
+
_context15.next = 38;
|
|
1229
1218
|
break;
|
|
1230
|
-
case
|
|
1231
|
-
_context15.prev =
|
|
1219
|
+
case 35:
|
|
1220
|
+
_context15.prev = 35;
|
|
1232
1221
|
_context15.t0 = _context15["catch"](17);
|
|
1233
1222
|
_iterator3.e(_context15.t0);
|
|
1234
|
-
case
|
|
1235
|
-
_context15.prev =
|
|
1223
|
+
case 38:
|
|
1224
|
+
_context15.prev = 38;
|
|
1236
1225
|
_iterator3.f();
|
|
1237
|
-
return _context15.finish(
|
|
1238
|
-
case
|
|
1226
|
+
return _context15.finish(38);
|
|
1227
|
+
case 41:
|
|
1239
1228
|
OrderModule.populateSavedAmounts(tempOrder.products, nextDiscountList);
|
|
1240
|
-
_context15.next =
|
|
1229
|
+
_context15.next = 44;
|
|
1241
1230
|
return discountModule === null || discountModule === void 0 ? void 0 : discountModule.setDiscountList(nextDiscountList);
|
|
1242
|
-
case
|
|
1231
|
+
case 44:
|
|
1243
1232
|
tempOrder.discount_list = (nextDiscountList || []).filter(function (d) {
|
|
1244
1233
|
return d.isSelected;
|
|
1245
1234
|
});
|
|
1246
|
-
_context15.next =
|
|
1235
|
+
_context15.next = 47;
|
|
1247
1236
|
return this.store.order.recalculateSummary({
|
|
1248
1237
|
createIfMissing: true
|
|
1249
1238
|
});
|
|
1250
|
-
case
|
|
1239
|
+
case 47:
|
|
1251
1240
|
this.store.order.persistTempOrder();
|
|
1252
1241
|
this.logMethodSuccess('setDiscountSelected', params);
|
|
1253
|
-
_context15.next =
|
|
1242
|
+
_context15.next = 55;
|
|
1254
1243
|
break;
|
|
1255
|
-
case
|
|
1256
|
-
_context15.prev =
|
|
1244
|
+
case 51:
|
|
1245
|
+
_context15.prev = 51;
|
|
1257
1246
|
_context15.t1 = _context15["catch"](1);
|
|
1258
1247
|
this.logMethodError('setDiscountSelected', _context15.t1);
|
|
1259
1248
|
throw _context15.t1;
|
|
1260
|
-
case
|
|
1249
|
+
case 55:
|
|
1261
1250
|
case "end":
|
|
1262
1251
|
return _context15.stop();
|
|
1263
1252
|
}
|
|
1264
|
-
}, _callee15, this, [[1,
|
|
1253
|
+
}, _callee15, this, [[1, 51], [17, 35, 38, 41]]);
|
|
1265
1254
|
}));
|
|
1266
1255
|
function setDiscountSelected(_x8) {
|
|
1267
1256
|
return _setDiscountSelected.apply(this, arguments);
|
|
@@ -51,10 +51,6 @@ import { RegisterAndLoginHooks } from "../RegisterAndLogin/types";
|
|
|
51
51
|
import Decimal from 'decimal.js';
|
|
52
52
|
export * from "./types";
|
|
53
53
|
var OPEN_DATA_SECTION_CODES = ['basic', 'fulfillment', 'reservation', 'sale', 'menu', 'availability', 'workflow', 'checkout'];
|
|
54
|
-
function isItemRewardProductDiscount(discount) {
|
|
55
|
-
var _discount$metadata, _discount$metadata2;
|
|
56
|
-
return (discount === null || discount === void 0 ? void 0 : discount.type) === 'product' && (discount === null || discount === void 0 || (_discount$metadata = discount.metadata) === null || _discount$metadata === void 0 ? void 0 : _discount$metadata.source) === 'promotion' && (discount === null || discount === void 0 || (_discount$metadata2 = discount.metadata) === null || _discount$metadata2 === void 0 ? void 0 : _discount$metadata2.actionType) === 'ITEM_REWARD';
|
|
57
|
-
}
|
|
58
54
|
function cloneCustomDepositData(customDepositData) {
|
|
59
55
|
if (!customDepositData || _typeof(customDepositData) !== 'object') return undefined;
|
|
60
56
|
return _objectSpread(_objectSpread({}, customDepositData), {}, {
|
|
@@ -2167,7 +2163,7 @@ export var VenueBookingImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2167
2163
|
_iterator14.s();
|
|
2168
2164
|
case 21:
|
|
2169
2165
|
if ((_step14 = _iterator14.n()).done) {
|
|
2170
|
-
_context21.next =
|
|
2166
|
+
_context21.next = 35;
|
|
2171
2167
|
break;
|
|
2172
2168
|
}
|
|
2173
2169
|
product = _step14.value;
|
|
@@ -2175,15 +2171,8 @@ export var VenueBookingImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2175
2171
|
_context21.next = 25;
|
|
2176
2172
|
break;
|
|
2177
2173
|
}
|
|
2178
|
-
return _context21.abrupt("continue",
|
|
2174
|
+
return _context21.abrupt("continue", 33);
|
|
2179
2175
|
case 25:
|
|
2180
|
-
if (!(product.discount_list || []).some(isItemRewardProductDiscount)) {
|
|
2181
|
-
_context21.next = 28;
|
|
2182
|
-
break;
|
|
2183
|
-
}
|
|
2184
|
-
product.discount_list = (product.discount_list || []).filter(isItemRewardProductDiscount);
|
|
2185
|
-
return _context21.abrupt("continue", 36);
|
|
2186
|
-
case 28:
|
|
2187
2176
|
// 1. 把 product.discount_list 和当前选中的 discount 对齐(剔除已取消的券)
|
|
2188
2177
|
product.discount_list = (product.discount_list || []).filter(function (pd) {
|
|
2189
2178
|
var _pd$discount$resource, _pd$discount;
|
|
@@ -2208,36 +2197,36 @@ export var VenueBookingImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2208
2197
|
mainPrice: newMainSellingPrice,
|
|
2209
2198
|
bundle: product.product_bundle
|
|
2210
2199
|
});
|
|
2211
|
-
case
|
|
2200
|
+
case 33:
|
|
2212
2201
|
_context21.next = 21;
|
|
2213
2202
|
break;
|
|
2214
|
-
case
|
|
2215
|
-
_context21.next =
|
|
2203
|
+
case 35:
|
|
2204
|
+
_context21.next = 40;
|
|
2216
2205
|
break;
|
|
2217
|
-
case
|
|
2218
|
-
_context21.prev =
|
|
2206
|
+
case 37:
|
|
2207
|
+
_context21.prev = 37;
|
|
2219
2208
|
_context21.t0 = _context21["catch"](19);
|
|
2220
2209
|
_iterator14.e(_context21.t0);
|
|
2221
|
-
case
|
|
2222
|
-
_context21.prev =
|
|
2210
|
+
case 40:
|
|
2211
|
+
_context21.prev = 40;
|
|
2223
2212
|
_iterator14.f();
|
|
2224
|
-
return _context21.finish(
|
|
2225
|
-
case
|
|
2213
|
+
return _context21.finish(40);
|
|
2214
|
+
case 43:
|
|
2226
2215
|
OrderModule.populateSavedAmounts(tempOrder.products, nextDiscountList);
|
|
2227
|
-
_context21.next =
|
|
2216
|
+
_context21.next = 46;
|
|
2228
2217
|
return discountModule === null || discountModule === void 0 ? void 0 : discountModule.setDiscountList(nextDiscountList);
|
|
2229
|
-
case
|
|
2218
|
+
case 46:
|
|
2230
2219
|
tempOrder.discount_list = (nextDiscountList || []).filter(function (d) {
|
|
2231
2220
|
return d.isSelected;
|
|
2232
2221
|
});
|
|
2233
2222
|
afterApplyTarget = this.store.order.getDiscountList().find(function (d) {
|
|
2234
2223
|
return d.id === params.discountId;
|
|
2235
2224
|
}) || null;
|
|
2236
|
-
_context21.next =
|
|
2225
|
+
_context21.next = 50;
|
|
2237
2226
|
return this.store.order.recalculateSummary({
|
|
2238
2227
|
createIfMissing: true
|
|
2239
2228
|
});
|
|
2240
|
-
case
|
|
2229
|
+
case 50:
|
|
2241
2230
|
this.store.order.persistTempOrder();
|
|
2242
2231
|
finalSummary = ((_this$store$order$get = this.store.order.getTempOrder()) === null || _this$store$order$get === void 0 ? void 0 : _this$store$order$get.summary) || null;
|
|
2243
2232
|
finalProduct = ((_this$store$order$get2 = this.store.order.getTempOrder()) === null || _this$store$order$get2 === void 0 || (_this$store$order$get2 = _this$store$order$get2.products) === null || _this$store$order$get2 === void 0 ? void 0 : _this$store$order$get2[0]) || null;
|
|
@@ -2246,16 +2235,16 @@ export var VenueBookingImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2246
2235
|
return d.id === params.discountId;
|
|
2247
2236
|
}) || null;
|
|
2248
2237
|
return _context21.abrupt("return", this.store.order.getDiscountList());
|
|
2249
|
-
case
|
|
2250
|
-
_context21.prev =
|
|
2238
|
+
case 58:
|
|
2239
|
+
_context21.prev = 58;
|
|
2251
2240
|
_context21.t1 = _context21["catch"](1);
|
|
2252
2241
|
this.logMethodError('setDiscountSelected', _context21.t1);
|
|
2253
2242
|
throw _context21.t1;
|
|
2254
|
-
case
|
|
2243
|
+
case 62:
|
|
2255
2244
|
case "end":
|
|
2256
2245
|
return _context21.stop();
|
|
2257
2246
|
}
|
|
2258
|
-
}, _callee21, this, [[1,
|
|
2247
|
+
}, _callee21, this, [[1, 58], [19, 37, 40, 43]]);
|
|
2259
2248
|
}));
|
|
2260
2249
|
function setDiscountSelected(_x15) {
|
|
2261
2250
|
return _setDiscountSelected.apply(this, arguments);
|
package/dist/types/index.d.ts
CHANGED
|
@@ -47,7 +47,6 @@ export interface PisellCore {
|
|
|
47
47
|
getModule: <T extends Module>(name: string) => T | null;
|
|
48
48
|
getModuleExports: <T = any>(name: string) => T | null;
|
|
49
49
|
hasModule: (name: string) => boolean;
|
|
50
|
-
getModuleNames: () => string[];
|
|
51
50
|
effects: {
|
|
52
51
|
on: (event: string, callback: (payload: any) => void) => () => void;
|
|
53
52
|
once: (event: string, callback: (payload: any) => void) => () => void;
|
package/lib/core/index.d.ts
CHANGED
|
@@ -28,8 +28,6 @@ declare class PisellOSCore implements PisellCore {
|
|
|
28
28
|
getModule<T extends Module>(name: string): T | null;
|
|
29
29
|
getModuleExports<T = any>(name: string): T | null;
|
|
30
30
|
hasModule(name: string): boolean;
|
|
31
|
-
/** 返回当前已注册模块名,供宿主在切换店铺等生命周期中定向清理运行态。 */
|
|
32
|
-
getModuleNames(): string[];
|
|
33
31
|
destroy(): Promise<void>;
|
|
34
32
|
setContext(ctx: Partial<BusinessContext>): void;
|
|
35
33
|
/**
|
package/lib/core/index.js
CHANGED
|
@@ -210,10 +210,6 @@ var PisellOSCore = class {
|
|
|
210
210
|
hasModule(name) {
|
|
211
211
|
return this.modules.has(name);
|
|
212
212
|
}
|
|
213
|
-
/** 返回当前已注册模块名,供宿主在切换店铺等生命周期中定向清理运行态。 */
|
|
214
|
-
getModuleNames() {
|
|
215
|
-
return Array.from(this.modules.keys());
|
|
216
|
-
}
|
|
217
213
|
// 销毁方法
|
|
218
214
|
async destroy() {
|
|
219
215
|
for (const [name, module2] of this.modules.entries()) {
|
|
@@ -134,8 +134,6 @@ var PromotionAdapter = class {
|
|
|
134
134
|
return this.parseXItemsForYPriceAction(action);
|
|
135
135
|
case import_type.PROMOTION_ACTION_TYPES.BUY_X_GET_Y_FREE:
|
|
136
136
|
return this.parseBuyXGetYFreeAction(action);
|
|
137
|
-
case import_type.PROMOTION_ACTION_TYPES.ITEM_REWARD:
|
|
138
|
-
return this.parseItemRewardAction(action);
|
|
139
137
|
default:
|
|
140
138
|
return void 0;
|
|
141
139
|
}
|
|
@@ -169,24 +167,6 @@ var PromotionAdapter = class {
|
|
|
169
167
|
giftProducts: config.giftProducts || []
|
|
170
168
|
};
|
|
171
169
|
}
|
|
172
|
-
/**
|
|
173
|
-
* 解析 商品奖励 Action
|
|
174
|
-
*/
|
|
175
|
-
parseItemRewardAction(action) {
|
|
176
|
-
const value = action.value || {};
|
|
177
|
-
const config = action.config || {};
|
|
178
|
-
return {
|
|
179
|
-
type: import_type.PROMOTION_ACTION_TYPES.ITEM_REWARD,
|
|
180
|
-
rewardMethod: value.rewardMethod || "free",
|
|
181
|
-
rewardValue: Number(value.rewardValue || 0),
|
|
182
|
-
quantityRule: value.quantityRule || "per_condition_quantity",
|
|
183
|
-
triggerQuantity: Number(value.triggerQuantity || 1),
|
|
184
|
-
rewardQuantity: Number(value.rewardQuantity || 1),
|
|
185
|
-
maxRewardQuantity: value.maxRewardQuantity === void 0 || value.maxRewardQuantity === null ? void 0 : Number(value.maxRewardQuantity),
|
|
186
|
-
rewardTargets: Array.isArray(config.rewardTargets) ? config.rewardTargets : [],
|
|
187
|
-
targetSelection: config.targetSelection || "consumer_best"
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
170
|
/**
|
|
191
171
|
* 获取适用的商品列表
|
|
192
172
|
*
|
|
@@ -169,21 +169,6 @@ export declare class PromotionEvaluator {
|
|
|
169
169
|
* 支持 bundle 子商品的数量计算(主商品数量 × 子商品数量)
|
|
170
170
|
*/
|
|
171
171
|
private processBuyXGetYFree;
|
|
172
|
-
/**
|
|
173
|
-
* 处理 商品奖励 促销
|
|
174
|
-
*
|
|
175
|
-
* 1. 使用 group.products 统计触发条件商品数量
|
|
176
|
-
* 2. 按 quantityRule 计算最多奖励的目标商品数量
|
|
177
|
-
* 3. 在全购物车商品中筛选 rewardTargets
|
|
178
|
-
* 4. 按消费者最优(可节省金额从高到低)选择目标单位
|
|
179
|
-
* 5. 对目标商品拆分并写入 finalPrice,触发商品本身不改价
|
|
180
|
-
*/
|
|
181
|
-
private processItemReward;
|
|
182
|
-
private normalizePositiveInteger;
|
|
183
|
-
private getAvailablePromotionQuantity;
|
|
184
|
-
private buildItemRewardTargetUnits;
|
|
185
|
-
private resolveItemRewardFinalPrice;
|
|
186
|
-
private resolveItemRewardLimit;
|
|
187
172
|
/**
|
|
188
173
|
* 获取未参与任何促销的商品
|
|
189
174
|
*/
|
|
@@ -209,8 +194,6 @@ export declare class PromotionEvaluator {
|
|
|
209
194
|
* 检查商品是否在策略的适用范围内
|
|
210
195
|
*/
|
|
211
196
|
private isProductInStrategy;
|
|
212
|
-
private shouldSkipStrategyForProduct;
|
|
213
|
-
private hasActionType;
|
|
214
197
|
/**
|
|
215
198
|
* 查找商品匹配规则
|
|
216
199
|
*/
|
|
@@ -133,9 +133,6 @@ var PromotionEvaluator = class {
|
|
|
133
133
|
for (const product of products) {
|
|
134
134
|
const applicablePromotions = [];
|
|
135
135
|
for (const config of configs) {
|
|
136
|
-
if (this.shouldSkipStrategyForProduct(product, config)) {
|
|
137
|
-
continue;
|
|
138
|
-
}
|
|
139
136
|
const matchInfo = this.getProductMatchInfo(product, config);
|
|
140
137
|
if (!matchInfo.isMatch) {
|
|
141
138
|
continue;
|
|
@@ -299,16 +296,6 @@ var PromotionEvaluator = class {
|
|
|
299
296
|
if (result.giftInfo) {
|
|
300
297
|
gifts.push(result.giftInfo);
|
|
301
298
|
}
|
|
302
|
-
} else if (actionType === import_type.PROMOTION_ACTION_TYPES.ITEM_REWARD) {
|
|
303
|
-
const result = this.processItemReward(
|
|
304
|
-
group,
|
|
305
|
-
processedQuantityMap,
|
|
306
|
-
products,
|
|
307
|
-
matchedBundleIndexMap
|
|
308
|
-
);
|
|
309
|
-
pricedProducts.push(...result.products);
|
|
310
|
-
totalOriginalAmount = totalOriginalAmount.plus(result.originalAmount);
|
|
311
|
-
totalFinalAmount = totalFinalAmount.plus(result.finalAmount);
|
|
312
299
|
}
|
|
313
300
|
}
|
|
314
301
|
const remainingProducts = this.getRemainingProducts(
|
|
@@ -392,9 +379,6 @@ var PromotionEvaluator = class {
|
|
|
392
379
|
for (const product of products) {
|
|
393
380
|
const applicableStrategies = [];
|
|
394
381
|
for (const config of configs) {
|
|
395
|
-
if (this.shouldSkipStrategyForProduct(product, config)) {
|
|
396
|
-
continue;
|
|
397
|
-
}
|
|
398
382
|
let contextProduct = product;
|
|
399
383
|
if (!matchVariant) {
|
|
400
384
|
const productMatchRule = this.findProductMatchRule(config);
|
|
@@ -471,9 +455,6 @@ var PromotionEvaluator = class {
|
|
|
471
455
|
} else if (actionType === "X_ITEMS_FOR_Y_PRICE") {
|
|
472
456
|
const detail = actionDetail;
|
|
473
457
|
requiredQuantity = detail.x || 0;
|
|
474
|
-
} else if (actionType === "ITEM_REWARD") {
|
|
475
|
-
const detail = actionDetail;
|
|
476
|
-
requiredQuantity = detail.triggerQuantity || 1;
|
|
477
458
|
}
|
|
478
459
|
const productMatchRule = this.findProductMatchRule(config);
|
|
479
460
|
const eligibleProducts = (productMatchRule == null ? void 0 : productMatchRule.value) || [];
|
|
@@ -787,213 +768,6 @@ var PromotionEvaluator = class {
|
|
|
787
768
|
giftInfo
|
|
788
769
|
};
|
|
789
770
|
}
|
|
790
|
-
/**
|
|
791
|
-
* 处理 商品奖励 促销
|
|
792
|
-
*
|
|
793
|
-
* 1. 使用 group.products 统计触发条件商品数量
|
|
794
|
-
* 2. 按 quantityRule 计算最多奖励的目标商品数量
|
|
795
|
-
* 3. 在全购物车商品中筛选 rewardTargets
|
|
796
|
-
* 4. 按消费者最优(可节省金额从高到低)选择目标单位
|
|
797
|
-
* 5. 对目标商品拆分并写入 finalPrice,触发商品本身不改价
|
|
798
|
-
*/
|
|
799
|
-
processItemReward(group, processedQuantityMap, allProducts, matchedBundleIndexMap) {
|
|
800
|
-
const {
|
|
801
|
-
strategyId,
|
|
802
|
-
strategyMetadata,
|
|
803
|
-
actionDetail,
|
|
804
|
-
products: triggerProducts
|
|
805
|
-
} = group;
|
|
806
|
-
const detail = actionDetail;
|
|
807
|
-
const triggerQuantity = this.normalizePositiveInteger(detail.triggerQuantity, 1);
|
|
808
|
-
const rewardQuantity = this.normalizePositiveInteger(detail.rewardQuantity, 1);
|
|
809
|
-
const conditionQuantity = this.getAvailablePromotionQuantity(
|
|
810
|
-
triggerProducts,
|
|
811
|
-
processedQuantityMap,
|
|
812
|
-
matchedBundleIndexMap
|
|
813
|
-
);
|
|
814
|
-
if (conditionQuantity < triggerQuantity) {
|
|
815
|
-
return { products: [], originalAmount: 0, finalAmount: 0 };
|
|
816
|
-
}
|
|
817
|
-
const targetProducts = allProducts.filter(
|
|
818
|
-
(product) => this.isProductMatch(product, detail.rewardTargets || [])
|
|
819
|
-
);
|
|
820
|
-
const targetUnitCandidates = this.buildItemRewardTargetUnits(
|
|
821
|
-
targetProducts,
|
|
822
|
-
processedQuantityMap,
|
|
823
|
-
detail
|
|
824
|
-
);
|
|
825
|
-
if (targetUnitCandidates.length === 0) {
|
|
826
|
-
return { products: [], originalAmount: 0, finalAmount: 0 };
|
|
827
|
-
}
|
|
828
|
-
const rewardLimit = this.resolveItemRewardLimit(
|
|
829
|
-
detail,
|
|
830
|
-
conditionQuantity,
|
|
831
|
-
triggerQuantity,
|
|
832
|
-
rewardQuantity,
|
|
833
|
-
targetUnitCandidates.length
|
|
834
|
-
);
|
|
835
|
-
if (rewardLimit <= 0) {
|
|
836
|
-
return { products: [], originalAmount: 0, finalAmount: 0 };
|
|
837
|
-
}
|
|
838
|
-
const selectedUnits = [...targetUnitCandidates].sort((a, b) => {
|
|
839
|
-
const discountDiff = b.discountAmount.minus(a.discountAmount).toNumber();
|
|
840
|
-
if (discountDiff !== 0)
|
|
841
|
-
return discountDiff;
|
|
842
|
-
return b.originalPrice.minus(a.originalPrice).toNumber();
|
|
843
|
-
}).slice(0, rewardLimit);
|
|
844
|
-
const selectedByProductId = /* @__PURE__ */ new Map();
|
|
845
|
-
for (const unit of selectedUnits) {
|
|
846
|
-
const existing = selectedByProductId.get(unit.product.id);
|
|
847
|
-
if (existing) {
|
|
848
|
-
existing.quantity += 1;
|
|
849
|
-
} else {
|
|
850
|
-
selectedByProductId.set(unit.product.id, {
|
|
851
|
-
quantity: 1,
|
|
852
|
-
finalPrice: unit.finalPrice,
|
|
853
|
-
originalPrice: unit.originalPrice
|
|
854
|
-
});
|
|
855
|
-
}
|
|
856
|
-
}
|
|
857
|
-
const result = [];
|
|
858
|
-
let originalAmount = new import_decimal.default(0);
|
|
859
|
-
let finalAmount = new import_decimal.default(0);
|
|
860
|
-
for (const product of targetProducts) {
|
|
861
|
-
const key = this.getProductKey(product);
|
|
862
|
-
const processedQty = processedQuantityMap.get(key) || 0;
|
|
863
|
-
const availableQty = product.quantity - processedQty;
|
|
864
|
-
if (availableQty <= 0)
|
|
865
|
-
continue;
|
|
866
|
-
const selected = selectedByProductId.get(product.id);
|
|
867
|
-
const selectedQty = (selected == null ? void 0 : selected.quantity) || 0;
|
|
868
|
-
const remainingQty = availableQty - selectedQty;
|
|
869
|
-
if (selectedQty <= 0)
|
|
870
|
-
continue;
|
|
871
|
-
if (selectedQty > 0) {
|
|
872
|
-
result.push({
|
|
873
|
-
...product,
|
|
874
|
-
id: selectedQty === availableQty ? product.id : this.generateRandomId(),
|
|
875
|
-
originalId: product.id,
|
|
876
|
-
quantity: selectedQty,
|
|
877
|
-
finalPrice: this.formatPrice(selected.finalPrice),
|
|
878
|
-
strategyId,
|
|
879
|
-
strategyMetadata,
|
|
880
|
-
inPromotion: true,
|
|
881
|
-
isSplit: selectedQty !== product.quantity
|
|
882
|
-
});
|
|
883
|
-
originalAmount = originalAmount.plus(
|
|
884
|
-
selected.originalPrice.mul(selectedQty)
|
|
885
|
-
);
|
|
886
|
-
finalAmount = finalAmount.plus(selected.finalPrice.mul(selectedQty));
|
|
887
|
-
}
|
|
888
|
-
if (remainingQty > 0) {
|
|
889
|
-
result.push({
|
|
890
|
-
...product,
|
|
891
|
-
quantity: remainingQty,
|
|
892
|
-
finalPrice: this.formatPrice(product.price),
|
|
893
|
-
strategyId: void 0,
|
|
894
|
-
strategyMetadata: void 0,
|
|
895
|
-
inPromotion: false,
|
|
896
|
-
isSplit: selectedQty > 0
|
|
897
|
-
});
|
|
898
|
-
const remainingAmount = new import_decimal.default(product.price).mul(remainingQty);
|
|
899
|
-
originalAmount = originalAmount.plus(remainingAmount);
|
|
900
|
-
finalAmount = finalAmount.plus(remainingAmount);
|
|
901
|
-
}
|
|
902
|
-
processedQuantityMap.set(key, processedQty + availableQty);
|
|
903
|
-
}
|
|
904
|
-
return {
|
|
905
|
-
products: result,
|
|
906
|
-
originalAmount: originalAmount.toNumber(),
|
|
907
|
-
finalAmount: finalAmount.toNumber()
|
|
908
|
-
};
|
|
909
|
-
}
|
|
910
|
-
normalizePositiveInteger(value, fallback) {
|
|
911
|
-
const n = Math.floor(Number(value));
|
|
912
|
-
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
913
|
-
}
|
|
914
|
-
getAvailablePromotionQuantity(products, processedQuantityMap, matchedBundleIndexMap) {
|
|
915
|
-
let total = 0;
|
|
916
|
-
for (const product of products) {
|
|
917
|
-
const key = this.getProductKey(product);
|
|
918
|
-
const processedQty = processedQuantityMap.get(key) || 0;
|
|
919
|
-
const availableQty = product.quantity - processedQty;
|
|
920
|
-
if (availableQty <= 0)
|
|
921
|
-
continue;
|
|
922
|
-
const matchedBundleIndex = matchedBundleIndexMap == null ? void 0 : matchedBundleIndexMap.get(product.id);
|
|
923
|
-
if (matchedBundleIndex !== void 0 && product.bundle) {
|
|
924
|
-
const bundleItem = product.bundle[matchedBundleIndex];
|
|
925
|
-
total += availableQty * ((bundleItem == null ? void 0 : bundleItem.quantity) || 1);
|
|
926
|
-
} else {
|
|
927
|
-
total += availableQty;
|
|
928
|
-
}
|
|
929
|
-
}
|
|
930
|
-
return total;
|
|
931
|
-
}
|
|
932
|
-
buildItemRewardTargetUnits(products, processedQuantityMap, detail) {
|
|
933
|
-
const units = [];
|
|
934
|
-
for (const product of products) {
|
|
935
|
-
const key = this.getProductKey(product);
|
|
936
|
-
const processedQty = processedQuantityMap.get(key) || 0;
|
|
937
|
-
const availableQty = product.quantity - processedQty;
|
|
938
|
-
if (availableQty <= 0)
|
|
939
|
-
continue;
|
|
940
|
-
const originalPrice = new import_decimal.default(product.price || 0);
|
|
941
|
-
const finalPrice = this.resolveItemRewardFinalPrice(originalPrice, detail);
|
|
942
|
-
const discountAmount = originalPrice.minus(finalPrice);
|
|
943
|
-
if (discountAmount.lte(0))
|
|
944
|
-
continue;
|
|
945
|
-
for (let i = 0; i < availableQty; i++) {
|
|
946
|
-
units.push({
|
|
947
|
-
product,
|
|
948
|
-
originalPrice,
|
|
949
|
-
finalPrice,
|
|
950
|
-
discountAmount
|
|
951
|
-
});
|
|
952
|
-
}
|
|
953
|
-
}
|
|
954
|
-
return units;
|
|
955
|
-
}
|
|
956
|
-
resolveItemRewardFinalPrice(originalPrice, detail) {
|
|
957
|
-
const rewardValue = new import_decimal.default(Number(detail.rewardValue) || 0);
|
|
958
|
-
let finalPrice;
|
|
959
|
-
switch (detail.rewardMethod) {
|
|
960
|
-
case "percent_off": {
|
|
961
|
-
const percent = import_decimal.default.min(100, import_decimal.default.max(0, rewardValue));
|
|
962
|
-
finalPrice = originalPrice.mul(new import_decimal.default(100).minus(percent)).div(100);
|
|
963
|
-
break;
|
|
964
|
-
}
|
|
965
|
-
case "amount_off":
|
|
966
|
-
finalPrice = originalPrice.minus(import_decimal.default.max(0, rewardValue));
|
|
967
|
-
break;
|
|
968
|
-
case "fixed_price":
|
|
969
|
-
finalPrice = import_decimal.default.max(0, rewardValue);
|
|
970
|
-
break;
|
|
971
|
-
case "free":
|
|
972
|
-
default:
|
|
973
|
-
finalPrice = new import_decimal.default(0);
|
|
974
|
-
break;
|
|
975
|
-
}
|
|
976
|
-
return import_decimal.default.max(0, import_decimal.default.min(originalPrice, finalPrice)).toDecimalPlaces(2, import_decimal.default.ROUND_HALF_UP);
|
|
977
|
-
}
|
|
978
|
-
resolveItemRewardLimit(detail, conditionQuantity, triggerQuantity, rewardQuantity, targetUnitCount) {
|
|
979
|
-
let limit = 0;
|
|
980
|
-
switch (detail.quantityRule) {
|
|
981
|
-
case "all_targets":
|
|
982
|
-
limit = targetUnitCount;
|
|
983
|
-
break;
|
|
984
|
-
case "max_per_order":
|
|
985
|
-
limit = this.normalizePositiveInteger(
|
|
986
|
-
detail.maxRewardQuantity ?? detail.rewardQuantity,
|
|
987
|
-
rewardQuantity
|
|
988
|
-
);
|
|
989
|
-
break;
|
|
990
|
-
case "per_condition_quantity":
|
|
991
|
-
default:
|
|
992
|
-
limit = Math.floor(conditionQuantity / triggerQuantity) * rewardQuantity;
|
|
993
|
-
break;
|
|
994
|
-
}
|
|
995
|
-
return Math.min(Math.max(0, limit), targetUnitCount);
|
|
996
|
-
}
|
|
997
771
|
/**
|
|
998
772
|
* 获取未参与任何促销的商品
|
|
999
773
|
*/
|
|
@@ -1065,17 +839,8 @@ var PromotionEvaluator = class {
|
|
|
1065
839
|
* 检查商品是否在策略的适用范围内
|
|
1066
840
|
*/
|
|
1067
841
|
isProductInStrategy(product, config) {
|
|
1068
|
-
if (this.shouldSkipStrategyForProduct(product, config)) {
|
|
1069
|
-
return false;
|
|
1070
|
-
}
|
|
1071
842
|
return this.getProductMatchInfo(product, config).isMatch;
|
|
1072
843
|
}
|
|
1073
|
-
shouldSkipStrategyForProduct(product, config) {
|
|
1074
|
-
return Boolean(product._promotionOnlyForItemReward) && !this.hasActionType(config, import_type.PROMOTION_ACTION_TYPES.ITEM_REWARD);
|
|
1075
|
-
}
|
|
1076
|
-
hasActionType(config, actionType) {
|
|
1077
|
-
return (config.actions || []).some((action) => (action == null ? void 0 : action.type) === actionType);
|
|
1078
|
-
}
|
|
1079
844
|
/**
|
|
1080
845
|
* 查找商品匹配规则
|
|
1081
846
|
*/
|