@pisell/pisellos 2.3.74 → 2.3.76
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.d.ts +1 -1
- package/dist/modules/Order/index.js +75 -91
- package/dist/modules/Order/types.d.ts +3 -1
- 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 +100 -72
- package/dist/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
- package/dist/solution/BaseSales/utils/cartPromotion.js +15 -6
- 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.d.ts +1 -1
- package/lib/modules/Order/index.js +1733 -2121
- package/lib/modules/Order/payment-utils.js +77 -120
- package/lib/modules/Order/types.d.ts +3 -1
- 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 +1220 -1412
- package/lib/solution/BaseSales/types.js +42 -38
- package/lib/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
- package/lib/solution/BaseSales/utils/cartPromotion.js +652 -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,72 +1,53 @@
|
|
|
1
|
-
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
-
mod
|
|
26
|
-
));
|
|
27
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
"use strict";
|
|
28
2
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
__export(utils_exports, {
|
|
32
|
-
buildProductLineFingerprint: () => buildProductLineFingerprint,
|
|
33
|
-
createEmptySummary: () => createEmptySummary,
|
|
34
|
-
getSafeProductNum: () => getSafeProductNum,
|
|
35
|
-
isSkuOnlyDeleteIdentity: () => isSkuOnlyDeleteIdentity,
|
|
36
|
-
normalizeOrderProduct: () => normalizeOrderProduct
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
37
5
|
});
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
6
|
+
exports.buildProductLineFingerprint = buildProductLineFingerprint;
|
|
7
|
+
exports.createEmptySummary = createEmptySummary;
|
|
8
|
+
exports.getSafeProductNum = getSafeProductNum;
|
|
9
|
+
exports.isSkuOnlyDeleteIdentity = isSkuOnlyDeleteIdentity;
|
|
10
|
+
exports.normalizeOrderProduct = normalizeOrderProduct;
|
|
11
|
+
var _decimal = _interopRequireDefault(require("decimal.js"));
|
|
12
|
+
var _utils = require("../../modules/Order/utils");
|
|
13
|
+
var _manualProductDiscount = require("../../modules/Order/utils/manualProductDiscount");
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
/**
|
|
16
|
+
* 构建金额全为 0 的空 summary。
|
|
17
|
+
* 作为尚未计算金额时的兜底默认值,避免下游因 undefined 报错。
|
|
18
|
+
*/
|
|
42
19
|
function createEmptySummary() {
|
|
43
20
|
return {
|
|
44
21
|
product_quantity: 0,
|
|
45
|
-
product_original_amount:
|
|
46
|
-
product_amount:
|
|
47
|
-
product_expect_amount:
|
|
48
|
-
product_tax_fee:
|
|
49
|
-
shipping_fee:
|
|
50
|
-
shipping_tax_fee:
|
|
51
|
-
tax_fee:
|
|
52
|
-
surcharge_fee:
|
|
53
|
-
discount_amount:
|
|
54
|
-
deposit_amount:
|
|
55
|
-
expect_amount:
|
|
56
|
-
total_amount:
|
|
57
|
-
amount_gap:
|
|
58
|
-
rounding_amount:
|
|
59
|
-
pay_service_charge_amount:
|
|
22
|
+
product_original_amount: '0.00',
|
|
23
|
+
product_amount: '0.00',
|
|
24
|
+
product_expect_amount: '0.00',
|
|
25
|
+
product_tax_fee: '0.00',
|
|
26
|
+
shipping_fee: '0.00',
|
|
27
|
+
shipping_tax_fee: '0.00',
|
|
28
|
+
tax_fee: '0.00',
|
|
29
|
+
surcharge_fee: '0.00',
|
|
30
|
+
discount_amount: '0.00',
|
|
31
|
+
deposit_amount: '0.00',
|
|
32
|
+
expect_amount: '0.00',
|
|
33
|
+
total_amount: '0.00',
|
|
34
|
+
amount_gap: '0.00',
|
|
35
|
+
rounding_amount: '0.00',
|
|
36
|
+
pay_service_charge_amount: '0.00'
|
|
60
37
|
};
|
|
61
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* 将选项行 / 套餐行归一成稳定 JSON,用于「同 SKU 是否合并」判断。
|
|
41
|
+
* 数组元素先按主键排序再序列化,避免顺序差异导致误判为不同行。
|
|
42
|
+
*/
|
|
62
43
|
function buildProductLineFingerprint(productOptionItem, productBundle) {
|
|
63
|
-
const normalizeOptions =
|
|
44
|
+
const normalizeOptions = options => {
|
|
64
45
|
const optionArr = Array.isArray(options) ? options : [];
|
|
65
|
-
return optionArr.map(
|
|
66
|
-
option_group_item_id: Number(item
|
|
67
|
-
option_group_id: Number(item
|
|
68
|
-
num: typeof
|
|
69
|
-
price: String(
|
|
46
|
+
return optionArr.map(item => ({
|
|
47
|
+
option_group_item_id: Number(item?.option_group_item_id) || 0,
|
|
48
|
+
option_group_id: Number(item?.option_group_id) || 0,
|
|
49
|
+
num: typeof item?.num === 'number' && !Number.isNaN(item.num) ? Math.max(1, Math.floor(item.num)) : 1,
|
|
50
|
+
price: String(item?.add_price ?? item?.price ?? '')
|
|
70
51
|
})).sort((p, q) => {
|
|
71
52
|
if (p.option_group_item_id !== q.option_group_item_id) {
|
|
72
53
|
return p.option_group_item_id - q.option_group_item_id;
|
|
@@ -74,68 +55,89 @@ function buildProductLineFingerprint(productOptionItem, productBundle) {
|
|
|
74
55
|
if (p.option_group_id !== q.option_group_id) {
|
|
75
56
|
return p.option_group_id - q.option_group_id;
|
|
76
57
|
}
|
|
77
|
-
if (p.num !== q.num)
|
|
78
|
-
return p.num - q.num;
|
|
58
|
+
if (p.num !== q.num) return p.num - q.num;
|
|
79
59
|
return p.price.localeCompare(q.price);
|
|
80
60
|
});
|
|
81
61
|
};
|
|
82
62
|
const normalizedOpts = normalizeOptions(productOptionItem);
|
|
83
63
|
const bundleArr = Array.isArray(productBundle) ? productBundle : [];
|
|
84
|
-
const normalizedBundles = bundleArr.map(
|
|
85
|
-
bundle_id: Number(
|
|
86
|
-
product_id: Number(item
|
|
87
|
-
product_variant_id: Number(
|
|
88
|
-
num: typeof
|
|
89
|
-
option: normalizeOptions(item
|
|
64
|
+
const normalizedBundles = bundleArr.map(item => ({
|
|
65
|
+
bundle_id: Number(item?.bundle_id ?? item?.id ?? 0) || 0,
|
|
66
|
+
product_id: Number(item?.product_id) || 0,
|
|
67
|
+
product_variant_id: Number(item?.bundle_variant_id ?? item?.product_variant_id) || 0,
|
|
68
|
+
num: typeof item?.num === 'number' && !Number.isNaN(item.num) ? Math.max(1, Math.floor(item.num)) : 1,
|
|
69
|
+
option: normalizeOptions(item?.option)
|
|
90
70
|
})).sort((p, q) => {
|
|
91
|
-
if (p.bundle_id !== q.bundle_id)
|
|
92
|
-
|
|
93
|
-
if (p.product_id !== q.product_id)
|
|
94
|
-
return p.product_id - q.product_id;
|
|
71
|
+
if (p.bundle_id !== q.bundle_id) return p.bundle_id - q.bundle_id;
|
|
72
|
+
if (p.product_id !== q.product_id) return p.product_id - q.product_id;
|
|
95
73
|
if (p.product_variant_id !== q.product_variant_id) {
|
|
96
74
|
return p.product_variant_id - q.product_variant_id;
|
|
97
75
|
}
|
|
98
|
-
if (p.num !== q.num)
|
|
99
|
-
return p.num - q.num;
|
|
76
|
+
if (p.num !== q.num) return p.num - q.num;
|
|
100
77
|
return JSON.stringify(p.option).localeCompare(JSON.stringify(q.option));
|
|
101
78
|
});
|
|
102
79
|
return JSON.stringify([normalizedOpts, normalizedBundles]);
|
|
103
80
|
}
|
|
104
81
|
function getSafeProductNum(num) {
|
|
105
|
-
if (!num || Number.isNaN(num))
|
|
106
|
-
|
|
107
|
-
if (num < 1)
|
|
108
|
-
return 1;
|
|
82
|
+
if (!num || Number.isNaN(num)) return 1;
|
|
83
|
+
if (num < 1) return 1;
|
|
109
84
|
return Math.floor(num);
|
|
110
85
|
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* removeProductFromOrder 仅传 SKU 时的通配 identity(对象上未声明选项键)。
|
|
89
|
+
* 与显式 `product_sku: { option: [] }` 区分:后者只匹配「无选项」行。
|
|
90
|
+
*/
|
|
111
91
|
function isSkuOnlyDeleteIdentity(x) {
|
|
112
|
-
if (x.identity_key)
|
|
113
|
-
|
|
114
|
-
return !("product_sku" in x) && !("product_bundle" in x);
|
|
92
|
+
if (x.identity_key) return false;
|
|
93
|
+
return !('product_sku' in x) && !('product_bundle' in x);
|
|
115
94
|
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* 对外部传入的商品对象做归一化(v2 composite 语义):
|
|
98
|
+
* - 补全可选字段默认值(未传则使用兜底值,避免后续计算时因 undefined 导致异常)
|
|
99
|
+
* - 对 num 调用 getSafeProductNum 做安全处理
|
|
100
|
+
* - 保留 _origin 供后续业务流程(如促销规则)使用
|
|
101
|
+
*
|
|
102
|
+
* 价格字段语义(metadata 权威源 + composite 派生):
|
|
103
|
+
* - `metadata.source_product_price`:主商品/variant 基础价(已应用报价单),**不含 option**、
|
|
104
|
+
* **不含折扣**。是推导 main_product_* 的起点。variant 分支优先读 `metadata.origin.variant[vid].price`。
|
|
105
|
+
* - `metadata.main_product_original_price`:`source + Σ(option.price × option.num)`,**含 option**、
|
|
106
|
+
* **不含折扣**。
|
|
107
|
+
* - `metadata.main_product_selling_price`:`main_product_original_price - 主商品券 per-unit amount`,
|
|
108
|
+
* **含 option**、**含折扣**。
|
|
109
|
+
* - 行级 `selling_price` = `main_product_selling_price + Σ(bundle_selling_price × num)`。
|
|
110
|
+
* - 行级 `original_price` = `main_product_original_price + Σ(bundle 原价 × num)`。
|
|
111
|
+
*
|
|
112
|
+
* 迁移与幂等:
|
|
113
|
+
* - `metadata.price_schema_version === 2` → 已新语义归一化,保留 main_product_* 原值(保留折扣)。
|
|
114
|
+
* - 其它情况(v1 / 缺字段 / 无 metadata)→ 按"main_product_selling_price 曾是 main-only"的旧约定
|
|
115
|
+
* 反推 legacyDiscount,再以新 source + options 基准重算。最终统一打上 `price_schema_version: 2`。
|
|
116
|
+
* - 因此多次 normalize 不会重复叠加 option/bundle。
|
|
117
|
+
*/
|
|
116
118
|
function normalizeOrderProduct(product) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
const metadata = {
|
|
120
|
+
...(product.metadata || {})
|
|
121
|
+
};
|
|
122
|
+
// 不透明 identity 契约:每条订单行必须带 identity_key。
|
|
123
|
+
// 调用方未传时由 SDK 自动生成 UUID,后续 update/remove 只做严格比对,避免猜测合成 key。
|
|
124
|
+
const resolvedIdentityKey = product.metadata?.unique_identification_number ? String(product.metadata.unique_identification_number) : product.unique_identification_number && String(product.unique_identification_number).length > 0 ? String(product.unique_identification_number) : product.identity_key && String(product.identity_key).length > 0 ? String(product.identity_key) : (0, _utils.createUuidV4)();
|
|
120
125
|
metadata.unique_identification_number = resolvedIdentityKey;
|
|
121
126
|
const priceOverride = metadata.price_override;
|
|
122
|
-
const originOtherBundle =
|
|
127
|
+
const originOtherBundle = metadata.origin?._extend?.other?.bundle;
|
|
123
128
|
let bundleInput = product.product_bundle || [];
|
|
124
|
-
if (priceOverride !==
|
|
125
|
-
const priceById =
|
|
126
|
-
originOtherBundle.forEach(
|
|
127
|
-
if (
|
|
128
|
-
return;
|
|
129
|
+
if (priceOverride !== undefined && priceOverride !== null && priceOverride !== '' && Array.isArray(originOtherBundle) && originOtherBundle.length > 0) {
|
|
130
|
+
const priceById = new Map();
|
|
131
|
+
originOtherBundle.forEach(item => {
|
|
132
|
+
if (item?.id == null) return;
|
|
129
133
|
const unit = item.price ?? item.bundle_selling_price;
|
|
130
|
-
if (unit ===
|
|
131
|
-
return;
|
|
134
|
+
if (unit === undefined || unit === null) return;
|
|
132
135
|
priceById.set(String(item.id), String(unit));
|
|
133
136
|
});
|
|
134
137
|
const base = Array.isArray(bundleInput) && bundleInput.length > 0 ? bundleInput : originOtherBundle;
|
|
135
|
-
bundleInput = base.map(
|
|
136
|
-
const unit = priceById.get(String(item
|
|
137
|
-
if (unit ===
|
|
138
|
-
return item;
|
|
138
|
+
bundleInput = base.map(item => {
|
|
139
|
+
const unit = priceById.get(String(item?.id));
|
|
140
|
+
if (unit === undefined) return item;
|
|
139
141
|
return {
|
|
140
142
|
...item,
|
|
141
143
|
price: unit,
|
|
@@ -143,86 +145,107 @@ function normalizeOrderProduct(product) {
|
|
|
143
145
|
};
|
|
144
146
|
});
|
|
145
147
|
}
|
|
146
|
-
const normalizedBundle = bundleInput.map(
|
|
148
|
+
const normalizedBundle = bundleInput.map(item => ({
|
|
147
149
|
...item,
|
|
148
150
|
bundle_id: item.bundle_id ?? item.id,
|
|
149
151
|
bundle_product_id: item.bundle_product_id ?? item._bundle_product_id,
|
|
150
152
|
bundle_group_id: item.bundle_group_id ?? item.group_id,
|
|
151
|
-
bundle_selling_price: item.bundle_selling_price ?? item.price ??
|
|
152
|
-
price: item.price ?? item.custom_price ?? item.bundle_selling_price ??
|
|
153
|
-
price_type: item.price_type ?? item.custom_price_type ??
|
|
154
|
-
price_type_ext: item.price_type_ext ?? item.custom_price_type_ext ??
|
|
153
|
+
bundle_selling_price: item.bundle_selling_price ?? item.price ?? '0.00',
|
|
154
|
+
price: item.price ?? item.custom_price ?? item.bundle_selling_price ?? '0.00',
|
|
155
|
+
price_type: item.price_type ?? item.custom_price_type ?? '',
|
|
156
|
+
price_type_ext: item.price_type_ext ?? item.custom_price_type_ext ?? ''
|
|
155
157
|
}));
|
|
156
|
-
const normalizedOptions = (0,
|
|
157
|
-
const optionSum = (0,
|
|
158
|
+
const normalizedOptions = (0, _utils.normalizeProductSkuOptions)(product.product_sku?.option);
|
|
159
|
+
const optionSum = (0, _utils.sumOptionUnitPrice)(normalizedOptions);
|
|
158
160
|
const productSku = {
|
|
159
|
-
...(0,
|
|
161
|
+
...(0, _utils.ensureProductSku)(product),
|
|
160
162
|
option: normalizedOptions
|
|
161
163
|
};
|
|
162
|
-
|
|
164
|
+
|
|
165
|
+
// 1) 解析 source_product_price。
|
|
166
|
+
// 优先级:
|
|
167
|
+
// 1) metadata.source_product_price(v2 权威)
|
|
168
|
+
// 2) variantPrice(命中 variant_id,从 metadata.origin.variant[vid].price 读)
|
|
169
|
+
// 3) _origin.price / _origin.base_price(后端语义的基础价)
|
|
170
|
+
// 4) v1 兼容:无 v2 标记但存在 metadata.main_product_original_price(v1 main-only,即旧 source)
|
|
171
|
+
// 5) 入参 original_price(v1 addProduct 约定:original_price 为 pre-discount 基础价)
|
|
172
|
+
// 6) 入参 selling_price(最末兜底,新添加路径 caller 只给 selling_price)
|
|
173
|
+
const isV2 = metadata.price_schema_version === 2 || metadata.price_schema_version === '2';
|
|
163
174
|
const variantId = Number(product.product_variant_id || 0);
|
|
164
|
-
const variantList = variantId ?
|
|
165
|
-
const variantPrice = Array.isArray(variantList) ?
|
|
175
|
+
const variantList = variantId ? metadata?.origin?.variant : null;
|
|
176
|
+
const variantPrice = Array.isArray(variantList) ? variantList.find(v => Number(v?.id) === variantId)?.price : undefined;
|
|
166
177
|
const resolvedSource = (() => {
|
|
167
|
-
|
|
168
|
-
if (metadata.source_product_price !== void 0) {
|
|
178
|
+
if (metadata.source_product_price !== undefined) {
|
|
169
179
|
return String(metadata.source_product_price);
|
|
170
180
|
}
|
|
171
|
-
if (variantPrice !==
|
|
181
|
+
if (variantPrice !== undefined && variantPrice !== null) {
|
|
172
182
|
return String(variantPrice);
|
|
173
183
|
}
|
|
174
|
-
const originPrice =
|
|
175
|
-
if (originPrice !==
|
|
184
|
+
const originPrice = product._origin?.price;
|
|
185
|
+
if (originPrice !== undefined && originPrice !== null) {
|
|
176
186
|
return String(originPrice);
|
|
177
187
|
}
|
|
178
|
-
const originBasePrice =
|
|
179
|
-
if (originBasePrice !==
|
|
188
|
+
const originBasePrice = product._origin?.base_price;
|
|
189
|
+
if (originBasePrice !== undefined && originBasePrice !== null) {
|
|
180
190
|
return String(originBasePrice);
|
|
181
191
|
}
|
|
182
|
-
if (!isV2 && metadata.main_product_original_price !==
|
|
192
|
+
if (!isV2 && metadata.main_product_original_price !== undefined) {
|
|
183
193
|
return String(metadata.main_product_original_price);
|
|
184
194
|
}
|
|
185
|
-
return product.original_price ?? product.selling_price ??
|
|
195
|
+
return product.original_price ?? product.selling_price ?? '0.00';
|
|
186
196
|
})();
|
|
187
|
-
|
|
197
|
+
|
|
198
|
+
// 2) 派生 main_product_original_price(含 option、不含折扣)
|
|
199
|
+
const mainOriginalDec = new _decimal.default(Number(resolvedSource) || 0).plus(optionSum);
|
|
188
200
|
const mainOriginalStr = mainOriginalDec.toDecimalPlaces(2).toFixed(2);
|
|
201
|
+
|
|
202
|
+
// 3) 派生 main_product_selling_price(含 option、含主商品折扣)
|
|
203
|
+
// - v2 数据:直接沿用 metadata.main_product_selling_price(保留折扣)
|
|
204
|
+
// - v1 metadata:main_product_selling_price 旧语义是 main-only(≈ source-level 折后价),
|
|
205
|
+
// 反推 legacyDiscount = main_original(旧) - main_selling(旧),再用新 main_original - legacyDiscount
|
|
206
|
+
// - v1 addProduct 入参:top-level selling_price < original_price 表示主商品折扣;
|
|
207
|
+
// 用差额作为 legacyDiscount 映射到新 main_selling
|
|
208
|
+
// - 其它:视为无折扣,main_selling = main_original
|
|
189
209
|
let mainSellingDec;
|
|
190
210
|
if (isV2 && metadata.main_product_selling_price != null) {
|
|
191
|
-
mainSellingDec = new
|
|
211
|
+
mainSellingDec = new _decimal.default(Number(metadata.main_product_selling_price) || 0);
|
|
192
212
|
} else if (metadata.main_product_selling_price != null && metadata.main_product_original_price != null) {
|
|
193
|
-
const legacyOriginal = new
|
|
194
|
-
const legacySelling = new
|
|
213
|
+
const legacyOriginal = new _decimal.default(Number(metadata.main_product_original_price) || 0);
|
|
214
|
+
const legacySelling = new _decimal.default(Number(metadata.main_product_selling_price) || 0);
|
|
195
215
|
const legacyDiscount = legacyOriginal.minus(legacySelling);
|
|
196
216
|
mainSellingDec = mainOriginalDec.minus(legacyDiscount);
|
|
197
|
-
} else if (product.original_price != null && product.selling_price != null && new
|
|
198
|
-
new
|
|
199
|
-
|
|
200
|
-
const topOriginal = new import_decimal.default(Number(product.original_price) || 0);
|
|
201
|
-
const topSelling = new import_decimal.default(Number(product.selling_price) || 0);
|
|
217
|
+
} else if (product.original_price != null && product.selling_price != null && new _decimal.default(Number(product.original_price) || 0).greaterThan(new _decimal.default(Number(product.selling_price) || 0))) {
|
|
218
|
+
const topOriginal = new _decimal.default(Number(product.original_price) || 0);
|
|
219
|
+
const topSelling = new _decimal.default(Number(product.selling_price) || 0);
|
|
202
220
|
const legacyDiscount = topOriginal.minus(topSelling);
|
|
203
221
|
mainSellingDec = mainOriginalDec.minus(legacyDiscount);
|
|
204
222
|
} else {
|
|
205
223
|
mainSellingDec = mainOriginalDec;
|
|
206
224
|
}
|
|
207
225
|
const mainSellingStr = mainSellingDec.toDecimalPlaces(2).toFixed(2);
|
|
226
|
+
|
|
227
|
+
// 4) 落盘 metadata:三字段 + schema 版本 sentinel
|
|
208
228
|
metadata.source_product_price = resolvedSource;
|
|
209
229
|
metadata.main_product_original_price = mainOriginalStr;
|
|
210
230
|
metadata.main_product_selling_price = mainSellingStr;
|
|
211
231
|
metadata.price_schema_version = 2;
|
|
212
|
-
|
|
232
|
+
|
|
233
|
+
// 5) 合成行级 composite(main 已含 option,本步只叠 bundle)
|
|
234
|
+
const composedSellingPrice = (0, _utils.composeLinePrice)({
|
|
213
235
|
mainPrice: mainSellingStr,
|
|
214
236
|
bundle: normalizedBundle
|
|
215
237
|
});
|
|
216
|
-
const composedOriginalPrice = (0,
|
|
238
|
+
const composedOriginalPrice = (0, _utils.composeLinePrice)({
|
|
217
239
|
mainPrice: mainOriginalStr,
|
|
218
240
|
bundle: normalizedBundle,
|
|
219
241
|
useOriginalBundle: true
|
|
220
242
|
});
|
|
221
|
-
const finalOriginalPrice = (0,
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
243
|
+
const finalOriginalPrice = (0, _utils.resolveManualOverrideLineOriginalPrice)({
|
|
244
|
+
num: product.num,
|
|
245
|
+
metadata,
|
|
246
|
+
lineOriginalPrice: product.original_price
|
|
247
|
+
}, composedOriginalPrice);
|
|
248
|
+
const discountList = (0, _manualProductDiscount.ensureManualProductDiscountList)({
|
|
226
249
|
discountList: product.discount_list,
|
|
227
250
|
metadata,
|
|
228
251
|
originalPrice: finalOriginalPrice,
|
|
@@ -237,19 +260,11 @@ function normalizeOrderProduct(product) {
|
|
|
237
260
|
product_sku: productSku,
|
|
238
261
|
selling_price: composedSellingPrice,
|
|
239
262
|
original_price: finalOriginalPrice,
|
|
240
|
-
tax_fee: product.tax_fee ||
|
|
263
|
+
tax_fee: product.tax_fee || '0.00',
|
|
241
264
|
is_charge_tax: product.is_charge_tax ?? 0,
|
|
242
265
|
discount_list: discountList,
|
|
243
266
|
product_bundle: normalizedBundle,
|
|
244
267
|
metadata,
|
|
245
|
-
note: product.note != null ? String(product.note) :
|
|
268
|
+
note: product.note != null ? String(product.note) : ''
|
|
246
269
|
};
|
|
247
|
-
}
|
|
248
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
249
|
-
0 && (module.exports = {
|
|
250
|
-
buildProductLineFingerprint,
|
|
251
|
-
createEmptySummary,
|
|
252
|
-
getSafeProductNum,
|
|
253
|
-
isSkuOnlyDeleteIdentity,
|
|
254
|
-
normalizeOrderProduct
|
|
255
|
-
});
|
|
270
|
+
}
|