@pisell/pisellos 0.0.569 → 0.10.2
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 +10 -6
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -3
- package/dist/model/strategy/adapter/promotion/index.js +9 -0
- package/dist/model/strategy/adapter/walletPass/evaluator.js +7 -5
- package/dist/model/strategy/adapter/walletPass/example.js +26 -3
- package/dist/model/strategy/adapter/walletPass/index.js +5 -5
- package/dist/model/strategy/adapter/walletPass/type.d.ts +0 -3
- package/dist/model/strategy/adapter/walletPass/utils.d.ts +0 -26
- package/dist/model/strategy/adapter/walletPass/utils.js +17 -92
- package/dist/model/strategy/strategy-example.js +19 -5
- package/dist/modules/BaseModule.d.ts +1 -1
- package/dist/modules/BaseModule.js +8 -10
- package/dist/modules/Cart/index.js +3 -0
- package/dist/modules/Cart/utils/cartProduct.js +1 -0
- package/dist/modules/Cart/utils/cartResource.js +0 -2
- package/dist/modules/Cart/utils/changePrice.js +9 -16
- package/dist/modules/Date/index.js +5 -1
- package/dist/modules/Discount/index.d.ts +0 -1
- package/dist/modules/Discount/index.js +7 -22
- package/dist/modules/Discount/types.d.ts +0 -1
- package/dist/modules/OpenData/index.js +2 -0
- package/dist/modules/Order/index.js +70 -40
- package/dist/modules/Payment/index.js +162 -97
- package/dist/modules/Payment/types.d.ts +4 -8
- package/dist/modules/Payment/walletpass.d.ts +0 -2
- package/dist/modules/Payment/walletpass.js +5 -4
- package/dist/modules/ProductList/index.d.ts +1 -1
- package/dist/modules/ProductList/index.js +3 -12
- package/dist/modules/ProductList/types.d.ts +0 -1
- package/dist/modules/Rules/index.js +126 -427
- package/dist/modules/SalesSummary/utils.js +1 -2
- package/dist/modules/Schedule/getDateIsInSchedule.js +0 -5
- package/dist/modules/Schedule/index.js +1 -0
- package/dist/modules/Schedule/utils.js +1 -0
- package/dist/modules/Step/index.js +1 -0
- package/dist/modules/Summary/utils.js +22 -43
- package/dist/plugins/request.js +4 -1
- package/dist/plugins/window.js +6 -2
- package/dist/server/index.js +129 -97
- package/dist/server/modules/menu/index.js +41 -32
- package/dist/server/modules/order/index.js +4 -2
- package/dist/server/modules/products/index.js +42 -24
- package/dist/server/modules/quotation/index.js +38 -29
- package/dist/server/modules/resource/index.js +4 -3
- package/dist/server/modules/schedule/index.js +35 -27
- package/dist/server/utils/product.js +1 -0
- package/dist/solution/BaseSales/index.js +41 -38
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingByStep/index.js +60 -11
- package/dist/solution/BookingByStep/utils/capacity.js +11 -1
- package/dist/solution/BookingByStep/utils/resources.js +3 -1
- package/dist/solution/BookingByStep/utils/timeslots.js +43 -2
- package/dist/solution/BookingTicket/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.js +2 -0
- package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +7 -6
- package/dist/solution/BookingTicket/utils/scan/handleScan.js +31 -25
- package/dist/solution/BookingTicket/utils/scan/index.js +10 -6
- package/dist/solution/BuyTickets/index.js +12 -9
- package/dist/solution/Checkout/index.js +252 -177
- package/dist/solution/Checkout/utils/index.js +16 -4
- package/dist/solution/RegisterAndLogin/index.js +76 -30
- package/dist/solution/ScanOrder/index.js +60 -50
- package/dist/solution/ShopDiscount/index.js +14 -15
- package/dist/solution/ShopDiscount/types.d.ts +4 -5
- package/dist/solution/ShopDiscount/utils.d.ts +0 -9
- package/dist/solution/ShopDiscount/utils.js +0 -9
- package/dist/solution/VenueBooking/index.d.ts +3 -31
- package/dist/solution/VenueBooking/index.js +496 -651
- package/dist/solution/VenueBooking/types.d.ts +1 -3
- package/dist/solution/VenueBooking/types.js +0 -1
- package/dist/solution/VenueBooking/utils/dateSummary.d.ts +2 -2
- package/dist/solution/VenueBooking/utils/dateSummary.js +25 -12
- package/dist/solution/VenueBooking/utils/timeSlot.d.ts +0 -2
- package/dist/solution/VenueBooking/utils/timeSlot.js +4 -9
- package/dist/types/index.d.ts +1 -1
- package/dist/utils/task.js +18 -15
- package/dist/utils/watch.js +1 -0
- package/lib/apis/picoding.js +0 -2
- package/lib/core/index.js +132 -130
- package/lib/effects/index.js +57 -46
- package/lib/index.d.ts +0 -1
- package/lib/index.js +50 -92
- package/lib/model/index.js +21 -14
- package/lib/model/strategy/adapter/dataVariant/adapter.js +50 -38
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +236 -162
- package/lib/model/strategy/adapter/dataVariant/examples.js +237 -229
- package/lib/model/strategy/adapter/dataVariant/index.js +34 -39
- package/lib/model/strategy/adapter/dataVariant/type.js +28 -57
- package/lib/model/strategy/adapter/index.js +64 -100
- package/lib/model/strategy/adapter/itemRule/adapter.js +144 -156
- package/lib/model/strategy/adapter/itemRule/evaluator.js +48 -36
- package/lib/model/strategy/adapter/itemRule/examples.js +225 -295
- package/lib/model/strategy/adapter/itemRule/index.js +57 -83
- package/lib/model/strategy/adapter/itemRule/type.js +36 -97
- package/lib/model/strategy/adapter/promotion/adapter.js +63 -84
- package/lib/model/strategy/adapter/promotion/evaluator.js +231 -381
- package/lib/model/strategy/adapter/promotion/examples.js +159 -139
- package/lib/model/strategy/adapter/promotion/index.js +49 -1
- package/lib/model/strategy/adapter/promotion/type.js +35 -199
- package/lib/model/strategy/adapter/type.js +16 -4
- package/lib/model/strategy/adapter/walletPass/evaluator.js +152 -180
- package/lib/model/strategy/adapter/walletPass/example.js +190 -217
- package/lib/model/strategy/adapter/walletPass/index.js +51 -75
- package/lib/model/strategy/adapter/walletPass/locales.js +58 -36
- package/lib/model/strategy/adapter/walletPass/type.d.ts +0 -3
- package/lib/model/strategy/adapter/walletPass/type.js +16 -4
- package/lib/model/strategy/adapter/walletPass/utils.d.ts +0 -26
- package/lib/model/strategy/adapter/walletPass/utils.js +383 -678
- package/lib/model/strategy/engine.js +168 -270
- package/lib/model/strategy/index.js +34 -49
- package/lib/model/strategy/strategy-example.js +239 -243
- package/lib/model/strategy/type.js +40 -100
- package/lib/modules/Account/index.js +53 -39
- package/lib/modules/Account/types.js +33 -20
- package/lib/modules/AccountList/index.js +154 -116
- package/lib/modules/AccountList/types.js +31 -30
- package/lib/modules/AccountList/utils.js +30 -18
- package/lib/modules/BaseModule.d.ts +1 -1
- package/lib/modules/BaseModule.js +46 -25
- package/lib/modules/BookingContext/index.js +136 -158
- package/lib/modules/BookingContext/types.js +32 -46
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +143 -131
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +82 -75
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +150 -170
- package/lib/modules/BookingContext/utils/flexible.js +55 -38
- package/lib/modules/BookingContext/utils/formatResourceList.js +34 -19
- package/lib/modules/BookingContext/utils/index.js +41 -124
- package/lib/modules/BookingContext/utils/noResource.js +70 -58
- package/lib/modules/BookingContext/utils/orderLineDisplay.js +41 -14
- package/lib/modules/BookingContext/utils/productExtend.js +155 -202
- package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
- package/lib/modules/BookingContext/utils/resourceSelection.js +41 -19
- package/lib/modules/BookingContext/utils/resources.js +167 -209
- package/lib/modules/BookingContext/utils/serviceTimes.js +116 -115
- package/lib/modules/BookingContext/utils/timeSlices.js +80 -70
- package/lib/modules/Cart/index.js +124 -170
- package/lib/modules/Cart/types.js +51 -46
- package/lib/modules/Cart/utils/cartAccount.js +39 -40
- package/lib/modules/Cart/utils/cartDate.js +61 -56
- package/lib/modules/Cart/utils/cartDiscount.js +33 -28
- package/lib/modules/Cart/utils/cartNote.js +32 -27
- package/lib/modules/Cart/utils/cartProduct.js +251 -321
- package/lib/modules/Cart/utils/cartRelationForms.js +35 -29
- package/lib/modules/Cart/utils/cartResource.js +78 -72
- package/lib/modules/Cart/utils/changePrice.js +50 -28
- package/lib/modules/Cart/utils/index.js +48 -106
- package/lib/modules/Customer/constants.js +34 -13
- package/lib/modules/Customer/index.js +169 -232
- package/lib/modules/Customer/types.js +35 -38
- package/lib/modules/Date/index.js +115 -116
- package/lib/modules/Date/types.js +28 -16
- package/lib/modules/Date/utils.js +123 -174
- package/lib/modules/Discount/index.d.ts +0 -1
- package/lib/modules/Discount/index.js +128 -130
- package/lib/modules/Discount/types.d.ts +0 -1
- package/lib/modules/Discount/types.js +31 -9
- package/lib/modules/Guests/index.js +56 -30
- package/lib/modules/Guests/types.js +33 -23
- package/lib/modules/Holder/index.js +189 -209
- package/lib/modules/Holder/types.js +16 -4
- package/lib/modules/Holder/utils.js +49 -20
- package/lib/modules/OpenData/index.js +76 -69
- package/lib/modules/OpenData/types.js +16 -4
- package/lib/modules/OpenData/utils.js +78 -44
- package/lib/modules/Order/index.js +1909 -1572
- package/lib/modules/Order/types.js +35 -78
- package/lib/modules/Order/utils/bundleDiscountHydration.js +74 -41
- package/lib/modules/Order/utils/manualProductDiscount.js +123 -124
- package/lib/modules/Order/utils/orderCollectionIdentity.js +210 -148
- package/lib/modules/Order/utils.js +634 -799
- package/lib/modules/Payment/cash.js +33 -20
- package/lib/modules/Payment/cashRecommendationAlgorithm.js +76 -145
- package/lib/modules/Payment/eftpos.js +30 -16
- package/lib/modules/Payment/index.js +378 -518
- package/lib/modules/Payment/mx51.js +0 -1
- package/lib/modules/Payment/types.d.ts +4 -8
- package/lib/modules/Payment/types.js +107 -216
- package/lib/modules/Payment/utils.js +48 -51
- package/lib/modules/Payment/walletpass.d.ts +0 -2
- package/lib/modules/Payment/walletpass.js +211 -226
- package/lib/modules/Product/index.js +46 -51
- package/lib/modules/Product/types.js +16 -4
- package/lib/modules/Product/utils.js +33 -32
- package/lib/modules/ProductList/index.d.ts +1 -1
- package/lib/modules/ProductList/index.js +117 -117
- package/lib/modules/ProductList/types.d.ts +0 -1
- package/lib/modules/ProductList/types.js +31 -9
- package/lib/modules/Quotation/index.js +100 -66
- package/lib/modules/Quotation/types.js +16 -4
- package/lib/modules/Resource/index.js +59 -27
- package/lib/modules/Resource/types.js +32 -22
- package/lib/modules/Resource/utils.js +38 -30
- package/lib/modules/ResourcePlanner/index.js +61 -60
- package/lib/modules/ResourcePlanner/planner.js +384 -346
- package/lib/modules/ResourcePlanner/types.js +16 -4
- package/lib/modules/Rules/index.js +903 -1475
- package/lib/modules/Rules/types.js +40 -17
- package/lib/modules/SalesSummary/index.js +90 -85
- package/lib/modules/SalesSummary/types.js +16 -4
- package/lib/modules/SalesSummary/utils.js +427 -351
- package/lib/modules/ScanOrderLogger/index.js +79 -59
- package/lib/modules/ScanOrderLogger/providers/feishu.js +78 -54
- package/lib/modules/ScanOrderLogger/providers/grafana.js +36 -13
- package/lib/modules/ScanOrderLogger/types.js +16 -4
- package/lib/modules/Schedule/getDateIsInSchedule.js +163 -339
- package/lib/modules/Schedule/index.js +114 -100
- package/lib/modules/Schedule/type.js +16 -4
- package/lib/modules/Schedule/types.js +16 -4
- package/lib/modules/Schedule/utils.js +291 -433
- package/lib/modules/Step/index.js +52 -40
- package/lib/modules/Step/tyeps.js +16 -4
- package/lib/modules/Summary/index.js +71 -66
- package/lib/modules/Summary/types.js +16 -4
- package/lib/modules/Summary/utils.js +418 -791
- package/lib/modules/SurchargeList/index.js +60 -46
- package/lib/modules/SurchargeList/types.js +16 -4
- package/lib/modules/index.js +63 -245
- package/lib/plugins/app.js +16 -4
- package/lib/plugins/index.js +25 -36
- package/lib/plugins/request.js +126 -137
- package/lib/plugins/shopStore.js +16 -4
- package/lib/plugins/user.js +16 -4
- package/lib/plugins/window.js +179 -171
- package/lib/server/index.js +2337 -2675
- package/lib/server/modules/floor-plan/index.js +123 -102
- package/lib/server/modules/floor-plan/types.js +30 -15
- package/lib/server/modules/index.js +68 -106
- package/lib/server/modules/menu/index.js +122 -146
- package/lib/server/modules/menu/types.js +31 -18
- package/lib/server/modules/order/index.js +642 -567
- package/lib/server/modules/order/types.js +32 -117
- package/lib/server/modules/order/utils/filterBookings.js +194 -219
- package/lib/server/modules/order/utils/filterOrders.js +92 -118
- package/lib/server/modules/payment/index.js +83 -59
- package/lib/server/modules/payment/types.js +16 -4
- package/lib/server/modules/products/index.js +459 -575
- package/lib/server/modules/products/types.js +34 -44
- package/lib/server/modules/quotation/index.js +172 -137
- package/lib/server/modules/quotation/types.js +31 -21
- package/lib/server/modules/resource/index.js +184 -213
- package/lib/server/modules/resource/types.js +33 -42
- package/lib/server/modules/schedule/index.js +123 -135
- package/lib/server/modules/schedule/types.js +21 -14
- package/lib/server/modules/schedule/utils.js +163 -334
- package/lib/server/types.js +16 -4
- package/lib/server/utils/index.js +23 -25
- package/lib/server/utils/product.js +139 -196
- package/lib/server/utils/schedule.js +41 -34
- package/lib/server/utils/small-ticket.js +456 -478
- package/lib/server/utils/time.js +49 -40
- package/lib/solution/BaseSales/index.js +1016 -850
- package/lib/solution/BaseSales/types.js +37 -41
- package/lib/solution/BaseSales/utils/cartPromotion.js +460 -611
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +105 -85
- package/lib/solution/BaseSales/utils/quotationPrice.js +114 -56
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +143 -102
- package/lib/solution/BaseSales/utils.js +140 -155
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingByStep/index.js +1340 -1530
- package/lib/solution/BookingByStep/types.js +99 -40
- package/lib/solution/BookingByStep/utils/capacity.js +160 -192
- package/lib/solution/BookingByStep/utils/products.js +52 -42
- package/lib/solution/BookingByStep/utils/resources.js +330 -527
- package/lib/solution/BookingByStep/utils/stock.js +44 -65
- package/lib/solution/BookingByStep/utils/timeslots.js +131 -129
- package/lib/solution/BookingTicket/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.js +459 -543
- package/lib/solution/BookingTicket/types.js +77 -99
- package/lib/solution/BookingTicket/utils/addProductDecision.js +184 -219
- package/lib/solution/BookingTicket/utils/addTimeAvailability.js +89 -58
- package/lib/solution/BookingTicket/utils/bookingStatus.js +78 -107
- package/lib/solution/BookingTicket/utils/cartView.js +94 -110
- package/lib/solution/BookingTicket/utils/exampleData.js +0 -185
- package/lib/solution/BookingTicket/utils/orderCustomer.js +41 -18
- package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +86 -219
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +93 -144
- package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +91 -79
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +41 -54
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +81 -84
- package/lib/solution/BookingTicket/utils/scan/index.js +104 -98
- package/lib/solution/BookingTicket/utils/scan/scanCache.js +43 -90
- package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +64 -52
- package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +58 -56
- package/lib/solution/BuyTickets/index.js +70 -67
- package/lib/solution/BuyTickets/types.js +38 -22
- package/lib/solution/Checkout/index.js +1158 -1451
- package/lib/solution/Checkout/types.js +61 -91
- package/lib/solution/Checkout/utils/index.js +156 -228
- package/lib/solution/PlaceOrder/index.js +0 -55
- package/lib/solution/RegisterAndLogin/config.js +460 -493
- package/lib/solution/RegisterAndLogin/index.js +630 -633
- package/lib/solution/RegisterAndLogin/types.js +76 -189
- package/lib/solution/RegisterAndLogin/utils.js +125 -183
- package/lib/solution/Sales/index.js +320 -317
- package/lib/solution/Sales/types.js +33 -27
- package/lib/solution/ScanOrder/index.js +862 -831
- package/lib/solution/ScanOrder/types.js +34 -33
- package/lib/solution/ScanOrder/utils.js +371 -406
- package/lib/solution/ShopDiscount/index.js +233 -235
- package/lib/solution/ShopDiscount/types.d.ts +4 -5
- package/lib/solution/ShopDiscount/types.js +37 -15
- package/lib/solution/ShopDiscount/utils.d.ts +0 -9
- package/lib/solution/ShopDiscount/utils.js +172 -309
- package/lib/solution/UnifiedBookingSales/index.js +405 -379
- package/lib/solution/UnifiedBookingSales/types.js +31 -12
- package/lib/solution/VenueBooking/index.d.ts +3 -31
- package/lib/solution/VenueBooking/index.js +916 -967
- package/lib/solution/VenueBooking/types.d.ts +1 -3
- package/lib/solution/VenueBooking/types.js +39 -20
- package/lib/solution/VenueBooking/utils/dateSummary.d.ts +2 -2
- package/lib/solution/VenueBooking/utils/dateSummary.js +62 -25
- package/lib/solution/VenueBooking/utils/resource.js +54 -31
- package/lib/solution/VenueBooking/utils/slotMerge.js +107 -94
- package/lib/solution/VenueBooking/utils/timeSlot.d.ts +0 -2
- package/lib/solution/VenueBooking/utils/timeSlot.js +133 -138
- package/lib/solution/VenueBooking/utils.js +67 -130
- package/lib/solution/index.js +41 -124
- package/lib/store/createStore.js +29 -32
- package/lib/types/index.d.ts +1 -1
- package/lib/types/index.js +16 -4
- package/lib/utils/task.js +36 -36
- package/lib/utils/watch.js +47 -81
- package/package.json +2 -4
- package/dist/solution/VenueBooking/utils/smartPricing.d.ts +0 -70
- package/dist/solution/VenueBooking/utils/smartPricing.js +0 -233
- package/lib/solution/VenueBooking/utils/smartPricing.d.ts +0 -70
- package/lib/solution/VenueBooking/utils/smartPricing.js +0 -192
|
@@ -1,118 +1,126 @@
|
|
|
1
|
-
|
|
1
|
+
var __create = Object.create;
|
|
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);
|
|
2
28
|
|
|
3
|
-
|
|
4
|
-
|
|
29
|
+
// src/server/modules/order/utils/filterBookings.ts
|
|
30
|
+
var filterBookings_exports = {};
|
|
31
|
+
__export(filterBookings_exports, {
|
|
32
|
+
filterBookings: () => filterBookings,
|
|
33
|
+
filterBookingsFromOrders: () => filterBookingsFromOrders,
|
|
34
|
+
flattenOrdersToBookings: () => flattenOrdersToBookings,
|
|
35
|
+
productsForBooking: () => productsForBooking,
|
|
36
|
+
sortBookings: () => sortBookings
|
|
5
37
|
});
|
|
6
|
-
exports
|
|
7
|
-
|
|
8
|
-
exports.flattenOrdersToBookings = flattenOrdersToBookings;
|
|
9
|
-
exports.productsForBooking = productsForBooking;
|
|
10
|
-
exports.sortBookings = sortBookings;
|
|
11
|
-
var _dayjs = _interopRequireDefault(require("dayjs"));
|
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
/** 预约状态:协议 appointment_status 优先,兼容历史 status */
|
|
38
|
+
module.exports = __toCommonJS(filterBookings_exports);
|
|
39
|
+
var import_dayjs = __toESM(require("dayjs"));
|
|
14
40
|
function getBookingAppointmentStatus(booking) {
|
|
15
|
-
return String(booking.appointment_status ?? booking.status ??
|
|
41
|
+
return String(booking.appointment_status ?? booking.status ?? "");
|
|
16
42
|
}
|
|
17
|
-
|
|
18
|
-
// ─────────────────────────────────────────────────────────────────
|
|
19
|
-
// 时间戳 / 范围解析
|
|
20
|
-
// ─────────────────────────────────────────────────────────────────
|
|
21
|
-
|
|
22
43
|
function toTimestamp(value) {
|
|
23
|
-
if (value ===
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
44
|
+
if (value === void 0 || value === null || value === "")
|
|
45
|
+
return 0;
|
|
46
|
+
if (typeof value === "number")
|
|
47
|
+
return value;
|
|
48
|
+
const d = (0, import_dayjs.default)(value);
|
|
27
49
|
return d.isValid() ? d.valueOf() : 0;
|
|
28
50
|
}
|
|
29
|
-
|
|
30
|
-
/** 日期范围端点解析:纯日期串自动对齐到当天起止边界(本地时区) */
|
|
31
|
-
const DATE_ONLY_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
51
|
+
var DATE_ONLY_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
32
52
|
function toRangeBoundary(value, isEnd) {
|
|
33
|
-
if (value ===
|
|
34
|
-
|
|
53
|
+
if (value === void 0 || value === null || value === "")
|
|
54
|
+
return 0;
|
|
55
|
+
if (typeof value === "number")
|
|
56
|
+
return value;
|
|
35
57
|
const str = String(value).trim();
|
|
36
|
-
const d = (0,
|
|
37
|
-
if (!d.isValid())
|
|
58
|
+
const d = (0, import_dayjs.default)(str);
|
|
59
|
+
if (!d.isValid())
|
|
60
|
+
return 0;
|
|
38
61
|
if (DATE_ONLY_RE.test(str)) {
|
|
39
|
-
return (isEnd ? d.endOf(
|
|
62
|
+
return (isEnd ? d.endOf("day") : d.startOf("day")).valueOf();
|
|
40
63
|
}
|
|
41
64
|
return d.valueOf();
|
|
42
65
|
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* 将 start_date / start_time(或 end_*)拼成可被 Date 稳定解析的字符串。
|
|
46
|
-
* 时间字段协议为 H:i(如 15:00)时补全为 H:i:00,避免部分环境对「无秒」非 ISO 串(空格分隔)解析不一致。
|
|
47
|
-
*/
|
|
48
66
|
function bookingDateTimeString(datePart, timePart) {
|
|
49
|
-
const d = (datePart ??
|
|
50
|
-
let t = (timePart ??
|
|
67
|
+
const d = (datePart ?? "").trim();
|
|
68
|
+
let t = (timePart ?? "").trim();
|
|
51
69
|
if (t && /^\d{1,2}:\d{2}$/.test(t)) {
|
|
52
70
|
t = `${t}:00`;
|
|
53
71
|
}
|
|
54
72
|
return `${d} ${t}`.trim();
|
|
55
73
|
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* 解析预约自身的起止时间区间,供 `sales_time_between` 做区间重叠匹配。
|
|
59
|
-
*
|
|
60
|
-
* @example
|
|
61
|
-
* const span = resolveBookingTimeRange({ start_date: '2026-06-09', start_time: '10:00', end_date: '2026-06-15', end_time: '10:00' })
|
|
62
|
-
*/
|
|
63
74
|
function resolveBookingTimeRange(booking) {
|
|
64
75
|
const start = toTimestamp(bookingDateTimeString(booking.start_date, booking.start_time));
|
|
65
|
-
if (!start)
|
|
66
|
-
|
|
76
|
+
if (!start)
|
|
77
|
+
return null;
|
|
78
|
+
const end = toTimestamp(
|
|
79
|
+
bookingDateTimeString(
|
|
80
|
+
booking.end_date || booking.start_date,
|
|
81
|
+
booking.end_time || booking.start_time
|
|
82
|
+
)
|
|
83
|
+
) || start;
|
|
67
84
|
return end >= start ? [start, end] : [end, start];
|
|
68
85
|
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* 判断两个闭区间是否有交集。
|
|
72
|
-
*
|
|
73
|
-
* @example
|
|
74
|
-
* isRangeOverlapping([1, 10], [5, 6]) // true
|
|
75
|
-
*/
|
|
76
86
|
function isRangeOverlapping(left, right) {
|
|
77
87
|
return left[0] <= right[1] && left[1] >= right[0];
|
|
78
88
|
}
|
|
79
89
|
function parseDateRange(range) {
|
|
80
|
-
if (!Array.isArray(range) || range.length < 2)
|
|
90
|
+
if (!Array.isArray(range) || range.length < 2)
|
|
91
|
+
return null;
|
|
81
92
|
const start = toRangeBoundary(range[0], false);
|
|
82
93
|
const end = toRangeBoundary(range[1], true);
|
|
83
|
-
if (!start && !end)
|
|
94
|
+
if (!start && !end)
|
|
95
|
+
return null;
|
|
84
96
|
return [start, end];
|
|
85
97
|
}
|
|
86
98
|
function parseNumberRange(range) {
|
|
87
|
-
if (!Array.isArray(range) || range.length < 2)
|
|
99
|
+
if (!Array.isArray(range) || range.length < 2)
|
|
100
|
+
return null;
|
|
88
101
|
const min = Number(range[0]);
|
|
89
102
|
const max = Number(range[1]);
|
|
90
|
-
if (isNaN(min) || isNaN(max))
|
|
103
|
+
if (isNaN(min) || isNaN(max))
|
|
104
|
+
return null;
|
|
91
105
|
return [min, max];
|
|
92
106
|
}
|
|
93
|
-
|
|
94
|
-
// ─────────────────────────────────────────────────────────────────
|
|
95
|
-
// 预编译过滤上下文:将 filters 一次性解析为高效的 Set / Range,
|
|
96
|
-
// 供 matchOrder、matchBooking 复用,避免重复计算
|
|
97
|
-
// ─────────────────────────────────────────────────────────────────
|
|
98
|
-
|
|
99
|
-
/** 预约列表搜索兼容前端通用 `keyword` 与后端协议 `keywords` 两种字段 */
|
|
100
107
|
function resolveBookingKeyword(f) {
|
|
101
108
|
const keyword = f.keyword ?? f.keywords;
|
|
102
|
-
return typeof keyword ===
|
|
109
|
+
return typeof keyword === "string" ? keyword.trim() : "";
|
|
103
110
|
}
|
|
104
111
|
function prepareFilters(f) {
|
|
105
|
-
|
|
112
|
+
var _a, _b, _c, _d, _e, _f;
|
|
113
|
+
const hasCustomerId = f.customer_id !== void 0 && f.customer_id !== null;
|
|
106
114
|
const keyword = resolveBookingKeyword(f);
|
|
107
115
|
return {
|
|
108
|
-
orderPaymentStatusSet: f.order_payment_status
|
|
109
|
-
orderStatusSet: f.order_status
|
|
110
|
-
orderSalesChannelSet: f.order_sales_channel
|
|
111
|
-
paymentMethodSet: f.payment_method
|
|
112
|
-
appointmentStatusSet: f.appointment_status
|
|
113
|
-
formRecordIdSet: f.form_record_ids
|
|
116
|
+
orderPaymentStatusSet: ((_a = f.order_payment_status) == null ? void 0 : _a.length) ? new Set(f.order_payment_status) : null,
|
|
117
|
+
orderStatusSet: ((_b = f.order_status) == null ? void 0 : _b.length) ? new Set(f.order_status) : null,
|
|
118
|
+
orderSalesChannelSet: ((_c = f.order_sales_channel) == null ? void 0 : _c.length) ? new Set(f.order_sales_channel) : null,
|
|
119
|
+
paymentMethodSet: ((_d = f.payment_method) == null ? void 0 : _d.length) ? new Set(f.payment_method) : null,
|
|
120
|
+
appointmentStatusSet: ((_e = f.appointment_status) == null ? void 0 : _e.length) ? new Set(f.appointment_status) : null,
|
|
121
|
+
formRecordIdSet: ((_f = f.form_record_ids) == null ? void 0 : _f.length) ? new Set(f.form_record_ids) : null,
|
|
114
122
|
hasCustomerId,
|
|
115
|
-
customerIdStr: hasCustomerId ? String(f.customer_id) :
|
|
123
|
+
customerIdStr: hasCustomerId ? String(f.customer_id) : "",
|
|
116
124
|
hasBusinessCode: !!f.business_code,
|
|
117
125
|
businessCode: f.business_code,
|
|
118
126
|
bookingTimeRange: parseDateRange(f.sales_time_between),
|
|
@@ -120,30 +128,33 @@ function prepareFilters(f) {
|
|
|
120
128
|
updatedAtRange: parseDateRange(f.updated_at_between),
|
|
121
129
|
numberRange: parseNumberRange(f.number_between),
|
|
122
130
|
totalAmountRange: Array.isArray(f.total_amount_between) && f.total_amount_between.length === 2 ? f.total_amount_between : null,
|
|
123
|
-
keywordLower: keyword ? keyword.toLowerCase() :
|
|
131
|
+
keywordLower: keyword ? keyword.toLowerCase() : "",
|
|
124
132
|
afterExecutionTimeMs: (() => {
|
|
125
133
|
const raw = f.after_execution_time;
|
|
126
|
-
if (raw ===
|
|
134
|
+
if (raw === void 0 || raw === null || raw === "")
|
|
135
|
+
return null;
|
|
127
136
|
const ms = toTimestamp(raw);
|
|
128
137
|
return Number.isFinite(ms) ? ms : null;
|
|
129
138
|
})(),
|
|
130
139
|
enableChildBookingFilter: f.child_booking === 1
|
|
131
140
|
};
|
|
132
141
|
}
|
|
133
|
-
|
|
134
|
-
// ─────────────────────────────────────────────────────────────────
|
|
135
|
-
// 订单级匹配:不通过则整个 order 下所有 bookings 跳过
|
|
136
|
-
// ─────────────────────────────────────────────────────────────────
|
|
137
|
-
|
|
138
142
|
function matchOrder(order, ctx) {
|
|
139
|
-
|
|
140
|
-
if (ctx.
|
|
141
|
-
|
|
142
|
-
if (ctx.
|
|
143
|
-
|
|
143
|
+
var _a;
|
|
144
|
+
if (ctx.hasBusinessCode && order.business_code !== ctx.businessCode)
|
|
145
|
+
return false;
|
|
146
|
+
if (ctx.hasCustomerId && String(order.customer_id) !== ctx.customerIdStr)
|
|
147
|
+
return false;
|
|
148
|
+
if (ctx.orderPaymentStatusSet && !ctx.orderPaymentStatusSet.has(order.payment_status))
|
|
149
|
+
return false;
|
|
150
|
+
if (ctx.orderStatusSet && !ctx.orderStatusSet.has(order.status))
|
|
151
|
+
return false;
|
|
152
|
+
if (ctx.orderSalesChannelSet && !ctx.orderSalesChannelSet.has(order.order_sales_channel))
|
|
153
|
+
return false;
|
|
144
154
|
if (ctx.paymentMethodSet) {
|
|
145
155
|
const pm = order.payments;
|
|
146
|
-
if (!Array.isArray(pm) || pm.length === 0)
|
|
156
|
+
if (!Array.isArray(pm) || pm.length === 0)
|
|
157
|
+
return false;
|
|
147
158
|
let matched = false;
|
|
148
159
|
for (let k = 0; k < pm.length; k++) {
|
|
149
160
|
if (ctx.paymentMethodSet.has(pm[k].code)) {
|
|
@@ -151,109 +162,113 @@ function matchOrder(order, ctx) {
|
|
|
151
162
|
break;
|
|
152
163
|
}
|
|
153
164
|
}
|
|
154
|
-
if (!matched)
|
|
165
|
+
if (!matched)
|
|
166
|
+
return false;
|
|
155
167
|
}
|
|
156
168
|
if (ctx.createdAtRange) {
|
|
157
169
|
const ts = toTimestamp(order.created_at);
|
|
158
|
-
if (ts < ctx.createdAtRange[0] || ts > ctx.createdAtRange[1])
|
|
170
|
+
if (ts < ctx.createdAtRange[0] || ts > ctx.createdAtRange[1])
|
|
171
|
+
return false;
|
|
159
172
|
}
|
|
160
173
|
if (ctx.updatedAtRange) {
|
|
161
174
|
const ts = toTimestamp(order.updated_at);
|
|
162
|
-
if (ts < ctx.updatedAtRange[0] || ts > ctx.updatedAtRange[1])
|
|
175
|
+
if (ts < ctx.updatedAtRange[0] || ts > ctx.updatedAtRange[1])
|
|
176
|
+
return false;
|
|
163
177
|
}
|
|
164
178
|
if (ctx.totalAmountRange) {
|
|
165
|
-
const raw = order.summary
|
|
179
|
+
const raw = ((_a = order.summary) == null ? void 0 : _a.total_amount) ?? order.total_amount;
|
|
166
180
|
const amt = Number(raw);
|
|
167
|
-
if (isNaN(amt))
|
|
168
|
-
|
|
169
|
-
if (ctx.totalAmountRange[
|
|
181
|
+
if (isNaN(amt))
|
|
182
|
+
return false;
|
|
183
|
+
if (ctx.totalAmountRange[0] != null && amt < ctx.totalAmountRange[0])
|
|
184
|
+
return false;
|
|
185
|
+
if (ctx.totalAmountRange[1] != null && amt > ctx.totalAmountRange[1])
|
|
186
|
+
return false;
|
|
170
187
|
}
|
|
171
188
|
return true;
|
|
172
189
|
}
|
|
173
|
-
|
|
174
|
-
// ─────────────────────────────────────────────────────────────────
|
|
175
|
-
// Booking 级匹配:在订单通过之后逐条检查每个 booking
|
|
176
|
-
// orderInfo 用于 keyword 搜索时的 JSON 序列化
|
|
177
|
-
// ─────────────────────────────────────────────────────────────────
|
|
178
|
-
|
|
179
190
|
function matchBooking(booking, orderInfo, ctx) {
|
|
180
191
|
if (ctx.enableChildBookingFilter && booking.booking_id) {
|
|
181
|
-
const parentId = Number(
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
192
|
+
const parentId = Number(
|
|
193
|
+
booking.parent_id ?? 0
|
|
194
|
+
);
|
|
195
|
+
const itemType = String(
|
|
196
|
+
booking.item_type ?? ""
|
|
197
|
+
);
|
|
198
|
+
const isMatched = parentId !== 0 && itemType !== "recurring_booking" || parentId === 0 && itemType === "recurring_booking";
|
|
199
|
+
if (!isMatched)
|
|
200
|
+
return false;
|
|
185
201
|
}
|
|
186
|
-
if (ctx.appointmentStatusSet && !ctx.appointmentStatusSet.has(getBookingAppointmentStatus(booking)))
|
|
202
|
+
if (ctx.appointmentStatusSet && !ctx.appointmentStatusSet.has(getBookingAppointmentStatus(booking)))
|
|
203
|
+
return false;
|
|
187
204
|
if (ctx.bookingTimeRange) {
|
|
188
205
|
const bookingRange = resolveBookingTimeRange(booking);
|
|
189
|
-
if (!bookingRange || !isRangeOverlapping(bookingRange, ctx.bookingTimeRange))
|
|
206
|
+
if (!bookingRange || !isRangeOverlapping(bookingRange, ctx.bookingTimeRange))
|
|
207
|
+
return false;
|
|
190
208
|
}
|
|
191
209
|
if (ctx.afterExecutionTimeMs != null) {
|
|
192
210
|
const bookingStartMs = toTimestamp(bookingDateTimeString(booking.start_date, booking.start_time));
|
|
193
|
-
if (!Number.isFinite(bookingStartMs) || bookingStartMs < ctx.afterExecutionTimeMs)
|
|
211
|
+
if (!Number.isFinite(bookingStartMs) || bookingStartMs < ctx.afterExecutionTimeMs)
|
|
212
|
+
return false;
|
|
194
213
|
}
|
|
195
214
|
if (ctx.numberRange) {
|
|
196
215
|
const num = Number(booking.number);
|
|
197
|
-
if (isNaN(num) || num < ctx.numberRange[0] || num > ctx.numberRange[1])
|
|
216
|
+
if (isNaN(num) || num < ctx.numberRange[0] || num > ctx.numberRange[1])
|
|
217
|
+
return false;
|
|
198
218
|
}
|
|
199
219
|
if (ctx.formRecordIdSet) {
|
|
200
220
|
let formMatched = false;
|
|
201
221
|
const resources = booking.resources;
|
|
202
222
|
if (Array.isArray(resources)) {
|
|
203
223
|
for (let r = 0; r < resources.length; r++) {
|
|
204
|
-
if (resources[r].relation_type ===
|
|
224
|
+
if (resources[r].relation_type === "form" && ctx.formRecordIdSet.has(resources[r].relation_id)) {
|
|
205
225
|
formMatched = true;
|
|
206
226
|
break;
|
|
207
227
|
}
|
|
208
228
|
}
|
|
209
229
|
}
|
|
210
|
-
if (!formMatched && booking.relation_type ===
|
|
230
|
+
if (!formMatched && booking.relation_type === "form" && booking.relation_id && booking.relation_id > 0) {
|
|
211
231
|
formMatched = ctx.formRecordIdSet.has(booking.relation_id);
|
|
212
232
|
}
|
|
213
|
-
if (!formMatched)
|
|
233
|
+
if (!formMatched)
|
|
234
|
+
return false;
|
|
214
235
|
}
|
|
215
236
|
if (ctx.keywordLower) {
|
|
216
|
-
const target = orderInfo ? {
|
|
217
|
-
...booking,
|
|
218
|
-
order: orderInfo
|
|
219
|
-
} : booking;
|
|
237
|
+
const target = orderInfo ? { ...booking, order: orderInfo } : booking;
|
|
220
238
|
const str = JSON.stringify(target).toLowerCase();
|
|
221
|
-
if (!str.includes(ctx.keywordLower))
|
|
239
|
+
if (!str.includes(ctx.keywordLower))
|
|
240
|
+
return false;
|
|
222
241
|
}
|
|
223
242
|
return true;
|
|
224
243
|
}
|
|
225
|
-
|
|
226
|
-
// ─────────────────────────────────────────────────────────────────
|
|
227
|
-
// 当前预约归属商品:先按 schedule_event_id 命中,再按 relation_items.resource_id 追加(去重保序)
|
|
228
|
-
// ─────────────────────────────────────────────────────────────────
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* 从整单 `order.products` 中归集属于指定 `booking` 的明细行。
|
|
232
|
-
* - 第一遍:`product.schedule_event_id === booking.schedule_event_id`(保持 products 原顺序)
|
|
233
|
-
* - 第二遍:按 `relation_items` 顺序追加 `resource_id` 与 `order_detail_id` 匹配且尚未收录的行
|
|
234
|
-
*/
|
|
235
244
|
function productsForBooking(order, booking) {
|
|
245
|
+
var _a;
|
|
236
246
|
const products = order.products;
|
|
237
|
-
if (!Array.isArray(products) || products.length === 0)
|
|
247
|
+
if (!Array.isArray(products) || products.length === 0)
|
|
248
|
+
return [];
|
|
238
249
|
const bookingEventId = booking.schedule_event_id;
|
|
239
|
-
const byDetailId = new Map();
|
|
250
|
+
const byDetailId = /* @__PURE__ */ new Map();
|
|
240
251
|
for (let i = 0, len = products.length; i < len; i++) {
|
|
241
252
|
const p = products[i];
|
|
242
253
|
const oid = p.order_detail_id;
|
|
243
|
-
if (oid ===
|
|
254
|
+
if (oid === void 0 || oid === null)
|
|
255
|
+
continue;
|
|
244
256
|
const detailId = Number(oid);
|
|
245
|
-
if (Number.isNaN(detailId))
|
|
257
|
+
if (Number.isNaN(detailId))
|
|
258
|
+
continue;
|
|
246
259
|
byDetailId.set(detailId, p);
|
|
247
260
|
}
|
|
248
|
-
const seen = new Set();
|
|
261
|
+
const seen = /* @__PURE__ */ new Set();
|
|
249
262
|
const out = [];
|
|
250
263
|
for (let i = 0, len = products.length; i < len; i++) {
|
|
251
264
|
const p = products[i];
|
|
252
265
|
const oid = p.order_detail_id;
|
|
253
|
-
if (oid ===
|
|
266
|
+
if (oid === void 0 || oid === null)
|
|
267
|
+
continue;
|
|
254
268
|
const detailId = Number(oid);
|
|
255
|
-
if (Number.isNaN(detailId))
|
|
256
|
-
|
|
269
|
+
if (Number.isNaN(detailId))
|
|
270
|
+
continue;
|
|
271
|
+
if (bookingEventId !== void 0 && bookingEventId !== null && p.schedule_event_id !== void 0 && p.schedule_event_id !== null && Number(p.schedule_event_id) === Number(bookingEventId)) {
|
|
257
272
|
if (!seen.has(detailId)) {
|
|
258
273
|
seen.add(detailId);
|
|
259
274
|
out.push(p);
|
|
@@ -263,10 +278,12 @@ function productsForBooking(order, booking) {
|
|
|
263
278
|
const relationItems = booking.relation_items;
|
|
264
279
|
if (Array.isArray(relationItems) && relationItems.length > 0) {
|
|
265
280
|
for (let r = 0, rLen = relationItems.length; r < rLen; r++) {
|
|
266
|
-
const rid = relationItems[r]
|
|
267
|
-
if (rid ===
|
|
281
|
+
const rid = (_a = relationItems[r]) == null ? void 0 : _a.resource_id;
|
|
282
|
+
if (rid === void 0 || rid === null)
|
|
283
|
+
continue;
|
|
268
284
|
const detailId = Number(rid);
|
|
269
|
-
if (Number.isNaN(detailId) || seen.has(detailId))
|
|
285
|
+
if (Number.isNaN(detailId) || seen.has(detailId))
|
|
286
|
+
continue;
|
|
270
287
|
const line = byDetailId.get(detailId);
|
|
271
288
|
if (line) {
|
|
272
289
|
seen.add(detailId);
|
|
@@ -276,22 +293,16 @@ function productsForBooking(order, booking) {
|
|
|
276
293
|
}
|
|
277
294
|
return out;
|
|
278
295
|
}
|
|
279
|
-
|
|
280
|
-
// ─────────────────────────────────────────────────────────────────
|
|
281
|
-
// 转换:OrderData[] → BookingData[](独立导出,供其他场景使用)
|
|
282
|
-
// ─────────────────────────────────────────────────────────────────
|
|
283
|
-
|
|
284
296
|
function flattenOrdersToBookings(orders) {
|
|
285
|
-
if (!orders || !Array.isArray(orders))
|
|
297
|
+
if (!orders || !Array.isArray(orders))
|
|
298
|
+
return [];
|
|
286
299
|
const result = [];
|
|
287
300
|
for (let i = 0, len = orders.length; i < len; i++) {
|
|
288
301
|
const order = orders[i];
|
|
289
302
|
const bookings = order.bookings;
|
|
290
|
-
if (!Array.isArray(bookings) || bookings.length === 0)
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
...orderInfo
|
|
294
|
-
} = order;
|
|
303
|
+
if (!Array.isArray(bookings) || bookings.length === 0)
|
|
304
|
+
continue;
|
|
305
|
+
const { bookings: _omit, ...orderInfo } = order;
|
|
295
306
|
for (let j = 0, bLen = bookings.length; j < bLen; j++) {
|
|
296
307
|
const booking = bookings[j];
|
|
297
308
|
result.push({
|
|
@@ -303,25 +314,10 @@ function flattenOrdersToBookings(orders) {
|
|
|
303
314
|
}
|
|
304
315
|
return result;
|
|
305
316
|
}
|
|
306
|
-
|
|
307
|
-
// ─────────────────────────────────────────────────────────────────
|
|
308
|
-
// 核心:单遍扫描 — 展开 + 过滤 + 分页
|
|
309
|
-
//
|
|
310
|
-
// 性能策略:
|
|
311
|
-
// 1. 订单级条件在外层循环 matchOrder 预判,不匹配则整组 bookings 跳过
|
|
312
|
-
// 2. orderInfo 延迟到有命中 booking 时才创建,同一 order 只创建一次
|
|
313
|
-
// 3. 只对最终命中的 booking 做 object spread
|
|
314
|
-
// ─────────────────────────────────────────────────────────────────
|
|
315
|
-
|
|
316
317
|
function filterBookingsFromOrders(orders, filters) {
|
|
317
318
|
const f = filters || {};
|
|
318
319
|
if (!orders || !Array.isArray(orders)) {
|
|
319
|
-
return {
|
|
320
|
-
list: [],
|
|
321
|
-
count: 0,
|
|
322
|
-
size: 0,
|
|
323
|
-
skip: 0
|
|
324
|
-
};
|
|
320
|
+
return { list: [], count: 0, size: 0, skip: 0 };
|
|
325
321
|
}
|
|
326
322
|
const size = f.num || 20;
|
|
327
323
|
const page = f.skip || 1;
|
|
@@ -332,33 +328,22 @@ function filterBookingsFromOrders(orders, filters) {
|
|
|
332
328
|
for (let i = 0, oLen = orders.length; i < oLen; i++) {
|
|
333
329
|
const order = orders[i];
|
|
334
330
|
const bookings = order.bookings;
|
|
335
|
-
if (!Array.isArray(bookings) || bookings.length === 0)
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
// 订单通过,遍历其 bookings;orderInfo 延迟创建
|
|
331
|
+
if (!Array.isArray(bookings) || bookings.length === 0)
|
|
332
|
+
continue;
|
|
333
|
+
if (!matchOrder(order, ctx))
|
|
334
|
+
continue;
|
|
341
335
|
let orderInfo = null;
|
|
342
336
|
for (let j = 0, bLen = bookings.length; j < bLen; j++) {
|
|
343
337
|
const booking = bookings[j];
|
|
344
|
-
|
|
345
|
-
// keyword 匹配需要 orderInfo,提前创建
|
|
346
338
|
if (ctx.keywordLower && !orderInfo) {
|
|
347
|
-
const {
|
|
348
|
-
bookings: _omit,
|
|
349
|
-
...rest
|
|
350
|
-
} = order;
|
|
339
|
+
const { bookings: _omit, ...rest } = order;
|
|
351
340
|
orderInfo = rest;
|
|
352
341
|
}
|
|
353
|
-
if (!matchBooking(booking, orderInfo, ctx))
|
|
354
|
-
|
|
355
|
-
// 命中:收集到分页窗口内
|
|
342
|
+
if (!matchBooking(booking, orderInfo, ctx))
|
|
343
|
+
continue;
|
|
356
344
|
if (totalCount >= startIndex && paginatedList.length < size) {
|
|
357
345
|
if (!orderInfo) {
|
|
358
|
-
const {
|
|
359
|
-
bookings: _omit,
|
|
360
|
-
...rest
|
|
361
|
-
} = order;
|
|
346
|
+
const { bookings: _omit, ...rest } = order;
|
|
362
347
|
orderInfo = rest;
|
|
363
348
|
}
|
|
364
349
|
paginatedList.push({
|
|
@@ -377,32 +362,28 @@ function filterBookingsFromOrders(orders, filters) {
|
|
|
377
362
|
skip: page
|
|
378
363
|
};
|
|
379
364
|
}
|
|
380
|
-
|
|
381
|
-
// ─────────────────────────────────────────────────────────────────
|
|
382
|
-
// 排序预约列表
|
|
383
|
-
// order_by 格式:"field:direction",如 "start_at:desc"
|
|
384
|
-
// 不带方向后缀则不排序
|
|
385
|
-
// ─────────────────────────────────────────────────────────────────
|
|
386
|
-
|
|
387
365
|
function sortBookings(result, filters) {
|
|
388
366
|
const f = filters || {};
|
|
389
367
|
const orderBy = f.order_by;
|
|
390
|
-
if (!orderBy)
|
|
391
|
-
|
|
392
|
-
|
|
368
|
+
if (!orderBy)
|
|
369
|
+
return result;
|
|
370
|
+
const separatorIdx = orderBy.lastIndexOf(":");
|
|
371
|
+
if (separatorIdx === -1)
|
|
372
|
+
return result;
|
|
393
373
|
const field = orderBy.slice(0, separatorIdx);
|
|
394
374
|
const direction = orderBy.slice(separatorIdx + 1);
|
|
395
|
-
if (direction !==
|
|
396
|
-
|
|
397
|
-
const
|
|
375
|
+
if (direction !== "asc" && direction !== "desc")
|
|
376
|
+
return result;
|
|
377
|
+
const multiplier = direction === "asc" ? 1 : -1;
|
|
378
|
+
const getTimestamp = (booking) => {
|
|
398
379
|
switch (field) {
|
|
399
|
-
case
|
|
380
|
+
case "start_at":
|
|
400
381
|
return toTimestamp(bookingDateTimeString(booking.start_date, booking.start_time));
|
|
401
|
-
case
|
|
382
|
+
case "end_at":
|
|
402
383
|
return toTimestamp(bookingDateTimeString(booking.end_date, booking.end_time));
|
|
403
|
-
case
|
|
384
|
+
case "created_at":
|
|
404
385
|
return toTimestamp(booking.order.created_at);
|
|
405
|
-
case
|
|
386
|
+
case "updated_at":
|
|
406
387
|
return toTimestamp(booking.order.updated_at);
|
|
407
388
|
default:
|
|
408
389
|
return 0;
|
|
@@ -411,26 +392,12 @@ function sortBookings(result, filters) {
|
|
|
411
392
|
const sorted = result.list.slice().sort((a, b) => {
|
|
412
393
|
return (getTimestamp(a) - getTimestamp(b)) * multiplier;
|
|
413
394
|
});
|
|
414
|
-
return {
|
|
415
|
-
...result,
|
|
416
|
-
list: sorted
|
|
417
|
-
};
|
|
395
|
+
return { ...result, list: sorted };
|
|
418
396
|
}
|
|
419
|
-
|
|
420
|
-
// ─────────────────────────────────────────────────────────────────
|
|
421
|
-
// 兼容独立调用:对已展开的 BookingData[] 做筛选
|
|
422
|
-
// 复用 matchOrder + matchBooking,仅负责迭代与分页
|
|
423
|
-
// ─────────────────────────────────────────────────────────────────
|
|
424
|
-
|
|
425
397
|
function filterBookings(bookings, filters) {
|
|
426
398
|
const f = filters || {};
|
|
427
399
|
if (!bookings || !Array.isArray(bookings)) {
|
|
428
|
-
return {
|
|
429
|
-
list: [],
|
|
430
|
-
count: 0,
|
|
431
|
-
size: 0,
|
|
432
|
-
skip: 0
|
|
433
|
-
};
|
|
400
|
+
return { list: [], count: 0, size: 0, skip: 0 };
|
|
434
401
|
}
|
|
435
402
|
const size = f.num || 20;
|
|
436
403
|
const page = f.skip || 1;
|
|
@@ -441,10 +408,10 @@ function filterBookings(bookings, filters) {
|
|
|
441
408
|
for (let i = 0, len = bookings.length; i < len; i++) {
|
|
442
409
|
const booking = bookings[i];
|
|
443
410
|
const order = booking.order;
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
if (!
|
|
447
|
-
|
|
411
|
+
if (!matchOrder(order, ctx))
|
|
412
|
+
continue;
|
|
413
|
+
if (!matchBooking(booking, order, ctx))
|
|
414
|
+
continue;
|
|
448
415
|
if (totalCount >= startIndex && paginatedList.length < size) {
|
|
449
416
|
paginatedList.push({
|
|
450
417
|
...booking,
|
|
@@ -459,4 +426,12 @@ function filterBookings(bookings, filters) {
|
|
|
459
426
|
size,
|
|
460
427
|
skip: page
|
|
461
428
|
};
|
|
462
|
-
}
|
|
429
|
+
}
|
|
430
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
431
|
+
0 && (module.exports = {
|
|
432
|
+
filterBookings,
|
|
433
|
+
filterBookingsFromOrders,
|
|
434
|
+
flattenOrdersToBookings,
|
|
435
|
+
productsForBooking,
|
|
436
|
+
sortBookings
|
|
437
|
+
});
|