@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,55 +1,44 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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);
|
|
18
|
-
|
|
19
|
-
// src/solution/Checkout/utils/index.ts
|
|
20
|
-
var utils_exports = {};
|
|
21
|
-
__export(utils_exports, {
|
|
22
|
-
calculateTotalAmount: () => calculateTotalAmount,
|
|
23
|
-
createCheckoutError: () => createCheckoutError,
|
|
24
|
-
debounce: () => debounce,
|
|
25
|
-
deepClone: () => deepClone,
|
|
26
|
-
extractAmountFromCartSummary: () => extractAmountFromCartSummary,
|
|
27
|
-
formatAmount: () => formatAmount,
|
|
28
|
-
formatDateTime: () => formatDateTime,
|
|
29
|
-
generateLocalOrderId: () => generateLocalOrderId,
|
|
30
|
-
generateOrderId: () => generateOrderId,
|
|
31
|
-
getErrorMessage: () => getErrorMessage,
|
|
32
|
-
isCashPayment: () => isCashPayment,
|
|
33
|
-
isEmpty: () => isEmpty,
|
|
34
|
-
isProduction: () => isProduction,
|
|
35
|
-
isValidPaymentMethodCode: () => isValidPaymentMethodCode,
|
|
36
|
-
isVirtualOrderId: () => isVirtualOrderId,
|
|
37
|
-
logger: () => logger,
|
|
38
|
-
retry: () => retry,
|
|
39
|
-
safeJsonParse: () => safeJsonParse,
|
|
40
|
-
shouldSyncOrderForPayment: () => shouldSyncOrderForPayment,
|
|
41
|
-
throttle: () => throttle,
|
|
42
|
-
validateAmount: () => validateAmount,
|
|
43
|
-
validateCheckoutData: () => validateCheckoutData,
|
|
44
|
-
validateLocalOrderData: () => validateLocalOrderData
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
45
5
|
});
|
|
46
|
-
|
|
47
|
-
|
|
6
|
+
exports.calculateTotalAmount = calculateTotalAmount;
|
|
7
|
+
exports.createCheckoutError = createCheckoutError;
|
|
8
|
+
exports.debounce = debounce;
|
|
9
|
+
exports.deepClone = deepClone;
|
|
10
|
+
exports.extractAmountFromCartSummary = extractAmountFromCartSummary;
|
|
11
|
+
exports.formatAmount = formatAmount;
|
|
12
|
+
exports.formatDateTime = formatDateTime;
|
|
13
|
+
exports.generateLocalOrderId = generateLocalOrderId;
|
|
14
|
+
exports.generateOrderId = generateOrderId;
|
|
15
|
+
exports.getErrorMessage = getErrorMessage;
|
|
16
|
+
exports.isCashPayment = isCashPayment;
|
|
17
|
+
exports.isEmpty = isEmpty;
|
|
18
|
+
exports.isProduction = isProduction;
|
|
19
|
+
exports.isValidPaymentMethodCode = isValidPaymentMethodCode;
|
|
20
|
+
exports.isVirtualOrderId = isVirtualOrderId;
|
|
21
|
+
exports.logger = void 0;
|
|
22
|
+
exports.retry = retry;
|
|
23
|
+
exports.safeJsonParse = safeJsonParse;
|
|
24
|
+
exports.shouldSyncOrderForPayment = shouldSyncOrderForPayment;
|
|
25
|
+
exports.throttle = throttle;
|
|
26
|
+
exports.validateAmount = validateAmount;
|
|
27
|
+
exports.validateCheckoutData = validateCheckoutData;
|
|
28
|
+
exports.validateLocalOrderData = validateLocalOrderData;
|
|
29
|
+
var _types = require("../../../modules/Payment/types");
|
|
30
|
+
/**
|
|
31
|
+
* 验证结账数据
|
|
32
|
+
*/
|
|
48
33
|
function validateCheckoutData(params) {
|
|
49
34
|
const errors = [];
|
|
35
|
+
|
|
36
|
+
// 验证购物车商品
|
|
50
37
|
if (!params.cartItems || params.cartItems.length === 0) {
|
|
51
|
-
errors.push(
|
|
38
|
+
errors.push('购物车不能为空');
|
|
52
39
|
}
|
|
40
|
+
|
|
41
|
+
// 验证购物车商品数据完整性
|
|
53
42
|
if (params.cartItems) {
|
|
54
43
|
params.cartItems.forEach((item, index) => {
|
|
55
44
|
if (!item.id) {
|
|
@@ -63,14 +52,25 @@ function validateCheckoutData(params) {
|
|
|
63
52
|
}
|
|
64
53
|
});
|
|
65
54
|
}
|
|
66
|
-
|
|
67
|
-
|
|
55
|
+
|
|
56
|
+
// // 验证订单类型
|
|
57
|
+
// if (params.orderType && !['virtual', 'appointment_booking'].includes(params.orderType)) {
|
|
58
|
+
// errors.push('订单类型无效,必须是 virtual 或 appointment_booking');
|
|
59
|
+
// }
|
|
60
|
+
|
|
61
|
+
// 验证平台类型
|
|
62
|
+
if (params.platform && !['pc', 'h5'].includes(params.platform)) {
|
|
63
|
+
errors.push('平台类型无效,必须是 pc 或 h5');
|
|
68
64
|
}
|
|
69
65
|
return {
|
|
70
66
|
valid: errors.length === 0,
|
|
71
67
|
errors
|
|
72
68
|
};
|
|
73
69
|
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* 创建结账错误对象
|
|
73
|
+
*/
|
|
74
74
|
function createCheckoutError(type, message, details) {
|
|
75
75
|
return {
|
|
76
76
|
type,
|
|
@@ -79,24 +79,44 @@ function createCheckoutError(type, message, details) {
|
|
|
79
79
|
timestamp: Date.now()
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* 格式化金额
|
|
85
|
+
*/
|
|
82
86
|
function formatAmount(amount) {
|
|
83
|
-
const numAmount = typeof amount ===
|
|
84
|
-
if (isNaN(numAmount))
|
|
85
|
-
return "0.00";
|
|
87
|
+
const numAmount = typeof amount === 'string' ? parseFloat(amount) : amount;
|
|
88
|
+
if (isNaN(numAmount)) return '0.00';
|
|
86
89
|
return numAmount.toFixed(2);
|
|
87
90
|
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* 验证金额
|
|
94
|
+
*/
|
|
88
95
|
function validateAmount(amount) {
|
|
89
|
-
const numAmount = typeof amount ===
|
|
96
|
+
const numAmount = typeof amount === 'string' ? parseFloat(amount) : amount;
|
|
90
97
|
return !isNaN(numAmount) && numAmount >= 0;
|
|
91
98
|
}
|
|
92
|
-
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 生成唯一订单ID
|
|
102
|
+
*/
|
|
103
|
+
function generateOrderId(prefix = 'order') {
|
|
93
104
|
const timestamp = Date.now();
|
|
94
|
-
const random = Math.floor(Math.random() *
|
|
105
|
+
const random = Math.floor(Math.random() * 10000).toString().padStart(4, '0');
|
|
95
106
|
return `${prefix}_${timestamp}_${random}`;
|
|
96
107
|
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 检查是否为有效的支付方式代码
|
|
111
|
+
*/
|
|
97
112
|
function isValidPaymentMethodCode(code) {
|
|
98
|
-
|
|
113
|
+
// 基本的支付方式代码验证
|
|
114
|
+
return typeof code === 'string' && code.length > 0 && /^[a-zA-Z0-9_-]+$/.test(code);
|
|
99
115
|
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* 安全地解析JSON
|
|
119
|
+
*/
|
|
100
120
|
function safeJsonParse(jsonString, defaultValue) {
|
|
101
121
|
try {
|
|
102
122
|
return JSON.parse(jsonString);
|
|
@@ -104,17 +124,21 @@ function safeJsonParse(jsonString, defaultValue) {
|
|
|
104
124
|
return defaultValue;
|
|
105
125
|
}
|
|
106
126
|
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* 深度克隆对象
|
|
130
|
+
*/
|
|
107
131
|
function deepClone(obj) {
|
|
108
|
-
if (obj === null || typeof obj !==
|
|
132
|
+
if (obj === null || typeof obj !== 'object') {
|
|
109
133
|
return obj;
|
|
110
134
|
}
|
|
111
135
|
if (obj instanceof Date) {
|
|
112
136
|
return new Date(obj.getTime());
|
|
113
137
|
}
|
|
114
138
|
if (obj instanceof Array) {
|
|
115
|
-
return obj.map(
|
|
139
|
+
return obj.map(item => deepClone(item));
|
|
116
140
|
}
|
|
117
|
-
if (typeof obj ===
|
|
141
|
+
if (typeof obj === 'object') {
|
|
118
142
|
const clonedObj = {};
|
|
119
143
|
for (const key in obj) {
|
|
120
144
|
if (obj.hasOwnProperty(key)) {
|
|
@@ -125,6 +149,10 @@ function deepClone(obj) {
|
|
|
125
149
|
}
|
|
126
150
|
return obj;
|
|
127
151
|
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* 防抖函数
|
|
155
|
+
*/
|
|
128
156
|
function debounce(func, wait) {
|
|
129
157
|
let timeout = null;
|
|
130
158
|
return (...args) => {
|
|
@@ -136,6 +164,10 @@ function debounce(func, wait) {
|
|
|
136
164
|
}, wait);
|
|
137
165
|
};
|
|
138
166
|
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* 节流函数
|
|
170
|
+
*/
|
|
139
171
|
function throttle(func, wait) {
|
|
140
172
|
let lastTime = 0;
|
|
141
173
|
return (...args) => {
|
|
@@ -146,7 +178,11 @@ function throttle(func, wait) {
|
|
|
146
178
|
}
|
|
147
179
|
};
|
|
148
180
|
}
|
|
149
|
-
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* 重试函数
|
|
184
|
+
*/
|
|
185
|
+
async function retry(fn, maxAttempts = 3, delay = 1000) {
|
|
150
186
|
let lastError;
|
|
151
187
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
152
188
|
try {
|
|
@@ -156,39 +192,52 @@ async function retry(fn, maxAttempts = 3, delay = 1e3) {
|
|
|
156
192
|
if (attempt === maxAttempts) {
|
|
157
193
|
throw lastError;
|
|
158
194
|
}
|
|
159
|
-
|
|
195
|
+
|
|
196
|
+
// 等待指定时间后重试
|
|
197
|
+
await new Promise(resolve => setTimeout(resolve, delay * attempt));
|
|
160
198
|
}
|
|
161
199
|
}
|
|
162
200
|
throw lastError;
|
|
163
201
|
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* 检查对象是否为空
|
|
205
|
+
*/
|
|
164
206
|
function isEmpty(obj) {
|
|
165
|
-
if (obj == null)
|
|
166
|
-
|
|
167
|
-
if (
|
|
168
|
-
return obj.length === 0;
|
|
169
|
-
if (typeof obj === "object")
|
|
170
|
-
return Object.keys(obj).length === 0;
|
|
207
|
+
if (obj == null) return true;
|
|
208
|
+
if (Array.isArray(obj) || typeof obj === 'string') return obj.length === 0;
|
|
209
|
+
if (typeof obj === 'object') return Object.keys(obj).length === 0;
|
|
171
210
|
return false;
|
|
172
211
|
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* 获取错误消息
|
|
215
|
+
*/
|
|
173
216
|
function getErrorMessage(error) {
|
|
174
217
|
if (error instanceof Error) {
|
|
175
218
|
return error.message;
|
|
176
219
|
}
|
|
177
|
-
if (typeof error ===
|
|
220
|
+
if (typeof error === 'string') {
|
|
178
221
|
return error;
|
|
179
222
|
}
|
|
180
|
-
if (error && typeof error ===
|
|
223
|
+
if (error && typeof error === 'object' && 'message' in error) {
|
|
181
224
|
return String(error.message);
|
|
182
225
|
}
|
|
183
|
-
return
|
|
226
|
+
return '未知错误';
|
|
184
227
|
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* 检查是否为生产环境
|
|
231
|
+
*/
|
|
185
232
|
function isProduction() {
|
|
186
|
-
return process.env.NODE_ENV ===
|
|
233
|
+
return process.env.NODE_ENV === 'production';
|
|
187
234
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* 日志记录器
|
|
238
|
+
*/
|
|
239
|
+
const logger = exports.logger = {
|
|
240
|
+
info: (message, ...args) => {},
|
|
192
241
|
warn: (message, ...args) => {
|
|
193
242
|
console.warn(`[Checkout] ${message}`, ...args);
|
|
194
243
|
},
|
|
@@ -196,23 +245,30 @@ var logger = {
|
|
|
196
245
|
console.error(`[Checkout] ${message}`, ...args);
|
|
197
246
|
},
|
|
198
247
|
debug: (message, ...args) => {
|
|
199
|
-
if (!isProduction()) {
|
|
200
|
-
console.debug(`[Checkout] ${message}`, ...args);
|
|
201
|
-
}
|
|
248
|
+
if (!isProduction()) {}
|
|
202
249
|
}
|
|
203
250
|
};
|
|
251
|
+
|
|
252
|
+
// ========== 从 CheckoutImpl 类中移出的纯静态方法 ==========
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* 验证本地订单数据
|
|
256
|
+
*/
|
|
204
257
|
function validateLocalOrderData(orderData) {
|
|
205
|
-
var _a;
|
|
206
258
|
const errors = [];
|
|
259
|
+
|
|
260
|
+
// 验证基本字段
|
|
207
261
|
if (!orderData.type) {
|
|
208
|
-
errors.push(
|
|
262
|
+
errors.push('订单类型不能为空');
|
|
209
263
|
}
|
|
210
264
|
if (!orderData.platform) {
|
|
211
|
-
errors.push(
|
|
265
|
+
errors.push('平台信息不能为空');
|
|
212
266
|
}
|
|
213
|
-
if ((!orderData.bookings || orderData.bookings.length === 0) && !
|
|
214
|
-
errors.push(
|
|
267
|
+
if ((!orderData.bookings || orderData.bookings.length === 0) && !orderData?.relation_products?.length) {
|
|
268
|
+
errors.push('预订信息不能为空');
|
|
215
269
|
}
|
|
270
|
+
|
|
271
|
+
// 验证预订信息
|
|
216
272
|
if (orderData.bookings) {
|
|
217
273
|
orderData.bookings.forEach((booking, index) => {
|
|
218
274
|
if (!booking.product || !booking.product.product_id) {
|
|
@@ -231,131 +287,147 @@ function validateLocalOrderData(orderData) {
|
|
|
231
287
|
errors
|
|
232
288
|
};
|
|
233
289
|
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* 生成本地订单ID
|
|
293
|
+
*/
|
|
234
294
|
function generateLocalOrderId() {
|
|
235
295
|
const timestamp = Date.now();
|
|
236
|
-
const random = Math.floor(Math.random() *
|
|
296
|
+
const random = Math.floor(Math.random() * 10000).toString().padStart(4, '0');
|
|
237
297
|
return `local_order_${timestamp}_${random}`;
|
|
238
298
|
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* 格式化日期时间为 YYYY-MM-DD hh:mm:ss 格式
|
|
302
|
+
*
|
|
303
|
+
* @param date 要格式化的日期对象
|
|
304
|
+
* @returns 格式化后的日期时间字符串
|
|
305
|
+
*/
|
|
239
306
|
function formatDateTime(date) {
|
|
240
307
|
const year = date.getFullYear();
|
|
241
|
-
const month = String(date.getMonth() + 1).padStart(2,
|
|
242
|
-
const day = String(date.getDate()).padStart(2,
|
|
243
|
-
const hours = String(date.getHours()).padStart(2,
|
|
244
|
-
const minutes = String(date.getMinutes()).padStart(2,
|
|
245
|
-
const seconds = String(date.getSeconds()).padStart(2,
|
|
308
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
309
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
310
|
+
const hours = String(date.getHours()).padStart(2, '0');
|
|
311
|
+
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
312
|
+
const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
246
313
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
247
314
|
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* 从购物车小计数据中提取金额信息
|
|
318
|
+
*/
|
|
248
319
|
function extractAmountFromCartSummary(cartSummary) {
|
|
249
320
|
const result = {
|
|
250
|
-
totalAmount:
|
|
251
|
-
subTotal:
|
|
252
|
-
taxAmount:
|
|
253
|
-
discountAmount:
|
|
254
|
-
shopDiscountAmount:
|
|
255
|
-
roundingAmount:
|
|
321
|
+
totalAmount: '0.00',
|
|
322
|
+
subTotal: '0.00',
|
|
323
|
+
taxAmount: '0.00',
|
|
324
|
+
discountAmount: '0.00',
|
|
325
|
+
shopDiscountAmount: '0.00',
|
|
326
|
+
roundingAmount: '0.00'
|
|
256
327
|
};
|
|
257
|
-
cartSummary.forEach(
|
|
328
|
+
cartSummary.forEach(item => {
|
|
258
329
|
const value = Number(item.value).toFixed(2);
|
|
259
330
|
switch (item.key) {
|
|
260
|
-
case
|
|
331
|
+
case 'expect_amount':
|
|
261
332
|
result.totalAmount = value;
|
|
262
333
|
break;
|
|
263
|
-
case
|
|
334
|
+
case 'sub_total':
|
|
264
335
|
result.subTotal = value;
|
|
265
336
|
break;
|
|
266
|
-
case
|
|
337
|
+
case 'tax':
|
|
267
338
|
result.taxAmount = value;
|
|
268
339
|
if (item.tax) {
|
|
269
340
|
result.taxDetails = item.tax;
|
|
270
341
|
}
|
|
271
342
|
break;
|
|
272
|
-
case
|
|
343
|
+
case 'discount':
|
|
273
344
|
result.discountAmount = value;
|
|
274
345
|
break;
|
|
275
|
-
case
|
|
346
|
+
case 'shop_discount':
|
|
276
347
|
result.shopDiscountAmount = value;
|
|
277
348
|
break;
|
|
278
|
-
case
|
|
349
|
+
case 'custom_roundingAmount':
|
|
279
350
|
result.roundingAmount = value;
|
|
280
351
|
break;
|
|
281
352
|
default:
|
|
282
|
-
|
|
353
|
+
// 处理其他可能的键,如定金等
|
|
354
|
+
if (item.key.includes('deposit')) {
|
|
283
355
|
result.depositAmount = value;
|
|
284
356
|
}
|
|
285
357
|
break;
|
|
286
358
|
}
|
|
287
359
|
});
|
|
288
|
-
console.log("[Checkout] 从购物车小计提取金额信息:", {
|
|
289
|
-
totalAmount: result.totalAmount,
|
|
290
|
-
subTotal: result.subTotal,
|
|
291
|
-
taxAmount: result.taxAmount,
|
|
292
|
-
discountAmount: result.discountAmount,
|
|
293
|
-
shopDiscountAmount: result.shopDiscountAmount,
|
|
294
|
-
roundingAmount: result.roundingAmount
|
|
295
|
-
});
|
|
296
360
|
return result;
|
|
297
361
|
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* 计算购物车总金额
|
|
365
|
+
*/
|
|
298
366
|
function calculateTotalAmount(cartItems) {
|
|
299
367
|
const total = cartItems.reduce((sum, item) => {
|
|
300
|
-
const price = parseFloat(String(item.price) ||
|
|
368
|
+
const price = parseFloat(String(item.price) || '0');
|
|
301
369
|
const quantity = item.quantity || 1;
|
|
302
370
|
return sum + price * quantity;
|
|
303
371
|
}, 0);
|
|
304
372
|
return total.toFixed(2);
|
|
305
373
|
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* 判断订单ID是否为本地生成的虚拟ID
|
|
377
|
+
*
|
|
378
|
+
* @param orderId 订单ID
|
|
379
|
+
* @returns true 表示是虚拟ID,false 表示是真实的后端ID
|
|
380
|
+
*/
|
|
306
381
|
function isVirtualOrderId(orderId) {
|
|
307
|
-
return orderId.startsWith(
|
|
382
|
+
return orderId.startsWith('local_order_');
|
|
308
383
|
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* 判断支付方式是否需要同步订单到后端
|
|
387
|
+
*
|
|
388
|
+
* 现金支付(CASHMANUAL)和自定义支付不需要同步,其他支付方式需要同步
|
|
389
|
+
*
|
|
390
|
+
* @param paymentCode 支付方式代码
|
|
391
|
+
* @param paymentType 支付方式类型
|
|
392
|
+
* @returns 是否需要同步订单
|
|
393
|
+
*/
|
|
309
394
|
function shouldSyncOrderForPayment(paymentCode, paymentType) {
|
|
310
|
-
const codeUpper =
|
|
311
|
-
const typeUpper =
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
)) {
|
|
395
|
+
const codeUpper = paymentCode?.toUpperCase() || '';
|
|
396
|
+
const typeUpper = paymentType?.toUpperCase() || '';
|
|
397
|
+
|
|
398
|
+
// 现金支付不需要同步 - 支持多种现金支付识别方式
|
|
399
|
+
const cashIdentifiers = ['CASHMANUAL', 'CASH', 'MANUAL'];
|
|
400
|
+
if (cashIdentifiers.some(id => codeUpper.includes(id) || typeUpper.includes(id))) {
|
|
316
401
|
return false;
|
|
317
402
|
}
|
|
318
|
-
|
|
403
|
+
|
|
404
|
+
// 标准现金支付代码检查
|
|
405
|
+
if (paymentCode === _types.PaymentMethodType.Cash || paymentType === _types.PaymentMethodType.Cash) {
|
|
319
406
|
return false;
|
|
320
407
|
}
|
|
321
|
-
|
|
408
|
+
|
|
409
|
+
// 自定义支付不需要同步
|
|
410
|
+
if (codeUpper.includes('CUSTOM') || typeUpper.includes('CUSTOM')) {
|
|
322
411
|
return false;
|
|
323
412
|
}
|
|
413
|
+
|
|
414
|
+
// 其他支付方式都需要同步
|
|
324
415
|
return true;
|
|
325
416
|
}
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* 判断是否为现金支付
|
|
420
|
+
*
|
|
421
|
+
* @param paymentCode 支付方式代码
|
|
422
|
+
* @param paymentType 支付方式类型
|
|
423
|
+
* @returns 是否为现金支付
|
|
424
|
+
*/
|
|
326
425
|
function isCashPayment(paymentItem) {
|
|
327
|
-
|
|
328
|
-
const
|
|
329
|
-
const
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
}
|
|
336
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
337
|
-
0 && (module.exports = {
|
|
338
|
-
calculateTotalAmount,
|
|
339
|
-
createCheckoutError,
|
|
340
|
-
debounce,
|
|
341
|
-
deepClone,
|
|
342
|
-
extractAmountFromCartSummary,
|
|
343
|
-
formatAmount,
|
|
344
|
-
formatDateTime,
|
|
345
|
-
generateLocalOrderId,
|
|
346
|
-
generateOrderId,
|
|
347
|
-
getErrorMessage,
|
|
348
|
-
isCashPayment,
|
|
349
|
-
isEmpty,
|
|
350
|
-
isProduction,
|
|
351
|
-
isValidPaymentMethodCode,
|
|
352
|
-
isVirtualOrderId,
|
|
353
|
-
logger,
|
|
354
|
-
retry,
|
|
355
|
-
safeJsonParse,
|
|
356
|
-
shouldSyncOrderForPayment,
|
|
357
|
-
throttle,
|
|
358
|
-
validateAmount,
|
|
359
|
-
validateCheckoutData,
|
|
360
|
-
validateLocalOrderData
|
|
361
|
-
});
|
|
426
|
+
const codeUpper = paymentItem.code?.toUpperCase() || '';
|
|
427
|
+
const typeUpper = paymentItem.type?.toUpperCase() || '';
|
|
428
|
+
const isNameCash = paymentItem.name?.toLowerCase().includes('cash');
|
|
429
|
+
|
|
430
|
+
// 现金支付识别规则
|
|
431
|
+
const cashIdentifiers = ['CASH', 'CASHMANUAL', 'MANUAL'];
|
|
432
|
+
return cashIdentifiers.some(identifier => codeUpper.includes(identifier) || typeUpper.includes(identifier)) || isNameCash;
|
|
433
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// // 只是一个示例工程
|
|
2
|
+
|
|
3
|
+
// import { Module, PisellCore, ModuleOptions } from '../types';
|
|
4
|
+
// import { CartModuleAPI } from '../modules/cart';
|
|
5
|
+
// import { StockModuleAPI } from '../modules/stock';
|
|
6
|
+
// import { CheckoutModuleAPI } from '../modules/checkout';
|
|
7
|
+
|
|
8
|
+
// class OrderSolution implements Module {
|
|
9
|
+
// name = 'orderSolution';
|
|
10
|
+
// version = '1.0.0';
|
|
11
|
+
|
|
12
|
+
// private core!: PisellCore;
|
|
13
|
+
// private cart!: CartModuleAPI;
|
|
14
|
+
// private stock!: StockModuleAPI;
|
|
15
|
+
// private checkout!: CheckoutModuleAPI;
|
|
16
|
+
|
|
17
|
+
// public exports = {
|
|
18
|
+
// submitOrder: this.submitOrder.bind(this),
|
|
19
|
+
// };
|
|
20
|
+
|
|
21
|
+
// async initialize(core: PisellCore): Promise<void> {
|
|
22
|
+
// this.core = core;
|
|
23
|
+
|
|
24
|
+
// // 获取依赖的模块 API
|
|
25
|
+
// this.cart = core.getModuleExports<CartModuleAPI>('cart');
|
|
26
|
+
// this.stock = core.getModuleExports<StockModuleAPI>('stock');
|
|
27
|
+
// this.checkout = core.getModuleExports<CheckoutModuleAPI>('checkout');
|
|
28
|
+
|
|
29
|
+
// console.log('[OrderSolution] 初始化完成');
|
|
30
|
+
// }
|
|
31
|
+
|
|
32
|
+
// async destroy(): Promise<void> {
|
|
33
|
+
// console.log('[OrderSolution] 已销毁');
|
|
34
|
+
// }
|
|
35
|
+
|
|
36
|
+
// /**
|
|
37
|
+
// * 下单流程(商品 → 库存校验 → 结算 → 提交)
|
|
38
|
+
// */
|
|
39
|
+
// async submitOrder(): Promise<void> {
|
|
40
|
+
// const cartItems = await this.cart.getItems();
|
|
41
|
+
|
|
42
|
+
// const stockResult = await this.stock.checkAvailability(cartItems);
|
|
43
|
+
// if (!stockResult.ok) {
|
|
44
|
+
// throw new Error('部分商品库存不足');
|
|
45
|
+
// }
|
|
46
|
+
|
|
47
|
+
// const summary = await this.checkout.calculate(cartItems);
|
|
48
|
+
|
|
49
|
+
// await this.checkout.submit(summary);
|
|
50
|
+
// console.log('[OrderSolution] 下单完成');
|
|
51
|
+
// }
|
|
52
|
+
// }
|
|
53
|
+
|
|
54
|
+
// export default new OrderSolution();
|
|
55
|
+
"use strict";
|