@pisell/pisellos 2.2.180 → 2.2.182
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/modules/BookingContext/index.d.ts +37 -0
- package/dist/modules/BookingContext/index.js +436 -0
- package/dist/modules/BookingContext/types.d.ts +102 -0
- package/dist/modules/BookingContext/types.js +51 -0
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +276 -0
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +137 -0
- package/dist/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +75 -0
- package/dist/modules/BookingContext/utils/cacheItemToBookingInput.js +215 -0
- package/dist/modules/BookingContext/utils/flexible.d.ts +28 -0
- package/dist/modules/BookingContext/utils/flexible.js +56 -0
- package/dist/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
- package/dist/modules/BookingContext/utils/formatResourceList.js +38 -0
- package/dist/modules/BookingContext/utils/index.d.ts +11 -0
- package/dist/modules/BookingContext/utils/index.js +11 -0
- package/dist/modules/BookingContext/utils/noResource.d.ts +13 -0
- package/dist/modules/BookingContext/utils/noResource.js +77 -0
- package/dist/modules/BookingContext/utils/productExtend.d.ts +72 -0
- package/dist/modules/BookingContext/utils/productExtend.js +339 -0
- package/dist/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
- package/dist/modules/BookingContext/utils/resourceErrors.js +74 -0
- package/dist/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
- package/dist/modules/BookingContext/utils/resourceSelection.js +24 -0
- package/dist/modules/BookingContext/utils/resources.d.ts +80 -0
- package/dist/modules/BookingContext/utils/resources.js +486 -0
- package/dist/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
- package/dist/modules/BookingContext/utils/serviceTimes.js +151 -0
- package/dist/modules/BookingContext/utils/timeSlices.d.ts +42 -0
- package/dist/modules/BookingContext/utils/timeSlices.js +100 -0
- package/dist/modules/Customer/index.d.ts +6 -0
- package/dist/modules/Customer/index.js +129 -83
- package/dist/modules/Customer/types.d.ts +2 -0
- package/dist/modules/Discount/index.js +4 -3
- package/dist/modules/Discount/types.d.ts +1 -0
- package/dist/modules/Order/index.d.ts +101 -10
- package/dist/modules/Order/index.js +1444 -490
- package/dist/modules/Order/types.d.ts +201 -18
- package/dist/modules/Order/types.js +31 -0
- package/dist/modules/Order/utils/manualProductDiscount.d.ts +106 -0
- package/dist/modules/Order/utils/manualProductDiscount.js +210 -0
- package/dist/modules/Order/utils.d.ts +83 -1
- package/dist/modules/Order/utils.js +405 -61
- package/dist/modules/Product/index.d.ts +1 -1
- package/dist/modules/Quotation/index.d.ts +0 -1
- package/dist/modules/Quotation/index.js +23 -21
- package/dist/modules/Rules/index.d.ts +4 -0
- package/dist/modules/Rules/index.js +43 -39
- package/dist/modules/Rules/types.d.ts +1 -0
- package/dist/modules/SalesSummary/index.js +4 -2
- package/dist/modules/SalesSummary/utils.js +21 -7
- package/dist/modules/Schedule/index.js +6 -2
- package/dist/modules/index.d.ts +1 -0
- package/dist/modules/index.js +2 -1
- package/dist/server/index.js +87 -29
- package/dist/server/modules/order/index.d.ts +23 -0
- package/dist/server/modules/order/index.js +123 -46
- package/dist/server/modules/order/utils/filterOrders.js +20 -6
- package/dist/server/modules/products/index.d.ts +1 -1
- package/dist/server/modules/products/index.js +130 -113
- package/dist/server/modules/schedule/index.js +13 -6
- package/dist/solution/BaseSales/index.d.ts +89 -7
- package/dist/solution/BaseSales/index.js +1489 -366
- package/dist/solution/BaseSales/types.d.ts +67 -1
- package/dist/solution/BaseSales/types.js +3 -1
- package/dist/solution/BaseSales/utils/cartPromotion.d.ts +275 -0
- package/dist/solution/BaseSales/utils/cartPromotion.js +1258 -0
- package/dist/solution/BaseSales/utils/quotationPrice.d.ts +7 -0
- package/dist/solution/BaseSales/utils/quotationPrice.js +237 -0
- package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +68 -16
- package/dist/solution/BaseSales/utils.js +46 -8
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.d.ts +152 -2
- package/dist/solution/BookingTicket/index.js +848 -184
- package/dist/solution/BookingTicket/types.d.ts +2 -0
- package/dist/solution/BookingTicket/types.js +3 -0
- package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +113 -0
- package/dist/solution/BookingTicket/utils/addProductDecision.js +346 -0
- package/dist/solution/BookingTicket/utils/cartView.js +4 -2
- package/dist/solution/ScanOrder/index.d.ts +9 -3
- package/dist/solution/ScanOrder/index.js +231 -128
- package/dist/solution/ScanOrder/utils.js +46 -8
- package/dist/solution/VenueBooking/index.d.ts +5 -2
- package/dist/solution/VenueBooking/index.js +103 -55
- package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -0
- package/dist/solution/VenueBooking/utils/slotMerge.js +10 -0
- package/lib/model/strategy/adapter/promotion/index.js +49 -0
- package/lib/modules/BookingContext/index.d.ts +37 -0
- package/lib/modules/BookingContext/index.js +297 -0
- package/lib/modules/BookingContext/types.d.ts +102 -0
- package/lib/modules/BookingContext/types.js +34 -0
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +271 -0
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +141 -0
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +75 -0
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +198 -0
- package/lib/modules/BookingContext/utils/flexible.d.ts +28 -0
- package/lib/modules/BookingContext/utils/flexible.js +80 -0
- package/lib/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
- package/lib/modules/BookingContext/utils/formatResourceList.js +50 -0
- package/lib/modules/BookingContext/utils/index.d.ts +11 -0
- package/lib/modules/BookingContext/utils/index.js +43 -0
- package/lib/modules/BookingContext/utils/noResource.d.ts +13 -0
- package/lib/modules/BookingContext/utils/noResource.js +90 -0
- package/lib/modules/BookingContext/utils/productExtend.d.ts +72 -0
- package/lib/modules/BookingContext/utils/productExtend.js +283 -0
- package/lib/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
- package/lib/modules/BookingContext/utils/resourceErrors.js +80 -0
- package/lib/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
- package/lib/modules/BookingContext/utils/resourceSelection.js +46 -0
- package/lib/modules/BookingContext/utils/resources.d.ts +80 -0
- package/lib/modules/BookingContext/utils/resources.js +377 -0
- package/lib/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
- package/lib/modules/BookingContext/utils/serviceTimes.js +162 -0
- package/lib/modules/BookingContext/utils/timeSlices.d.ts +42 -0
- package/lib/modules/BookingContext/utils/timeSlices.js +124 -0
- package/lib/modules/Customer/index.d.ts +6 -0
- package/lib/modules/Customer/index.js +26 -11
- package/lib/modules/Customer/types.d.ts +2 -0
- package/lib/modules/Discount/index.js +5 -1
- package/lib/modules/Discount/types.d.ts +1 -0
- package/lib/modules/Order/index.d.ts +101 -10
- package/lib/modules/Order/index.js +751 -114
- package/lib/modules/Order/types.d.ts +201 -18
- package/lib/modules/Order/types.js +1 -0
- package/lib/modules/Order/utils/manualProductDiscount.d.ts +106 -0
- package/lib/modules/Order/utils/manualProductDiscount.js +206 -0
- package/lib/modules/Order/utils.d.ts +83 -1
- package/lib/modules/Order/utils.js +340 -22
- package/lib/modules/Product/index.d.ts +1 -1
- package/lib/modules/Quotation/index.d.ts +0 -1
- package/lib/modules/Quotation/index.js +18 -15
- package/lib/modules/Rules/index.d.ts +4 -0
- package/lib/modules/Rules/index.js +26 -27
- package/lib/modules/Rules/types.d.ts +1 -0
- package/lib/modules/SalesSummary/index.js +4 -2
- package/lib/modules/SalesSummary/utils.js +21 -7
- package/lib/modules/Schedule/index.js +3 -1
- package/lib/modules/index.d.ts +1 -0
- package/lib/modules/index.js +3 -1
- package/lib/server/index.js +41 -4
- package/lib/server/modules/order/index.d.ts +23 -0
- package/lib/server/modules/order/index.js +46 -14
- package/lib/server/modules/order/utils/filterOrders.js +12 -4
- package/lib/server/modules/products/index.d.ts +1 -1
- package/lib/server/modules/products/index.js +30 -20
- package/lib/server/modules/schedule/index.js +2 -1
- package/lib/solution/BaseSales/index.d.ts +89 -7
- package/lib/solution/BaseSales/index.js +742 -23
- package/lib/solution/BaseSales/types.d.ts +67 -1
- package/lib/solution/BaseSales/types.js +3 -1
- package/lib/solution/BaseSales/utils/cartPromotion.d.ts +275 -0
- package/lib/solution/BaseSales/utils/cartPromotion.js +836 -0
- package/lib/solution/BaseSales/utils/quotationPrice.d.ts +7 -0
- package/lib/solution/BaseSales/utils/quotationPrice.js +277 -0
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +71 -12
- package/lib/solution/BaseSales/utils.js +46 -6
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.d.ts +152 -2
- package/lib/solution/BookingTicket/index.js +389 -9
- package/lib/solution/BookingTicket/types.d.ts +2 -0
- package/lib/solution/BookingTicket/types.js +6 -0
- package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +113 -0
- package/lib/solution/BookingTicket/utils/addProductDecision.js +318 -0
- package/lib/solution/BookingTicket/utils/cartView.js +4 -2
- package/lib/solution/ScanOrder/index.d.ts +9 -3
- package/lib/solution/ScanOrder/index.js +147 -66
- package/lib/solution/ScanOrder/utils.js +46 -6
- package/lib/solution/VenueBooking/index.d.ts +5 -2
- package/lib/solution/VenueBooking/index.js +50 -14
- package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -0
- package/lib/solution/VenueBooking/utils/slotMerge.js +10 -0
- package/package.json +1 -1
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
3
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
5
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
6
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
7
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
8
|
+
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; }
|
|
9
|
+
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; }
|
|
10
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
11
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
12
|
+
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); }
|
|
13
|
+
import Decimal from 'decimal.js';
|
|
14
|
+
|
|
15
|
+
/** 解析商品行数量(checkout 协议 product_num 语义 = 当前行 num) */
|
|
16
|
+
export function resolveSafeProductNum(num) {
|
|
17
|
+
var parsed = Number(num);
|
|
18
|
+
if (!Number.isFinite(parsed) || parsed <= 0) return 1;
|
|
19
|
+
return Math.floor(parsed);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 将 discount_list 中 type=product 项的 product_num 同步为当前商品数量。
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* syncManualProductDiscountProductNum(line.discount_list, line.num);
|
|
27
|
+
*/
|
|
28
|
+
export function syncManualProductDiscountProductNum(discountList, productNum) {
|
|
29
|
+
var quantity = resolveSafeProductNum(productNum);
|
|
30
|
+
return (discountList || []).map(function (item) {
|
|
31
|
+
if ((item === null || item === void 0 ? void 0 : item.type) !== 'product') return item;
|
|
32
|
+
return _objectSpread(_objectSpread({}, item), {}, {
|
|
33
|
+
discount: _objectSpread(_objectSpread({}, item.discount || {}), {}, {
|
|
34
|
+
product_num: quantity
|
|
35
|
+
})
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** 从多源解析改价前行总价(与 cacheItem._extend.origin_total 语义一致) */
|
|
41
|
+
export function resolveManualDiscountOriginTotal(sources) {
|
|
42
|
+
var _sources$quantity;
|
|
43
|
+
var candidates = [sources.originTotal, sources.extendOriginTotal, sources.originExtendOriginTotal, sources.sourceExtendOriginTotal];
|
|
44
|
+
for (var _i = 0, _candidates = candidates; _i < _candidates.length; _i++) {
|
|
45
|
+
var candidate = _candidates[_i];
|
|
46
|
+
if (candidate === undefined || candidate === null || candidate === '') continue;
|
|
47
|
+
var parsed = Number(candidate);
|
|
48
|
+
if (Number.isFinite(parsed)) return parsed;
|
|
49
|
+
}
|
|
50
|
+
var unit = Number(sources.catalogUnitPrice);
|
|
51
|
+
var quantity = (_sources$quantity = sources.quantity) !== null && _sources$quantity !== void 0 ? _sources$quantity : 1;
|
|
52
|
+
if (Number.isFinite(unit) && unit > 0) {
|
|
53
|
+
return new Decimal(unit).mul(quantity).toNumber();
|
|
54
|
+
}
|
|
55
|
+
return NaN;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** 从 payload / extend / origin 解析手动折扣原因 */
|
|
59
|
+
export function resolveManualDiscountReasonFromSources(sources) {
|
|
60
|
+
for (var _i2 = 0, _arr = [sources.discountReason, sources.extendDiscountReason, sources.originExtendDiscountReason]; _i2 < _arr.length; _i2++) {
|
|
61
|
+
var candidate = _arr[_i2];
|
|
62
|
+
if (candidate != null && String(candidate).trim() !== '') {
|
|
63
|
+
return String(candidate);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return '';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** 是否带手动改价标记(price_override / is_manual_discount) */
|
|
70
|
+
export function hasManualProductDiscountFlag(metadata) {
|
|
71
|
+
if (!metadata) return false;
|
|
72
|
+
var override = metadata.price_override;
|
|
73
|
+
if (override !== undefined && override !== null && override !== '') {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
return metadata.is_manual_discount === 1 || metadata.is_manual_discount === true;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* normalize 兜底:手动改价但 discount_list 缺 type=product 时,按行级原价/折后价补写。
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ensureManualProductDiscountList({
|
|
84
|
+
* discountList: [],
|
|
85
|
+
* metadata: { price_override: '5', is_manual_discount: 1 },
|
|
86
|
+
* originalPrice: '11.00',
|
|
87
|
+
* sellingPrice: '5.00',
|
|
88
|
+
* quantity: 1,
|
|
89
|
+
* });
|
|
90
|
+
*/
|
|
91
|
+
export function ensureManualProductDiscountList(params) {
|
|
92
|
+
var _metadata$origin, _metadata$origin2, _metadata$origin3, _metadata$origin4;
|
|
93
|
+
var list = params.discountList || [];
|
|
94
|
+
var quantity = resolveSafeProductNum(params.quantity);
|
|
95
|
+
if (findManualProductDiscountItem(list)) {
|
|
96
|
+
return syncManualProductDiscountProductNum(list, quantity);
|
|
97
|
+
}
|
|
98
|
+
var metadata = params.metadata || {};
|
|
99
|
+
var originalNum = Number(params.originalPrice);
|
|
100
|
+
var sellingNum = Number(params.sellingPrice);
|
|
101
|
+
var hasPriceOverride = hasManualProductDiscountFlag(metadata);
|
|
102
|
+
var shouldBuild = shouldBuildManualProductDiscount({
|
|
103
|
+
hasPriceOverride: hasPriceOverride,
|
|
104
|
+
originTotal: originalNum,
|
|
105
|
+
sellingTotal: sellingNum
|
|
106
|
+
});
|
|
107
|
+
if (!shouldBuild) {
|
|
108
|
+
return list;
|
|
109
|
+
}
|
|
110
|
+
if (!Number.isFinite(originalNum) || !Number.isFinite(sellingNum) || originalNum === sellingNum) {
|
|
111
|
+
return list;
|
|
112
|
+
}
|
|
113
|
+
var message = resolveManualDiscountMessage(list, resolveManualDiscountReasonFromSources({
|
|
114
|
+
extendDiscountReason: (_metadata$origin = metadata.origin) === null || _metadata$origin === void 0 || (_metadata$origin = _metadata$origin._extend) === null || _metadata$origin === void 0 ? void 0 : _metadata$origin.discount_reason,
|
|
115
|
+
originExtendDiscountReason: (_metadata$origin2 = metadata.origin) === null || _metadata$origin2 === void 0 || (_metadata$origin2 = _metadata$origin2._extend) === null || _metadata$origin2 === void 0 ? void 0 : _metadata$origin2.discount_reason
|
|
116
|
+
}));
|
|
117
|
+
return mergeManualProductDiscountIntoList(list, buildManualProductDiscountItem({
|
|
118
|
+
originTotal: originalNum,
|
|
119
|
+
sellingTotal: sellingNum,
|
|
120
|
+
quantity: quantity,
|
|
121
|
+
message: message,
|
|
122
|
+
discountway: (_metadata$origin3 = metadata.origin) === null || _metadata$origin3 === void 0 || (_metadata$origin3 = _metadata$origin3._extend) === null || _metadata$origin3 === void 0 ? void 0 : _metadata$origin3.discountway,
|
|
123
|
+
discount_per: (_metadata$origin4 = metadata.origin) === null || _metadata$origin4 === void 0 || (_metadata$origin4 = _metadata$origin4._extend) === null || _metadata$origin4 === void 0 ? void 0 : _metadata$origin4.discount_per
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** 商品手动折扣 discount_list 项(checkout 协议,type = product) */
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* 从 discount_list 中取手动改价项(type = product)。
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* const manual = findManualProductDiscountItem(product.discount_list);
|
|
134
|
+
* manual?.discount.message; // 折扣原因
|
|
135
|
+
*/
|
|
136
|
+
export function findManualProductDiscountItem(discountList) {
|
|
137
|
+
return (discountList || []).find(function (item) {
|
|
138
|
+
return (item === null || item === void 0 ? void 0 : item.type) === 'product';
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* 解析折扣原因:优先 discount_list[type=product].discount.message。
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* resolveManualDiscountMessage(line.discount_list, line.metadata?.legacy_reason);
|
|
147
|
+
*/
|
|
148
|
+
export function resolveManualDiscountMessage(discountList, fallback) {
|
|
149
|
+
var _findManualProductDis;
|
|
150
|
+
var message = (_findManualProductDis = findManualProductDiscountItem(discountList)) === null || _findManualProductDis === void 0 || (_findManualProductDis = _findManualProductDis.discount) === null || _findManualProductDis === void 0 ? void 0 : _findManualProductDis.message;
|
|
151
|
+
if (message != null && String(message).trim() !== '') {
|
|
152
|
+
return String(message);
|
|
153
|
+
}
|
|
154
|
+
return fallback !== null && fallback !== void 0 ? fallback : '';
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** 去掉 discount_list 中已有的手动改价项,避免重复叠加 */
|
|
158
|
+
export function stripManualProductDiscountItems(discountList) {
|
|
159
|
+
return (discountList || []).filter(function (item) {
|
|
160
|
+
return (item === null || item === void 0 ? void 0 : item.type) !== 'product';
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* 由改价前后行总价构建手动折扣项;amount = |originTotal - sellingTotal|(行级差额)。
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* buildManualProductDiscountItem({
|
|
169
|
+
* originTotal: 11,
|
|
170
|
+
* sellingTotal: 4,
|
|
171
|
+
* quantity: 1,
|
|
172
|
+
* message: 'VIP',
|
|
173
|
+
* });
|
|
174
|
+
*/
|
|
175
|
+
export function buildManualProductDiscountItem(params) {
|
|
176
|
+
var _params$message, _params$discountway, _params$discount_per;
|
|
177
|
+
var origin = new Decimal(Number(params.originTotal) || 0);
|
|
178
|
+
var selling = new Decimal(Number(params.sellingTotal) || 0);
|
|
179
|
+
var diff = origin.minus(selling);
|
|
180
|
+
var quantity = resolveSafeProductNum(params.quantity);
|
|
181
|
+
return {
|
|
182
|
+
amount: diff.abs().toDecimalPlaces(2).toNumber(),
|
|
183
|
+
type: 'product',
|
|
184
|
+
discount: {
|
|
185
|
+
message: (_params$message = params.message) !== null && _params$message !== void 0 ? _params$message : '',
|
|
186
|
+
discountway: (_params$discountway = params.discountway) !== null && _params$discountway !== void 0 ? _params$discountway : 'num',
|
|
187
|
+
product_num: quantity,
|
|
188
|
+
discount_per: (_params$discount_per = params.discount_per) !== null && _params$discount_per !== void 0 ? _params$discount_per : '',
|
|
189
|
+
discount_type: diff.isNegative() ? 'change_price' : 'discount'
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* 将手动改价项合并进 discount_list(替换已有 type=product 项)。
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* mergeManualProductDiscountIntoList(coupons, manualItem);
|
|
199
|
+
*/
|
|
200
|
+
export function mergeManualProductDiscountIntoList(discountList, manualItem) {
|
|
201
|
+
var base = stripManualProductDiscountItems(discountList);
|
|
202
|
+
if (!manualItem) return base;
|
|
203
|
+
if (manualItem.amount === 0 && !manualItem.discount.message) return base;
|
|
204
|
+
return [].concat(_toConsumableArray(base), [manualItem]);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** 是否应写入手动改价 discount_list 项 */
|
|
208
|
+
export function shouldBuildManualProductDiscount(params) {
|
|
209
|
+
return Boolean(params.hasPriceOverride);
|
|
210
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Decimal from 'decimal.js';
|
|
2
2
|
import { CartItem } from "../Cart";
|
|
3
|
-
import type { OrderSubmitPayload, OrderSubmitProduct, OrderSummary, OrderTempOrder } from './types';
|
|
3
|
+
import type { OrderProductDiscountItem, OrderSubmitPayload, OrderSubmitProduct, OrderSummary, OrderTempOrder } from './types';
|
|
4
4
|
import type { RulesParamsHooks } from '../Rules/types';
|
|
5
5
|
import type { MapOrderPaymentsOptions, OrderPaymentData, OrderPaymentSource } from './types';
|
|
6
6
|
/**
|
|
@@ -65,6 +65,37 @@ export declare function sumOptionUnitPrice(options?: Array<{
|
|
|
65
65
|
*
|
|
66
66
|
* 导出为纯函数方便单测直接驱动钩子,不依赖 OrderModule 实例。
|
|
67
67
|
*/
|
|
68
|
+
/** Rules calcDiscount 用手动价标记;undefined 表示交给 Rules 用 total/origin_total 推断 */
|
|
69
|
+
export declare function resolveRulesManualDiscountFlag(metadata: Record<string, any> | null | undefined): boolean | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* 商品行折扣只保留后端 OrderProductDiscountItem 协议字段。
|
|
72
|
+
* Rules/券计算过程中的 `_num`、`config` 等运行态字段不应进入 tempOrder 或提交 payload。
|
|
73
|
+
*/
|
|
74
|
+
export declare function normalizeOrderProductDiscountList(discountList?: unknown[] | null): OrderProductDiscountItem[];
|
|
75
|
+
/**
|
|
76
|
+
* 手动改价(price_override)时行级 original_price(composite 单价):
|
|
77
|
+
* 购物车划线价应对齐 metadata.origin._extend.origin_total(改价前单价 composite,如 40),
|
|
78
|
+
* 而非 bundle 子项 catalog 原价合成的 composedOriginalPrice(如 30)。
|
|
79
|
+
*
|
|
80
|
+
* origin_total 与 SkuDetailModal / cacheItem._extend 一致,为单价语义,不再除以 num。
|
|
81
|
+
*/
|
|
82
|
+
export declare function resolveManualOverrideLineOriginalPrice(params: {
|
|
83
|
+
num?: number;
|
|
84
|
+
metadata?: Record<string, any> | null;
|
|
85
|
+
/** 已有行级 original_price(origin 被裁剪时兜底划线价) */
|
|
86
|
+
lineOriginalPrice?: string | number | null;
|
|
87
|
+
}, fallbackCompositeOriginal: string): string;
|
|
88
|
+
/**
|
|
89
|
+
* 计算商品行「每单位有效折扣」:discount_list 合计 + 被 Rules 剥离但仍 inPromotion 的差额。
|
|
90
|
+
*
|
|
91
|
+
* Rules.calcDiscount 会把 type=promotion 从 discount_list 去掉,但 metadata._promotion 仍保留;
|
|
92
|
+
* applyProductDiscountPrices 必须回读 _promotion,否则抬价/降价都会在第二步被 source 原价覆盖。
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* resolveEffectivePerUnitDiscount({ metadata: { _promotion: { inPromotion: true, originalPrice: 1, finalPrice: 5 } }, discount_list: [] });
|
|
96
|
+
* // => -4
|
|
97
|
+
*/
|
|
98
|
+
export declare function resolveEffectivePerUnitDiscount(product: Record<string, any>): number;
|
|
68
99
|
export declare function createDefaultOrderRulesHooks(): RulesParamsHooks;
|
|
69
100
|
/**
|
|
70
101
|
* 通过 session 类商品的开始时间结束时间生成商品的时长
|
|
@@ -140,4 +171,55 @@ export declare function formatV1Product(products: OrderSubmitProduct[]): {
|
|
|
140
171
|
session: null;
|
|
141
172
|
unique: string;
|
|
142
173
|
}[];
|
|
174
|
+
/**
|
|
175
|
+
* 判断 holder_id 是否已分配(非空)。
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* hasAssignedHolderId(12); // true
|
|
179
|
+
* hasAssignedHolderId([]); // false
|
|
180
|
+
*/
|
|
181
|
+
export declare function hasAssignedHolderId(value: unknown): boolean;
|
|
182
|
+
/**
|
|
183
|
+
* 清空 tempOrder 购物车行上的 holder 分配(products / bookings / runtime origin)。
|
|
184
|
+
* 移除或更换下单客户时调用,与 booking 页换客户清 holder 行为对齐。
|
|
185
|
+
*
|
|
186
|
+
* @example
|
|
187
|
+
* clearTempOrderHolderAssignments(tempOrder);
|
|
188
|
+
*/
|
|
189
|
+
export declare function clearTempOrderHolderAssignments(tempOrder: OrderTempOrder): boolean;
|
|
190
|
+
/**
|
|
191
|
+
* 读取购物车行的 stable uid(优先 metadata.unique_identification_number)。
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* getOrderProductLineUid({ metadata: { unique_identification_number: 'line-1' } }); // 'line-1'
|
|
195
|
+
*/
|
|
196
|
+
export declare function getOrderProductLineUid(product: Record<string, any> | null | undefined): string | null;
|
|
197
|
+
/**
|
|
198
|
+
* 判断展示字段是否为空(含 i18n 对象全空)。
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* isEmptyOrderProductDisplayValue(''); // true
|
|
202
|
+
* isEmptyOrderProductDisplayValue({ auto: '桌台费' }); // false
|
|
203
|
+
*/
|
|
204
|
+
export declare function isEmptyOrderProductDisplayValue(value: unknown): boolean;
|
|
205
|
+
/**
|
|
206
|
+
* calcDiscount / applyDiscount 回写时 Rules 往往不带 product_title 等展示字段;
|
|
207
|
+
* 用旧行补齐,避免编辑态 hydrate 后标题被冲掉。
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* mergeOrderProductDisplayFields(
|
|
211
|
+
* { product_title: { auto: '桌台费' }, metadata: { unique_identification_number: 'u1' } },
|
|
212
|
+
* { selling_price: '10.00', metadata: { unique_identification_number: 'u1' } },
|
|
213
|
+
* );
|
|
214
|
+
*/
|
|
215
|
+
export declare function mergeOrderProductDisplayFields(previous: Record<string, any>, next: Record<string, any>): Record<string, any>;
|
|
216
|
+
/**
|
|
217
|
+
* 按 uid 索引 tempOrder.products,供 applyDiscount 合并展示字段。
|
|
218
|
+
*
|
|
219
|
+
* @example
|
|
220
|
+
* indexOrderProductsByUid([{ metadata: { unique_identification_number: 'u1' } }]);
|
|
221
|
+
*/
|
|
222
|
+
export declare function indexOrderProductsByUid(products: Array<Record<string, any>> | null | undefined): Map<string, Record<string, any>>;
|
|
143
223
|
export { createEmptySummary } from '../../solution/ScanOrder/utils';
|
|
224
|
+
export { buildManualProductDiscountItem, ensureManualProductDiscountList, findManualProductDiscountItem, mergeManualProductDiscountIntoList, resolveManualDiscountMessage, resolveManualDiscountOriginTotal, resolveManualDiscountReasonFromSources, resolveSafeProductNum, shouldBuildManualProductDiscount, syncManualProductDiscountProductNum, stripManualProductDiscountItems, } from './utils/manualProductDiscount';
|
|
225
|
+
export type { ManualProductDiscountItem } from './utils/manualProductDiscount';
|