@pisell/pisellos 2.2.308 → 2.2.310
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/promotion/index.js +9 -0
- package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +2 -0
- package/dist/model/strategy/adapter/walletPass/evaluator.js +4 -2
- package/dist/modules/BookingContext/index.js +4 -4
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +58 -19
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +24 -12
- package/dist/modules/Customer/index.js +6 -3
- package/dist/modules/Customer/types.d.ts +2 -0
- package/dist/modules/Discount/availability.d.ts +7 -0
- package/dist/modules/Discount/availability.js +49 -0
- package/dist/modules/Discount/entitlementPass.d.ts +34 -0
- package/dist/modules/Discount/entitlementPass.js +147 -0
- package/dist/modules/Discount/index.d.ts +2 -2
- package/dist/modules/Discount/index.js +37 -151
- package/dist/modules/Discount/types.d.ts +36 -5
- package/dist/modules/OpenData/index.d.ts +1 -1
- package/dist/modules/OpenData/index.js +21 -12
- package/dist/modules/Order/index.d.ts +33 -4
- package/dist/modules/Order/index.js +830 -411
- package/dist/modules/Order/types.d.ts +17 -0
- package/dist/modules/Order/utils/orderCollectionIdentity.js +16 -12
- package/dist/modules/Order/utils/weighedProduct.d.ts +12 -0
- package/dist/modules/Order/utils/weighedProduct.js +94 -0
- package/dist/modules/Order/utils.d.ts +14 -2
- package/dist/modules/Order/utils.js +280 -79
- package/dist/modules/Payment/index.d.ts +0 -5
- package/dist/modules/Payment/index.js +35 -85
- package/dist/modules/Payment/types.d.ts +21 -1
- package/dist/modules/Payment/types.js +2 -0
- package/dist/modules/Payment/walletpass.d.ts +1 -1
- package/dist/modules/Payment/walletpass.js +80 -47
- package/dist/modules/ProductList/index.js +18 -5
- package/dist/modules/Rules/index.d.ts +2 -2
- package/dist/modules/Rules/index.js +484 -188
- package/dist/modules/Rules/types.d.ts +6 -0
- package/dist/server/index.js +8 -5
- package/dist/server/modules/order/index.js +6 -0
- package/dist/server/modules/order/types.d.ts +12 -0
- package/dist/server/modules/payment/index.d.ts +25 -6
- package/dist/server/modules/payment/index.js +660 -133
- package/dist/server/utils/small-ticket.d.ts +8 -5
- package/dist/server/utils/small-ticket.js +1269 -199
- package/dist/solution/BaseSales/index.d.ts +11 -2
- package/dist/solution/BaseSales/index.js +1463 -1173
- package/dist/solution/BaseSales/types.d.ts +7 -3
- package/dist/solution/BaseSales/utils/cartPromotion.js +141 -126
- package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +40 -25
- package/dist/solution/BaseSales/utils.js +3 -2
- package/dist/solution/BookingTicket/index.d.ts +11 -2
- package/dist/solution/BookingTicket/index.js +663 -542
- package/dist/solution/BookingTicket/types.d.ts +5 -1
- package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +2 -0
- package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +338 -147
- package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +8 -4
- package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +6 -0
- package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.js +19 -6
- package/dist/solution/ScanOrder/utils.js +3 -2
- package/dist/solution/ShopDiscount/index.d.ts +2 -0
- package/dist/solution/ShopDiscount/index.js +99 -42
- package/dist/solution/ShopDiscount/utils.d.ts +4 -2
- package/dist/solution/ShopDiscount/utils.js +43 -23
- package/dist/solution/UnifiedBookingSales/index.d.ts +2 -2
- package/dist/solution/UnifiedBookingSales/index.js +5 -5
- package/dist/utils/os-private-payload.d.ts +5 -0
- package/dist/utils/os-private-payload.js +17 -0
- package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +2 -0
- package/lib/model/strategy/adapter/walletPass/evaluator.js +2 -0
- package/lib/modules/BookingContext/index.js +3 -3
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +35 -6
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +13 -6
- package/lib/modules/Customer/index.js +5 -1
- package/lib/modules/Customer/types.d.ts +2 -0
- package/lib/modules/Discount/availability.d.ts +7 -0
- package/lib/modules/Discount/availability.js +43 -0
- package/lib/modules/Discount/entitlementPass.d.ts +34 -0
- package/lib/modules/Discount/entitlementPass.js +141 -0
- package/lib/modules/Discount/index.d.ts +2 -2
- package/lib/modules/Discount/index.js +23 -129
- package/lib/modules/Discount/types.d.ts +36 -5
- package/lib/modules/OpenData/index.d.ts +1 -1
- package/lib/modules/OpenData/index.js +11 -2
- package/lib/modules/Order/index.d.ts +33 -4
- package/lib/modules/Order/index.js +411 -81
- package/lib/modules/Order/types.d.ts +17 -0
- package/lib/modules/Order/utils/orderCollectionIdentity.js +14 -11
- package/lib/modules/Order/utils/weighedProduct.d.ts +12 -0
- package/lib/modules/Order/utils/weighedProduct.js +89 -0
- package/lib/modules/Order/utils.d.ts +14 -2
- package/lib/modules/Order/utils.js +189 -5
- package/lib/modules/Payment/index.d.ts +0 -5
- package/lib/modules/Payment/index.js +3 -28
- package/lib/modules/Payment/types.d.ts +21 -1
- package/lib/modules/Payment/types.js +1 -0
- package/lib/modules/Payment/walletpass.d.ts +1 -1
- package/lib/modules/Payment/walletpass.js +29 -9
- package/lib/modules/ProductList/index.js +14 -1
- package/lib/modules/Rules/index.d.ts +2 -2
- package/lib/modules/Rules/index.js +361 -112
- package/lib/modules/Rules/types.d.ts +6 -0
- package/lib/server/index.js +8 -5
- package/lib/server/modules/order/index.js +6 -0
- package/lib/server/modules/order/types.d.ts +12 -0
- package/lib/server/modules/payment/index.d.ts +25 -6
- package/lib/server/modules/payment/index.js +350 -78
- package/lib/server/utils/small-ticket.d.ts +8 -5
- package/lib/server/utils/small-ticket.js +1009 -121
- package/lib/solution/BaseSales/index.d.ts +11 -2
- package/lib/solution/BaseSales/index.js +164 -30
- package/lib/solution/BaseSales/types.d.ts +7 -3
- package/lib/solution/BaseSales/utils/cartPromotion.js +12 -4
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +24 -9
- package/lib/solution/BaseSales/utils.js +2 -1
- package/lib/solution/BookingTicket/index.d.ts +11 -2
- package/lib/solution/BookingTicket/index.js +103 -41
- package/lib/solution/BookingTicket/types.d.ts +5 -1
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +2 -0
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +174 -42
- package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +8 -4
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +6 -0
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +11 -3
- package/lib/solution/ScanOrder/utils.js +2 -1
- package/lib/solution/ShopDiscount/index.d.ts +2 -0
- package/lib/solution/ShopDiscount/index.js +55 -9
- package/lib/solution/ShopDiscount/utils.d.ts +4 -2
- package/lib/solution/ShopDiscount/utils.js +42 -25
- package/lib/solution/UnifiedBookingSales/index.d.ts +2 -2
- package/lib/solution/UnifiedBookingSales/index.js +5 -5
- package/lib/utils/os-private-payload.d.ts +5 -0
- package/lib/utils/os-private-payload.js +22 -0
- package/package.json +1 -1
|
@@ -2,6 +2,10 @@ var _excluded = ["_original_add_price"],
|
|
|
2
2
|
_excluded2 = ["_original_price", "_original_add_price"];
|
|
3
3
|
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
4
4
|
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
5
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
6
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
7
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
8
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
5
9
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
6
10
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7
11
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
@@ -32,13 +36,15 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
|
|
|
32
36
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
33
37
|
import { BaseModule } from "../BaseModule";
|
|
34
38
|
import { UnavailableReason } from "./types";
|
|
35
|
-
import { uniqueById, getDiscountAmount, getDiscountListAmountTotal, getDiscountListAmount, filterDiscountListByBookingTime } from "../../solution/ShopDiscount/utils";
|
|
39
|
+
import { uniqueById, getDiscountAmount, getDiscountListAmountTotal, getDiscountListAmount, filterDiscountListByBookingTime, getDiscountTimeUnavailableReason } from "../../solution/ShopDiscount/utils";
|
|
36
40
|
import { getProductOriginTotalPrice, getProductTotalPrice } from "../Cart/utils";
|
|
37
41
|
import Decimal from 'decimal.js';
|
|
38
|
-
import { isBoolean } from 'lodash-es';
|
|
42
|
+
import { cloneDeep, isBoolean } from 'lodash-es';
|
|
39
43
|
import dayjs from 'dayjs';
|
|
40
44
|
import { isOrderLevelFixedAmountDiscount } from "../../solution/ShopDiscount/utils";
|
|
41
45
|
import { calculateOrderLevelDiscountAllocation } from "../../solution/ShopDiscount/utils";
|
|
46
|
+
import { compareEntitlementPassPriority, getRemainingEntitlementUses, isEntitlementPass, isFullCoveragePass, resolveEntitlementQuota } from "../Discount/entitlementPass";
|
|
47
|
+
import { getDiscountUsageBlockReason, getDiscountUsageLimitFailKey } from "../Discount/availability";
|
|
42
48
|
export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
43
49
|
_inherits(RulesModule, _BaseModule);
|
|
44
50
|
var _super = _createSuper(RulesModule);
|
|
@@ -124,15 +130,23 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
124
130
|
}
|
|
125
131
|
|
|
126
132
|
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
133
|
+
* 商品未开启 Holder 选择时跳过匹配;已开启时,特定 form Holder 卡
|
|
134
|
+
* 只适用于同一 Holder Record,是否必填不影响匹配规则。
|
|
129
135
|
*/
|
|
130
136
|
}, {
|
|
131
137
|
key: "checkHolderMatch",
|
|
132
|
-
value: function checkHolderMatch(discount, product, holders) {
|
|
133
|
-
var _discount$holder;
|
|
138
|
+
value: function checkHolderMatch(discount, product, holderSource, holders) {
|
|
139
|
+
var _discount$holder, _ref, _ref2, _ref3, _ref4, _ref5, _ref6, _holderSource$holder_, _holderSource$metadat, _holderSource$origin, _holderSource$metadat2, _holderSource$_origin, _holderSource$_extend, _holderSource$_extend2, _holderSource$_extend3;
|
|
134
140
|
// 非表单类型 holder 视为匹配
|
|
135
141
|
if (((_discount$holder = discount.holder) === null || _discount$holder === void 0 ? void 0 : _discount$holder.holder_type) !== 'form') return true;
|
|
142
|
+
|
|
143
|
+
// getProduct 会裁剪商品字段,从原始商品读取配置,套餐子项沿用父商品。
|
|
144
|
+
var holderConfig = (_ref = (_ref2 = (_ref3 = (_ref4 = (_ref5 = (_ref6 = (_holderSource$holder_ = holderSource === null || holderSource === void 0 ? void 0 : holderSource.holder_config) !== null && _holderSource$holder_ !== void 0 ? _holderSource$holder_ : holderSource === null || holderSource === void 0 || (_holderSource$metadat = holderSource.metadata) === null || _holderSource$metadat === void 0 ? void 0 : _holderSource$metadat.holder_config) !== null && _ref6 !== void 0 ? _ref6 : holderSource === null || holderSource === void 0 || (_holderSource$origin = holderSource.origin) === null || _holderSource$origin === void 0 ? void 0 : _holderSource$origin.holder_config) !== null && _ref5 !== void 0 ? _ref5 : holderSource === null || holderSource === void 0 || (_holderSource$metadat2 = holderSource.metadata) === null || _holderSource$metadat2 === void 0 || (_holderSource$metadat2 = _holderSource$metadat2.origin) === null || _holderSource$metadat2 === void 0 ? void 0 : _holderSource$metadat2.holder_config) !== null && _ref4 !== void 0 ? _ref4 : holderSource === null || holderSource === void 0 || (_holderSource$_origin = holderSource._origin) === null || _holderSource$_origin === void 0 ? void 0 : _holderSource$_origin.holder_config) !== null && _ref3 !== void 0 ? _ref3 : holderSource === null || holderSource === void 0 || (_holderSource$_extend = holderSource._extend) === null || _holderSource$_extend === void 0 ? void 0 : _holderSource$_extend.holder_config) !== null && _ref2 !== void 0 ? _ref2 : holderSource === null || holderSource === void 0 || (_holderSource$_extend2 = holderSource._extend) === null || _holderSource$_extend2 === void 0 || (_holderSource$_extend2 = _holderSource$_extend2.product) === null || _holderSource$_extend2 === void 0 ? void 0 : _holderSource$_extend2.holder_config) !== null && _ref !== void 0 ? _ref : holderSource === null || holderSource === void 0 || (_holderSource$_extend3 = holderSource._extend) === null || _holderSource$_extend3 === void 0 || (_holderSource$_extend3 = _holderSource$_extend3.product) === null || _holderSource$_extend3 === void 0 || (_holderSource$_extend3 = _holderSource$_extend3.metadata) === null || _holderSource$_extend3 === void 0 ? void 0 : _holderSource$_extend3.holder_config;
|
|
145
|
+
var holderStatus = holderConfig === null || holderConfig === void 0 ? void 0 : holderConfig.status;
|
|
146
|
+
var holderEnabled = holderStatus === true || ['enable', '1'].includes(String(holderStatus).trim().toLowerCase());
|
|
147
|
+
if (!holderEnabled || (holderConfig === null || holderConfig === void 0 ? void 0 : holderConfig.resource_id) === undefined || (holderConfig === null || holderConfig === void 0 ? void 0 : holderConfig.resource_id) === null || (holderConfig === null || holderConfig === void 0 ? void 0 : holderConfig.resource_id) === '') {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
136
150
|
var discountHolderIds = this.normalizeHolderRecordIds(discount.holder.holder_id);
|
|
137
151
|
if (!discountHolderIds.length) return false;
|
|
138
152
|
var productHolderIds = this.normalizeHolderRecordIds(product.holder_id);
|
|
@@ -147,14 +161,14 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
147
161
|
// 判断discountList 是否可以对当前productList生效
|
|
148
162
|
}, {
|
|
149
163
|
key: "isDiscountListAvailable",
|
|
150
|
-
value: function isDiscountListAvailable(
|
|
164
|
+
value: function isDiscountListAvailable(_ref7) {
|
|
151
165
|
var _this2 = this;
|
|
152
|
-
var oldDiscountList =
|
|
153
|
-
newDiscountList =
|
|
154
|
-
productList =
|
|
155
|
-
orderTotalAmount =
|
|
156
|
-
holders =
|
|
157
|
-
isFormSubject =
|
|
166
|
+
var oldDiscountList = _ref7.oldDiscountList,
|
|
167
|
+
newDiscountList = _ref7.newDiscountList,
|
|
168
|
+
productList = _ref7.productList,
|
|
169
|
+
orderTotalAmount = _ref7.orderTotalAmount,
|
|
170
|
+
holders = _ref7.holders,
|
|
171
|
+
isFormSubject = _ref7.isFormSubject;
|
|
158
172
|
// 首先检查是否有新的优惠券可应用
|
|
159
173
|
if (!newDiscountList || newDiscountList.length === 0) {
|
|
160
174
|
return {
|
|
@@ -177,11 +191,17 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
177
191
|
unavailableReason: UnavailableReason.AlreadyUsed
|
|
178
192
|
};
|
|
179
193
|
}
|
|
194
|
+
var scannedEntitlementPassIds = newDiscountList.filter(function (discount) {
|
|
195
|
+
return isEntitlementPass(discount);
|
|
196
|
+
}).map(function (discount) {
|
|
197
|
+
return discount.id;
|
|
198
|
+
});
|
|
199
|
+
var scannedEntitlementPassIdSet = new Set(scannedEntitlementPassIds.map(String));
|
|
180
200
|
|
|
181
|
-
//
|
|
182
|
-
//
|
|
201
|
+
// 客户次卡必须保留在完整列表中;同一实例以本次扫码数据更新。
|
|
202
|
+
// 历史折扣不参与试算,商品券继续沿用仅保留扫码来源的规则。
|
|
183
203
|
var filteredOldDiscountList = oldDiscountList.filter(function (discount) {
|
|
184
|
-
return !discount.isEditMode && (discount
|
|
204
|
+
return !discount.isEditMode && (!isFullCoveragePass(discount) || isEntitlementPass(discount) || discount.isScan) && !scannedEntitlementPassIdSet.has(String(discount.id));
|
|
185
205
|
});
|
|
186
206
|
var mergedDiscountList = uniqueById([].concat(_toConsumableArray(filteredOldDiscountList), _toConsumableArray(newDiscountList)));
|
|
187
207
|
var result = this.calcDiscount({
|
|
@@ -191,7 +211,8 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
191
211
|
holders: holders,
|
|
192
212
|
isFormSubject: isFormSubject
|
|
193
213
|
}, {
|
|
194
|
-
scan: true
|
|
214
|
+
scan: true,
|
|
215
|
+
preferredEntitlementPassIds: scannedEntitlementPassIds
|
|
195
216
|
});
|
|
196
217
|
|
|
197
218
|
// 检查是否有产品使用了新折扣
|
|
@@ -346,14 +367,15 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
346
367
|
}
|
|
347
368
|
}, {
|
|
348
369
|
key: "calcDiscount",
|
|
349
|
-
value: function calcDiscount(
|
|
370
|
+
value: function calcDiscount(_ref8, options) {
|
|
350
371
|
var _options$selectedList,
|
|
351
372
|
_this4 = this;
|
|
352
|
-
var discountList =
|
|
353
|
-
productList =
|
|
354
|
-
holders =
|
|
355
|
-
isFormSubject =
|
|
356
|
-
orderTotalAmount =
|
|
373
|
+
var discountList = _ref8.discountList,
|
|
374
|
+
productList = _ref8.productList,
|
|
375
|
+
holders = _ref8.holders,
|
|
376
|
+
isFormSubject = _ref8.isFormSubject,
|
|
377
|
+
orderTotalAmount = _ref8.orderTotalAmount;
|
|
378
|
+
var preferredEntitlementPassIds = new Set(((options === null || options === void 0 ? void 0 : options.preferredEntitlementPassIds) || []).map(String));
|
|
357
379
|
var resolveIsFormSubject = function resolveIsFormSubject(product) {
|
|
358
380
|
return typeof isFormSubject === 'function' ? Boolean(isFormSubject(product)) : Boolean(isFormSubject);
|
|
359
381
|
};
|
|
@@ -365,7 +387,8 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
365
387
|
}) && productList.find(function (n) {
|
|
366
388
|
return !n.booking_id;
|
|
367
389
|
});
|
|
368
|
-
var
|
|
390
|
+
var reapplyWeighedDiscountProductUids = new Set(((options === null || options === void 0 ? void 0 : options.reapplyWeighedDiscountProductUids) || []).map(String));
|
|
391
|
+
var reapplyBookingDiscountProductUids = new Set([].concat(_toConsumableArray((options === null || options === void 0 ? void 0 : options.reapplyBookingDiscountProductUids) || []), _toConsumableArray(reapplyWeighedDiscountProductUids)).filter(function (uid) {
|
|
369
392
|
return uid !== undefined && uid !== null && uid !== '';
|
|
370
393
|
}).map(String));
|
|
371
394
|
var getOriginProductUid = function getOriginProductUid(originProduct) {
|
|
@@ -379,7 +402,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
379
402
|
var uid = getOriginProductUid(originProduct);
|
|
380
403
|
if (!uid || !reapplyBookingDiscountProductUids.has(uid)) return false;
|
|
381
404
|
var discountType = selectedDiscount.tag || selectedDiscount.type;
|
|
382
|
-
return selectedDiscount.isEditMode === true && selectedDiscount.isSelected === true && ['good_pass', 'discount_card', 'product_discount_card'].includes(discountType);
|
|
405
|
+
return selectedDiscount.isEditMode === true && selectedDiscount.isSelected === true && ['entitlement_pass', 'good_pass', 'discount_card', 'product_discount_card'].includes(discountType !== null && discountType !== void 0 ? discountType : '');
|
|
383
406
|
};
|
|
384
407
|
var resolveReapplyBookingDiscountPercent = function resolveReapplyBookingDiscountPercent(originProduct, selectedDiscount) {
|
|
385
408
|
var _discount2;
|
|
@@ -397,7 +420,12 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
397
420
|
if (discount.isEditMode) {
|
|
398
421
|
editModeDiscount.push(discount);
|
|
399
422
|
} else {
|
|
400
|
-
|
|
423
|
+
// 试算不能把 config / 不可用原因写回原有选券;每次重新计算以清除旧原因。
|
|
424
|
+
addModeDiscount.push(_objectSpread(_objectSpread({}, discount), {}, {
|
|
425
|
+
usageLimitFailKey: getDiscountUsageLimitFailKey(discount),
|
|
426
|
+
reason: undefined,
|
|
427
|
+
reasonCode: getDiscountUsageBlockReason(discount)
|
|
428
|
+
}));
|
|
401
429
|
}
|
|
402
430
|
});
|
|
403
431
|
|
|
@@ -428,7 +456,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
428
456
|
}
|
|
429
457
|
var canUseEditModeDiscountForReapply = function canUseEditModeDiscountForReapply(discount) {
|
|
430
458
|
var discountType = discount.tag || discount.type;
|
|
431
|
-
return reapplyBookingDiscountProductUids.size > 0 && discount.isEditMode === true && discount.isSelected === true && ['good_pass', 'discount_card', 'product_discount_card'].includes(discountType);
|
|
459
|
+
return reapplyBookingDiscountProductUids.size > 0 && discount.isEditMode === true && discount.isSelected === true && ['entitlement_pass', 'good_pass', 'discount_card', 'product_discount_card'].includes(discountType !== null && discountType !== void 0 ? discountType : '');
|
|
432
460
|
};
|
|
433
461
|
|
|
434
462
|
// 过滤掉手动取消false的优惠券,但仅用于应用优惠逻辑。
|
|
@@ -460,7 +488,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
460
488
|
// 2. 展开 bundle 子商品
|
|
461
489
|
if (product.bundle && Array.isArray(product.bundle) && product.bundle.length > 0) {
|
|
462
490
|
product.bundle.forEach(function (bundleItem, bundleIndex) {
|
|
463
|
-
var
|
|
491
|
+
var _ref9, _bundleItem$bundle_pr;
|
|
464
492
|
flattened.push({
|
|
465
493
|
type: 'bundle',
|
|
466
494
|
originProduct: originProduct,
|
|
@@ -472,7 +500,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
472
500
|
// 新增商品运行态通常带 _bundle_product_id;订单 hydrate 后只有
|
|
473
501
|
// bundle_product_id。Change time 必须兼容两种结构,否则 bundle
|
|
474
502
|
// 子项无法命中折扣卡的 limited_relation_product_data.product_ids。
|
|
475
|
-
id: (
|
|
503
|
+
id: (_ref9 = (_bundleItem$bundle_pr = bundleItem.bundle_product_id) !== null && _bundleItem$bundle_pr !== void 0 ? _bundleItem$bundle_pr : bundleItem._bundle_product_id) !== null && _ref9 !== void 0 ? _ref9 : bundleItem.product_id,
|
|
476
504
|
_id: "".concat(product._id, "_bundle_").concat(bundleIndex),
|
|
477
505
|
parentId: product._id,
|
|
478
506
|
num: bundleItem.num || 1,
|
|
@@ -510,6 +538,9 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
510
538
|
var isGoodPass = function isGoodPass(discount) {
|
|
511
539
|
return discount.tag === 'good_pass';
|
|
512
540
|
};
|
|
541
|
+
var isEntitlement = function isEntitlement(discount) {
|
|
542
|
+
return isEntitlementPass(discount);
|
|
543
|
+
};
|
|
513
544
|
|
|
514
545
|
// 辅助函数:判断是否是订单级折扣卡
|
|
515
546
|
var isOrderLevelDiscount = function isOrderLevelDiscount(discount) {
|
|
@@ -578,6 +609,14 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
578
609
|
}
|
|
579
610
|
return 0;
|
|
580
611
|
}
|
|
612
|
+
var entitlementA = isEntitlement(a);
|
|
613
|
+
var entitlementB = isEntitlement(b);
|
|
614
|
+
if (entitlementA || entitlementB) {
|
|
615
|
+
if (entitlementA && entitlementB) {
|
|
616
|
+
return compareEntitlementPassPriority(a, b);
|
|
617
|
+
}
|
|
618
|
+
return entitlementA ? -1 : 1;
|
|
619
|
+
}
|
|
581
620
|
|
|
582
621
|
// 1. 先按优先级排序
|
|
583
622
|
var priorityA = getPriority(a);
|
|
@@ -621,10 +660,10 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
621
660
|
|
|
622
661
|
// 对扁平化后的列表按价格降序排序(用于应用优惠券时优先选择高价商品)
|
|
623
662
|
var sortedFlattenedList = flattenedList.sort(function (a, b) {
|
|
624
|
-
var
|
|
663
|
+
var _ref10, _a$original_price, _ref11, _b$original_price;
|
|
625
664
|
// 子商品优先使用 original_price,主商品使用 price
|
|
626
|
-
var priceA = new Decimal(a.type === 'bundle' ? (
|
|
627
|
-
var priceB = new Decimal(b.type === 'bundle' ? (
|
|
665
|
+
var priceA = new Decimal(a.type === 'bundle' ? (_ref10 = (_a$original_price = a.original_price) !== null && _a$original_price !== void 0 ? _a$original_price : a.price) !== null && _ref10 !== void 0 ? _ref10 : '0' : a.price || '0');
|
|
666
|
+
var priceB = new Decimal(b.type === 'bundle' ? (_ref11 = (_b$original_price = b.original_price) !== null && _b$original_price !== void 0 ? _b$original_price : b.price) !== null && _ref11 !== void 0 ? _ref11 : '0' : b.price || '0');
|
|
628
667
|
if (priceA.equals(priceB)) {
|
|
629
668
|
// 价格相同时,主商品优先
|
|
630
669
|
if (a.type !== b.type) {
|
|
@@ -648,20 +687,35 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
648
687
|
|
|
649
688
|
// 🔥 为每个折扣卡/商品券执行策略检查并附加config
|
|
650
689
|
var evaluator = this.getWalletPassEvaluator();
|
|
690
|
+
addModeDiscount.forEach(function (discount) {
|
|
691
|
+
if (discount.reasonCode) discount.config = {
|
|
692
|
+
isAvailable: false
|
|
693
|
+
};
|
|
694
|
+
});
|
|
651
695
|
if (evaluator) {
|
|
652
696
|
addModeDiscount.forEach(function (discount) {
|
|
697
|
+
// 即使没有匹配的动态策略,服务端状态和次数限制也不能被覆盖为可用。
|
|
698
|
+
if (discount.reasonCode) return;
|
|
653
699
|
var discountType = discount.tag || discount.type;
|
|
654
|
-
//
|
|
655
|
-
if (['good_pass', 'discount_card', 'product_discount_card'].includes(discountType)) {
|
|
656
|
-
var _discount$limited_rel, _discount$limited_rel2;
|
|
700
|
+
// 对两类全额抵扣卡和折扣卡执行附加策略检查。
|
|
701
|
+
if (['entitlement_pass', 'good_pass', 'discount_card', 'product_discount_card'].includes(discountType !== null && discountType !== void 0 ? discountType : '')) {
|
|
702
|
+
var _discount$unified_ava, _discount$limited_rel, _discount$limited_rel2;
|
|
703
|
+
var entitlementQuota = isEntitlementPass(discount) ? resolveEntitlementQuota(discount) : null;
|
|
704
|
+
if (isEntitlementPass(discount) && !entitlementQuota) {
|
|
705
|
+
discount.config = {
|
|
706
|
+
isAvailable: false
|
|
707
|
+
};
|
|
708
|
+
return;
|
|
709
|
+
}
|
|
710
|
+
|
|
657
711
|
// 转换 discount 为 Voucher 格式
|
|
658
712
|
var voucher = {
|
|
659
713
|
id: discount.id,
|
|
660
714
|
amount: Number(discount.par_value || 0),
|
|
661
|
-
balance: Number(discount.balance || 0),
|
|
715
|
+
balance: (entitlementQuota === null || entitlementQuota === void 0 ? void 0 : entitlementQuota.type) === 'unlimited' ? Number.MAX_SAFE_INTEGER : (entitlementQuota === null || entitlementQuota === void 0 ? void 0 : entitlementQuota.type) === 'limited' ? entitlementQuota.balance : Number(discount.balance || 0),
|
|
662
716
|
type: discountType,
|
|
663
717
|
product_id: discount.product_id,
|
|
664
|
-
unified_available_status: 1,
|
|
718
|
+
unified_available_status: (_discount$unified_ava = discount.unified_available_status) !== null && _discount$unified_ava !== void 0 ? _discount$unified_ava : 1,
|
|
665
719
|
available_product_type: (_discount$limited_rel = discount.limited_relation_product_data) === null || _discount$limited_rel === void 0 ? void 0 : _discount$limited_rel.type,
|
|
666
720
|
available_product_ids: (_discount$limited_rel2 = discount.limited_relation_product_data) === null || _discount$limited_rel2 === void 0 ? void 0 : _discount$limited_rel2.product_ids
|
|
667
721
|
};
|
|
@@ -694,6 +748,8 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
694
748
|
discount.config = {
|
|
695
749
|
isAvailable: false
|
|
696
750
|
};
|
|
751
|
+
discount.reason = result.reason;
|
|
752
|
+
discount.reasonCode = result.reasonCode || 'not_meet_the_required_conditions';
|
|
697
753
|
}
|
|
698
754
|
}
|
|
699
755
|
});
|
|
@@ -716,17 +772,162 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
716
772
|
});
|
|
717
773
|
*/
|
|
718
774
|
|
|
719
|
-
//
|
|
775
|
+
// good_pass / 折扣卡保持原有的一次性使用标记。
|
|
720
776
|
var usedDiscounts = new Map();
|
|
721
777
|
|
|
778
|
+
// Entitlement Pass 单独记录本次重算新增分配的次数。
|
|
779
|
+
var entitlementUsageCounts = new Map();
|
|
780
|
+
|
|
722
781
|
// 🔥 统计每个 product_id(商品券商品id)已使用的数量,用于 maxUsagePerOrder 限制
|
|
723
782
|
var usedProductIdCounts = new Map();
|
|
783
|
+
var markDiscountUsed = function markDiscountUsed(discount) {
|
|
784
|
+
var count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
785
|
+
if (isEntitlementPass(discount)) {
|
|
786
|
+
entitlementUsageCounts.set(discount.id, (entitlementUsageCounts.get(discount.id) || 0) + count);
|
|
787
|
+
return;
|
|
788
|
+
}
|
|
789
|
+
usedDiscounts.set(discount.id, true);
|
|
790
|
+
};
|
|
791
|
+
var isDiscountUsed = function isDiscountUsed(discount) {
|
|
792
|
+
if (isEntitlementPass(discount)) {
|
|
793
|
+
return (entitlementUsageCounts.get(discount.id) || 0) > 0;
|
|
794
|
+
}
|
|
795
|
+
return usedDiscounts.get(discount.id) === true;
|
|
796
|
+
};
|
|
797
|
+
var buildFullCoveragePassUsageGroups = function buildFullCoveragePassUsageGroups(discounts, requestedCount) {
|
|
798
|
+
var _firstGoodPass$config;
|
|
799
|
+
var groups = [];
|
|
800
|
+
var pendingUsedDiscounts = new Set(Array.from(usedDiscounts.entries()).filter(function (_ref12) {
|
|
801
|
+
var _ref13 = _slicedToArray(_ref12, 2),
|
|
802
|
+
used = _ref13[1];
|
|
803
|
+
return used;
|
|
804
|
+
}).map(function (_ref14) {
|
|
805
|
+
var _ref15 = _slicedToArray(_ref14, 1),
|
|
806
|
+
discountId = _ref15[0];
|
|
807
|
+
return discountId;
|
|
808
|
+
}));
|
|
809
|
+
var pendingEntitlementCounts = new Map(entitlementUsageCounts);
|
|
810
|
+
var pendingProductCounts = new Map(usedProductIdCounts);
|
|
811
|
+
var firstGoodPass = discounts.find(function (discount) {
|
|
812
|
+
return isFullCoveragePass(discount) && !isEntitlementPass(discount);
|
|
813
|
+
});
|
|
814
|
+
var legacyGoodPassPerLineLimit = firstGoodPass ? Number(((_firstGoodPass$config = firstGoodPass.config) === null || _firstGoodPass$config === void 0 ? void 0 : _firstGoodPass$config.maxUsagePerOrder) || 0) : 0;
|
|
815
|
+
var allocatedGoodPassCount = 0;
|
|
816
|
+
var remaining = Math.max(Math.floor(requestedCount), 0);
|
|
817
|
+
var _iterator5 = _createForOfIteratorHelper(discounts),
|
|
818
|
+
_step5;
|
|
819
|
+
try {
|
|
820
|
+
var _loop = function _loop() {
|
|
821
|
+
var _discount$config;
|
|
822
|
+
var discount = _step5.value;
|
|
823
|
+
if (remaining <= 0) return 0; // break
|
|
824
|
+
if (!isFullCoveragePass(discount)) return 1; // continue
|
|
825
|
+
var currentEntitlementCount = pendingEntitlementCounts.get(discount.id) || 0;
|
|
826
|
+
var availableCount = isEntitlementPass(discount) ? getRemainingEntitlementUses(discount, currentEntitlementCount, remaining) : pendingUsedDiscounts.has(discount.id) ? 0 : 1;
|
|
827
|
+
if (!isEntitlementPass(discount) && legacyGoodPassPerLineLimit > 0) {
|
|
828
|
+
availableCount = Math.min(availableCount, Math.max(Math.floor(legacyGoodPassPerLineLimit) - allocatedGoodPassCount, 0));
|
|
829
|
+
}
|
|
830
|
+
var maxUsagePerOrder = Number(((_discount$config = discount.config) === null || _discount$config === void 0 ? void 0 : _discount$config.maxUsagePerOrder) || 0);
|
|
831
|
+
if (isEntitlementPass(discount) && maxUsagePerOrder > 0) {
|
|
832
|
+
var currentProductCount = pendingProductCounts.get(discount.product_id) || 0;
|
|
833
|
+
availableCount = Math.min(availableCount, Math.max(Math.floor(maxUsagePerOrder) - currentProductCount, 0));
|
|
834
|
+
}
|
|
835
|
+
var allocatedCount = Math.min(availableCount, remaining);
|
|
836
|
+
if (allocatedCount <= 0) return 1; // continue
|
|
837
|
+
var existingGroup = groups.find(function (group) {
|
|
838
|
+
return String(group.discount.id) === String(discount.id);
|
|
839
|
+
});
|
|
840
|
+
if (existingGroup) {
|
|
841
|
+
existingGroup.count += allocatedCount;
|
|
842
|
+
} else {
|
|
843
|
+
groups.push({
|
|
844
|
+
discount: discount,
|
|
845
|
+
count: allocatedCount
|
|
846
|
+
});
|
|
847
|
+
}
|
|
848
|
+
if (isEntitlementPass(discount)) {
|
|
849
|
+
pendingEntitlementCounts.set(discount.id, currentEntitlementCount + allocatedCount);
|
|
850
|
+
} else {
|
|
851
|
+
pendingUsedDiscounts.add(discount.id);
|
|
852
|
+
allocatedGoodPassCount += allocatedCount;
|
|
853
|
+
}
|
|
854
|
+
pendingProductCounts.set(discount.product_id, (pendingProductCounts.get(discount.product_id) || 0) + allocatedCount);
|
|
855
|
+
remaining -= allocatedCount;
|
|
856
|
+
},
|
|
857
|
+
_ret;
|
|
858
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
859
|
+
_ret = _loop();
|
|
860
|
+
if (_ret === 0) break;
|
|
861
|
+
if (_ret === 1) continue;
|
|
862
|
+
}
|
|
863
|
+
} catch (err) {
|
|
864
|
+
_iterator5.e(err);
|
|
865
|
+
} finally {
|
|
866
|
+
_iterator5.f();
|
|
867
|
+
}
|
|
868
|
+
return groups;
|
|
869
|
+
};
|
|
870
|
+
var mergeEntitlementAppliedProductDetails = function mergeEntitlementAppliedProductDetails(details) {
|
|
871
|
+
var mergedDetails = [];
|
|
872
|
+
var mergedIndexByKey = new Map();
|
|
873
|
+
var toComparableNumber = function toComparableNumber(value) {
|
|
874
|
+
var numberValue = Number(value);
|
|
875
|
+
return Number.isFinite(numberValue) ? String(numberValue) : String(value !== null && value !== void 0 ? value : '');
|
|
876
|
+
};
|
|
877
|
+
var _iterator6 = _createForOfIteratorHelper(details || []),
|
|
878
|
+
_step6;
|
|
879
|
+
try {
|
|
880
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
881
|
+
var _detail$discount$reso, _detail$discount, _detail$discount$prod, _detail$discount2, _detail$metadata$cust, _detail$metadata, _detail$discount3, _ref16, _detail$metadata$num, _detail$metadata2, _ref17, _existed$metadata$num, _existed$metadata;
|
|
882
|
+
var detail = _step6.value;
|
|
883
|
+
if (!isEntitlementPass(detail)) {
|
|
884
|
+
mergedDetails.push(detail);
|
|
885
|
+
continue;
|
|
886
|
+
}
|
|
887
|
+
var resourceId = (_detail$discount$reso = detail === null || detail === void 0 || (_detail$discount = detail.discount) === null || _detail$discount === void 0 ? void 0 : _detail$discount.resource_id) !== null && _detail$discount$reso !== void 0 ? _detail$discount$reso : detail === null || detail === void 0 ? void 0 : detail.resource_id;
|
|
888
|
+
if (resourceId === undefined || resourceId === null) {
|
|
889
|
+
mergedDetails.push(detail);
|
|
890
|
+
continue;
|
|
891
|
+
}
|
|
892
|
+
var key = [resourceId, (_detail$discount$prod = detail === null || detail === void 0 || (_detail$discount2 = detail.discount) === null || _detail$discount2 === void 0 ? void 0 : _detail$discount2.product_id) !== null && _detail$discount$prod !== void 0 ? _detail$discount$prod : '', (_detail$metadata$cust = detail === null || detail === void 0 || (_detail$metadata = detail.metadata) === null || _detail$metadata === void 0 ? void 0 : _detail$metadata.custom_product_bundle_map_id) !== null && _detail$metadata$cust !== void 0 ? _detail$metadata$cust : '', toComparableNumber(detail === null || detail === void 0 ? void 0 : detail.amount), toComparableNumber(detail === null || detail === void 0 || (_detail$discount3 = detail.discount) === null || _detail$discount3 === void 0 ? void 0 : _detail$discount3.fixed_amount)].join('|');
|
|
893
|
+
var rawUsageCount = Number((_ref16 = (_detail$metadata$num = detail === null || detail === void 0 || (_detail$metadata2 = detail.metadata) === null || _detail$metadata2 === void 0 ? void 0 : _detail$metadata2.num) !== null && _detail$metadata$num !== void 0 ? _detail$metadata$num : detail === null || detail === void 0 ? void 0 : detail._num) !== null && _ref16 !== void 0 ? _ref16 : 1);
|
|
894
|
+
var usageCount = Number.isFinite(rawUsageCount) && rawUsageCount > 0 ? rawUsageCount : 1;
|
|
895
|
+
var mergedIndex = mergedIndexByKey.get(key);
|
|
896
|
+
if (mergedIndex === undefined) {
|
|
897
|
+
mergedIndexByKey.set(key, mergedDetails.length);
|
|
898
|
+
mergedDetails.push(_objectSpread(_objectSpread({}, detail), {}, {
|
|
899
|
+
metadata: _objectSpread(_objectSpread({}, (detail === null || detail === void 0 ? void 0 : detail.metadata) || {}), {}, {
|
|
900
|
+
num: usageCount
|
|
901
|
+
}),
|
|
902
|
+
_num: usageCount
|
|
903
|
+
}));
|
|
904
|
+
continue;
|
|
905
|
+
}
|
|
906
|
+
var existed = mergedDetails[mergedIndex];
|
|
907
|
+
var existedUsageCount = Number((_ref17 = (_existed$metadata$num = existed === null || existed === void 0 || (_existed$metadata = existed.metadata) === null || _existed$metadata === void 0 ? void 0 : _existed$metadata.num) !== null && _existed$metadata$num !== void 0 ? _existed$metadata$num : existed === null || existed === void 0 ? void 0 : existed._num) !== null && _ref17 !== void 0 ? _ref17 : 1);
|
|
908
|
+
var totalUsageCount = existedUsageCount + usageCount;
|
|
909
|
+
mergedDetails[mergedIndex] = _objectSpread(_objectSpread({}, existed), {}, {
|
|
910
|
+
metadata: _objectSpread(_objectSpread({}, (existed === null || existed === void 0 ? void 0 : existed.metadata) || {}), {}, {
|
|
911
|
+
num: totalUsageCount
|
|
912
|
+
}),
|
|
913
|
+
_num: totalUsageCount
|
|
914
|
+
});
|
|
915
|
+
}
|
|
916
|
+
} catch (err) {
|
|
917
|
+
_iterator6.e(err);
|
|
918
|
+
} finally {
|
|
919
|
+
_iterator6.f();
|
|
920
|
+
}
|
|
921
|
+
return mergedDetails;
|
|
922
|
+
};
|
|
724
923
|
|
|
725
924
|
// 记录每个优惠券适用的商品ID
|
|
726
925
|
var discountApplicability = new Map();
|
|
727
926
|
|
|
728
927
|
// 记录每个优惠券适用的商品详细信息
|
|
729
928
|
var discountApplicableProducts = new Map();
|
|
929
|
+
var discountTimeReasons = new Map();
|
|
930
|
+
var discountHolderMismatch = new Set();
|
|
730
931
|
|
|
731
932
|
// 初始化每个优惠券的适用性和可抵扣商品
|
|
732
933
|
addModeDiscount.forEach(function (discount) {
|
|
@@ -746,7 +947,8 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
746
947
|
|
|
747
948
|
// 辅助函数:检查商品是否对某个折扣卡可用
|
|
748
949
|
var checkItemApplicableForDiscount = function checkItemApplicableForDiscount(flatItem, discount) {
|
|
749
|
-
var _product, _product2, _product3, _flatItem$bundleItem, _flatItem$bundleItem2, _product4;
|
|
950
|
+
var _discount$config2, _product, _product2, _product3, _flatItem$bundleItem, _flatItem$bundleItem2, _product4;
|
|
951
|
+
if (((_discount$config2 = discount.config) === null || _discount$config2 === void 0 ? void 0 : _discount$config2.isAvailable) === false) return false;
|
|
750
952
|
var product;
|
|
751
953
|
if (flatItem.type === 'main') {
|
|
752
954
|
product = flatItem.product;
|
|
@@ -769,7 +971,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
769
971
|
|
|
770
972
|
// 编辑的商品使用了优惠券不可用
|
|
771
973
|
var isAvailableProduct = flatItem.type === 'main' ? !((_product = product) !== null && _product !== void 0 && _product.booking_id && (_product2 = product) !== null && _product2 !== void 0 && (_product2 = _product2.discount_list) !== null && _product2 !== void 0 && _product2.length && (_product3 = product) !== null && _product3 !== void 0 && (_product3 = _product3.discount_list) !== null && _product3 !== void 0 && _product3.every(function (d) {
|
|
772
|
-
return d.id && ['good_pass', 'discount_card', 'product_discount_card'].includes(d.tag || d.type);
|
|
974
|
+
return d.id && ['entitlement_pass', 'good_pass', 'discount_card', 'product_discount_card'].includes(d.tag || d.type);
|
|
773
975
|
})) : !(flatItem !== null && flatItem !== void 0 && flatItem.booking_id && !!(flatItem !== null && flatItem !== void 0 && (_flatItem$bundleItem = flatItem.bundleItem) !== null && _flatItem$bundleItem !== void 0 && (_flatItem$bundleItem = _flatItem$bundleItem.discount_list) !== null && _flatItem$bundleItem !== void 0 && _flatItem$bundleItem.length) && flatItem !== null && flatItem !== void 0 && (_flatItem$bundleItem2 = flatItem.bundleItem) !== null && _flatItem$bundleItem2 !== void 0 && (_flatItem$bundleItem2 = _flatItem$bundleItem2.discount_list) !== null && _flatItem$bundleItem2 !== void 0 && _flatItem$bundleItem2.every(function (d) {
|
|
774
976
|
return d.id;
|
|
775
977
|
}));
|
|
@@ -869,7 +1071,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
869
1071
|
// 收集该折扣卡适用的商品(排除被其他专属折扣卡占用的商品)
|
|
870
1072
|
var applicableProducts = [];
|
|
871
1073
|
sortedFlattenedList.forEach(function (flatItem) {
|
|
872
|
-
var _flatItem$parentProdu2, _flatItem$parentProdu3, _product$price,
|
|
1074
|
+
var _flatItem$parentProdu2, _flatItem$parentProdu3, _product$price, _ref18, _flatItem$original_pr;
|
|
873
1075
|
// 🔥 检查该商品是否被其他专属折扣卡占用
|
|
874
1076
|
var occupyingDiscountId = occupiedItems.get(flatItem._id);
|
|
875
1077
|
if (occupyingDiscountId !== undefined && occupyingDiscountId !== discount.id) {
|
|
@@ -897,7 +1099,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
897
1099
|
|
|
898
1100
|
// 对于主商品:使用 price
|
|
899
1101
|
// 对于子商品:优先使用 flatItem.original_price,否则使用 flatItem.price
|
|
900
|
-
var originalAmount = flatItem.type === 'main' ? Number((_product$price = product.price) !== null && _product$price !== void 0 ? _product$price : 0) : Number((
|
|
1102
|
+
var originalAmount = flatItem.type === 'main' ? Number((_product$price = product.price) !== null && _product$price !== void 0 ? _product$price : 0) : Number((_ref18 = (_flatItem$original_pr = flatItem.original_price) !== null && _flatItem$original_pr !== void 0 ? _flatItem$original_pr : flatItem.price) !== null && _ref18 !== void 0 ? _ref18 : 0);
|
|
901
1103
|
|
|
902
1104
|
// 传递 parentQuantity 用于差值处理时判断是否是真正的"数量为1"
|
|
903
1105
|
var productData = {
|
|
@@ -954,42 +1156,49 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
954
1156
|
}
|
|
955
1157
|
var isItemRewardProductDiscount = _this4.isItemRewardProductDiscount(product);
|
|
956
1158
|
addModeDiscount.forEach(function (discount) {
|
|
957
|
-
var _product5, _product6, _product7, _product8, _flatItem$bundleItem3, _flatItem$bundleItem4, _discount$
|
|
1159
|
+
var _product5, _product6, _product7, _product8, _flatItem$bundleItem3, _flatItem$bundleItem4, _discount$config3;
|
|
958
1160
|
var limitedData = discount === null || discount === void 0 ? void 0 : discount.limited_relation_product_data;
|
|
959
1161
|
// 拿到discount配置的holder信息 product信息 product.holder 加在 isLimitedProduct
|
|
960
1162
|
var _tempVar = (flatItem === null || flatItem === void 0 ? void 0 : flatItem.type) === 'bundle' ? flatItem === null || flatItem === void 0 ? void 0 : flatItem.parentProduct : flatItem === null || flatItem === void 0 ? void 0 : flatItem.product;
|
|
961
1163
|
var isHolderMatch = _this4.checkHolderMatch(discount, {
|
|
962
1164
|
isNeedHolder: resolveIsFormSubject(_tempVar) && !(_tempVar !== null && _tempVar !== void 0 && _tempVar.isNormalProduct),
|
|
963
1165
|
holder_id: (_tempVar === null || _tempVar === void 0 ? void 0 : _tempVar.holder_id) || product.holder_id
|
|
964
|
-
}, holders);
|
|
965
|
-
var
|
|
966
|
-
timeLimit =
|
|
1166
|
+
}, flatItem.originProduct, holders);
|
|
1167
|
+
var timeReason = getDiscountTimeUnavailableReason(discount, (((_product5 = product) === null || _product5 === void 0 ? void 0 : _product5.startDate) || dayjs()).format('YYYY-MM-DD HH:mm:ss'));
|
|
1168
|
+
var timeLimit = !timeReason;
|
|
967
1169
|
// 是符合折扣的商品
|
|
968
|
-
var
|
|
1170
|
+
var isProductInScope = limitedData.type === 'product_all' && limitedData.filter !== 1 || limitedData.type === 'product_all' && limitedData.filter === 1 && !limitedData.exclude_product_ids.includes(product.id) || limitedData.product_ids && limitedData.product_ids.includes(product.id);
|
|
1171
|
+
var isLimitedProduct = isProductInScope && isHolderMatch;
|
|
969
1172
|
|
|
970
1173
|
// 编辑的商品 使用了优惠券不可用
|
|
971
1174
|
var isAvailableProduct = flatItem.type === 'main' ? !((_product6 = product) !== null && _product6 !== void 0 && _product6.booking_id && (_product7 = product) !== null && _product7 !== void 0 && (_product7 = _product7.discount_list) !== null && _product7 !== void 0 && _product7.length && (_product8 = product) !== null && _product8 !== void 0 && (_product8 = _product8.discount_list) !== null && _product8 !== void 0 && _product8.every(function (discount) {
|
|
972
|
-
return discount.id && ['good_pass', 'discount_card', 'product_discount_card'].includes(discount.tag || discount.type);
|
|
1175
|
+
return discount.id && ['entitlement_pass', 'good_pass', 'discount_card', 'product_discount_card'].includes(discount.tag || discount.type);
|
|
973
1176
|
})) : !(flatItem !== null && flatItem !== void 0 && flatItem.booking_id && !!(flatItem !== null && flatItem !== void 0 && (_flatItem$bundleItem3 = flatItem.bundleItem) !== null && _flatItem$bundleItem3 !== void 0 && (_flatItem$bundleItem3 = _flatItem$bundleItem3.discount_list) !== null && _flatItem$bundleItem3 !== void 0 && _flatItem$bundleItem3.length) && flatItem !== null && flatItem !== void 0 && (_flatItem$bundleItem4 = flatItem.bundleItem) !== null && _flatItem$bundleItem4 !== void 0 && (_flatItem$bundleItem4 = _flatItem$bundleItem4.discount_list) !== null && _flatItem$bundleItem4 !== void 0 && _flatItem$bundleItem4.every(function (discount) {
|
|
974
1177
|
return discount.id;
|
|
975
1178
|
}));
|
|
976
1179
|
|
|
977
1180
|
// 套餐是否可用判断
|
|
978
1181
|
var isBundleAvailable = _this4.checkPackageSubItemUsageRules(discount, flatItem);
|
|
1182
|
+
if (isProductInScope && isBundleAvailable && !isItemRewardProductDiscount) {
|
|
1183
|
+
var timeReasons = discountTimeReasons.get(discount.id) || [];
|
|
1184
|
+
timeReasons.push(timeReason);
|
|
1185
|
+
discountTimeReasons.set(discount.id, timeReasons);
|
|
1186
|
+
if (!isHolderMatch && timeLimit) discountHolderMismatch.add(discount.id);
|
|
1187
|
+
}
|
|
979
1188
|
|
|
980
1189
|
// 判断优惠券是否适用于该商品
|
|
981
|
-
if (isAvailableProduct && !isItemRewardProductDiscount && isLimitedProduct && timeLimit && isBundleAvailable && (_discount$
|
|
982
|
-
var _discountApplicabilit, _discount$metadata4, _discount$metadata5;
|
|
1190
|
+
if (isAvailableProduct && !isItemRewardProductDiscount && isLimitedProduct && timeLimit && isBundleAvailable && (_discount$config3 = discount.config) !== null && _discount$config3 !== void 0 && _discount$config3.isAvailable && (!isEntitlementPass(discount) || getRemainingEntitlementUses(discount, 0, 1) > 0)) {
|
|
1191
|
+
var _discountApplicabilit, _discount$metadata4, _discount$metadata5, _discount$metadata6;
|
|
983
1192
|
// 记录此优惠券适用的商品
|
|
984
1193
|
(_discountApplicabilit = discountApplicability.get(discount.id)) === null || _discountApplicabilit === void 0 || _discountApplicabilit.push(product.id);
|
|
985
1194
|
|
|
986
1195
|
// 记录可抵扣的商品详情
|
|
987
1196
|
var applicableProducts = discountApplicableProducts.get(discount.id) || [];
|
|
988
1197
|
var discountType = discount.tag || discount.type;
|
|
989
|
-
var
|
|
1198
|
+
var isFullCoverage = isFullCoveragePass(discount);
|
|
990
1199
|
|
|
991
1200
|
// 使用数量
|
|
992
|
-
var num =
|
|
1201
|
+
var num = isFullCoverage || (flatItem === null || flatItem === void 0 ? void 0 : flatItem.type) === 'main' ? 1 : product.num;
|
|
993
1202
|
var productData = {
|
|
994
1203
|
amount: product.price * num,
|
|
995
1204
|
type: discountType,
|
|
@@ -1006,6 +1215,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1006
1215
|
discount_product_id: discount.product_id
|
|
1007
1216
|
},
|
|
1008
1217
|
metadata: {
|
|
1218
|
+
encoded: ((_discount$metadata6 = discount.metadata) === null || _discount$metadata6 === void 0 ? void 0 : _discount$metadata6.encoded) || discount.encoded,
|
|
1009
1219
|
num: num,
|
|
1010
1220
|
discount_rule_uncheck_flag: discount === null || discount === void 0 ? void 0 : discount.discount_rule_uncheck_flag
|
|
1011
1221
|
}
|
|
@@ -1027,13 +1237,13 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1027
1237
|
};
|
|
1028
1238
|
var optionDiscountAmount = 0;
|
|
1029
1239
|
var discountedOptions = options.map(function (option) {
|
|
1030
|
-
var
|
|
1240
|
+
var _ref19, _ref20, _option$_original_pri, _ref21, _option$num, _rest$price, _option$_original_pri2;
|
|
1031
1241
|
// 折前单价:优先 price,缺失再 add_price;已写回折后价时用 _original_price(或旧字段 _original_add_price)
|
|
1032
|
-
var rawUnit = (
|
|
1242
|
+
var rawUnit = (_ref19 = (_ref20 = (_option$_original_pri = option._original_price) !== null && _option$_original_pri !== void 0 ? _option$_original_pri : option._original_add_price) !== null && _ref20 !== void 0 ? _ref20 : option.price) !== null && _ref19 !== void 0 ? _ref19 : option.add_price;
|
|
1033
1243
|
var baseUnitNum = Number(rawUnit !== null && rawUnit !== void 0 ? rawUnit : 0);
|
|
1034
1244
|
if (baseUnitNum <= 0) return option;
|
|
1035
1245
|
var discountedPrice = getDiscountAmount(discount, baseUnitNum, baseUnitNum);
|
|
1036
|
-
var optQty = Number((
|
|
1246
|
+
var optQty = Number((_ref21 = (_option$num = option.num) !== null && _option$num !== void 0 ? _option$num : option.quantity) !== null && _ref21 !== void 0 ? _ref21 : 1);
|
|
1037
1247
|
optionDiscountAmount = new Decimal(optionDiscountAmount).plus(new Decimal(baseUnitNum).minus(discountedPrice).mul(optQty)).toNumber();
|
|
1038
1248
|
var _original_add_price = option._original_add_price,
|
|
1039
1249
|
rest = _objectWithoutProperties(option, _excluded);
|
|
@@ -1067,9 +1277,9 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1067
1277
|
var getOptionTotal = function getOptionTotal(options) {
|
|
1068
1278
|
if (!(options !== null && options !== void 0 && options.length)) return 0;
|
|
1069
1279
|
return options.reduce(function (sum, opt) {
|
|
1070
|
-
var
|
|
1071
|
-
var unit = Number((
|
|
1072
|
-
var n = Number((
|
|
1280
|
+
var _ref22, _opt$price, _ref23, _opt$num;
|
|
1281
|
+
var unit = Number((_ref22 = (_opt$price = opt.price) !== null && _opt$price !== void 0 ? _opt$price : opt.add_price) !== null && _ref22 !== void 0 ? _ref22 : 0);
|
|
1282
|
+
var n = Number((_ref23 = (_opt$num = opt.num) !== null && _opt$num !== void 0 ? _opt$num : opt.quantity) !== null && _ref23 !== void 0 ? _ref23 : 1);
|
|
1073
1283
|
return new Decimal(sum).plus(new Decimal(unit).mul(n)).toNumber();
|
|
1074
1284
|
}, 0);
|
|
1075
1285
|
};
|
|
@@ -1106,11 +1316,12 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1106
1316
|
var _discount$id, _discount$discount4;
|
|
1107
1317
|
var discountIdentity = (_discount$id = discount.id) !== null && _discount$id !== void 0 ? _discount$id : (_discount$discount4 = discount.discount) === null || _discount$discount4 === void 0 ? void 0 : _discount$discount4.resource_id;
|
|
1108
1318
|
var discountType = discount.tag || discount.type;
|
|
1109
|
-
return Boolean(discountIdentity && ['good_pass', 'discount_card', 'product_discount_card'].includes(discountType));
|
|
1319
|
+
return Boolean(discountIdentity && ['entitlement_pass', 'good_pass', 'discount_card', 'product_discount_card'].includes(discountType));
|
|
1110
1320
|
}));
|
|
1111
1321
|
|
|
1112
1322
|
// 已持久化且已有钱包券/折扣卡的商品行跳过,保留后端历史折扣结果。
|
|
1113
|
-
|
|
1323
|
+
var isReweighedProduct = reapplyWeighedDiscountProductUids.has(getOriginProductUid(originProduct) || '');
|
|
1324
|
+
if (isPersistedProduct && hasExistingWalletDiscount && !isReweighedProduct) {
|
|
1114
1325
|
if (flatItem.type === 'main') {
|
|
1115
1326
|
processedProductsMap.set(product._id, [originProduct]);
|
|
1116
1327
|
}
|
|
@@ -1124,7 +1335,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1124
1335
|
var applicableDiscounts = sortedDiscountList.filter(function (discount) {
|
|
1125
1336
|
var _product$discount_lis3, _product$discount_lis4;
|
|
1126
1337
|
if (_this4.isItemRewardProductDiscount(product)) return false;
|
|
1127
|
-
// 🔥
|
|
1338
|
+
// 🔥 检查策略可用性(针对全额抵扣卡和折扣卡)
|
|
1128
1339
|
var discountType = discount.tag || discount.type;
|
|
1129
1340
|
var currentOriginUid = getOriginProductUid(originProduct);
|
|
1130
1341
|
var isReapplyEditModeDiscountForProduct = discount.isEditMode && reapplyBookingDiscountProductUids.size > 0 && currentOriginUid && reapplyBookingDiscountProductUids.has(String(currentOriginUid)) && discount.isSelected === true;
|
|
@@ -1133,31 +1344,36 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1133
1344
|
if (!uid || !reapplyBookingDiscountProductUids.has(uid)) return false;
|
|
1134
1345
|
if (!discount.isSelected) return false;
|
|
1135
1346
|
}
|
|
1136
|
-
if (['good_pass', 'discount_card', 'product_discount_card'].includes(discountType) && !isReapplyEditModeDiscountForProduct) {
|
|
1137
|
-
var _discount$
|
|
1347
|
+
if (['entitlement_pass', 'good_pass', 'discount_card', 'product_discount_card'].includes(discountType !== null && discountType !== void 0 ? discountType : '') && !isReapplyEditModeDiscountForProduct) {
|
|
1348
|
+
var _discount$config4;
|
|
1138
1349
|
// 如果策略检查后没有config,说明不可用
|
|
1139
|
-
if (discount.config === undefined || !(discount !== null && discount !== void 0 && (_discount$
|
|
1350
|
+
if (discount.config === undefined || !(discount !== null && discount !== void 0 && (_discount$config4 = discount.config) !== null && _discount$config4 !== void 0 && _discount$config4.isAvailable)) {
|
|
1140
1351
|
return false;
|
|
1141
1352
|
}
|
|
1142
1353
|
}
|
|
1143
1354
|
|
|
1144
1355
|
// 如果商品价格为 0,其实不需要使用任何优惠券,直接 return true
|
|
1145
|
-
//
|
|
1146
|
-
if ((Number(product.price) <= 0 || !product.price) && !((_product$discount_lis3 = product.discount_list) !== null && _product$discount_lis3 !== void 0 && _product$discount_lis3.length) && (discount
|
|
1356
|
+
// 全额抵扣卡在主商品价格为 0 时不可用。
|
|
1357
|
+
if ((Number(product.price) <= 0 || !product.price) && !((_product$discount_lis3 = product.discount_list) !== null && _product$discount_lis3 !== void 0 && _product$discount_lis3.length) && isFullCoveragePass(discount)) return false;
|
|
1147
1358
|
|
|
1148
1359
|
// 折扣卡商品价格为0时不可用
|
|
1149
1360
|
if ((Number(product.price) <= 0 || !product.price) && !((_product$discount_lis4 = product.discount_list) !== null && _product$discount_lis4 !== void 0 && _product$discount_lis4.find(function (n) {
|
|
1150
1361
|
var _n$discount;
|
|
1151
1362
|
return ((_n$discount = n.discount) === null || _n$discount === void 0 ? void 0 : _n$discount.resource_id) === discount.id;
|
|
1152
|
-
})) && (discount
|
|
1153
|
-
//
|
|
1154
|
-
|
|
1155
|
-
|
|
1363
|
+
})) && !isFullCoveragePass(discount)) return false;
|
|
1364
|
+
// good_pass 保持一张实例只使用一次。
|
|
1365
|
+
if ((discount.tag || discount.type) === 'good_pass' && usedDiscounts.get(discount.id)) {
|
|
1366
|
+
return false;
|
|
1367
|
+
}
|
|
1368
|
+
// 有限次数卡按后端实时 balance 约束本次新增分配;无限卡不看余额。
|
|
1369
|
+
if (isEntitlementPass(discount) && getRemainingEntitlementUses(discount, entitlementUsageCounts.get(discount.id) || 0, 1) <= 0) {
|
|
1370
|
+
return false;
|
|
1371
|
+
}
|
|
1156
1372
|
|
|
1157
1373
|
// 🔥 检查 maxUsagePerOrder 限制:同一 product_id 的商品券使用数量不能超过配置值
|
|
1158
|
-
if ((discount
|
|
1159
|
-
var _discount$
|
|
1160
|
-
var maxUsagePerOrder = (_discount$
|
|
1374
|
+
if (isFullCoveragePass(discount)) {
|
|
1375
|
+
var _discount$config5;
|
|
1376
|
+
var maxUsagePerOrder = (_discount$config5 = discount.config) === null || _discount$config5 === void 0 ? void 0 : _discount$config5.maxUsagePerOrder;
|
|
1161
1377
|
if (maxUsagePerOrder && maxUsagePerOrder > 0) {
|
|
1162
1378
|
var currentUsedCount = usedProductIdCounts.get(discount.product_id) || 0;
|
|
1163
1379
|
if (currentUsedCount >= maxUsagePerOrder) {
|
|
@@ -1172,7 +1388,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1172
1388
|
var isHolderMatch = _this4.checkHolderMatch(discount, {
|
|
1173
1389
|
isNeedHolder: resolveIsFormSubject(_tempVar) && !(_tempVar !== null && _tempVar !== void 0 && _tempVar.isNormalProduct),
|
|
1174
1390
|
holder_id: (_tempVar === null || _tempVar === void 0 ? void 0 : _tempVar.holder_id) || product.holder_id
|
|
1175
|
-
}, holders);
|
|
1391
|
+
}, flatItem.originProduct, holders);
|
|
1176
1392
|
// 如果 holder 不匹配,则不适用
|
|
1177
1393
|
if (!isHolderMatch) return false;
|
|
1178
1394
|
var timeLimit = true;
|
|
@@ -1201,41 +1417,50 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1201
1417
|
return false;
|
|
1202
1418
|
});
|
|
1203
1419
|
|
|
1204
|
-
//
|
|
1420
|
+
// 识别用户本次显式选择的卡券,供次卡和折扣卡各自的优先级使用。
|
|
1205
1421
|
// 目标仍必须在当前商品的 applicableDiscounts 中,因此不会绕过 Holder、时间或商品范围校验。
|
|
1206
1422
|
var explicitlySelectedDiscount = (options === null || options === void 0 ? void 0 : options.isSelected) === true && options.discountId !== undefined ? applicableDiscounts.find(function (discount) {
|
|
1207
1423
|
var discountType = discount.tag || discount.type;
|
|
1208
|
-
return String(discount.id) === String(options.discountId) && ['good_pass', 'discount_card', 'product_discount_card'].includes(discountType);
|
|
1424
|
+
return String(discount.id) === String(options.discountId) && ['entitlement_pass', 'good_pass', 'discount_card', 'product_discount_card'].includes(discountType !== null && discountType !== void 0 ? discountType : '');
|
|
1209
1425
|
}) : undefined;
|
|
1210
1426
|
// 折扣卡会复用于整条商品行;商品券必须继续按单张拆分,不能复用该分支。
|
|
1211
|
-
var explicitlySelectedDiscountCard = explicitlySelectedDiscount && (explicitlySelectedDiscount
|
|
1427
|
+
var explicitlySelectedDiscountCard = explicitlySelectedDiscount && !isFullCoveragePass(explicitlySelectedDiscount) ? explicitlySelectedDiscount : undefined;
|
|
1212
1428
|
|
|
1213
|
-
// 商品数量等变化会触发无 discountId
|
|
1429
|
+
// 商品数量等变化会触发无 discountId 的重算。只要当前行已应用的卡仍在
|
|
1214
1430
|
// applicableDiscounts 中,就应保留该行选择,避免被自动排序中力度更大的卡替换。
|
|
1215
|
-
var
|
|
1216
|
-
return ['discount_card', 'product_discount_card'].includes((item === null || item === void 0 ? void 0 : item.tag) || (item === null || item === void 0 ? void 0 : item.type));
|
|
1431
|
+
var appliedWalletDiscountIds = new Set((product.discount_list || []).filter(function (item) {
|
|
1432
|
+
return ['entitlement_pass', 'discount_card', 'product_discount_card'].includes((item === null || item === void 0 ? void 0 : item.tag) || (item === null || item === void 0 ? void 0 : item.type));
|
|
1217
1433
|
}).map(function (item) {
|
|
1218
|
-
var
|
|
1219
|
-
return (
|
|
1434
|
+
var _ref24, _item$discount$resour, _item$discount;
|
|
1435
|
+
return (_ref24 = (_item$discount$resour = item === null || item === void 0 || (_item$discount = item.discount) === null || _item$discount === void 0 ? void 0 : _item$discount.resource_id) !== null && _item$discount$resour !== void 0 ? _item$discount$resour : item === null || item === void 0 ? void 0 : item.resource_id) !== null && _ref24 !== void 0 ? _ref24 : item === null || item === void 0 ? void 0 : item.id;
|
|
1220
1436
|
}).filter(function (id) {
|
|
1221
1437
|
return id !== undefined && id !== null;
|
|
1222
1438
|
}).map(String));
|
|
1223
1439
|
var appliedDiscountCard = options !== null && options !== void 0 && options.scan ? undefined : applicableDiscounts.find(function (discount) {
|
|
1224
1440
|
var discountType = discount.tag || discount.type;
|
|
1225
|
-
return discount.isSelected === true && ['discount_card', 'product_discount_card'].includes(discountType) &&
|
|
1441
|
+
return discount.isSelected === true && ['discount_card', 'product_discount_card'].includes(discountType !== null && discountType !== void 0 ? discountType : '') && appliedWalletDiscountIds.has(String(discount.id));
|
|
1442
|
+
});
|
|
1443
|
+
var appliedEntitlementPass = options !== null && options !== void 0 && options.scan || (options === null || options === void 0 ? void 0 : options.preserveEntitlementSelection) === false ? undefined : applicableDiscounts.find(function (discount) {
|
|
1444
|
+
return isEntitlementPass(discount) && discount.isSelected === true && appliedWalletDiscountIds.has(String(discount.id));
|
|
1226
1445
|
});
|
|
1227
1446
|
|
|
1228
|
-
//
|
|
1447
|
+
// 次卡内部按本次手选/扫码、当前行已应用、默认排序选择。
|
|
1229
1448
|
var scannedSelectedDiscountCard = applicableDiscounts.find(function (n) {
|
|
1230
|
-
return n.isScan && n.isSelected && (n
|
|
1449
|
+
return n.isScan && n.isSelected && !isFullCoveragePass(n);
|
|
1231
1450
|
});
|
|
1232
1451
|
var selectedDiscountCard = explicitlySelectedDiscountCard || appliedDiscountCard || scannedSelectedDiscountCard;
|
|
1233
|
-
var
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
return
|
|
1452
|
+
var selectedEntitlementPass = (explicitlySelectedDiscount && isEntitlementPass(explicitlySelectedDiscount) ? explicitlySelectedDiscount : undefined) || applicableDiscounts.find(function (discount) {
|
|
1453
|
+
return isEntitlementPass(discount) && preferredEntitlementPassIds.has(String(discount.id));
|
|
1454
|
+
}) || appliedEntitlementPass || applicableDiscounts.find(function (discount) {
|
|
1455
|
+
return isEntitlementPass(discount);
|
|
1456
|
+
});
|
|
1457
|
+
// 手选优先;普通重算保留当前折扣卡,扫码和最优选择仍使用原有优先级。
|
|
1458
|
+
var selectedDiscount = explicitlySelectedDiscount || ((options === null || options === void 0 ? void 0 : options.preserveEntitlementSelection) !== false && preferredEntitlementPassIds.size === 0 ? appliedDiscountCard : undefined) || selectedEntitlementPass || selectedDiscountCard || applicableDiscounts[0];
|
|
1459
|
+
// 实际次数分配必须使用同一顺序,避免选中状态切换后仍将次数分配给默认卡。
|
|
1460
|
+
var prioritizedApplicableDiscounts = selectedDiscount && isFullCoveragePass(selectedDiscount) ? [selectedDiscount].concat(_toConsumableArray(applicableDiscounts.filter(function (discount) {
|
|
1461
|
+
return isFullCoveragePass(discount) && String(discount.id) !== String(selectedDiscount.id);
|
|
1237
1462
|
})), _toConsumableArray(applicableDiscounts.filter(function (discount) {
|
|
1238
|
-
return (discount
|
|
1463
|
+
return !isFullCoveragePass(discount);
|
|
1239
1464
|
}))) : applicableDiscounts;
|
|
1240
1465
|
|
|
1241
1466
|
// 如果是手动折扣,则不适用优惠券
|
|
@@ -1247,8 +1472,8 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1247
1472
|
isManualDiscount = typeof product.isManualDiscount === 'boolean' ? product.isManualDiscount : ((_product$discount_lis5 = product.discount_list) === null || _product$discount_lis5 === void 0 ? void 0 : _product$discount_lis5.some(function (item) {
|
|
1248
1473
|
return item.type === 'product';
|
|
1249
1474
|
})) || product.total != product.origin_total && (product.bundle || []).every(function (item) {
|
|
1250
|
-
var
|
|
1251
|
-
return !((
|
|
1475
|
+
var _ref25;
|
|
1476
|
+
return !((_ref25 = item.discount_list || []) !== null && _ref25 !== void 0 && _ref25.length);
|
|
1252
1477
|
}) && (!((_product$discount_lis6 = product.discount_list) !== null && _product$discount_lis6 !== void 0 && _product$discount_lis6.length) || ((_product11 = product) === null || _product11 === void 0 || (_product11 = _product11.discount_list) === null || _product11 === void 0 || (_product11$every = _product11.every) === null || _product11$every === void 0 ? void 0 : _product11$every.call(_product11, function (item) {
|
|
1253
1478
|
return item.type === 'product';
|
|
1254
1479
|
})));
|
|
@@ -1264,8 +1489,8 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1264
1489
|
isManualDiscount = typeof parentProduct.isManualDiscount === 'boolean' ? parentProduct.isManualDiscount : ((_parentProduct$discou = parentProduct.discount_list) === null || _parentProduct$discou === void 0 ? void 0 : _parentProduct$discou.some(function (item) {
|
|
1265
1490
|
return item.type === 'product';
|
|
1266
1491
|
})) || parentProduct.total != parentProduct.origin_total && (parentProduct.bundle || []).every(function (item) {
|
|
1267
|
-
var
|
|
1268
|
-
return !((
|
|
1492
|
+
var _ref26;
|
|
1493
|
+
return !((_ref26 = item.discount_list || []) !== null && _ref26 !== void 0 && _ref26.length);
|
|
1269
1494
|
}) && (!((_parentProduct$discou2 = parentProduct.discount_list) !== null && _parentProduct$discou2 !== void 0 && _parentProduct$discou2.length) || (parentProduct === null || parentProduct === void 0 || (_parentProduct$discou3 = parentProduct.discount_list) === null || _parentProduct$discou3 === void 0 || (_parentProduct$discou4 = _parentProduct$discou3.every) === null || _parentProduct$discou4 === void 0 ? void 0 : _parentProduct$discou4.call(_parentProduct$discou3, function (item) {
|
|
1270
1495
|
return item.type === 'product';
|
|
1271
1496
|
})));
|
|
@@ -1358,8 +1583,8 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1358
1583
|
discount_list: isManualDiscount ? _this4.resolveDiscountListForManualOverride(product.discount_list) : _this4.filterDiscountListByType(product.discount_list, 'promotion')
|
|
1359
1584
|
}))]);
|
|
1360
1585
|
} else {
|
|
1361
|
-
var
|
|
1362
|
-
var total = product.inPromotion ? (
|
|
1586
|
+
var _ref27, _product$_promotion$f, _product12, _product$origin_total;
|
|
1587
|
+
var total = product.inPromotion ? (_ref27 = (_product$_promotion$f = (_product12 = product) === null || _product12 === void 0 || (_product12 = _product12._promotion) === null || _product12 === void 0 ? void 0 : _product12.finalPrice) !== null && _product$_promotion$f !== void 0 ? _product$_promotion$f : product.origin_total) !== null && _ref27 !== void 0 ? _ref27 : product.total : (_product$origin_total = product.origin_total) !== null && _product$origin_total !== void 0 ? _product$origin_total : product.total;
|
|
1363
1588
|
var main_product_selling_price = product.price;
|
|
1364
1589
|
if ((product.discount_list || []).some(function (item) {
|
|
1365
1590
|
return item.type === 'promotion';
|
|
@@ -1400,21 +1625,15 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1400
1625
|
return;
|
|
1401
1626
|
}
|
|
1402
1627
|
|
|
1403
|
-
//
|
|
1404
|
-
var isNeedSplit = (selectedDiscount
|
|
1628
|
+
// good_pass 与 Entitlement Pass 都沿用全额抵扣卡的商品行拆分机制。
|
|
1629
|
+
var isNeedSplit = isFullCoveragePass(selectedDiscount);
|
|
1405
1630
|
|
|
1406
1631
|
// 需要拆分出来的数量
|
|
1407
1632
|
var totalQuantity = product.quantity || product.num || 1;
|
|
1408
|
-
var
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
// 🔥 如果selectedDiscount有config配置,则使用config.maxUsagePerOrder限制使用次数
|
|
1413
|
-
var maxUsageLimit = availableGoodPassCount;
|
|
1414
|
-
if (selectedDiscount.config && selectedDiscount.config.maxUsagePerOrder) {
|
|
1415
|
-
maxUsageLimit = Math.min(availableGoodPassCount, selectedDiscount.config.maxUsagePerOrder);
|
|
1416
|
-
}
|
|
1417
|
-
var splitCount = isNeedSplit ? Math.min(product.quantity || product.num || 1, maxUsageLimit) : 1;
|
|
1633
|
+
var fullCoveragePassUsageGroups = isNeedSplit ? buildFullCoveragePassUsageGroups(prioritizedApplicableDiscounts, totalQuantity) : [];
|
|
1634
|
+
var splitCount = isNeedSplit ? fullCoveragePassUsageGroups.reduce(function (total, group) {
|
|
1635
|
+
return total + group.count;
|
|
1636
|
+
}, 0) : 1;
|
|
1418
1637
|
var arr = [];
|
|
1419
1638
|
|
|
1420
1639
|
// 🔥 主商品和bundle子商品分别处理
|
|
@@ -1423,8 +1642,8 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1423
1642
|
if (splitCount < totalQuantity && isNeedSplit) {
|
|
1424
1643
|
var _product$origin_total2, _product$main_product2;
|
|
1425
1644
|
var remainingQuantity = totalQuantity - splitCount;
|
|
1426
|
-
var
|
|
1427
|
-
return (discount
|
|
1645
|
+
var applicableNonFullCoveragePassById = new Map(applicableDiscounts.filter(function (discount) {
|
|
1646
|
+
return !isFullCoveragePass(discount);
|
|
1428
1647
|
}).map(function (discount) {
|
|
1429
1648
|
return [String(discount.id), discount];
|
|
1430
1649
|
}));
|
|
@@ -1432,19 +1651,19 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1432
1651
|
var _discount$discount$re, _discount$discount5;
|
|
1433
1652
|
var discountType = discount.tag || discount.type;
|
|
1434
1653
|
if (discountType === 'promotion') return true;
|
|
1435
|
-
if (
|
|
1654
|
+
if (isFullCoveragePass(discount)) return false;
|
|
1436
1655
|
var resourceId = (_discount$discount$re = (_discount$discount5 = discount.discount) === null || _discount$discount5 === void 0 ? void 0 : _discount$discount5.resource_id) !== null && _discount$discount$re !== void 0 ? _discount$discount$re : discount.id;
|
|
1437
|
-
return resourceId !== undefined && resourceId !== null &&
|
|
1656
|
+
return resourceId !== undefined && resourceId !== null && applicableNonFullCoveragePassById.has(String(resourceId));
|
|
1438
1657
|
}).map(function (discount) {
|
|
1439
1658
|
var _discount$discount$re2, _discount$discount6;
|
|
1440
1659
|
if ((discount.tag || discount.type) === 'promotion') return discount;
|
|
1441
1660
|
var resourceId = (_discount$discount$re2 = (_discount$discount6 = discount.discount) === null || _discount$discount6 === void 0 ? void 0 : _discount$discount6.resource_id) !== null && _discount$discount$re2 !== void 0 ? _discount$discount$re2 : discount.id;
|
|
1442
|
-
var matchedDiscount =
|
|
1661
|
+
var matchedDiscount = applicableNonFullCoveragePassById.get(String(resourceId));
|
|
1443
1662
|
if (matchedDiscount) {
|
|
1444
1663
|
// 实际场景:3 件折扣卡商品中拆出 1 件改用商品券后,
|
|
1445
1664
|
// 剩余 2 件仍在使用原折扣卡;必须同步登记折扣卡的使用状态,
|
|
1446
1665
|
// 否则 updatedDiscountList 会把它改成未选中并清空 savedAmount。
|
|
1447
|
-
|
|
1666
|
+
markDiscountUsed(matchedDiscount);
|
|
1448
1667
|
var appliedProducts = appliedDiscountProducts.get(matchedDiscount.id) || [];
|
|
1449
1668
|
appliedProducts.push(_objectSpread(_objectSpread({}, discount), {}, {
|
|
1450
1669
|
_num: remainingQuantity
|
|
@@ -1457,7 +1676,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1457
1676
|
});
|
|
1458
1677
|
});
|
|
1459
1678
|
var hasRetainedWalletDiscount = remainderDiscountList.some(function (discount) {
|
|
1460
|
-
return
|
|
1679
|
+
return (discount.tag || discount.type) !== 'promotion' && !isFullCoveragePass(discount);
|
|
1461
1680
|
});
|
|
1462
1681
|
var _total = (_product$origin_total2 = product.origin_total) !== null && _product$origin_total2 !== void 0 ? _product$origin_total2 : product.total;
|
|
1463
1682
|
if ((product.discount_list || []).some(function (item) {
|
|
@@ -1468,7 +1687,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1468
1687
|
}
|
|
1469
1688
|
arr.push(_this4.hooks.setProduct(originProduct, _objectSpread({
|
|
1470
1689
|
// 商品券只替换被拆出的 splitCount 件。余量行原本仍有效的折扣卡
|
|
1471
|
-
//
|
|
1690
|
+
// 不能随全额抵扣卡拆分一起清除;已取消或已失效的折扣不会进入此列表。
|
|
1472
1691
|
discount_list: remainderDiscountList,
|
|
1473
1692
|
quantity: remainingQuantity,
|
|
1474
1693
|
_id: product._id.split('___')[0],
|
|
@@ -1477,15 +1696,21 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1477
1696
|
main_product_selling_price: (_product$main_product2 = product.main_product_selling_price) !== null && _product$main_product2 !== void 0 ? _product$main_product2 : product.price
|
|
1478
1697
|
} : {})));
|
|
1479
1698
|
}
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1699
|
+
var discountUsageGroups = isNeedSplit ? fullCoveragePassUsageGroups : [{
|
|
1700
|
+
discount: selectedDiscount,
|
|
1701
|
+
count: 1
|
|
1702
|
+
}];
|
|
1703
|
+
for (var i = 0; i < discountUsageGroups.length; i++) {
|
|
1704
|
+
var _originProduct4, _selectedDiscount$con, _product$options, _product$options2, _selectedDiscount$met, _selectedDiscount$met2, _reapplyDiscountPerce, _selectedDiscount$met3;
|
|
1705
|
+
var _discountUsageGroups$ = discountUsageGroups[i],
|
|
1706
|
+
_selectedDiscount = _discountUsageGroups$.discount,
|
|
1707
|
+
appliedUseCount = _discountUsageGroups$.count;
|
|
1483
1708
|
// 标记优惠券为已使用
|
|
1484
|
-
|
|
1709
|
+
markDiscountUsed(_selectedDiscount, appliedUseCount);
|
|
1485
1710
|
// 🔥 更新 product_id 使用计数
|
|
1486
|
-
if ((_selectedDiscount
|
|
1711
|
+
if (isFullCoveragePass(_selectedDiscount)) {
|
|
1487
1712
|
var currentCount = usedProductIdCounts.get(_selectedDiscount.product_id) || 0;
|
|
1488
|
-
usedProductIdCounts.set(_selectedDiscount.product_id, currentCount +
|
|
1713
|
+
usedProductIdCounts.set(_selectedDiscount.product_id, currentCount + appliedUseCount);
|
|
1489
1714
|
}
|
|
1490
1715
|
|
|
1491
1716
|
// 记录实际应用了优惠券的商品信息
|
|
@@ -1547,7 +1772,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1547
1772
|
var mainProductDiscountAmount = amount;
|
|
1548
1773
|
var lineDiscountAmount = new Decimal(mainProductDiscountAmount).plus(optionDiscountAmount).toNumber();
|
|
1549
1774
|
var discountType = _selectedDiscount.tag || _selectedDiscount.type;
|
|
1550
|
-
var
|
|
1775
|
+
var isFullCoverage = isFullCoveragePass(_selectedDiscount);
|
|
1551
1776
|
var discountDetail = {
|
|
1552
1777
|
amount: lineDiscountAmount,
|
|
1553
1778
|
type: _selectedDiscount.tag === 'product_discount_card' ? 'discount_card' : discountType,
|
|
@@ -1563,10 +1788,11 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1563
1788
|
discount_product_id: _selectedDiscount.product_id
|
|
1564
1789
|
},
|
|
1565
1790
|
// 前端使用的num数量,为了计算优惠金额
|
|
1566
|
-
_num:
|
|
1791
|
+
_num: isFullCoverage ? appliedUseCount : product.num,
|
|
1567
1792
|
config: _selectedDiscount === null || _selectedDiscount === void 0 ? void 0 : _selectedDiscount.config,
|
|
1568
1793
|
metadata: _objectSpread(_objectSpread({
|
|
1569
|
-
|
|
1794
|
+
encoded: ((_selectedDiscount$met3 = _selectedDiscount.metadata) === null || _selectedDiscount$met3 === void 0 ? void 0 : _selectedDiscount$met3.encoded) || _selectedDiscount.encoded,
|
|
1795
|
+
num: isFullCoverage ? appliedUseCount : 1,
|
|
1570
1796
|
discount_rule_uncheck_flag: _selectedDiscount === null || _selectedDiscount === void 0 ? void 0 : _selectedDiscount.discount_rule_uncheck_flag
|
|
1571
1797
|
}, productDiscountDifference !== undefined && {
|
|
1572
1798
|
product_discount_difference: productDiscountDifference
|
|
@@ -1584,9 +1810,9 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1584
1810
|
if (product.isClient) {
|
|
1585
1811
|
arr.push(_this4.hooks.setProduct(originProduct, {
|
|
1586
1812
|
discount_list: [discountDetail],
|
|
1587
|
-
//
|
|
1588
|
-
price:
|
|
1589
|
-
quantity: isNeedSplit ?
|
|
1813
|
+
// 全额抵扣卡:主商品价以折后价为准;勿用 product.price - amount(amount 含 option 优惠时会算错)
|
|
1814
|
+
price: isFullCoverage ? mainProductSellingPrice : product.price,
|
|
1815
|
+
quantity: isNeedSplit ? appliedUseCount : product.quantity,
|
|
1590
1816
|
origin_total: getProductOriginTotalPrice({
|
|
1591
1817
|
product: {
|
|
1592
1818
|
original_price: product.original_price
|
|
@@ -1603,8 +1829,8 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1603
1829
|
arr.push(_this4.hooks.setProduct(originProduct, {
|
|
1604
1830
|
discount_list: _this4.filterDiscountListByType(product.discount_list, 'promotion').concat([discountDetail]),
|
|
1605
1831
|
_id: product._id.split('___')[0] + '___' + _selectedDiscount.id + index,
|
|
1606
|
-
price:
|
|
1607
|
-
quantity: isNeedSplit ?
|
|
1832
|
+
price: isFullCoverage ? 0 : product.price,
|
|
1833
|
+
quantity: isNeedSplit ? appliedUseCount : product.quantity,
|
|
1608
1834
|
total: _total2,
|
|
1609
1835
|
origin_total: productOriginTotal,
|
|
1610
1836
|
main_product_selling_price: mainProductSellingPrice,
|
|
@@ -1621,15 +1847,17 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1621
1847
|
var discountNum = splitCount;
|
|
1622
1848
|
var normalNum = totalQuantity - discountNum;
|
|
1623
1849
|
|
|
1624
|
-
//
|
|
1625
|
-
for (var _i = 0; _i <
|
|
1626
|
-
var _selectedDiscount2$me;
|
|
1627
|
-
var
|
|
1628
|
-
|
|
1850
|
+
// 同一卡实例的本次新增使用合并为一条,metadata.num 记录实际次数。
|
|
1851
|
+
for (var _i = 0; _i < fullCoveragePassUsageGroups.length; _i++) {
|
|
1852
|
+
var _selectedDiscount2$me, _selectedDiscount2$me2;
|
|
1853
|
+
var _fullCoveragePassUsag = fullCoveragePassUsageGroups[_i],
|
|
1854
|
+
_selectedDiscount2 = _fullCoveragePassUsag.discount,
|
|
1855
|
+
_appliedUseCount = _fullCoveragePassUsag.count;
|
|
1856
|
+
markDiscountUsed(_selectedDiscount2, _appliedUseCount);
|
|
1629
1857
|
// 🔥 更新 product_id 使用计数
|
|
1630
|
-
if ((_selectedDiscount2
|
|
1858
|
+
if (isFullCoveragePass(_selectedDiscount2)) {
|
|
1631
1859
|
var _currentCount = usedProductIdCounts.get(_selectedDiscount2.product_id) || 0;
|
|
1632
|
-
usedProductIdCounts.set(_selectedDiscount2.product_id, _currentCount +
|
|
1860
|
+
usedProductIdCounts.set(_selectedDiscount2.product_id, _currentCount + _appliedUseCount);
|
|
1633
1861
|
}
|
|
1634
1862
|
|
|
1635
1863
|
// 🔥 生成唯一的 _id
|
|
@@ -1637,11 +1865,12 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1637
1865
|
|
|
1638
1866
|
// 计算折扣后的价格(使用 getDiscountAmount,内部已处理 maxDeductionAmount)
|
|
1639
1867
|
var discountedPrice = getDiscountAmount(_selectedDiscount2, product.origin_total, product.origin_total);
|
|
1640
|
-
var
|
|
1868
|
+
var bundleDiscountAmountPerItem = new Decimal(product.origin_total || 0).minus(discountedPrice).toNumber();
|
|
1869
|
+
var bundleDiscountAmount = new Decimal(bundleDiscountAmountPerItem).mul(_appliedUseCount).toNumber();
|
|
1641
1870
|
debugger;
|
|
1642
1871
|
var _discountDetail = {
|
|
1643
1872
|
amount: bundleDiscountAmount,
|
|
1644
|
-
type:
|
|
1873
|
+
type: _selectedDiscount2.tag || _selectedDiscount2.type,
|
|
1645
1874
|
discount: {
|
|
1646
1875
|
fixed_amount: product.origin_total,
|
|
1647
1876
|
discount_calculation_mode: _selectedDiscount2 === null || _selectedDiscount2 === void 0 || (_selectedDiscount2$me = _selectedDiscount2.metadata) === null || _selectedDiscount2$me === void 0 ? void 0 : _selectedDiscount2$me.discount_calculation_mode,
|
|
@@ -1652,12 +1881,13 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1652
1881
|
discount_product_id: _selectedDiscount2.product_id
|
|
1653
1882
|
},
|
|
1654
1883
|
metadata: {
|
|
1884
|
+
encoded: ((_selectedDiscount2$me2 = _selectedDiscount2.metadata) === null || _selectedDiscount2$me2 === void 0 ? void 0 : _selectedDiscount2$me2.encoded) || _selectedDiscount2.encoded,
|
|
1655
1885
|
// 🔥 使用拆分后的唯一 _id
|
|
1656
1886
|
custom_product_bundle_map_id: uniqueId,
|
|
1657
1887
|
discount_rule_uncheck_flag: _selectedDiscount2 === null || _selectedDiscount2 === void 0 ? void 0 : _selectedDiscount2.discount_rule_uncheck_flag,
|
|
1658
|
-
num:
|
|
1888
|
+
num: _appliedUseCount
|
|
1659
1889
|
},
|
|
1660
|
-
_num:
|
|
1890
|
+
_num: _appliedUseCount,
|
|
1661
1891
|
config: _selectedDiscount2 === null || _selectedDiscount2 === void 0 ? void 0 : _selectedDiscount2.config
|
|
1662
1892
|
};
|
|
1663
1893
|
|
|
@@ -1668,11 +1898,11 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1668
1898
|
processedItems.push(_objectSpread(_objectSpread({}, flatItem), {}, {
|
|
1669
1899
|
// 🔥 使用唯一的 _id
|
|
1670
1900
|
_id: uniqueId,
|
|
1671
|
-
num:
|
|
1672
|
-
quantity:
|
|
1901
|
+
num: _appliedUseCount,
|
|
1902
|
+
quantity: _appliedUseCount,
|
|
1673
1903
|
price: discountedPrice,
|
|
1674
1904
|
// 折扣后的价格
|
|
1675
|
-
total: discountedPrice,
|
|
1905
|
+
total: new Decimal(discountedPrice).mul(_appliedUseCount).toNumber(),
|
|
1676
1906
|
discount_list: [_discountDetail],
|
|
1677
1907
|
processed: true,
|
|
1678
1908
|
_discountId: _selectedDiscount2.id
|
|
@@ -1691,12 +1921,12 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1691
1921
|
}));
|
|
1692
1922
|
}
|
|
1693
1923
|
} else {
|
|
1694
|
-
var _selectedDiscount3$me, _selectedDiscount3$me2, _reapplyDiscountPerce2, _flatItem$parentProdu9;
|
|
1924
|
+
var _selectedDiscount3$me, _selectedDiscount3$me2, _reapplyDiscountPerce2, _selectedDiscount3$me3, _flatItem$parentProdu9;
|
|
1695
1925
|
// 折扣卡:不拆分数量,直接应用
|
|
1696
1926
|
var _selectedDiscount3 = selectedDiscountCard || applicableDiscounts[0];
|
|
1697
|
-
|
|
1927
|
+
markDiscountUsed(_selectedDiscount3);
|
|
1698
1928
|
// 🔥 更新 product_id 使用计数(虽然此处主要是折扣卡,但保持一致性)
|
|
1699
|
-
if ((_selectedDiscount3
|
|
1929
|
+
if (isFullCoveragePass(_selectedDiscount3)) {
|
|
1700
1930
|
var _currentCount2 = usedProductIdCounts.get(_selectedDiscount3.product_id) || 0;
|
|
1701
1931
|
usedProductIdCounts.set(_selectedDiscount3.product_id, _currentCount2 + 1);
|
|
1702
1932
|
}
|
|
@@ -1746,6 +1976,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1746
1976
|
discount_product_id: _selectedDiscount3.product_id
|
|
1747
1977
|
},
|
|
1748
1978
|
metadata: _objectSpread({
|
|
1979
|
+
encoded: ((_selectedDiscount3$me3 = _selectedDiscount3.metadata) === null || _selectedDiscount3$me3 === void 0 ? void 0 : _selectedDiscount3$me3.encoded) || _selectedDiscount3.encoded,
|
|
1749
1980
|
// 🔥 使用唯一的 _id
|
|
1750
1981
|
custom_product_bundle_map_id: _uniqueId,
|
|
1751
1982
|
discount_rule_uncheck_flag: _selectedDiscount3 === null || _selectedDiscount3 === void 0 ? void 0 : _selectedDiscount3.discount_rule_uncheck_flag,
|
|
@@ -1826,11 +2057,10 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1826
2057
|
// 没有bundle,直接使用主商品处理结果
|
|
1827
2058
|
result.push.apply(result, _toConsumableArray(mainProductArr));
|
|
1828
2059
|
} else {
|
|
1829
|
-
// 🔥 有bundle
|
|
2060
|
+
// 🔥 有 bundle,需要检查子商品是否应用了全额抵扣卡
|
|
1830
2061
|
// 1. 先收集所有bundle子商品的处理结果
|
|
1831
2062
|
var bundleProcessingInfo = new Map();
|
|
1832
|
-
var
|
|
1833
|
-
|
|
2063
|
+
var hasFullCoveragePassApplied = false;
|
|
1834
2064
|
if (product.bundle && Array.isArray(product.bundle)) {
|
|
1835
2065
|
product.bundle.forEach(function (bundleItem, bundleIndex) {
|
|
1836
2066
|
var bundleItemId = "".concat(product._id, "_bundle_").concat(bundleIndex);
|
|
@@ -1841,15 +2071,14 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1841
2071
|
} else {
|
|
1842
2072
|
// 处理过的bundle item
|
|
1843
2073
|
bundleProcessingInfo.set(bundleIndex, processedBundleItems);
|
|
1844
|
-
|
|
1845
|
-
var hasGoodPass = processedBundleItems.some(function (item) {
|
|
2074
|
+
var hasFullCoveragePass = processedBundleItems.some(function (item) {
|
|
1846
2075
|
var _item$discount_list;
|
|
1847
2076
|
return (_item$discount_list = item.discount_list) === null || _item$discount_list === void 0 ? void 0 : _item$discount_list.some(function (discount) {
|
|
1848
|
-
return discount
|
|
2077
|
+
return isFullCoveragePass(discount);
|
|
1849
2078
|
});
|
|
1850
2079
|
});
|
|
1851
|
-
if (
|
|
1852
|
-
|
|
2080
|
+
if (hasFullCoveragePass) {
|
|
2081
|
+
hasFullCoveragePassApplied = true;
|
|
1853
2082
|
}
|
|
1854
2083
|
}
|
|
1855
2084
|
});
|
|
@@ -1857,7 +2086,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1857
2086
|
|
|
1858
2087
|
// 🔥 2. 如果有子商品应用了商品券,且主商品数量大于1,需要拆分主商品
|
|
1859
2088
|
var mainProductQuantity = mainProductArr[0] ? _this4.hooks.getProduct(mainProductArr[0]).quantity : 1;
|
|
1860
|
-
if (
|
|
2089
|
+
if (hasFullCoveragePassApplied && mainProductArr.length === 1 && mainProductQuantity > 1) {
|
|
1861
2090
|
var mainProduct = mainProductArr[0];
|
|
1862
2091
|
var mainProductData = _this4.hooks.getProduct(mainProduct);
|
|
1863
2092
|
|
|
@@ -1925,8 +2154,8 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1925
2154
|
|
|
1926
2155
|
// 🔥 更新主商品自己的 discount_list 中的 num(quantity=1)
|
|
1927
2156
|
var updatedMainDiscountList = mainProductData.discount_list.map(function (discount) {
|
|
1928
|
-
var _discount$
|
|
1929
|
-
if (discount !== null && discount !== void 0 && (_discount$
|
|
2157
|
+
var _discount$metadata7, _discount$metadata8;
|
|
2158
|
+
if (discount !== null && discount !== void 0 && (_discount$metadata7 = discount.metadata) !== null && _discount$metadata7 !== void 0 && _discount$metadata7.custom_product_bundle_map_id) {
|
|
1930
2159
|
// bundle的discount_list保持不变
|
|
1931
2160
|
return discount;
|
|
1932
2161
|
}
|
|
@@ -1934,7 +2163,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1934
2163
|
return _objectSpread(_objectSpread({}, discount), {}, {
|
|
1935
2164
|
// num: 1,
|
|
1936
2165
|
metadata: _objectSpread(_objectSpread({}, discount.metadata), {}, {
|
|
1937
|
-
custom_product_bundle_map_id: discount === null || discount === void 0 || (_discount$
|
|
2166
|
+
custom_product_bundle_map_id: discount === null || discount === void 0 || (_discount$metadata8 = discount.metadata) === null || _discount$metadata8 === void 0 ? void 0 : _discount$metadata8.custom_product_bundle_map_id,
|
|
1938
2167
|
num: 1
|
|
1939
2168
|
})
|
|
1940
2169
|
});
|
|
@@ -1999,8 +2228,8 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1999
2228
|
|
|
2000
2229
|
// 🔥 更新主商品自己的 discount_list 中的 num(quantity=原quantity-1)
|
|
2001
2230
|
var updatedMainDiscountListOriginal = mainProductData.discount_list.map(function (discount) {
|
|
2002
|
-
var _discount$
|
|
2003
|
-
if (discount !== null && discount !== void 0 && (_discount$
|
|
2231
|
+
var _discount$metadata9, _discount$metadata10;
|
|
2232
|
+
if (discount !== null && discount !== void 0 && (_discount$metadata9 = discount.metadata) !== null && _discount$metadata9 !== void 0 && _discount$metadata9.custom_product_bundle_map_id) {
|
|
2004
2233
|
// bundle的discount_list保持不变
|
|
2005
2234
|
return discount;
|
|
2006
2235
|
}
|
|
@@ -2008,7 +2237,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
2008
2237
|
return _objectSpread(_objectSpread({}, discount), {}, {
|
|
2009
2238
|
metadata: _objectSpread(_objectSpread({}, discount.metadata), {}, {
|
|
2010
2239
|
num: mainProductQuantity - 1,
|
|
2011
|
-
custom_product_bundle_map_id: discount === null || discount === void 0 || (_discount$
|
|
2240
|
+
custom_product_bundle_map_id: discount === null || discount === void 0 || (_discount$metadata10 = discount.metadata) === null || _discount$metadata10 === void 0 ? void 0 : _discount$metadata10.custom_product_bundle_map_id
|
|
2012
2241
|
})
|
|
2013
2242
|
// num: mainProductQuantity - 1,
|
|
2014
2243
|
});
|
|
@@ -2058,7 +2287,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
2058
2287
|
} else {
|
|
2059
2288
|
// 🔥 没有子商品被拆分,使用原有逻辑
|
|
2060
2289
|
mainProductArr.forEach(function (mainProduct) {
|
|
2061
|
-
var
|
|
2290
|
+
var _ref29, _mainProductData$main, _mainProductData$disc, _mainProductData$disc2, _mainProductData$disc3;
|
|
2062
2291
|
var mainProductData = _this4.hooks.getProduct(mainProduct);
|
|
2063
2292
|
|
|
2064
2293
|
// 重组bundle
|
|
@@ -2073,16 +2302,16 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
2073
2302
|
} else {
|
|
2074
2303
|
// 🔥 关键:拆分后的bundle item
|
|
2075
2304
|
processedBundleItems.forEach(function (item) {
|
|
2076
|
-
var _item$price,
|
|
2305
|
+
var _item$price, _ref28, _item$bundle_selling_;
|
|
2077
2306
|
var nextBundlePrice = (_item$price = item.price) !== null && _item$price !== void 0 ? _item$price : bundleItem.price;
|
|
2078
|
-
var nextBundleSellingPrice = (
|
|
2307
|
+
var nextBundleSellingPrice = (_ref28 = (_item$bundle_selling_ = item.bundle_selling_price) !== null && _item$bundle_selling_ !== void 0 ? _item$bundle_selling_ : item.price) !== null && _ref28 !== void 0 ? _ref28 : bundleItem.bundle_selling_price;
|
|
2079
2308
|
// 🔥 更新 discount_list 中的 num,使其与拆分后的 item.num 一致
|
|
2080
2309
|
var updatedDiscountList = (item.discount_list || []).map(function (discount) {
|
|
2081
|
-
var _discount$
|
|
2310
|
+
var _discount$metadata11;
|
|
2082
2311
|
return _objectSpread(_objectSpread({}, discount), {}, {
|
|
2083
2312
|
metadata: _objectSpread(_objectSpread({}, discount.metadata), {}, {
|
|
2084
2313
|
num: item.num,
|
|
2085
|
-
custom_product_bundle_map_id: discount === null || discount === void 0 || (_discount$
|
|
2314
|
+
custom_product_bundle_map_id: discount === null || discount === void 0 || (_discount$metadata11 = discount.metadata) === null || _discount$metadata11 === void 0 ? void 0 : _discount$metadata11.custom_product_bundle_map_id
|
|
2086
2315
|
})
|
|
2087
2316
|
// num: item.num, // 使用拆分后的 num
|
|
2088
2317
|
});
|
|
@@ -2102,7 +2331,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
2102
2331
|
|
|
2103
2332
|
// 主商品已经在前面的 setProduct 中应用过折扣;这里只替换 bundle,
|
|
2104
2333
|
// 避免把主商品 discount_list 再扣一次。
|
|
2105
|
-
var mainSellingPrice = (
|
|
2334
|
+
var mainSellingPrice = (_ref29 = (_mainProductData$main = mainProductData.main_product_selling_price) !== null && _mainProductData$main !== void 0 ? _mainProductData$main : mainProductData.price) !== null && _ref29 !== void 0 ? _ref29 : 0;
|
|
2106
2335
|
var newTotal = Number(mainSellingPrice || 0);
|
|
2107
2336
|
var newOriginTotal = Number(mainProductData.original_price || mainProductData.price || 0);
|
|
2108
2337
|
|
|
@@ -2171,25 +2400,36 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
2171
2400
|
|
|
2172
2401
|
// 获取此优惠券实际应用的商品详情
|
|
2173
2402
|
var appliedProductDetails = appliedDiscountProducts.get(discount.id) || [];
|
|
2403
|
+
var committedAppliedProductDetails = isEntitlementPass(discount) ? mergeEntitlementAppliedProductDetails(discount.committedAppliedProductDetails || []) : [];
|
|
2404
|
+
var allAppliedProductDetails = isEntitlementPass(discount) ? mergeEntitlementAppliedProductDetails([].concat(_toConsumableArray(committedAppliedProductDetails), _toConsumableArray(appliedProductDetails))) : appliedProductDetails;
|
|
2174
2405
|
|
|
2175
2406
|
// 根据是否有适用商品决定isAvailable
|
|
2176
2407
|
var isAvailable = applicableProducts.length > 0;
|
|
2408
|
+
var timeReasons = discountTimeReasons.get(discount.id) || [];
|
|
2409
|
+
var timeReason = timeReasons.length ? timeReasons.every(Boolean) ? timeReasons[0] : undefined : getDiscountTimeUnavailableReason(discount, dayjs().format('YYYY-MM-DD HH:mm:ss'));
|
|
2410
|
+
var reasonCode = isAvailable ? undefined : getDiscountUsageBlockReason(discount) || timeReason || discount.reasonCode || (discountHolderMismatch.has(discount.id) ? 'holder_not_matched' : 'product_not_applicable');
|
|
2411
|
+
var availabilityReason = {
|
|
2412
|
+
reasonCode: reasonCode,
|
|
2413
|
+
reason: reasonCode && reasonCode === discount.reasonCode ? discount.reason : undefined
|
|
2414
|
+
};
|
|
2177
2415
|
|
|
2178
2416
|
// 如果此优惠券被明确设置为不选中,保持其状态,但正确设置isAvailable
|
|
2179
2417
|
if (typeof discount.isSelected === 'boolean' && discount.isSelected === false && discount.isManualSelect) {
|
|
2180
|
-
return _objectSpread(_objectSpread({}, discount), {}, {
|
|
2418
|
+
return _objectSpread(_objectSpread(_objectSpread({}, discount), availabilityReason), {}, {
|
|
2181
2419
|
isSelected: false,
|
|
2182
2420
|
isAvailable: isAvailable,
|
|
2183
2421
|
// 正确设置可用性
|
|
2184
2422
|
applicableProductIds: applicableProducts,
|
|
2185
2423
|
// 添加可抵扣的商品详情
|
|
2186
2424
|
applicableProductDetails: applicableProductDetails,
|
|
2187
|
-
//
|
|
2188
|
-
appliedProductDetails:
|
|
2425
|
+
// 已提交的历史使用不可撤销;只取消本次新增分配。
|
|
2426
|
+
appliedProductDetails: committedAppliedProductDetails
|
|
2189
2427
|
});
|
|
2190
2428
|
}
|
|
2191
|
-
if (
|
|
2429
|
+
if (isDiscountUsed(discount)) {
|
|
2192
2430
|
return _objectSpread(_objectSpread({}, discount), {}, {
|
|
2431
|
+
reason: undefined,
|
|
2432
|
+
reasonCode: undefined,
|
|
2193
2433
|
isSelected: true,
|
|
2194
2434
|
isManualSelect: options !== null && options !== void 0 && options.scan ? false : discount.isManualSelect,
|
|
2195
2435
|
// 标记为可用,因为它已被应用
|
|
@@ -2199,7 +2439,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
2199
2439
|
// 添加可抵扣的商品详情
|
|
2200
2440
|
applicableProductDetails: applicableProductDetails,
|
|
2201
2441
|
// 添加实际抵扣的商品详情
|
|
2202
|
-
appliedProductDetails:
|
|
2442
|
+
appliedProductDetails: allAppliedProductDetails
|
|
2203
2443
|
});
|
|
2204
2444
|
}
|
|
2205
2445
|
var isSelected = typeof discount.isSelected === 'boolean' ? discount.isSelected : undefined;
|
|
@@ -2207,10 +2447,10 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
2207
2447
|
// 如果是可用的 并且没有手动标记 则设置为选中
|
|
2208
2448
|
if (isAvailable && appliedProductDetails.length && !discount.isManualSelect) {
|
|
2209
2449
|
isSelected = true;
|
|
2210
|
-
} else if (!appliedProductDetails.length) {
|
|
2450
|
+
} else if (!appliedProductDetails.length && !committedAppliedProductDetails.length) {
|
|
2211
2451
|
isSelected = false;
|
|
2212
2452
|
}
|
|
2213
|
-
return _objectSpread(_objectSpread({}, discount), {}, {
|
|
2453
|
+
return _objectSpread(_objectSpread(_objectSpread({}, discount), availabilityReason), {}, {
|
|
2214
2454
|
// 如果有适用的商品,标记为可用
|
|
2215
2455
|
isAvailable: isAvailable,
|
|
2216
2456
|
isSelected: isSelected,
|
|
@@ -2220,13 +2460,69 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
2220
2460
|
applicableProductIds: applicableProducts,
|
|
2221
2461
|
// 添加可抵扣的商品详情
|
|
2222
2462
|
applicableProductDetails: applicableProductDetails,
|
|
2223
|
-
//
|
|
2224
|
-
appliedProductDetails:
|
|
2463
|
+
// 编辑订单的历史使用继续保留,本次没有新增使用。
|
|
2464
|
+
appliedProductDetails: committedAppliedProductDetails
|
|
2465
|
+
});
|
|
2466
|
+
});
|
|
2467
|
+
|
|
2468
|
+
// 整单分配完成后统一记录卡余额;历史使用已包含在服务端余额中,只扣本次新增次数。
|
|
2469
|
+
var entitlementBalances = new Map();
|
|
2470
|
+
addModeDiscount.forEach(function (discount) {
|
|
2471
|
+
var quota = resolveEntitlementQuota(discount);
|
|
2472
|
+
if (!quota) return;
|
|
2473
|
+
entitlementBalances.set(String(discount.id), quota.type === 'unlimited' ? null : Math.max(quota.balance - (entitlementUsageCounts.get(discount.id) || 0), 0));
|
|
2474
|
+
});
|
|
2475
|
+
var getEntitlementBalance = function getEntitlementBalance(detail) {
|
|
2476
|
+
var _detail$discount$reso2, _detail$discount4;
|
|
2477
|
+
if (!isEntitlementPass(detail)) return undefined;
|
|
2478
|
+
var resourceId = (_detail$discount$reso2 = detail === null || detail === void 0 || (_detail$discount4 = detail.discount) === null || _detail$discount4 === void 0 ? void 0 : _detail$discount4.resource_id) !== null && _detail$discount$reso2 !== void 0 ? _detail$discount$reso2 : detail === null || detail === void 0 ? void 0 : detail.resource_id;
|
|
2479
|
+
return entitlementBalances.get(String(resourceId));
|
|
2480
|
+
};
|
|
2481
|
+
var needsEntitlementBalance = function needsEntitlementBalance(detail) {
|
|
2482
|
+
var _detail$metadata3;
|
|
2483
|
+
var balance = getEntitlementBalance(detail);
|
|
2484
|
+
return balance !== undefined && (detail === null || detail === void 0 || (_detail$metadata3 = detail.metadata) === null || _detail$metadata3 === void 0 ? void 0 : _detail$metadata3.balance) !== balance;
|
|
2485
|
+
};
|
|
2486
|
+
var withEntitlementBalance = function withEntitlementBalance(detail) {
|
|
2487
|
+
if (!needsEntitlementBalance(detail)) return detail;
|
|
2488
|
+
return _objectSpread(_objectSpread({}, detail), {}, {
|
|
2489
|
+
metadata: _objectSpread(_objectSpread({}, detail.metadata || {}), {}, {
|
|
2490
|
+
balance: getEntitlementBalance(detail)
|
|
2491
|
+
})
|
|
2225
2492
|
});
|
|
2493
|
+
};
|
|
2494
|
+
var getProductDiscountDetails = function getProductDiscountDetails(originProduct) {
|
|
2495
|
+
var product = _this4.hooks.getProduct(originProduct);
|
|
2496
|
+
return [].concat(_toConsumableArray(product.discount_list || []), _toConsumableArray((product.bundle || []).flatMap(function (bundle) {
|
|
2497
|
+
return bundle.discount_list || [];
|
|
2498
|
+
})));
|
|
2499
|
+
};
|
|
2500
|
+
var productsWithEntitlementBalances = entitlementBalances.size ? processedProductList.map(function (product) {
|
|
2501
|
+
if (!getProductDiscountDetails(product).some(needsEntitlementBalance)) {
|
|
2502
|
+
return product;
|
|
2503
|
+
}
|
|
2504
|
+
// 历史商品及套餐可能仍引用输入快照;仅复制有变化的行,并直接更新 metadata。
|
|
2505
|
+
// 不再次调用价格换算钩子,避免只补余额时改变商品价格。
|
|
2506
|
+
var nextProduct = cloneDeep(product);
|
|
2507
|
+
getProductDiscountDetails(nextProduct).forEach(function (detail) {
|
|
2508
|
+
if (!needsEntitlementBalance(detail)) return;
|
|
2509
|
+
detail.metadata = withEntitlementBalance(detail).metadata;
|
|
2510
|
+
});
|
|
2511
|
+
return nextProduct;
|
|
2512
|
+
}) : processedProductList;
|
|
2513
|
+
var discountsWithEntitlementBalances = [].concat(editModeDiscount, _toConsumableArray(updatedDiscountList)).map(function (discount) {
|
|
2514
|
+
if (!isEntitlementPass(discount) || !entitlementBalances.has(String(discount.id))) {
|
|
2515
|
+
return discount;
|
|
2516
|
+
}
|
|
2517
|
+
return _objectSpread(_objectSpread({}, discount), {}, {
|
|
2518
|
+
appliedProductDetails: (discount.appliedProductDetails || []).map(withEntitlementBalance)
|
|
2519
|
+
}, discount.committedAppliedProductDetails ? {
|
|
2520
|
+
committedAppliedProductDetails: discount.committedAppliedProductDetails.map(withEntitlementBalance)
|
|
2521
|
+
} : {});
|
|
2226
2522
|
});
|
|
2227
2523
|
return {
|
|
2228
|
-
productList:
|
|
2229
|
-
discountList:
|
|
2524
|
+
productList: productsWithEntitlementBalances,
|
|
2525
|
+
discountList: discountsWithEntitlementBalances
|
|
2230
2526
|
};
|
|
2231
2527
|
}
|
|
2232
2528
|
|
|
@@ -2251,15 +2547,15 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
2251
2547
|
var ruleType = usageRules.type;
|
|
2252
2548
|
// 套餐适用范围配置
|
|
2253
2549
|
var packageScope = usageRules === null || usageRules === void 0 ? void 0 : usageRules.package_scope;
|
|
2254
|
-
var
|
|
2255
|
-
|
|
2256
|
-
scopeType =
|
|
2257
|
-
|
|
2258
|
-
exclude_bundle_product_ids =
|
|
2259
|
-
|
|
2260
|
-
include_bundle_product_ids =
|
|
2261
|
-
|
|
2262
|
-
filter =
|
|
2550
|
+
var _ref30 = packageScope || {},
|
|
2551
|
+
_ref30$type = _ref30.type,
|
|
2552
|
+
scopeType = _ref30$type === void 0 ? 'product_all' : _ref30$type,
|
|
2553
|
+
_ref30$exclude_bundle = _ref30.exclude_bundle_product_ids,
|
|
2554
|
+
exclude_bundle_product_ids = _ref30$exclude_bundle === void 0 ? [] : _ref30$exclude_bundle,
|
|
2555
|
+
_ref30$include_bundle = _ref30.include_bundle_product_ids,
|
|
2556
|
+
include_bundle_product_ids = _ref30$include_bundle === void 0 ? [] : _ref30$include_bundle,
|
|
2557
|
+
_ref30$filter = _ref30.filter,
|
|
2558
|
+
filter = _ref30$filter === void 0 ? 0 : _ref30$filter;
|
|
2263
2559
|
var isMainProduct = flatItem.type === 'main'; // 单独购买
|
|
2264
2560
|
var isBundleItem = flatItem.type === 'bundle'; // 套餐中购买
|
|
2265
2561
|
var bundleMainProductId = (_flatItem$product = flatItem.product) === null || _flatItem$product === void 0 ? void 0 : _flatItem$product.product_id;
|