@pisell/pisellos 2.3.74 → 2.3.75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/index.js +6 -10
- package/dist/model/strategy/adapter/promotion/index.js +9 -0
- package/dist/model/strategy/adapter/walletPass/example.js +3 -26
- package/dist/model/strategy/strategy-example.js +5 -19
- package/dist/modules/Cart/index.js +0 -3
- package/dist/modules/Cart/utils/cartProduct.js +0 -1
- package/dist/modules/Date/index.js +1 -5
- package/dist/modules/Discount/index.js +2 -4
- package/dist/modules/OpenData/index.js +0 -2
- package/dist/modules/Order/index.js +36 -64
- package/dist/modules/Payment/index.js +97 -162
- package/dist/modules/Rules/index.js +1 -4
- package/dist/modules/Schedule/index.js +0 -1
- package/dist/modules/Schedule/utils.js +0 -1
- package/dist/modules/Step/index.js +0 -1
- package/dist/plugins/request.js +1 -4
- package/dist/plugins/window.js +2 -6
- package/dist/server/index.js +97 -129
- package/dist/server/modules/menu/index.js +32 -41
- package/dist/server/modules/order/index.js +2 -4
- package/dist/server/modules/products/index.js +24 -42
- package/dist/server/modules/quotation/index.js +29 -38
- package/dist/server/modules/resource/index.js +3 -4
- package/dist/server/modules/schedule/index.js +27 -35
- package/dist/server/utils/product.js +0 -1
- package/dist/solution/BaseSales/index.js +38 -41
- package/dist/solution/BookingByStep/index.js +7 -59
- package/dist/solution/BookingByStep/utils/capacity.js +1 -11
- package/dist/solution/BookingByStep/utils/resources.js +1 -3
- package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
- package/dist/solution/BookingTicket/index.js +0 -2
- package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
- package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
- package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
- package/dist/solution/BuyTickets/index.js +9 -12
- package/dist/solution/Checkout/index.js +177 -252
- package/dist/solution/Checkout/utils/index.js +4 -16
- package/dist/solution/RegisterAndLogin/index.js +30 -76
- package/dist/solution/ScanOrder/index.js +50 -60
- package/dist/solution/ShopDiscount/index.js +2 -7
- package/dist/solution/VenueBooking/index.js +45 -55
- package/dist/utils/task.js +15 -18
- package/dist/utils/watch.js +0 -1
- package/lib/apis/picoding.js +2 -0
- package/lib/core/index.js +134 -134
- package/lib/effects/index.js +46 -57
- package/lib/index.js +82 -49
- package/lib/model/index.js +14 -21
- package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
- package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
- package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
- package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
- package/lib/model/strategy/adapter/index.js +100 -64
- package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
- package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
- package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
- package/lib/model/strategy/adapter/itemRule/index.js +83 -57
- package/lib/model/strategy/adapter/itemRule/type.js +97 -36
- package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
- package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
- package/lib/model/strategy/adapter/promotion/examples.js +222 -234
- package/lib/model/strategy/adapter/promotion/index.js +1 -0
- package/lib/model/strategy/adapter/promotion/type.js +243 -36
- package/lib/model/strategy/adapter/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
- package/lib/model/strategy/adapter/walletPass/example.js +217 -190
- package/lib/model/strategy/adapter/walletPass/index.js +75 -51
- package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
- package/lib/model/strategy/adapter/walletPass/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
- package/lib/model/strategy/engine.js +270 -168
- package/lib/model/strategy/index.js +49 -34
- package/lib/model/strategy/strategy-example.js +243 -239
- package/lib/model/strategy/type.js +100 -40
- package/lib/modules/Account/index.js +39 -53
- package/lib/modules/Account/types.js +20 -33
- package/lib/modules/AccountList/index.js +116 -154
- package/lib/modules/AccountList/types.js +30 -31
- package/lib/modules/AccountList/utils.js +18 -30
- package/lib/modules/BaseModule.js +23 -42
- package/lib/modules/BookingContext/index.js +158 -136
- package/lib/modules/BookingContext/types.js +46 -32
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
- package/lib/modules/BookingContext/utils/flexible.js +38 -55
- package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
- package/lib/modules/BookingContext/utils/index.js +124 -41
- package/lib/modules/BookingContext/utils/noResource.js +58 -70
- package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
- package/lib/modules/BookingContext/utils/productExtend.js +202 -155
- package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
- package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
- package/lib/modules/BookingContext/utils/resources.js +209 -167
- package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
- package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
- package/lib/modules/Cart/index.js +170 -124
- package/lib/modules/Cart/types.js +46 -51
- package/lib/modules/Cart/utils/cartAccount.js +40 -39
- package/lib/modules/Cart/utils/cartDate.js +56 -61
- package/lib/modules/Cart/utils/cartDiscount.js +28 -33
- package/lib/modules/Cart/utils/cartNote.js +27 -32
- package/lib/modules/Cart/utils/cartProduct.js +321 -251
- package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
- package/lib/modules/Cart/utils/cartResource.js +70 -78
- package/lib/modules/Cart/utils/changePrice.js +22 -50
- package/lib/modules/Cart/utils/index.js +106 -48
- package/lib/modules/Customer/constants.js +13 -34
- package/lib/modules/Customer/index.js +235 -172
- package/lib/modules/Customer/types.js +38 -35
- package/lib/modules/Date/index.js +116 -115
- package/lib/modules/Date/types.js +16 -28
- package/lib/modules/Date/utils.js +174 -123
- package/lib/modules/Discount/index.js +122 -127
- package/lib/modules/Discount/types.js +9 -31
- package/lib/modules/Guests/index.js +30 -56
- package/lib/modules/Guests/types.js +23 -33
- package/lib/modules/Holder/index.js +209 -189
- package/lib/modules/Holder/types.js +4 -16
- package/lib/modules/Holder/utils.js +20 -49
- package/lib/modules/OpenData/index.js +70 -76
- package/lib/modules/OpenData/types.js +4 -16
- package/lib/modules/OpenData/utils.js +44 -78
- package/lib/modules/Order/index.js +1713 -2118
- package/lib/modules/Order/payment-utils.js +77 -120
- package/lib/modules/Order/types.js +88 -35
- package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
- package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
- package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
- package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
- package/lib/modules/Order/utils.js +814 -647
- package/lib/modules/Payment/cash.js +20 -33
- package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
- package/lib/modules/Payment/eftpos.js +16 -30
- package/lib/modules/Payment/index.js +532 -399
- package/lib/modules/Payment/mx51.js +1 -0
- package/lib/modules/Payment/types.js +230 -108
- package/lib/modules/Payment/utils.js +52 -51
- package/lib/modules/Payment/walletpass.js +485 -660
- package/lib/modules/Product/index.js +51 -46
- package/lib/modules/Product/types.js +4 -16
- package/lib/modules/Product/utils.js +32 -33
- package/lib/modules/ProductList/index.js +113 -123
- package/lib/modules/ProductList/types.js +9 -31
- package/lib/modules/Quotation/index.js +81 -118
- package/lib/modules/Quotation/types.js +4 -16
- package/lib/modules/Resource/index.js +27 -59
- package/lib/modules/Resource/types.js +22 -32
- package/lib/modules/Resource/utils.js +30 -38
- package/lib/modules/ResourcePlanner/index.js +25 -23
- package/lib/modules/ResourcePlanner/localClock.js +54 -119
- package/lib/modules/ResourcePlanner/planner.js +589 -770
- package/lib/modules/ResourcePlanner/types.js +10 -29
- package/lib/modules/Rules/index.js +1218 -959
- package/lib/modules/Rules/types.js +17 -40
- package/lib/modules/SalesSummary/index.js +85 -90
- package/lib/modules/SalesSummary/types.js +4 -16
- package/lib/modules/SalesSummary/utils.js +355 -430
- package/lib/modules/ScanOrderLogger/index.js +59 -79
- package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
- package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
- package/lib/modules/ScanOrderLogger/types.js +4 -16
- package/lib/modules/Schedule/getDateIsInSchedule.js +334 -163
- package/lib/modules/Schedule/index.js +100 -114
- package/lib/modules/Schedule/type.js +4 -16
- package/lib/modules/Schedule/types.js +4 -16
- package/lib/modules/Schedule/utils.js +433 -291
- package/lib/modules/Step/index.js +40 -52
- package/lib/modules/Step/tyeps.js +4 -16
- package/lib/modules/Summary/index.js +66 -71
- package/lib/modules/Summary/types.js +4 -16
- package/lib/modules/Summary/utils.js +773 -418
- package/lib/modules/SurchargeList/index.js +46 -60
- package/lib/modules/SurchargeList/types.js +4 -16
- package/lib/modules/index.js +245 -63
- package/lib/plugins/app.js +4 -16
- package/lib/plugins/index.js +36 -25
- package/lib/plugins/request.js +137 -126
- package/lib/plugins/shopStore.js +4 -16
- package/lib/plugins/user.js +4 -16
- package/lib/plugins/window.js +171 -179
- package/lib/server/index.js +3050 -2665
- package/lib/server/modules/floor-plan/index.js +118 -134
- package/lib/server/modules/floor-plan/types.js +15 -30
- package/lib/server/modules/index.js +106 -68
- package/lib/server/modules/menu/index.js +142 -122
- package/lib/server/modules/menu/types.js +18 -31
- package/lib/server/modules/order/index.js +784 -1002
- package/lib/server/modules/order/types.js +122 -33
- package/lib/server/modules/order/utils/filterBookings.js +219 -194
- package/lib/server/modules/order/utils/filterOrders.js +118 -92
- package/lib/server/modules/payment/index.js +59 -83
- package/lib/server/modules/payment/types.js +4 -16
- package/lib/server/modules/products/index.js +583 -471
- package/lib/server/modules/products/types.js +44 -34
- package/lib/server/modules/quotation/index.js +137 -172
- package/lib/server/modules/quotation/types.js +21 -31
- package/lib/server/modules/resource/index.js +220 -186
- package/lib/server/modules/resource/types.js +42 -33
- package/lib/server/modules/schedule/index.js +135 -123
- package/lib/server/modules/schedule/types.js +14 -21
- package/lib/server/modules/schedule/utils.js +334 -163
- package/lib/server/types.js +4 -16
- package/lib/server/utils/index.js +25 -23
- package/lib/server/utils/product.js +196 -139
- package/lib/server/utils/schedule.js +34 -41
- package/lib/server/utils/small-ticket.js +479 -456
- package/lib/server/utils/time.js +40 -49
- package/lib/solution/BaseSales/index.js +1186 -1410
- package/lib/solution/BaseSales/types.js +42 -38
- package/lib/solution/BaseSales/utils/cartPromotion.js +642 -498
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
- package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +108 -145
- package/lib/solution/BaseSales/utils.js +158 -143
- package/lib/solution/BookingByStep/index.js +1527 -1340
- package/lib/solution/BookingByStep/types.js +40 -99
- package/lib/solution/BookingByStep/utils/capacity.js +192 -160
- package/lib/solution/BookingByStep/utils/products.js +42 -52
- package/lib/solution/BookingByStep/utils/resources.js +527 -330
- package/lib/solution/BookingByStep/utils/stock.js +65 -44
- package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
- package/lib/solution/BookingTicket/index.js +607 -522
- package/lib/solution/BookingTicket/types.js +99 -77
- package/lib/solution/BookingTicket/utils/addProductDecision.js +226 -189
- package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
- package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
- package/lib/solution/BookingTicket/utils/cartView.js +114 -99
- package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
- package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
- package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
- package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
- package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
- package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
- package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
- package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
- package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
- package/lib/solution/BuyTickets/index.js +67 -70
- package/lib/solution/BuyTickets/types.js +22 -38
- package/lib/solution/Checkout/index.js +1451 -1158
- package/lib/solution/Checkout/types.js +91 -61
- package/lib/solution/Checkout/utils/index.js +228 -156
- package/lib/solution/PlaceOrder/index.js +55 -0
- package/lib/solution/RegisterAndLogin/config.js +493 -460
- package/lib/solution/RegisterAndLogin/index.js +633 -630
- package/lib/solution/RegisterAndLogin/types.js +189 -76
- package/lib/solution/RegisterAndLogin/utils.js +183 -125
- package/lib/solution/Sales/index.js +328 -324
- package/lib/solution/Sales/types.js +27 -33
- package/lib/solution/ScanOrder/index.js +832 -864
- package/lib/solution/ScanOrder/types.js +33 -34
- package/lib/solution/ScanOrder/utils.js +409 -374
- package/lib/solution/ShopDiscount/index.js +226 -232
- package/lib/solution/ShopDiscount/types.js +15 -37
- package/lib/solution/ShopDiscount/utils.js +300 -172
- package/lib/solution/UnifiedBookingSales/index.js +1035 -1201
- package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +99 -159
- package/lib/solution/UnifiedBookingSales/types.js +10 -32
- package/lib/solution/VenueBooking/index.js +811 -879
- package/lib/solution/VenueBooking/types.js +19 -39
- package/lib/solution/VenueBooking/utils/dateSummary.js +27 -56
- package/lib/solution/VenueBooking/utils/resource.js +31 -54
- package/lib/solution/VenueBooking/utils/slotMerge.js +94 -107
- package/lib/solution/VenueBooking/utils/timeSlot.js +132 -132
- package/lib/solution/VenueBooking/utils.js +130 -67
- package/lib/solution/index.js +124 -41
- package/lib/store/createStore.js +32 -29
- package/lib/types/index.js +4 -16
- package/lib/utils/payment-number.js +26 -46
- package/lib/utils/task.js +36 -36
- package/lib/utils/watch.js +81 -47
- package/package.json +2 -1
|
@@ -1,87 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __export = (target, all) => {
|
|
6
|
-
for (var name in all)
|
|
7
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
-
};
|
|
9
|
-
var __copyProps = (to, from, except, desc) => {
|
|
10
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
-
for (let key of __getOwnPropNames(from))
|
|
12
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
-
}
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
"use strict";
|
|
18
2
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
__export(transformBaseProductToOrderProduct_exports, {
|
|
22
|
-
transformBaseProductToOrderProduct: () => transformBaseProductToOrderProduct
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
23
5
|
});
|
|
24
|
-
|
|
25
|
-
var
|
|
26
|
-
var
|
|
6
|
+
exports.transformBaseProductToOrderProduct = transformBaseProductToOrderProduct;
|
|
7
|
+
var _utils = require("../../../modules/Order/utils");
|
|
8
|
+
var _manualProductDiscount = require("../../../modules/Order/utils/manualProductDiscount");
|
|
27
9
|
function toNumber(value, fallback = 0) {
|
|
28
10
|
const parsedValue = Number(value);
|
|
29
|
-
if (!Number.isFinite(parsedValue))
|
|
30
|
-
return fallback;
|
|
11
|
+
if (!Number.isFinite(parsedValue)) return fallback;
|
|
31
12
|
return parsedValue;
|
|
32
13
|
}
|
|
33
14
|
function toProductId(value) {
|
|
34
|
-
if (value === null || value ===
|
|
35
|
-
return null;
|
|
15
|
+
if (value === null || value === undefined || value === '') return null;
|
|
36
16
|
const parsedValue = Number(value);
|
|
37
|
-
if (!Number.isFinite(parsedValue))
|
|
38
|
-
return null;
|
|
17
|
+
if (!Number.isFinite(parsedValue)) return null;
|
|
39
18
|
return parsedValue;
|
|
40
19
|
}
|
|
41
20
|
function toSafePositiveInt(value, fallback = 1) {
|
|
42
21
|
const parsedValue = Math.floor(Number(value));
|
|
43
|
-
if (!Number.isFinite(parsedValue) || parsedValue < 1)
|
|
44
|
-
return fallback;
|
|
22
|
+
if (!Number.isFinite(parsedValue) || parsedValue < 1) return fallback;
|
|
45
23
|
return parsedValue;
|
|
46
24
|
}
|
|
47
|
-
function toPriceString(value, fallback =
|
|
25
|
+
function toPriceString(value, fallback = '0.00') {
|
|
48
26
|
const parsedValue = Number(value);
|
|
49
|
-
if (!Number.isFinite(parsedValue))
|
|
50
|
-
return fallback;
|
|
27
|
+
if (!Number.isFinite(parsedValue)) return fallback;
|
|
51
28
|
return parsedValue.toFixed(2);
|
|
52
29
|
}
|
|
53
30
|
function isBlankValue(value) {
|
|
54
|
-
return value ===
|
|
31
|
+
return value === undefined || value === null || typeof value === 'string' && value.trim() === '';
|
|
55
32
|
}
|
|
56
33
|
function firstNonBlank(...values) {
|
|
57
|
-
return values.find(
|
|
34
|
+
return values.find(value => !isBlankValue(value));
|
|
58
35
|
}
|
|
59
36
|
function normalizeOptionItems(optionItems) {
|
|
60
|
-
if (!Array.isArray(optionItems))
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
const price = (optionItem == null ? void 0 : optionItem.price) ?? (optionItem == null ? void 0 : optionItem.add_price) ?? 0;
|
|
37
|
+
if (!Array.isArray(optionItems)) return [];
|
|
38
|
+
return optionItems.map(optionItem => {
|
|
39
|
+
const optionGroupItemId = toNumber(optionItem?.option_group_item_id ?? optionItem?.id);
|
|
40
|
+
const price = optionItem?.price ?? optionItem?.add_price ?? 0;
|
|
65
41
|
return {
|
|
66
42
|
...optionItem,
|
|
67
43
|
option_group_item_id: optionGroupItemId,
|
|
68
|
-
option_group_id: toNumber(optionItem
|
|
69
|
-
num: toSafePositiveInt(
|
|
44
|
+
option_group_id: toNumber(optionItem?.option_group_id),
|
|
45
|
+
num: toSafePositiveInt(optionItem?.num ?? optionItem?.quantity, 1),
|
|
70
46
|
add_price: toNumber(price, 0),
|
|
71
|
-
price:
|
|
47
|
+
price: undefined
|
|
72
48
|
};
|
|
73
49
|
});
|
|
74
50
|
}
|
|
75
51
|
function normalizeBundleItems(bundleItems, preferPriceField = false) {
|
|
76
|
-
if (!Array.isArray(bundleItems))
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
const num = toSafePositiveInt((bundleItem == null ? void 0 : bundleItem.num) ?? (bundleItem == null ? void 0 : bundleItem.quantity), 1);
|
|
52
|
+
if (!Array.isArray(bundleItems)) return [];
|
|
53
|
+
return bundleItems.map(bundleItem => {
|
|
54
|
+
const unitSelling = preferPriceField ? bundleItem.price ?? bundleItem.bundle_selling_price ?? bundleItem.custom_price ?? bundleItem.product_price ?? '0' : bundleItem.bundle_selling_price ?? bundleItem.price ?? bundleItem.custom_price ?? bundleItem.product_price ?? '0';
|
|
55
|
+
const unitStr = toPriceString(unitSelling, '0.00');
|
|
56
|
+
const num = toSafePositiveInt(bundleItem?.num ?? bundleItem?.quantity, 1);
|
|
82
57
|
const magnitudeSource = {
|
|
83
58
|
...bundleItem,
|
|
84
|
-
option: normalizeOptionItems(bundleItem
|
|
59
|
+
option: normalizeOptionItems(bundleItem?.option),
|
|
85
60
|
bundle_selling_price: unitStr,
|
|
86
61
|
// 计算 markdown 净额时,只传真实毛价;仅有 bundle_selling_price 时按历史净额兜底。
|
|
87
62
|
price: bundleItem.price ?? bundleItem.custom_price
|
|
@@ -89,16 +64,17 @@ function normalizeBundleItems(bundleItems, preferPriceField = false) {
|
|
|
89
64
|
const normalizedItem = {
|
|
90
65
|
...bundleItem,
|
|
91
66
|
num,
|
|
92
|
-
quantity:
|
|
67
|
+
quantity: bundleItem?.quantity ?? num,
|
|
93
68
|
// price 保留毛价(markdown 仍为正),由 price_type 决定符号。
|
|
94
69
|
price: bundleItem.price ?? unitStr,
|
|
95
70
|
bundle_selling_price: unitStr,
|
|
96
71
|
original_price: bundleItem.original_price ?? bundleItem.product_price ?? bundleItem.price ?? unitStr,
|
|
97
|
-
option: normalizeOptionItems(bundleItem
|
|
72
|
+
option: normalizeOptionItems(bundleItem?.option),
|
|
98
73
|
discount_list: preferPriceField ? [] : bundleItem.discount_list
|
|
99
74
|
};
|
|
100
|
-
|
|
101
|
-
|
|
75
|
+
// bundle_selling_price 落「正净额」:markdown = |price| − Σoptions;markup/原价维持原值。
|
|
76
|
+
normalizedItem.bundle_selling_price = (0, _utils.getBundleSellingMagnitude)(magnitudeSource).toFixed(2);
|
|
77
|
+
if ((normalizedItem.price_type ?? normalizedItem.custom_price_type) === 'markdown' && (normalizedItem.price_type_ext === '' || normalizedItem.price_type_ext === undefined || normalizedItem.price_type_ext === null)) {
|
|
102
78
|
normalizedItem.custom_price = normalizedItem.custom_price ?? normalizedItem.price;
|
|
103
79
|
normalizedItem.price = normalizedItem.bundle_selling_price;
|
|
104
80
|
}
|
|
@@ -106,91 +82,83 @@ function normalizeBundleItems(bundleItems, preferPriceField = false) {
|
|
|
106
82
|
});
|
|
107
83
|
}
|
|
108
84
|
function findVariantById(origin, variantId) {
|
|
109
|
-
if (!origin || !variantId || variantId <= 0)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
return variants.find((variant) => Number(variant == null ? void 0 : variant.id) === variantId) || null;
|
|
85
|
+
if (!origin || !variantId || variantId <= 0) return null;
|
|
86
|
+
const variants = Array.isArray(origin?.variant) ? origin.variant : [];
|
|
87
|
+
return variants.find(variant => Number(variant?.id) === variantId) || null;
|
|
113
88
|
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* 将商品列表原始数据 + 商品详情选择回调转换成 OrderModule.addProductToOrder 入参。
|
|
92
|
+
*
|
|
93
|
+
* 注意:这里不生成 identity,缺省时由 OrderModule 自动补齐。
|
|
94
|
+
*/
|
|
114
95
|
function transformBaseProductToOrderProduct(params) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
96
|
+
const {
|
|
97
|
+
payload,
|
|
98
|
+
fallbackProductId = null
|
|
99
|
+
} = params;
|
|
100
|
+
if (!payload || typeof payload !== 'object') return null;
|
|
119
101
|
const sourceProduct = params.sourceProduct || params.sourceItem || {};
|
|
120
|
-
const productId = toProductId(
|
|
121
|
-
|
|
122
|
-
);
|
|
123
|
-
|
|
124
|
-
return null;
|
|
125
|
-
const productVariantId = toNumber(
|
|
126
|
-
payload.product_variant_id ?? payload.variant_id ?? (sourceProduct == null ? void 0 : sourceProduct.product_variant_id) ?? (sourceProduct == null ? void 0 : sourceProduct.variant_id),
|
|
127
|
-
0
|
|
128
|
-
);
|
|
129
|
-
const callbackOrigin = payload.origin || ((_a = payload._origin) == null ? void 0 : _a.sourceProduct) || ((_b = payload._origin) == null ? void 0 : _b.sourceItem) || payload._origin || {};
|
|
102
|
+
const productId = toProductId(payload.product_id ?? payload.id ?? sourceProduct?.product_id ?? sourceProduct?.id ?? fallbackProductId);
|
|
103
|
+
if (productId === null) return null;
|
|
104
|
+
const productVariantId = toNumber(payload.product_variant_id ?? payload.variant_id ?? sourceProduct?.product_variant_id ?? sourceProduct?.variant_id, 0);
|
|
105
|
+
const callbackOrigin = payload.origin || payload._origin?.sourceProduct || payload._origin?.sourceItem || payload._origin || {};
|
|
130
106
|
const origin = {
|
|
131
|
-
...sourceProduct || {},
|
|
132
|
-
...callbackOrigin || {}
|
|
107
|
+
...(sourceProduct || {}),
|
|
108
|
+
...(callbackOrigin || {})
|
|
133
109
|
};
|
|
134
110
|
const matchedVariant = findVariantById(callbackOrigin, productVariantId) ?? findVariantById(sourceProduct, productVariantId) ?? findVariantById(origin, productVariantId);
|
|
135
|
-
const hasPriceOverride = payload.price_override !==
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
const explicitLineTotal = payload.line_total ?? payload.total ?? ((_c = payload._extend) == null ? void 0 : _c.total);
|
|
111
|
+
const hasPriceOverride = payload.price_override !== undefined && payload.price_override !== null && payload.price_override !== '';
|
|
112
|
+
// 手动改价后 payload.price 是分摊后的主商品售价,不能再作为券前 source。
|
|
113
|
+
// 此时优先从商品/variant 快照读取目录价;售价仍由 line_total - bundle 推导。
|
|
114
|
+
const catalogSourcePrice = matchedVariant?.price ?? matchedVariant?.base_price ?? origin?.price ?? origin?.base_price ?? sourceProduct?.price ?? sourceProduct?.selling_price ?? sourceProduct?.base_price;
|
|
115
|
+
const sourceProductPrice = toPriceString(hasPriceOverride ? catalogSourcePrice ?? payload.price ?? payload.selling_price : payload.price ?? payload.selling_price ?? catalogSourcePrice, '0.00');
|
|
116
|
+
const explicitLineTotal = payload.line_total ?? payload.total ?? payload._extend?.total;
|
|
142
117
|
const hasExplicitLineTotal = Number.isFinite(Number(explicitLineTotal));
|
|
143
118
|
const lineCompositeTotal = toPriceString(explicitLineTotal, sourceProductPrice);
|
|
144
|
-
const productOptionItem = (0,
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
);
|
|
149
|
-
const productBundle = normalizeBundleItems(
|
|
150
|
-
payload.bundle ?? payload.product_bundle,
|
|
151
|
-
hasPriceOverride
|
|
152
|
-
);
|
|
119
|
+
const productOptionItem = (0, _utils.normalizeProductSkuOptions)(normalizeOptionItems(payload.product_sku?.option ?? payload.option ?? payload.options ?? payload.product_option_item));
|
|
120
|
+
const productBundle = normalizeBundleItems(payload.bundle ?? payload.product_bundle, hasPriceOverride);
|
|
121
|
+
// `payload.unique` 是业务侧商品/票务标识,可能在连续加同一商品时重复;
|
|
122
|
+
// 行级唯一值只接受显式协议字段,缺省交给 OrderModule 生成。
|
|
153
123
|
const uniqueIdentificationNumber = payload.unique_identification_number;
|
|
154
124
|
const resolvedQuantity = toSafePositiveInt(payload.quantity ?? payload.num, 1);
|
|
155
|
-
const originTotal = (0,
|
|
125
|
+
const originTotal = (0, _manualProductDiscount.resolveManualDiscountOriginTotal)({
|
|
156
126
|
originTotal: payload.origin_total,
|
|
157
|
-
extendOriginTotal:
|
|
158
|
-
originExtendOriginTotal:
|
|
159
|
-
sourceExtendOriginTotal:
|
|
160
|
-
catalogUnitPrice:
|
|
127
|
+
extendOriginTotal: payload._extend?.origin_total,
|
|
128
|
+
originExtendOriginTotal: origin?._extend?.origin_total,
|
|
129
|
+
sourceExtendOriginTotal: sourceProduct?._extend?.origin_total,
|
|
130
|
+
catalogUnitPrice: origin?.base_price ?? origin?.price ?? sourceProduct?.base_price ?? sourceProduct?.price,
|
|
161
131
|
quantity: resolvedQuantity
|
|
162
132
|
});
|
|
163
|
-
const sellingTotal = Number(
|
|
164
|
-
|
|
165
|
-
);
|
|
166
|
-
const discountReason = (0, import_manualProductDiscount.resolveManualDiscountReasonFromSources)({
|
|
133
|
+
const sellingTotal = Number(payload.line_total ?? payload.total ?? payload._extend?.total ?? lineCompositeTotal);
|
|
134
|
+
const discountReason = (0, _manualProductDiscount.resolveManualDiscountReasonFromSources)({
|
|
167
135
|
discountReason: payload.discount_reason,
|
|
168
|
-
extendDiscountReason:
|
|
169
|
-
originExtendDiscountReason:
|
|
136
|
+
extendDiscountReason: payload._extend?.discount_reason,
|
|
137
|
+
originExtendDiscountReason: origin?._extend?.discount_reason
|
|
170
138
|
});
|
|
171
139
|
const lineOriginalPrice = hasPriceOverride && Number.isFinite(originTotal) ? toPriceString(originTotal) : lineCompositeTotal;
|
|
172
|
-
const manualDiscountList = (0,
|
|
140
|
+
const manualDiscountList = (0, _manualProductDiscount.shouldBuildManualProductDiscount)({
|
|
173
141
|
hasPriceOverride,
|
|
174
142
|
originTotal,
|
|
175
143
|
sellingTotal
|
|
176
|
-
}) ? (0,
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const optionSum = (0, import_utils.sumOptionUnitPrice)(productOptionItem).toNumber();
|
|
144
|
+
}) ? (0, _manualProductDiscount.mergeManualProductDiscountIntoList)(payload.discount_list, (0, _manualProductDiscount.buildManualProductDiscountItem)({
|
|
145
|
+
originTotal: Number.isFinite(originTotal) ? originTotal : Number(lineOriginalPrice),
|
|
146
|
+
sellingTotal: Number.isFinite(sellingTotal) ? sellingTotal : Number(lineCompositeTotal),
|
|
147
|
+
quantity: resolvedQuantity,
|
|
148
|
+
message: discountReason,
|
|
149
|
+
discountway: payload._extend?.discountway,
|
|
150
|
+
discount_per: payload._extend?.discount_per
|
|
151
|
+
})) : payload.discount_list || [];
|
|
152
|
+
|
|
153
|
+
// v2:source 不含 option;main_product_* 含 option(与 normalizeOrderProduct 一致)
|
|
154
|
+
const optionSum = (0, _utils.sumOptionUnitPrice)(productOptionItem).toNumber();
|
|
188
155
|
const mainProductOriginalPrice = toPriceString(Number(sourceProductPrice) + optionSum);
|
|
189
|
-
const bundleOnlyComposite = (0,
|
|
156
|
+
const bundleOnlyComposite = (0, _utils.composeLinePrice)({
|
|
157
|
+
mainPrice: 0,
|
|
158
|
+
bundle: productBundle
|
|
159
|
+
});
|
|
190
160
|
const derivedMainSelling = hasExplicitLineTotal ? Number(lineCompositeTotal) - Number(bundleOnlyComposite) : Number(mainProductOriginalPrice);
|
|
191
|
-
const mainProductSellingPrice = toPriceString(
|
|
192
|
-
Number.isFinite(derivedMainSelling) && derivedMainSelling >= 0 ? derivedMainSelling : Number(mainProductOriginalPrice)
|
|
193
|
-
);
|
|
161
|
+
const mainProductSellingPrice = toPriceString(Number.isFinite(derivedMainSelling) && derivedMainSelling >= 0 ? derivedMainSelling : Number(mainProductOriginalPrice));
|
|
194
162
|
const metadata = {
|
|
195
163
|
unique: payload.unique,
|
|
196
164
|
session: payload.session,
|
|
@@ -205,54 +173,49 @@ function transformBaseProductToOrderProduct(params) {
|
|
|
205
173
|
main_product_selling_price: mainProductSellingPrice,
|
|
206
174
|
main_product_original_price: mainProductOriginalPrice,
|
|
207
175
|
price_schema_version: 2,
|
|
208
|
-
holder_config: sourceProduct
|
|
209
|
-
...hasPriceOverride ? {
|
|
176
|
+
holder_config: sourceProduct?.holder_config,
|
|
177
|
+
...(hasPriceOverride ? {
|
|
210
178
|
price_override: String(payload.price_override),
|
|
211
179
|
is_manual_discount: 1
|
|
212
|
-
} : {},
|
|
213
|
-
...payload.bundle_edit !==
|
|
180
|
+
} : {}),
|
|
181
|
+
...(payload.bundle_edit !== undefined ? {
|
|
182
|
+
bundle_edit: payload.bundle_edit
|
|
183
|
+
} : {})
|
|
214
184
|
};
|
|
215
185
|
if (uniqueIdentificationNumber) {
|
|
216
186
|
metadata.unique_identification_number = String(uniqueIdentificationNumber);
|
|
217
187
|
}
|
|
188
|
+
// 从源头补充商品多语言标题
|
|
218
189
|
const productTitle = {
|
|
219
|
-
...(sourceProduct
|
|
220
|
-
original:
|
|
190
|
+
...(sourceProduct?.title_i18n || {}),
|
|
191
|
+
original: sourceProduct?.original_title || sourceProduct?.title || ''
|
|
221
192
|
};
|
|
222
193
|
return {
|
|
223
194
|
product_id: productId,
|
|
224
195
|
product_variant_id: productVariantId,
|
|
225
|
-
unique_identification_number: uniqueIdentificationNumber ? String(uniqueIdentificationNumber) :
|
|
196
|
+
unique_identification_number: uniqueIdentificationNumber ? String(uniqueIdentificationNumber) : undefined,
|
|
226
197
|
num: resolvedQuantity,
|
|
227
198
|
product_sku: {
|
|
228
|
-
...payload.product_sku && typeof payload.product_sku ===
|
|
199
|
+
...(payload.product_sku && typeof payload.product_sku === 'object' ? payload.product_sku : {}),
|
|
229
200
|
option: productOptionItem
|
|
230
201
|
},
|
|
231
202
|
product_bundle: productBundle,
|
|
232
203
|
discount_list: manualDiscountList,
|
|
233
|
-
...payload.bundle_edit !==
|
|
204
|
+
...(payload.bundle_edit !== undefined ? {
|
|
205
|
+
bundle_edit: payload.bundle_edit
|
|
206
|
+
} : {}),
|
|
234
207
|
// 折后行价由 normalizeOrderProduct 按 main + bundle 合成;手动改价时 bundle 已为分摊后单价
|
|
235
208
|
selling_price: lineCompositeTotal,
|
|
236
209
|
original_price: lineOriginalPrice,
|
|
237
|
-
tax_fee: toPriceString(
|
|
238
|
-
|
|
239
|
-
"0.00"
|
|
240
|
-
),
|
|
241
|
-
is_charge_tax: toNumber(
|
|
242
|
-
payload.is_charge_tax ?? (matchedVariant == null ? void 0 : matchedVariant.is_charge_tax) ?? (origin == null ? void 0 : origin.is_charge_tax) ?? (sourceProduct == null ? void 0 : sourceProduct.is_charge_tax),
|
|
243
|
-
0
|
|
244
|
-
),
|
|
210
|
+
tax_fee: toPriceString(payload.tax_fee ?? matchedVariant?.tax_fee ?? origin?.tax_fee ?? sourceProduct?.tax_fee, '0.00'),
|
|
211
|
+
is_charge_tax: toNumber(payload.is_charge_tax ?? matchedVariant?.is_charge_tax ?? origin?.is_charge_tax ?? sourceProduct?.is_charge_tax, 0),
|
|
245
212
|
metadata,
|
|
246
|
-
note: payload.note != null ? String(payload.note) :
|
|
213
|
+
note: payload.note != null ? String(payload.note) : '',
|
|
247
214
|
product_title: productTitle,
|
|
248
|
-
product_cover: firstNonBlank(matchedVariant
|
|
215
|
+
product_cover: firstNonBlank(matchedVariant?.cover, sourceProduct?.cover),
|
|
249
216
|
_origin: {
|
|
250
|
-
...sourceProduct || {},
|
|
217
|
+
...(sourceProduct || {}),
|
|
251
218
|
callbackData: payload
|
|
252
219
|
}
|
|
253
220
|
};
|
|
254
|
-
}
|
|
255
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
256
|
-
0 && (module.exports = {
|
|
257
|
-
transformBaseProductToOrderProduct
|
|
258
|
-
});
|
|
221
|
+
}
|