@pisell/pisellos 2.3.74 → 2.3.75
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.js +6 -10
- package/dist/model/strategy/adapter/promotion/index.js +9 -0
- package/dist/model/strategy/adapter/walletPass/example.js +3 -26
- package/dist/model/strategy/strategy-example.js +5 -19
- package/dist/modules/Cart/index.js +0 -3
- package/dist/modules/Cart/utils/cartProduct.js +0 -1
- package/dist/modules/Date/index.js +1 -5
- package/dist/modules/Discount/index.js +2 -4
- package/dist/modules/OpenData/index.js +0 -2
- package/dist/modules/Order/index.js +36 -64
- package/dist/modules/Payment/index.js +97 -162
- package/dist/modules/Rules/index.js +1 -4
- package/dist/modules/Schedule/index.js +0 -1
- package/dist/modules/Schedule/utils.js +0 -1
- package/dist/modules/Step/index.js +0 -1
- package/dist/plugins/request.js +1 -4
- package/dist/plugins/window.js +2 -6
- package/dist/server/index.js +97 -129
- package/dist/server/modules/menu/index.js +32 -41
- package/dist/server/modules/order/index.js +2 -4
- package/dist/server/modules/products/index.js +24 -42
- package/dist/server/modules/quotation/index.js +29 -38
- package/dist/server/modules/resource/index.js +3 -4
- package/dist/server/modules/schedule/index.js +27 -35
- package/dist/server/utils/product.js +0 -1
- package/dist/solution/BaseSales/index.js +38 -41
- package/dist/solution/BookingByStep/index.js +7 -59
- package/dist/solution/BookingByStep/utils/capacity.js +1 -11
- package/dist/solution/BookingByStep/utils/resources.js +1 -3
- package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
- package/dist/solution/BookingTicket/index.js +0 -2
- package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
- package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
- package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
- package/dist/solution/BuyTickets/index.js +9 -12
- package/dist/solution/Checkout/index.js +177 -252
- package/dist/solution/Checkout/utils/index.js +4 -16
- package/dist/solution/RegisterAndLogin/index.js +30 -76
- package/dist/solution/ScanOrder/index.js +50 -60
- package/dist/solution/ShopDiscount/index.js +2 -7
- package/dist/solution/VenueBooking/index.js +45 -55
- package/dist/utils/task.js +15 -18
- package/dist/utils/watch.js +0 -1
- package/lib/apis/picoding.js +2 -0
- package/lib/core/index.js +134 -134
- package/lib/effects/index.js +46 -57
- package/lib/index.js +82 -49
- package/lib/model/index.js +14 -21
- package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
- package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
- package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
- package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
- package/lib/model/strategy/adapter/index.js +100 -64
- package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
- package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
- package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
- package/lib/model/strategy/adapter/itemRule/index.js +83 -57
- package/lib/model/strategy/adapter/itemRule/type.js +97 -36
- package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
- package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
- package/lib/model/strategy/adapter/promotion/examples.js +222 -234
- package/lib/model/strategy/adapter/promotion/index.js +1 -0
- package/lib/model/strategy/adapter/promotion/type.js +243 -36
- package/lib/model/strategy/adapter/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
- package/lib/model/strategy/adapter/walletPass/example.js +217 -190
- package/lib/model/strategy/adapter/walletPass/index.js +75 -51
- package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
- package/lib/model/strategy/adapter/walletPass/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
- package/lib/model/strategy/engine.js +270 -168
- package/lib/model/strategy/index.js +49 -34
- package/lib/model/strategy/strategy-example.js +243 -239
- package/lib/model/strategy/type.js +100 -40
- package/lib/modules/Account/index.js +39 -53
- package/lib/modules/Account/types.js +20 -33
- package/lib/modules/AccountList/index.js +116 -154
- package/lib/modules/AccountList/types.js +30 -31
- package/lib/modules/AccountList/utils.js +18 -30
- package/lib/modules/BaseModule.js +23 -42
- package/lib/modules/BookingContext/index.js +158 -136
- package/lib/modules/BookingContext/types.js +46 -32
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
- package/lib/modules/BookingContext/utils/flexible.js +38 -55
- package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
- package/lib/modules/BookingContext/utils/index.js +124 -41
- package/lib/modules/BookingContext/utils/noResource.js +58 -70
- package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
- package/lib/modules/BookingContext/utils/productExtend.js +202 -155
- package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
- package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
- package/lib/modules/BookingContext/utils/resources.js +209 -167
- package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
- package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
- package/lib/modules/Cart/index.js +170 -124
- package/lib/modules/Cart/types.js +46 -51
- package/lib/modules/Cart/utils/cartAccount.js +40 -39
- package/lib/modules/Cart/utils/cartDate.js +56 -61
- package/lib/modules/Cart/utils/cartDiscount.js +28 -33
- package/lib/modules/Cart/utils/cartNote.js +27 -32
- package/lib/modules/Cart/utils/cartProduct.js +321 -251
- package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
- package/lib/modules/Cart/utils/cartResource.js +70 -78
- package/lib/modules/Cart/utils/changePrice.js +22 -50
- package/lib/modules/Cart/utils/index.js +106 -48
- package/lib/modules/Customer/constants.js +13 -34
- package/lib/modules/Customer/index.js +235 -172
- package/lib/modules/Customer/types.js +38 -35
- package/lib/modules/Date/index.js +116 -115
- package/lib/modules/Date/types.js +16 -28
- package/lib/modules/Date/utils.js +174 -123
- package/lib/modules/Discount/index.js +122 -127
- package/lib/modules/Discount/types.js +9 -31
- package/lib/modules/Guests/index.js +30 -56
- package/lib/modules/Guests/types.js +23 -33
- package/lib/modules/Holder/index.js +209 -189
- package/lib/modules/Holder/types.js +4 -16
- package/lib/modules/Holder/utils.js +20 -49
- package/lib/modules/OpenData/index.js +70 -76
- package/lib/modules/OpenData/types.js +4 -16
- package/lib/modules/OpenData/utils.js +44 -78
- package/lib/modules/Order/index.js +1713 -2118
- package/lib/modules/Order/payment-utils.js +77 -120
- package/lib/modules/Order/types.js +88 -35
- package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
- package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
- package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
- package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
- package/lib/modules/Order/utils.js +814 -647
- package/lib/modules/Payment/cash.js +20 -33
- package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
- package/lib/modules/Payment/eftpos.js +16 -30
- package/lib/modules/Payment/index.js +532 -399
- package/lib/modules/Payment/mx51.js +1 -0
- package/lib/modules/Payment/types.js +230 -108
- package/lib/modules/Payment/utils.js +52 -51
- package/lib/modules/Payment/walletpass.js +485 -660
- package/lib/modules/Product/index.js +51 -46
- package/lib/modules/Product/types.js +4 -16
- package/lib/modules/Product/utils.js +32 -33
- package/lib/modules/ProductList/index.js +113 -123
- package/lib/modules/ProductList/types.js +9 -31
- package/lib/modules/Quotation/index.js +81 -118
- package/lib/modules/Quotation/types.js +4 -16
- package/lib/modules/Resource/index.js +27 -59
- package/lib/modules/Resource/types.js +22 -32
- package/lib/modules/Resource/utils.js +30 -38
- package/lib/modules/ResourcePlanner/index.js +25 -23
- package/lib/modules/ResourcePlanner/localClock.js +54 -119
- package/lib/modules/ResourcePlanner/planner.js +589 -770
- package/lib/modules/ResourcePlanner/types.js +10 -29
- package/lib/modules/Rules/index.js +1218 -959
- package/lib/modules/Rules/types.js +17 -40
- package/lib/modules/SalesSummary/index.js +85 -90
- package/lib/modules/SalesSummary/types.js +4 -16
- package/lib/modules/SalesSummary/utils.js +355 -430
- package/lib/modules/ScanOrderLogger/index.js +59 -79
- package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
- package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
- package/lib/modules/ScanOrderLogger/types.js +4 -16
- package/lib/modules/Schedule/getDateIsInSchedule.js +334 -163
- package/lib/modules/Schedule/index.js +100 -114
- package/lib/modules/Schedule/type.js +4 -16
- package/lib/modules/Schedule/types.js +4 -16
- package/lib/modules/Schedule/utils.js +433 -291
- package/lib/modules/Step/index.js +40 -52
- package/lib/modules/Step/tyeps.js +4 -16
- package/lib/modules/Summary/index.js +66 -71
- package/lib/modules/Summary/types.js +4 -16
- package/lib/modules/Summary/utils.js +773 -418
- package/lib/modules/SurchargeList/index.js +46 -60
- package/lib/modules/SurchargeList/types.js +4 -16
- package/lib/modules/index.js +245 -63
- package/lib/plugins/app.js +4 -16
- package/lib/plugins/index.js +36 -25
- package/lib/plugins/request.js +137 -126
- package/lib/plugins/shopStore.js +4 -16
- package/lib/plugins/user.js +4 -16
- package/lib/plugins/window.js +171 -179
- package/lib/server/index.js +3050 -2665
- package/lib/server/modules/floor-plan/index.js +118 -134
- package/lib/server/modules/floor-plan/types.js +15 -30
- package/lib/server/modules/index.js +106 -68
- package/lib/server/modules/menu/index.js +142 -122
- package/lib/server/modules/menu/types.js +18 -31
- package/lib/server/modules/order/index.js +784 -1002
- package/lib/server/modules/order/types.js +122 -33
- package/lib/server/modules/order/utils/filterBookings.js +219 -194
- package/lib/server/modules/order/utils/filterOrders.js +118 -92
- package/lib/server/modules/payment/index.js +59 -83
- package/lib/server/modules/payment/types.js +4 -16
- package/lib/server/modules/products/index.js +583 -471
- package/lib/server/modules/products/types.js +44 -34
- package/lib/server/modules/quotation/index.js +137 -172
- package/lib/server/modules/quotation/types.js +21 -31
- package/lib/server/modules/resource/index.js +220 -186
- package/lib/server/modules/resource/types.js +42 -33
- package/lib/server/modules/schedule/index.js +135 -123
- package/lib/server/modules/schedule/types.js +14 -21
- package/lib/server/modules/schedule/utils.js +334 -163
- package/lib/server/types.js +4 -16
- package/lib/server/utils/index.js +25 -23
- package/lib/server/utils/product.js +196 -139
- package/lib/server/utils/schedule.js +34 -41
- package/lib/server/utils/small-ticket.js +479 -456
- package/lib/server/utils/time.js +40 -49
- package/lib/solution/BaseSales/index.js +1186 -1410
- package/lib/solution/BaseSales/types.js +42 -38
- package/lib/solution/BaseSales/utils/cartPromotion.js +642 -498
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
- package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +108 -145
- package/lib/solution/BaseSales/utils.js +158 -143
- package/lib/solution/BookingByStep/index.js +1527 -1340
- package/lib/solution/BookingByStep/types.js +40 -99
- package/lib/solution/BookingByStep/utils/capacity.js +192 -160
- package/lib/solution/BookingByStep/utils/products.js +42 -52
- package/lib/solution/BookingByStep/utils/resources.js +527 -330
- package/lib/solution/BookingByStep/utils/stock.js +65 -44
- package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
- package/lib/solution/BookingTicket/index.js +607 -522
- package/lib/solution/BookingTicket/types.js +99 -77
- package/lib/solution/BookingTicket/utils/addProductDecision.js +226 -189
- package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
- package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
- package/lib/solution/BookingTicket/utils/cartView.js +114 -99
- package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
- package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
- package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
- package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
- package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
- package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
- package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
- package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
- package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
- package/lib/solution/BuyTickets/index.js +67 -70
- package/lib/solution/BuyTickets/types.js +22 -38
- package/lib/solution/Checkout/index.js +1451 -1158
- package/lib/solution/Checkout/types.js +91 -61
- package/lib/solution/Checkout/utils/index.js +228 -156
- package/lib/solution/PlaceOrder/index.js +55 -0
- package/lib/solution/RegisterAndLogin/config.js +493 -460
- package/lib/solution/RegisterAndLogin/index.js +633 -630
- package/lib/solution/RegisterAndLogin/types.js +189 -76
- package/lib/solution/RegisterAndLogin/utils.js +183 -125
- package/lib/solution/Sales/index.js +328 -324
- package/lib/solution/Sales/types.js +27 -33
- package/lib/solution/ScanOrder/index.js +832 -864
- package/lib/solution/ScanOrder/types.js +33 -34
- package/lib/solution/ScanOrder/utils.js +409 -374
- package/lib/solution/ShopDiscount/index.js +226 -232
- package/lib/solution/ShopDiscount/types.js +15 -37
- package/lib/solution/ShopDiscount/utils.js +300 -172
- package/lib/solution/UnifiedBookingSales/index.js +1035 -1201
- package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +99 -159
- package/lib/solution/UnifiedBookingSales/types.js +10 -32
- package/lib/solution/VenueBooking/index.js +811 -879
- package/lib/solution/VenueBooking/types.js +19 -39
- package/lib/solution/VenueBooking/utils/dateSummary.js +27 -56
- package/lib/solution/VenueBooking/utils/resource.js +31 -54
- package/lib/solution/VenueBooking/utils/slotMerge.js +94 -107
- package/lib/solution/VenueBooking/utils/timeSlot.js +132 -132
- package/lib/solution/VenueBooking/utils.js +130 -67
- package/lib/solution/index.js +124 -41
- package/lib/store/createStore.js +32 -29
- package/lib/types/index.js +4 -16
- package/lib/utils/payment-number.js +26 -46
- package/lib/utils/task.js +36 -36
- package/lib/utils/watch.js +81 -47
- package/package.json +2 -1
|
@@ -1,42 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
-
mod
|
|
26
|
-
));
|
|
27
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
"use strict";
|
|
28
2
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
__export(evaluator_exports, {
|
|
32
|
-
WalletPassEvaluator: () => WalletPassEvaluator
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
33
5
|
});
|
|
34
|
-
|
|
35
|
-
var
|
|
36
|
-
var
|
|
37
|
-
var
|
|
38
|
-
var
|
|
39
|
-
|
|
6
|
+
exports.WalletPassEvaluator = void 0;
|
|
7
|
+
var _index = require("../../index");
|
|
8
|
+
var _utils = require("./utils");
|
|
9
|
+
var _locales = require("./locales");
|
|
10
|
+
var _decimal = _interopRequireDefault(require("decimal.js"));
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
const defaultStrategyMetadataCustom = {
|
|
40
13
|
maxDeductionAmount: 99999,
|
|
41
14
|
maxUsagePerOrder: 0,
|
|
42
15
|
allowCrossProduct: true,
|
|
@@ -45,34 +18,54 @@ var defaultStrategyMetadataCustom = {
|
|
|
45
18
|
maxPassesPerItem: 0,
|
|
46
19
|
deductOptionPrice: false
|
|
47
20
|
};
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 条件 field → reasonCode 映射
|
|
24
|
+
* 用于将策略引擎返回的 failedField 转换为本地化文案 key
|
|
25
|
+
*/
|
|
26
|
+
const FIELD_REASON_CODE_MAP = {
|
|
27
|
+
orderTotalAmount: 'order_total_amount_not_enough',
|
|
28
|
+
applicableProductTotalAmount: 'applicable_product_total_amount_not_enough',
|
|
29
|
+
applicableProductCount: 'applicable_product_count_not_enough'
|
|
52
30
|
};
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 金额类型 field 集合(需要在文案前拼货币符号)
|
|
34
|
+
*/
|
|
35
|
+
const AMOUNT_FIELDS = new Set(['orderTotalAmount', 'applicableProductTotalAmount']);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 用阈值与货币符号替换文案中的占位符
|
|
39
|
+
* 支持占位符:{value} / ${value} / {currency}
|
|
40
|
+
*/
|
|
41
|
+
function formatReason(template, value, currency = '') {
|
|
42
|
+
if (!template) return template;
|
|
43
|
+
const v = value === undefined || value === null ? '' : String(value);
|
|
44
|
+
const c = currency === undefined || currency === null ? '' : String(currency);
|
|
45
|
+
// 注意:必须先替换 value,再替换 currency
|
|
46
|
+
// 否则 currency 注入的 "$" 会被后续的 /\$\{value\}/ 正则误吞
|
|
47
|
+
// 使用函数作为替换参数,避免替换串中的 "$" 被 String.prototype.replace
|
|
48
|
+
// 当作特殊序列(如 $$ -> $、$& 等)处理
|
|
62
49
|
return template.replace(/\$\{value\}/g, () => v).replace(/\{value\}/g, () => v).replace(/\{currency\}/g, () => c);
|
|
63
50
|
}
|
|
64
|
-
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Wallet Pass 评估器
|
|
54
|
+
* 用于评估哪些 voucher 可以在当前订单中使用
|
|
55
|
+
*/
|
|
56
|
+
class WalletPassEvaluator {
|
|
57
|
+
engine;
|
|
58
|
+
strategyConfigs = [];
|
|
59
|
+
locale = 'en';
|
|
60
|
+
otherParams = {};
|
|
65
61
|
constructor() {
|
|
66
|
-
this.
|
|
67
|
-
this.locale = "en";
|
|
68
|
-
this.otherParams = {};
|
|
69
|
-
this.engine = new import__.StrategyEngine({
|
|
62
|
+
this.engine = new _index.StrategyEngine({
|
|
70
63
|
debug: false,
|
|
71
64
|
enableTrace: false
|
|
72
65
|
});
|
|
73
66
|
}
|
|
74
67
|
setStrategyConfigs(strategyConfigs) {
|
|
75
|
-
const newStrategyConfigs = strategyConfigs.filter(
|
|
68
|
+
const newStrategyConfigs = strategyConfigs.filter(item => item.metadata.type === 'wallet_pass');
|
|
76
69
|
this.strategyConfigs = newStrategyConfigs;
|
|
77
70
|
}
|
|
78
71
|
getStrategyConfigs() {
|
|
@@ -85,9 +78,9 @@ var WalletPassEvaluator = class {
|
|
|
85
78
|
this.otherParams = otherParams;
|
|
86
79
|
}
|
|
87
80
|
getText(key) {
|
|
88
|
-
|
|
89
|
-
return (_b = (_a = import_locales.locales) == null ? void 0 : _a[this.locale]) == null ? void 0 : _b[key];
|
|
81
|
+
return _locales.locales?.[this.locale]?.[key];
|
|
90
82
|
}
|
|
83
|
+
|
|
91
84
|
/**
|
|
92
85
|
* 搜索券的格式
|
|
93
86
|
* @param input 输入
|
|
@@ -95,20 +88,19 @@ var WalletPassEvaluator = class {
|
|
|
95
88
|
*/
|
|
96
89
|
searchVoucherFormat(input) {
|
|
97
90
|
const results = this.evaluate(input);
|
|
98
|
-
return results.map(
|
|
99
|
-
var _a, _b;
|
|
91
|
+
return results.map(item => {
|
|
100
92
|
if (item.isApplicable) {
|
|
101
93
|
return {
|
|
102
94
|
...item.voucher,
|
|
103
95
|
config: {
|
|
104
|
-
...
|
|
96
|
+
...item?.strategyResult?.config.metadata.custom
|
|
105
97
|
}
|
|
106
98
|
};
|
|
107
99
|
} else {
|
|
108
100
|
return {
|
|
109
101
|
...item.voucher,
|
|
110
102
|
config: {
|
|
111
|
-
...
|
|
103
|
+
...item?.strategyResult?.config.metadata.custom
|
|
112
104
|
},
|
|
113
105
|
_unified_available_status: 0,
|
|
114
106
|
reason: item.reason,
|
|
@@ -117,20 +109,28 @@ var WalletPassEvaluator = class {
|
|
|
117
109
|
}
|
|
118
110
|
});
|
|
119
111
|
}
|
|
112
|
+
|
|
120
113
|
/**
|
|
121
114
|
* 评估可用的 vouchers
|
|
122
115
|
*/
|
|
123
116
|
evaluate(input) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
117
|
+
const {
|
|
118
|
+
orderTotalAmount,
|
|
119
|
+
products,
|
|
120
|
+
vouchers,
|
|
121
|
+
strategyConfigs
|
|
122
|
+
} = input;
|
|
123
|
+
|
|
124
|
+
// 提取订单中的商品ID
|
|
125
|
+
const productIds = products.map(p => p.product_id);
|
|
127
126
|
const results = [];
|
|
127
|
+
|
|
128
|
+
// 遍历每个 voucher 进行评估
|
|
128
129
|
for (const voucher of vouchers) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
strategyConfigs || this.strategyConfigs
|
|
132
|
-
);
|
|
130
|
+
// 查找适用此 voucher 的策略配置
|
|
131
|
+
const applicableStrategies = this.findApplicableStrategies(voucher, strategyConfigs || this.strategyConfigs);
|
|
133
132
|
if (applicableStrategies.length === 0) {
|
|
133
|
+
// 没有匹配的策略 默认可用
|
|
134
134
|
results.push({
|
|
135
135
|
voucher,
|
|
136
136
|
isApplicable: true,
|
|
@@ -138,8 +138,8 @@ var WalletPassEvaluator = class {
|
|
|
138
138
|
maxDeduction: 0,
|
|
139
139
|
deductTaxAndFee: true,
|
|
140
140
|
applicableProductIds: [],
|
|
141
|
-
reason:
|
|
142
|
-
reasonCode:
|
|
141
|
+
reason: '',
|
|
142
|
+
reasonCode: '',
|
|
143
143
|
strategyResult: {
|
|
144
144
|
config: {
|
|
145
145
|
metadata: {
|
|
@@ -152,13 +152,20 @@ var WalletPassEvaluator = class {
|
|
|
152
152
|
});
|
|
153
153
|
continue;
|
|
154
154
|
}
|
|
155
|
+
|
|
156
|
+
// 对每个策略进行评估(取第一个匹配的策略)
|
|
155
157
|
const strategy = applicableStrategies[0];
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
158
|
+
|
|
159
|
+
// 从 voucher 中获取适用商品ID
|
|
160
|
+
const applicableProductIds = (0, _utils.getApplicableProductIds)(voucher);
|
|
161
|
+
|
|
162
|
+
// 计算适用商品的总金额和数量
|
|
163
|
+
const {
|
|
164
|
+
applicableTotal,
|
|
165
|
+
applicableCount
|
|
166
|
+
} = this.calculateApplicableProducts(products, applicableProductIds, strategy?.metadata?.custom?.deductTaxAndFee ?? true);
|
|
167
|
+
|
|
168
|
+
// 准备运行时上下文
|
|
162
169
|
const context = {
|
|
163
170
|
entities: {
|
|
164
171
|
voucher,
|
|
@@ -169,7 +176,7 @@ var WalletPassEvaluator = class {
|
|
|
169
176
|
}
|
|
170
177
|
},
|
|
171
178
|
attributes: {
|
|
172
|
-
orderTotalAmount,
|
|
179
|
+
orderTotalAmount: orderTotalAmount,
|
|
173
180
|
applicableProductTotalAmount: applicableTotal,
|
|
174
181
|
applicableProductCount: applicableCount,
|
|
175
182
|
voucherProductId: voucher.product_id,
|
|
@@ -179,7 +186,11 @@ var WalletPassEvaluator = class {
|
|
|
179
186
|
timestamp: Date.now()
|
|
180
187
|
}
|
|
181
188
|
};
|
|
189
|
+
|
|
190
|
+
// 执行策略评估
|
|
182
191
|
const evaluationResult = this.engine.evaluate(strategy, context);
|
|
192
|
+
|
|
193
|
+
// 从策略配置中获取业务配置
|
|
183
194
|
const businessConfig = strategy.metadata.custom || {};
|
|
184
195
|
const maxDeduction = businessConfig.maxDeductionAmount || 0;
|
|
185
196
|
const canUseCount = businessConfig.maxUsagePerOrder || 0;
|
|
@@ -195,26 +206,29 @@ var WalletPassEvaluator = class {
|
|
|
195
206
|
strategyResult: evaluationResult
|
|
196
207
|
});
|
|
197
208
|
} else {
|
|
198
|
-
|
|
199
|
-
let
|
|
200
|
-
|
|
201
|
-
const
|
|
209
|
+
// 优先根据失败的 field 映射到具体的 reasonCode(更精确的失败原因)
|
|
210
|
+
let reasonCode = 'not_meet_the_required_conditions';
|
|
211
|
+
let thresholdValue = undefined;
|
|
212
|
+
const failedField = evaluationResult.matched?.failedField;
|
|
213
|
+
const failedRule = evaluationResult.matched?.failedRules?.[0];
|
|
202
214
|
if (failedField && FIELD_REASON_CODE_MAP[failedField]) {
|
|
203
215
|
reasonCode = FIELD_REASON_CODE_MAP[failedField];
|
|
204
|
-
thresholdValue = failedRule
|
|
216
|
+
thresholdValue = failedRule?.value;
|
|
205
217
|
} else if (evaluationResult.code) {
|
|
218
|
+
// 兜底:保留原有 code → reasonCode 映射
|
|
206
219
|
const codeMapping = {
|
|
207
|
-
INSUFFICIENT_AMOUNT:
|
|
208
|
-
USAGE_LIMIT_EXCEEDED:
|
|
209
|
-
CHANNEL_NOT_ALLOWED:
|
|
210
|
-
ORDER_TYPE_NOT_ALLOWED:
|
|
211
|
-
DEDUCTION_LIMIT_EXCEEDED:
|
|
220
|
+
INSUFFICIENT_AMOUNT: 'not_meet_the_required_conditions',
|
|
221
|
+
USAGE_LIMIT_EXCEEDED: 'usage_limit_reached',
|
|
222
|
+
CHANNEL_NOT_ALLOWED: 'not_available_for_this_channel',
|
|
223
|
+
ORDER_TYPE_NOT_ALLOWED: 'not_valid_for_this_order_type',
|
|
224
|
+
DEDUCTION_LIMIT_EXCEEDED: 'exceeds_the_maximum_deduction_limit'
|
|
212
225
|
};
|
|
213
|
-
reasonCode = codeMapping[evaluationResult.code] ||
|
|
226
|
+
reasonCode = codeMapping[evaluationResult.code] || 'not_meet_the_required_conditions';
|
|
214
227
|
}
|
|
215
228
|
const rawText = this.getText(reasonCode);
|
|
216
|
-
|
|
217
|
-
const
|
|
229
|
+
// 金额类型字段:从 otherParams.getData 取货币符号;非金额或取不到则留空
|
|
230
|
+
const currency = failedField && AMOUNT_FIELDS.has(failedField) ? this.otherParams?.getData?.('shop_symbol') || '' : '';
|
|
231
|
+
const reason = thresholdValue !== undefined ? formatReason(rawText, thresholdValue, currency) : rawText;
|
|
218
232
|
results.push({
|
|
219
233
|
voucher,
|
|
220
234
|
isApplicable: false,
|
|
@@ -223,36 +237,47 @@ var WalletPassEvaluator = class {
|
|
|
223
237
|
deductTaxAndFee: false,
|
|
224
238
|
applicableProductIds: [],
|
|
225
239
|
reason,
|
|
226
|
-
reasonCode,
|
|
240
|
+
reasonCode: reasonCode,
|
|
227
241
|
strategyResult: evaluationResult
|
|
228
242
|
});
|
|
229
243
|
}
|
|
230
244
|
}
|
|
231
245
|
return results;
|
|
232
246
|
}
|
|
247
|
+
|
|
233
248
|
/** 检查代金券/折扣卡是否可用 并返回config */
|
|
234
249
|
checkVoucherAvailability(input) {
|
|
235
|
-
|
|
236
|
-
|
|
250
|
+
const {
|
|
251
|
+
orderTotalAmount,
|
|
252
|
+
products,
|
|
253
|
+
vouchers
|
|
254
|
+
} = input;
|
|
237
255
|
const results = this.evaluate(input);
|
|
238
|
-
const isAvailable =
|
|
256
|
+
const isAvailable = results[0]?.isApplicable || false;
|
|
239
257
|
return {
|
|
240
258
|
isAvailable,
|
|
241
259
|
config: {
|
|
242
|
-
...
|
|
260
|
+
...results[0]?.strategyResult?.config?.metadata?.custom
|
|
243
261
|
}
|
|
244
262
|
};
|
|
245
263
|
}
|
|
264
|
+
|
|
246
265
|
/**
|
|
247
266
|
* 获取推荐券
|
|
248
267
|
* @param input 输入
|
|
249
268
|
* @returns 返回推荐券列表
|
|
250
269
|
*/
|
|
251
270
|
getRecommendedVouchers(input) {
|
|
252
|
-
const {
|
|
271
|
+
const {
|
|
272
|
+
orderTotalAmount,
|
|
273
|
+
products,
|
|
274
|
+
vouchers
|
|
275
|
+
} = input;
|
|
276
|
+
// 基于后端返回的状态不可用券
|
|
253
277
|
const noApplicableVoucher = [];
|
|
278
|
+
// 基于后端返回的状态可用券
|
|
254
279
|
const applicableVoucher = [];
|
|
255
|
-
vouchers.forEach(
|
|
280
|
+
vouchers.forEach(voucher => {
|
|
256
281
|
if (voucher.unified_available_status === 1) {
|
|
257
282
|
applicableVoucher.push(voucher);
|
|
258
283
|
} else {
|
|
@@ -264,17 +289,17 @@ var WalletPassEvaluator = class {
|
|
|
264
289
|
vouchers: applicableVoucher
|
|
265
290
|
});
|
|
266
291
|
const newVouchers = [];
|
|
267
|
-
results.forEach(
|
|
268
|
-
var _a, _b, _c;
|
|
292
|
+
results.forEach(item => {
|
|
269
293
|
if (item.isApplicable) {
|
|
270
294
|
newVouchers.push({
|
|
271
295
|
...item.voucher,
|
|
272
296
|
config: {
|
|
273
297
|
...defaultStrategyMetadataCustom,
|
|
274
|
-
...(
|
|
298
|
+
...(item?.strategyResult?.config?.metadata?.custom || {})
|
|
275
299
|
}
|
|
276
300
|
});
|
|
277
301
|
} else {
|
|
302
|
+
// 不可用的券,添加原因信息
|
|
278
303
|
noApplicableVoucher.push({
|
|
279
304
|
...item.voucher,
|
|
280
305
|
_unified_available_status: 0,
|
|
@@ -283,13 +308,12 @@ var WalletPassEvaluator = class {
|
|
|
283
308
|
});
|
|
284
309
|
}
|
|
285
310
|
});
|
|
286
|
-
const {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
);
|
|
311
|
+
const {
|
|
312
|
+
recommended,
|
|
313
|
+
transformList
|
|
314
|
+
} = this.processVouchers(newVouchers, orderTotalAmount, products);
|
|
291
315
|
const recommendedAmount = recommended.reduce((sum, item) => {
|
|
292
|
-
return new
|
|
316
|
+
return new _decimal.default(sum).add(item._available_max_amount || 0).toNumber();
|
|
293
317
|
}, 0);
|
|
294
318
|
return {
|
|
295
319
|
// 推荐券总金额
|
|
@@ -311,6 +335,7 @@ var WalletPassEvaluator = class {
|
|
|
311
335
|
}
|
|
312
336
|
return voucher;
|
|
313
337
|
}
|
|
338
|
+
|
|
314
339
|
/**
|
|
315
340
|
* 优惠券处理函数
|
|
316
341
|
* @param applicableVouchers 可用的券列表
|
|
@@ -319,16 +344,13 @@ var WalletPassEvaluator = class {
|
|
|
319
344
|
* @returns 返回推荐券列表和全部列表,每个券包含 _available_max_amount 和 _unified_available_status
|
|
320
345
|
*/
|
|
321
346
|
processVouchers(vouchers, orderTotalAmount, products) {
|
|
322
|
-
const result = (0,
|
|
347
|
+
const result = (0, _utils.processVouchers)(vouchers, orderTotalAmount, products);
|
|
323
348
|
return {
|
|
324
|
-
recommended: result.recommended.map(
|
|
325
|
-
|
|
326
|
-
),
|
|
327
|
-
transformList: result.transformList.map(
|
|
328
|
-
(item) => this.enhanceWithReason(item)
|
|
329
|
-
)
|
|
349
|
+
recommended: result.recommended.map(item => this.enhanceWithReason(item)),
|
|
350
|
+
transformList: result.transformList.map(item => this.enhanceWithReason(item))
|
|
330
351
|
};
|
|
331
352
|
}
|
|
353
|
+
|
|
332
354
|
/**
|
|
333
355
|
* 重新计算优惠券状态(基于已选券的增量计算)
|
|
334
356
|
* @param allVouchers 所有原始券列表
|
|
@@ -338,47 +360,44 @@ var WalletPassEvaluator = class {
|
|
|
338
360
|
* @returns 返回更新后的所有券列表和已选券的详细抵扣信息
|
|
339
361
|
*/
|
|
340
362
|
recalculateVouchers(allVouchers, selectedVouchers, orderTotalAmount, products) {
|
|
341
|
-
const result = (0,
|
|
342
|
-
allVouchers,
|
|
343
|
-
selectedVouchers,
|
|
344
|
-
orderTotalAmount,
|
|
345
|
-
products
|
|
346
|
-
);
|
|
363
|
+
const result = (0, _utils.recalculateVouchers)(allVouchers, selectedVouchers, orderTotalAmount, products);
|
|
347
364
|
return {
|
|
348
|
-
allWithUpdatedStatus: result.allWithUpdatedStatus.map(
|
|
349
|
-
|
|
350
|
-
),
|
|
351
|
-
selectedWithDetails: result.selectedWithDetails.map(
|
|
352
|
-
(item) => this.enhanceWithReason(item)
|
|
353
|
-
)
|
|
365
|
+
allWithUpdatedStatus: result.allWithUpdatedStatus.map(item => this.enhanceWithReason(item)),
|
|
366
|
+
selectedWithDetails: result.selectedWithDetails.map(item => this.enhanceWithReason(item))
|
|
354
367
|
};
|
|
355
368
|
}
|
|
369
|
+
|
|
356
370
|
/**
|
|
357
371
|
* 查找适用于指定 voucher 的策略配置
|
|
358
372
|
*/
|
|
359
373
|
findApplicableStrategies(voucher, strategyConfigs) {
|
|
360
|
-
return strategyConfigs.filter(
|
|
374
|
+
return strategyConfigs.filter(config => {
|
|
375
|
+
// 检查策略的 conditions 中是否包含匹配此 voucher 的规则
|
|
361
376
|
return this.checkVoucherInStrategy(voucher.product_id, config);
|
|
362
377
|
});
|
|
363
378
|
}
|
|
379
|
+
|
|
364
380
|
/**
|
|
365
381
|
* 检查策略中是否包含指定的 voucher ID
|
|
366
382
|
*/
|
|
367
383
|
checkVoucherInStrategy(voucherProductId, config) {
|
|
368
384
|
const rules = config.conditions.rules;
|
|
369
385
|
for (const rule of rules) {
|
|
370
|
-
|
|
386
|
+
// 如果是条件组,递归检查
|
|
387
|
+
if ('operator' in rule && 'rules' in rule) {
|
|
371
388
|
if (this.checkVoucherInConditionGroup(voucherProductId, rule)) {
|
|
372
389
|
return true;
|
|
373
390
|
}
|
|
374
391
|
} else {
|
|
392
|
+
// 检查是否是 voucherProductId 字段的规则
|
|
375
393
|
const conditionRule = rule;
|
|
376
|
-
if (conditionRule.field ===
|
|
394
|
+
if (conditionRule.field === 'voucherProductId' && conditionRule.operator === 'in' && Array.isArray(conditionRule.value)) {
|
|
377
395
|
if (conditionRule.value.includes(voucherProductId)) {
|
|
378
396
|
return true;
|
|
379
397
|
}
|
|
380
398
|
}
|
|
381
|
-
|
|
399
|
+
// 支持等于判断
|
|
400
|
+
if (conditionRule.field === 'voucherProductId' && (conditionRule.operator === '=' || conditionRule.operator === '==')) {
|
|
382
401
|
if (conditionRule.value === voucherProductId) {
|
|
383
402
|
return true;
|
|
384
403
|
}
|
|
@@ -387,22 +406,23 @@ var WalletPassEvaluator = class {
|
|
|
387
406
|
}
|
|
388
407
|
return false;
|
|
389
408
|
}
|
|
409
|
+
|
|
390
410
|
/**
|
|
391
411
|
* 递归检查条件组中是否包含 voucher ID
|
|
392
412
|
*/
|
|
393
413
|
checkVoucherInConditionGroup(voucherProductId, group) {
|
|
394
414
|
for (const rule of group.rules) {
|
|
395
|
-
if (
|
|
415
|
+
if ('operator' in rule && 'rules' in rule) {
|
|
396
416
|
if (this.checkVoucherInConditionGroup(voucherProductId, rule)) {
|
|
397
417
|
return true;
|
|
398
418
|
}
|
|
399
419
|
} else {
|
|
400
|
-
if (rule.field ===
|
|
420
|
+
if (rule.field === 'voucherProductId' && rule.operator === 'in' && Array.isArray(rule.value)) {
|
|
401
421
|
if (rule.value.includes(voucherProductId)) {
|
|
402
422
|
return true;
|
|
403
423
|
}
|
|
404
424
|
}
|
|
405
|
-
if (rule.field ===
|
|
425
|
+
if (rule.field === 'voucherProductId' && (rule.operator === '=' || rule.operator === '==')) {
|
|
406
426
|
if (rule.value === voucherProductId) {
|
|
407
427
|
return true;
|
|
408
428
|
}
|
|
@@ -411,43 +431,53 @@ var WalletPassEvaluator = class {
|
|
|
411
431
|
}
|
|
412
432
|
return false;
|
|
413
433
|
}
|
|
434
|
+
|
|
414
435
|
/**
|
|
415
436
|
* 计算适用商品的总金额和数量
|
|
416
437
|
*/
|
|
417
438
|
calculateApplicableProducts(products, applicableProductIds, deductTaxAndFee) {
|
|
418
439
|
let total = 0;
|
|
419
440
|
let count = 0;
|
|
441
|
+
|
|
442
|
+
// 如果为空数组,不适用任何商品
|
|
420
443
|
if (applicableProductIds !== null && applicableProductIds.length === 0) {
|
|
421
|
-
return {
|
|
444
|
+
return {
|
|
445
|
+
applicableTotal: 0,
|
|
446
|
+
applicableCount: 0
|
|
447
|
+
};
|
|
422
448
|
}
|
|
423
|
-
products.forEach(
|
|
424
|
-
const productQuantity = (0,
|
|
449
|
+
products.forEach(product => {
|
|
450
|
+
const productQuantity = (0, _utils.getProductQuantity)(product);
|
|
451
|
+
|
|
452
|
+
// 检查主商品是否适用
|
|
425
453
|
const isMainProductApplicable = applicableProductIds === null || applicableProductIds.includes(product.product_id);
|
|
426
454
|
if (isMainProductApplicable) {
|
|
427
|
-
|
|
455
|
+
// 计算主商品价格(包含加减价子商品)
|
|
456
|
+
total += (0, _utils.getMainProductPrice)(product, deductTaxAndFee) * productQuantity;
|
|
428
457
|
count += productQuantity;
|
|
429
458
|
}
|
|
459
|
+
|
|
460
|
+
// 检查原价子商品(需要单独判断适用性)
|
|
430
461
|
if (product.product_bundle && product.product_bundle.length > 0) {
|
|
431
|
-
product.product_bundle.forEach(
|
|
432
|
-
|
|
462
|
+
product.product_bundle.forEach(bundleItem => {
|
|
463
|
+
// 只处理原价子商品,加减价子商品已包含在主商品价格中
|
|
464
|
+
if ((0, _utils.getBundleItemIsOriginalPrice)(bundleItem)) {
|
|
465
|
+
// 检查子商品是否适用
|
|
433
466
|
const isBundleItemApplicable = applicableProductIds === null || applicableProductIds.includes(bundleItem.bundle_product_id);
|
|
434
467
|
if (isBundleItemApplicable) {
|
|
468
|
+
// 计算原价子商品价格
|
|
435
469
|
const bundleItemQuantity = bundleItem.num * productQuantity;
|
|
436
|
-
total += (0,
|
|
437
|
-
bundleItem,
|
|
438
|
-
productQuantity,
|
|
439
|
-
deductTaxAndFee
|
|
440
|
-
);
|
|
470
|
+
total += (0, _utils.getBundleItemPrice)(bundleItem, productQuantity, deductTaxAndFee);
|
|
441
471
|
count += bundleItemQuantity;
|
|
442
472
|
}
|
|
443
473
|
}
|
|
444
474
|
});
|
|
445
475
|
}
|
|
446
476
|
});
|
|
447
|
-
return {
|
|
477
|
+
return {
|
|
478
|
+
applicableTotal: total,
|
|
479
|
+
applicableCount: count
|
|
480
|
+
};
|
|
448
481
|
}
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
0 && (module.exports = {
|
|
452
|
-
WalletPassEvaluator
|
|
453
|
-
});
|
|
482
|
+
}
|
|
483
|
+
exports.WalletPassEvaluator = WalletPassEvaluator;
|