@pisell/pisellos 0.0.567 → 0.0.568
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 -9
- package/dist/model/strategy/adapter/walletPass/evaluator.js +0 -2
- package/dist/model/strategy/adapter/walletPass/example.js +3 -26
- package/dist/model/strategy/adapter/walletPass/utils.js +0 -3
- 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 +1 -4
- package/dist/modules/OpenData/index.js +0 -2
- package/dist/modules/Order/index.d.ts +1 -1
- package/dist/modules/Order/index.js +14 -41
- package/dist/modules/Payment/index.js +142 -270
- package/dist/modules/Payment/walletpass.js +4 -5
- package/dist/modules/Rules/index.js +0 -7
- 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 +88 -121
- package/dist/server/modules/menu/index.js +32 -41
- package/dist/server/modules/products/index.js +29 -49
- 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 +32 -40
- package/dist/server/utils/product.js +0 -1
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- 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.d.ts +1 -1
- package/dist/solution/BookingTicket/index.js +5 -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 -246
- 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.d.ts +5 -0
- package/dist/solution/VenueBooking/index.js +364 -327
- 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 +130 -131
- package/lib/effects/index.js +46 -57
- package/lib/index.js +92 -53
- 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 +84 -63
- package/lib/model/strategy/adapter/promotion/evaluator.js +381 -231
- package/lib/model/strategy/adapter/promotion/examples.js +139 -159
- package/lib/model/strategy/adapter/promotion/index.js +1 -49
- package/lib/model/strategy/adapter/promotion/type.js +199 -35
- package/lib/model/strategy/adapter/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -152
- 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 +652 -402
- 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 +22 -45
- 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 +306 -241
- package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
- package/lib/modules/Cart/utils/cartResource.js +72 -78
- package/lib/modules/Cart/utils/changePrice.js +26 -62
- package/lib/modules/Cart/utils/index.js +106 -48
- package/lib/modules/Customer/constants.js +13 -34
- package/lib/modules/Customer/index.js +216 -153
- 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 +117 -113
- 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 +63 -74
- 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 +332 -320
- package/lib/modules/Order/types.js +24 -33
- package/lib/modules/Order/utils.js +350 -284
- 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 +566 -432
- package/lib/modules/Payment/mx51.js +1 -0
- package/lib/modules/Payment/types.js +216 -107
- package/lib/modules/Payment/utils.js +50 -47
- package/lib/modules/Payment/walletpass.js +221 -203
- 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 +111 -110
- package/lib/modules/ProductList/types.js +9 -31
- package/lib/modules/Quotation/index.js +60 -82
- 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/Rules/index.js +1172 -872
- package/lib/modules/Rules/types.js +17 -40
- package/lib/modules/SalesSummary/index.js +59 -68
- package/lib/modules/SalesSummary/types.js +4 -16
- package/lib/modules/SalesSummary/utils.js +176 -193
- 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 -167
- package/lib/modules/Schedule/index.js +97 -107
- 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 -70
- package/lib/modules/Summary/types.js +4 -16
- package/lib/modules/Summary/utils.js +782 -429
- package/lib/modules/index.js +212 -57
- 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 +882 -623
- package/lib/server/modules/index.js +85 -59
- package/lib/server/modules/menu/index.js +146 -122
- package/lib/server/modules/menu/types.js +18 -31
- package/lib/server/modules/order/index.js +195 -231
- package/lib/server/modules/order/types.js +107 -32
- package/lib/server/modules/order/utils/filterBookings.js +174 -140
- package/lib/server/modules/order/utils/filterOrders.js +89 -60
- package/lib/server/modules/products/index.js +430 -335
- package/lib/server/modules/products/types.js +41 -34
- package/lib/server/modules/quotation/index.js +76 -77
- package/lib/server/modules/quotation/types.js +21 -31
- package/lib/server/modules/resource/index.js +216 -187
- package/lib/server/modules/resource/types.js +42 -33
- package/lib/server/modules/schedule/index.js +134 -119
- 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/time.js +40 -49
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingByStep/index.js +1530 -1343
- 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.d.ts +1 -1
- package/lib/solution/BookingTicket/index.js +147 -122
- package/lib/solution/BookingTicket/types.js +38 -64
- package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +64 -80
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +82 -80
- package/lib/solution/BookingTicket/utils/scan/index.js +90 -94
- package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
- 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 +227 -158
- 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 +218 -200
- package/lib/solution/Sales/types.js +27 -33
- package/lib/solution/ScanOrder/index.js +803 -840
- package/lib/solution/ScanOrder/types.js +34 -34
- package/lib/solution/ScanOrder/utils.js +372 -331
- package/lib/solution/ShopDiscount/index.js +230 -236
- package/lib/solution/ShopDiscount/types.js +15 -37
- package/lib/solution/ShopDiscount/utils.js +309 -172
- package/lib/solution/VenueBooking/index.d.ts +5 -0
- package/lib/solution/VenueBooking/index.js +886 -929
- package/lib/solution/VenueBooking/types.js +20 -40
- package/lib/solution/VenueBooking/utils/dateSummary.js +22 -54
- package/lib/solution/VenueBooking/utils/resource.js +31 -54
- package/lib/solution/VenueBooking/utils/slotMerge.js +88 -106
- package/lib/solution/VenueBooking/utils/smartPricing.js +112 -100
- package/lib/solution/VenueBooking/utils/timeSlot.js +133 -132
- package/lib/solution/VenueBooking/utils.js +130 -67
- package/lib/solution/index.js +102 -37
- package/lib/store/createStore.js +32 -29
- package/lib/types/index.js +4 -16
- package/lib/utils/task.js +36 -36
- package/lib/utils/watch.js +81 -47
- package/package.json +2 -1
|
@@ -1,67 +1,44 @@
|
|
|
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(timeSlot_exports, {
|
|
32
|
-
buildTimeSlotGrid: () => buildTimeSlotGrid,
|
|
33
|
-
collectEventsForDate: () => collectEventsForDate,
|
|
34
|
-
computeSlotStatus: () => computeSlotStatus,
|
|
35
|
-
generateTimeLabels: () => generateTimeLabels,
|
|
36
|
-
isBusinessHoursCrossDay: () => isBusinessHoursCrossDay,
|
|
37
|
-
isSlotOccupied: () => isSlotOccupied
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
38
5
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
6
|
+
exports.buildTimeSlotGrid = buildTimeSlotGrid;
|
|
7
|
+
exports.collectEventsForDate = collectEventsForDate;
|
|
8
|
+
exports.computeSlotStatus = computeSlotStatus;
|
|
9
|
+
exports.generateTimeLabels = generateTimeLabels;
|
|
10
|
+
exports.isBusinessHoursCrossDay = isBusinessHoursCrossDay;
|
|
11
|
+
exports.isSlotOccupied = isSlotOccupied;
|
|
12
|
+
var _dayjs = _interopRequireDefault(require("dayjs"));
|
|
13
|
+
var _decimal = _interopRequireDefault(require("decimal.js"));
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
42
15
|
function isBusinessHoursCrossDay(config) {
|
|
43
|
-
const [startH, startM] = config.businessStartTime.split(
|
|
44
|
-
const [endH, endM] = config.businessEndTime.split(
|
|
16
|
+
const [startH, startM] = config.businessStartTime.split(':').map(Number);
|
|
17
|
+
const [endH, endM] = config.businessEndTime.split(':').map(Number);
|
|
45
18
|
return endH < startH || endH === startH && endM <= startM;
|
|
46
19
|
}
|
|
47
20
|
function generateTimeLabels(config) {
|
|
48
|
-
const {
|
|
21
|
+
const {
|
|
22
|
+
slotDurationMinutes,
|
|
23
|
+
businessStartTime,
|
|
24
|
+
businessEndTime
|
|
25
|
+
} = config;
|
|
49
26
|
const labels = [];
|
|
50
|
-
const baseDate =
|
|
51
|
-
let cursor = (0,
|
|
27
|
+
const baseDate = '2000-01-01';
|
|
28
|
+
let cursor = (0, _dayjs.default)(`${baseDate} ${businessStartTime}`);
|
|
52
29
|
const crossDay = isBusinessHoursCrossDay(config);
|
|
53
|
-
const endBase = crossDay ?
|
|
54
|
-
const end = (0,
|
|
30
|
+
const endBase = crossDay ? '2000-01-02' : baseDate;
|
|
31
|
+
const end = (0, _dayjs.default)(`${endBase} ${businessEndTime}`);
|
|
55
32
|
while (cursor.isBefore(end)) {
|
|
56
|
-
labels.push(cursor.format(
|
|
57
|
-
cursor = cursor.add(slotDurationMinutes,
|
|
33
|
+
labels.push(cursor.format('HH:mm'));
|
|
34
|
+
cursor = cursor.add(slotDurationMinutes, 'minute');
|
|
58
35
|
}
|
|
59
36
|
return labels;
|
|
60
37
|
}
|
|
61
38
|
function isSlotOccupied(slotStart, slotEnd, occupiedTimes) {
|
|
62
39
|
for (const occupied of occupiedTimes) {
|
|
63
|
-
const occStart = (0,
|
|
64
|
-
const occEnd = (0,
|
|
40
|
+
const occStart = (0, _dayjs.default)(occupied.start_at);
|
|
41
|
+
const occEnd = (0, _dayjs.default)(occupied.end_at);
|
|
65
42
|
if (slotStart.isBefore(occEnd) && slotEnd.isAfter(occStart)) {
|
|
66
43
|
return true;
|
|
67
44
|
}
|
|
@@ -70,20 +47,19 @@ function isSlotOccupied(slotStart, slotEnd, occupiedTimes) {
|
|
|
70
47
|
}
|
|
71
48
|
function isSlotWithinResourceTimes(slotStart, slotEnd, resourceTimes) {
|
|
72
49
|
for (const t of resourceTimes) {
|
|
73
|
-
const tStart = (0,
|
|
74
|
-
const tEnd = (0,
|
|
75
|
-
if (slotStart.isBefore(tEnd) && slotEnd.isAfter(tStart))
|
|
76
|
-
return true;
|
|
50
|
+
const tStart = (0, _dayjs.default)(t.start_at);
|
|
51
|
+
const tEnd = (0, _dayjs.default)(t.end_at);
|
|
52
|
+
if (slotStart.isBefore(tEnd) && slotEnd.isAfter(tStart)) return true;
|
|
77
53
|
}
|
|
78
54
|
return false;
|
|
79
55
|
}
|
|
80
56
|
function getResourceTimesForDate(resource, date, config) {
|
|
81
57
|
const crossDay = isBusinessHoursCrossDay(config);
|
|
82
|
-
const dayStart = (0,
|
|
83
|
-
const dayEnd = crossDay ? (0,
|
|
84
|
-
return resource.times.filter(
|
|
85
|
-
const tStart = (0,
|
|
86
|
-
const tEnd = (0,
|
|
58
|
+
const dayStart = (0, _dayjs.default)(`${date} ${config.businessStartTime}`);
|
|
59
|
+
const dayEnd = crossDay ? (0, _dayjs.default)(`${date} ${config.businessEndTime}`).add(1, 'day') : (0, _dayjs.default)(`${date} ${config.businessEndTime}`);
|
|
60
|
+
return resource.times.filter(t => {
|
|
61
|
+
const tStart = (0, _dayjs.default)(t.start_at);
|
|
62
|
+
const tEnd = (0, _dayjs.default)(t.end_at);
|
|
87
63
|
return tStart.isBefore(dayEnd) && tEnd.isAfter(dayStart);
|
|
88
64
|
});
|
|
89
65
|
}
|
|
@@ -104,25 +80,50 @@ function collectEventsForDate(resource, date, config) {
|
|
|
104
80
|
return events;
|
|
105
81
|
}
|
|
106
82
|
function computeSlotStatus(params) {
|
|
107
|
-
const {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
83
|
+
const {
|
|
84
|
+
slotStart,
|
|
85
|
+
slotEnd,
|
|
86
|
+
events,
|
|
87
|
+
resourceType,
|
|
88
|
+
capacity
|
|
89
|
+
} = params;
|
|
90
|
+
const overlapping = events.filter(evt => {
|
|
91
|
+
const evtStart = (0, _dayjs.default)(evt.start_at);
|
|
92
|
+
const evtEnd = (0, _dayjs.default)(evt.end_at);
|
|
111
93
|
return slotStart.isBefore(evtEnd) && slotEnd.isAfter(evtStart);
|
|
112
94
|
});
|
|
113
|
-
if (resourceType ===
|
|
114
|
-
if (overlapping.length > 0)
|
|
115
|
-
|
|
116
|
-
|
|
95
|
+
if (resourceType === 'single') {
|
|
96
|
+
if (overlapping.length > 0) return {
|
|
97
|
+
status: 'occupied',
|
|
98
|
+
remainingCapacity: 0
|
|
99
|
+
};
|
|
100
|
+
return {
|
|
101
|
+
status: 'available',
|
|
102
|
+
remainingCapacity: 1
|
|
103
|
+
};
|
|
117
104
|
}
|
|
118
105
|
const usedCapacity = overlapping.reduce((sum, evt) => sum + evt.pax, 0);
|
|
119
106
|
const remaining = Math.max(0, capacity - usedCapacity);
|
|
120
|
-
if (remaining <= 0)
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
107
|
+
if (remaining <= 0) return {
|
|
108
|
+
status: 'occupied',
|
|
109
|
+
remainingCapacity: 0
|
|
110
|
+
};
|
|
111
|
+
if (remaining < capacity) return {
|
|
112
|
+
status: 'partially_occupied',
|
|
113
|
+
remainingCapacity: remaining
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
status: 'available',
|
|
117
|
+
remainingCapacity: remaining
|
|
118
|
+
};
|
|
125
119
|
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* 合并多个子商品的同一个时段为一个"外层 slot"。
|
|
123
|
+
* - status 取优先级最高的(available > partially_occupied > occupied > unavailable / past)
|
|
124
|
+
* - price 取非空子 slot 中最小的那个
|
|
125
|
+
* - 其它字段使用第一个参考子 slot(外层 slot 不带 productId)
|
|
126
|
+
*/
|
|
126
127
|
function mergeSubSlots(subSlots) {
|
|
127
128
|
const priority = {
|
|
128
129
|
available: 5,
|
|
@@ -133,16 +134,13 @@ function mergeSubSlots(subSlots) {
|
|
|
133
134
|
};
|
|
134
135
|
let best = subSlots[0];
|
|
135
136
|
for (const slot of subSlots) {
|
|
136
|
-
if ((priority[slot.status] ?? 0) > (priority[best.status] ?? 0))
|
|
137
|
-
best = slot;
|
|
137
|
+
if ((priority[slot.status] ?? 0) > (priority[best.status] ?? 0)) best = slot;
|
|
138
138
|
}
|
|
139
139
|
let minPrice = null;
|
|
140
140
|
for (const slot of subSlots) {
|
|
141
|
-
if (slot.price == null)
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
if (!minPrice || decimal.lt(minPrice))
|
|
145
|
-
minPrice = decimal;
|
|
141
|
+
if (slot.price == null) continue;
|
|
142
|
+
const decimal = new _decimal.default(slot.price || '0');
|
|
143
|
+
if (!minPrice || decimal.lt(minPrice)) minPrice = decimal;
|
|
146
144
|
}
|
|
147
145
|
return {
|
|
148
146
|
startTime: best.startTime,
|
|
@@ -176,17 +174,17 @@ function buildProductSlots(params) {
|
|
|
176
174
|
} = params;
|
|
177
175
|
const slots = [];
|
|
178
176
|
for (const label of timeLabels) {
|
|
179
|
-
const [h] = label.split(
|
|
177
|
+
const [h] = label.split(':').map(Number);
|
|
180
178
|
const isNextDay = crossDay && h < config_businessStartHour;
|
|
181
|
-
const slotDate = isNextDay ? (0,
|
|
182
|
-
const slotStart = (0,
|
|
183
|
-
const slotEnd = slotStart.add(config.slotDurationMinutes,
|
|
179
|
+
const slotDate = isNextDay ? (0, _dayjs.default)(date).add(1, 'day').format('YYYY-MM-DD') : date;
|
|
180
|
+
const slotStart = (0, _dayjs.default)(`${slotDate} ${label}`);
|
|
181
|
+
const slotEnd = slotStart.add(config.slotDurationMinutes, 'minute');
|
|
184
182
|
let status;
|
|
185
183
|
let remainingCapacity = null;
|
|
186
184
|
if (slotStart.isBefore(now)) {
|
|
187
|
-
status =
|
|
185
|
+
status = 'past';
|
|
188
186
|
} else if (!isSlotWithinResourceTimes(slotStart, slotEnd, timesForDate)) {
|
|
189
|
-
status =
|
|
187
|
+
status = 'unavailable';
|
|
190
188
|
} else {
|
|
191
189
|
const result = computeSlotStatus({
|
|
192
190
|
slotStart,
|
|
@@ -197,17 +195,17 @@ function buildProductSlots(params) {
|
|
|
197
195
|
});
|
|
198
196
|
status = result.status;
|
|
199
197
|
remainingCapacity = result.remainingCapacity;
|
|
200
|
-
if (status !==
|
|
198
|
+
if (status !== 'occupied' && childRawResources && childRawResources.length) {
|
|
201
199
|
for (let i = 0; i < childRawResources.length; i++) {
|
|
202
200
|
const child = childRawResources[i];
|
|
203
|
-
const childTimes =
|
|
204
|
-
const childEvents =
|
|
201
|
+
const childTimes = childTimesCache?.[i] ?? getResourceTimesForDate(child, date, config);
|
|
202
|
+
const childEvents = childEventsCache?.[i] ?? collectEventsForDate(child, date, config);
|
|
205
203
|
if (!isSlotWithinResourceTimes(slotStart, slotEnd, childTimes)) {
|
|
206
|
-
status =
|
|
204
|
+
status = 'unavailable';
|
|
207
205
|
remainingCapacity = null;
|
|
208
206
|
break;
|
|
209
207
|
}
|
|
210
|
-
const childType = child.type ||
|
|
208
|
+
const childType = child.type || 'single';
|
|
211
209
|
const childResult = computeSlotStatus({
|
|
212
210
|
slotStart,
|
|
213
211
|
slotEnd,
|
|
@@ -215,32 +213,29 @@ function buildProductSlots(params) {
|
|
|
215
213
|
resourceType: childType,
|
|
216
214
|
capacity: child.capacity ?? 1
|
|
217
215
|
});
|
|
218
|
-
if (childResult.status ===
|
|
219
|
-
status =
|
|
216
|
+
if (childResult.status === 'occupied') {
|
|
217
|
+
status = 'occupied';
|
|
220
218
|
remainingCapacity = 0;
|
|
221
219
|
break;
|
|
222
220
|
}
|
|
223
|
-
if (childResult.status ===
|
|
224
|
-
status =
|
|
225
|
-
remainingCapacity = Math.min(
|
|
226
|
-
remainingCapacity ?? childResult.remainingCapacity,
|
|
227
|
-
childResult.remainingCapacity
|
|
228
|
-
);
|
|
221
|
+
if (childResult.status === 'partially_occupied' && status === 'available') {
|
|
222
|
+
status = 'partially_occupied';
|
|
223
|
+
remainingCapacity = Math.min(remainingCapacity ?? childResult.remainingCapacity, childResult.remainingCapacity);
|
|
229
224
|
}
|
|
230
225
|
}
|
|
231
226
|
}
|
|
232
227
|
}
|
|
233
|
-
const isBookable = status ===
|
|
234
|
-
const slotStartStr = slotStart.format(
|
|
228
|
+
const isBookable = status === 'available' || status === 'partially_occupied';
|
|
229
|
+
const slotStartStr = slotStart.format('YYYY-MM-DD HH:mm');
|
|
235
230
|
const resolvedPriceMap = slotPriceMap ?? quotationPriceMap;
|
|
236
231
|
slots.push({
|
|
237
232
|
startTime: slotStartStr,
|
|
238
|
-
endTime: slotEnd.format(
|
|
233
|
+
endTime: slotEnd.format('YYYY-MM-DD HH:mm'),
|
|
239
234
|
status,
|
|
240
|
-
price: isBookable ?
|
|
235
|
+
price: isBookable ? resolvedPriceMap?.get(`${mapping.productId}:${slotStartStr}`) ?? mapping.price : null,
|
|
241
236
|
resourceId: resource.resourceId,
|
|
242
237
|
resourceFormId: resource.formId,
|
|
243
|
-
capacity: status ===
|
|
238
|
+
capacity: status === 'past' || status === 'unavailable' ? null : resCapacity,
|
|
244
239
|
remainingCapacity,
|
|
245
240
|
productId: mapping.productId
|
|
246
241
|
});
|
|
@@ -248,29 +243,34 @@ function buildProductSlots(params) {
|
|
|
248
243
|
return slots;
|
|
249
244
|
}
|
|
250
245
|
function buildTimeSlotGrid(params) {
|
|
251
|
-
const {
|
|
246
|
+
const {
|
|
247
|
+
date,
|
|
248
|
+
config,
|
|
249
|
+
rawResources,
|
|
250
|
+
resourceProductMap,
|
|
251
|
+
quotationPriceMap,
|
|
252
|
+
slotPriceMap
|
|
253
|
+
} = params;
|
|
252
254
|
const resolvedPriceMap = slotPriceMap ?? quotationPriceMap;
|
|
253
255
|
const timeLabels = generateTimeLabels(config);
|
|
254
|
-
const now = (0,
|
|
256
|
+
const now = (0, _dayjs.default)();
|
|
255
257
|
const crossDay = isBusinessHoursCrossDay(config);
|
|
256
|
-
const config_businessStartHour = Number(config.businessStartTime.split(
|
|
257
|
-
const rawResourceById =
|
|
258
|
-
for (const item of rawResources)
|
|
259
|
-
rawResourceById.set(item.resourceId, item);
|
|
258
|
+
const config_businessStartHour = Number(config.businessStartTime.split(':')[0]);
|
|
259
|
+
const rawResourceById = new Map();
|
|
260
|
+
for (const item of rawResources) rawResourceById.set(item.resourceId, item);
|
|
260
261
|
const resources = [];
|
|
261
262
|
for (const resource of rawResources) {
|
|
262
263
|
const mappings = resourceProductMap.get(resource.resourceId);
|
|
263
|
-
if (!mappings || !mappings.length)
|
|
264
|
-
continue;
|
|
264
|
+
if (!mappings || !mappings.length) continue;
|
|
265
265
|
const timesForDate = getResourceTimesForDate(resource, date, config);
|
|
266
266
|
const events = collectEventsForDate(resource, date, config);
|
|
267
267
|
const resCapacity = resource.capacity ?? 1;
|
|
268
268
|
const combined = resource.combined_resource;
|
|
269
269
|
const isCombined = !!(combined && combined.status === 1 && Array.isArray(combined.resource_ids) && combined.resource_ids.length);
|
|
270
|
-
const childRawResources = isCombined ? combined.resource_ids.map(
|
|
271
|
-
const childTimesCache = childRawResources
|
|
272
|
-
const childEventsCache = childRawResources
|
|
273
|
-
const subRows = mappings.map(
|
|
270
|
+
const childRawResources = isCombined ? combined.resource_ids.map(id => rawResourceById.get(id)).filter(r => !!r) : undefined;
|
|
271
|
+
const childTimesCache = childRawResources?.map(child => getResourceTimesForDate(child, date, config));
|
|
272
|
+
const childEventsCache = childRawResources?.map(child => collectEventsForDate(child, date, config));
|
|
273
|
+
const subRows = mappings.map(mapping => {
|
|
274
274
|
const productSlots = buildProductSlots({
|
|
275
275
|
date,
|
|
276
276
|
config,
|
|
@@ -301,11 +301,14 @@ function buildTimeSlotGrid(params) {
|
|
|
301
301
|
let outerSlots;
|
|
302
302
|
if (hasMultipleProducts) {
|
|
303
303
|
outerSlots = timeLabels.map((_label, slotIndex) => {
|
|
304
|
-
const group = subRows.map(
|
|
304
|
+
const group = subRows.map(row => row.slots[slotIndex]);
|
|
305
305
|
return mergeSubSlots(group);
|
|
306
306
|
});
|
|
307
307
|
} else {
|
|
308
|
-
outerSlots = subRows[0].slots.map(
|
|
308
|
+
outerSlots = subRows[0].slots.map(slot => ({
|
|
309
|
+
...slot,
|
|
310
|
+
productId: undefined
|
|
311
|
+
}));
|
|
309
312
|
}
|
|
310
313
|
const row = {
|
|
311
314
|
resourceId: resource.resourceId,
|
|
@@ -320,24 +323,22 @@ function buildTimeSlotGrid(params) {
|
|
|
320
323
|
row.hasMultipleProducts = true;
|
|
321
324
|
}
|
|
322
325
|
if (isCombined && combined) {
|
|
323
|
-
row.combinedResource = {
|
|
326
|
+
row.combinedResource = {
|
|
327
|
+
resourceIds: [...combined.resource_ids]
|
|
328
|
+
};
|
|
324
329
|
}
|
|
325
330
|
resources.push(row);
|
|
326
331
|
}
|
|
327
|
-
|
|
332
|
+
|
|
333
|
+
// 按 productId 分组排序,确保同一商品的场地连续排列
|
|
334
|
+
const productOrder = new Map();
|
|
328
335
|
for (const row of resources) {
|
|
329
|
-
if (!productOrder.has(row.productId))
|
|
330
|
-
productOrder.set(row.productId, productOrder.size);
|
|
336
|
+
if (!productOrder.has(row.productId)) productOrder.set(row.productId, productOrder.size);
|
|
331
337
|
}
|
|
332
338
|
resources.sort((a, b) => (productOrder.get(a.productId) ?? 0) - (productOrder.get(b.productId) ?? 0));
|
|
333
|
-
return {
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
computeSlotStatus,
|
|
340
|
-
generateTimeLabels,
|
|
341
|
-
isBusinessHoursCrossDay,
|
|
342
|
-
isSlotOccupied
|
|
343
|
-
});
|
|
339
|
+
return {
|
|
340
|
+
date,
|
|
341
|
+
timeLabels,
|
|
342
|
+
resources
|
|
343
|
+
};
|
|
344
|
+
}
|
|
@@ -1,69 +1,132 @@
|
|
|
1
|
-
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __export = (target, all) => {
|
|
6
|
-
for (var name in all)
|
|
7
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
-
};
|
|
9
|
-
var __copyProps = (to, from, except, desc) => {
|
|
10
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
-
for (let key of __getOwnPropNames(from))
|
|
12
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
-
}
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
"use strict";
|
|
18
2
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
__export(utils_exports, {
|
|
22
|
-
aggregateItemRuleLimit: () => import_utils.aggregateItemRuleLimit,
|
|
23
|
-
attachItemRuleLimitsToTopLevelProducts: () => import_utils.attachItemRuleLimitsToTopLevelProducts,
|
|
24
|
-
buildItemRuleBusinessData: () => import_utils.buildItemRuleBusinessData,
|
|
25
|
-
buildProductKey: () => import_utils.buildProductKey,
|
|
26
|
-
buildQuantityLimitIndex: () => import_utils.buildQuantityLimitIndex,
|
|
27
|
-
createEmptySummary: () => import_utils.createEmptySummary,
|
|
28
|
-
extractStrategyModelIdsFromTableConfig: () => import_utils.extractStrategyModelIdsFromTableConfig,
|
|
29
|
-
getProductIdentityIndex: () => import_utils.getProductIdentityIndex,
|
|
30
|
-
getSafeProductNum: () => import_utils.getSafeProductNum,
|
|
31
|
-
getTopLevelProductId: () => import_utils.getTopLevelProductId,
|
|
32
|
-
getTopLevelVariantId: () => import_utils.getTopLevelVariantId,
|
|
33
|
-
isIdentityMatch: () => import_utils.isIdentityMatch,
|
|
34
|
-
normalizeEnabledItemRuleIds: () => import_utils.normalizeEnabledItemRuleIds,
|
|
35
|
-
normalizeItemRuleStrategies: () => import_utils.normalizeItemRuleStrategies,
|
|
36
|
-
normalizeOrderProduct: () => import_utils.normalizeOrderProduct,
|
|
37
|
-
resolveSkuMatchedQuantityLimits: () => import_utils.resolveSkuMatchedQuantityLimits,
|
|
38
|
-
toBoolean: () => import_utils.toBoolean,
|
|
39
|
-
toNonNegativeInt: () => import_utils.toNonNegativeInt,
|
|
40
|
-
toNonNegativeNumber: () => import_utils.toNonNegativeNumber,
|
|
41
|
-
toPositiveString: () => import_utils.toPositiveString,
|
|
42
|
-
toPriceString: () => import_utils.toPriceString
|
|
43
|
-
});
|
|
44
|
-
module.exports = __toCommonJS(utils_exports);
|
|
45
|
-
var import_utils = require("../ScanOrder/utils");
|
|
46
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
47
|
-
0 && (module.exports = {
|
|
48
|
-
aggregateItemRuleLimit,
|
|
49
|
-
attachItemRuleLimitsToTopLevelProducts,
|
|
50
|
-
buildItemRuleBusinessData,
|
|
51
|
-
buildProductKey,
|
|
52
|
-
buildQuantityLimitIndex,
|
|
53
|
-
createEmptySummary,
|
|
54
|
-
extractStrategyModelIdsFromTableConfig,
|
|
55
|
-
getProductIdentityIndex,
|
|
56
|
-
getSafeProductNum,
|
|
57
|
-
getTopLevelProductId,
|
|
58
|
-
getTopLevelVariantId,
|
|
59
|
-
isIdentityMatch,
|
|
60
|
-
normalizeEnabledItemRuleIds,
|
|
61
|
-
normalizeItemRuleStrategies,
|
|
62
|
-
normalizeOrderProduct,
|
|
63
|
-
resolveSkuMatchedQuantityLimits,
|
|
64
|
-
toBoolean,
|
|
65
|
-
toNonNegativeInt,
|
|
66
|
-
toNonNegativeNumber,
|
|
67
|
-
toPositiveString,
|
|
68
|
-
toPriceString
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
69
5
|
});
|
|
6
|
+
Object.defineProperty(exports, "aggregateItemRuleLimit", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _utils.aggregateItemRuleLimit;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "attachItemRuleLimitsToTopLevelProducts", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _utils.attachItemRuleLimitsToTopLevelProducts;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "buildItemRuleBusinessData", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _utils.buildItemRuleBusinessData;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "buildProductKey", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () {
|
|
27
|
+
return _utils.buildProductKey;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(exports, "buildQuantityLimitIndex", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () {
|
|
33
|
+
return _utils.buildQuantityLimitIndex;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
Object.defineProperty(exports, "createEmptySummary", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
get: function () {
|
|
39
|
+
return _utils.createEmptySummary;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(exports, "extractStrategyModelIdsFromTableConfig", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function () {
|
|
45
|
+
return _utils.extractStrategyModelIdsFromTableConfig;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
Object.defineProperty(exports, "getProductIdentityIndex", {
|
|
49
|
+
enumerable: true,
|
|
50
|
+
get: function () {
|
|
51
|
+
return _utils.getProductIdentityIndex;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(exports, "getSafeProductNum", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function () {
|
|
57
|
+
return _utils.getSafeProductNum;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
Object.defineProperty(exports, "getTopLevelProductId", {
|
|
61
|
+
enumerable: true,
|
|
62
|
+
get: function () {
|
|
63
|
+
return _utils.getTopLevelProductId;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
Object.defineProperty(exports, "getTopLevelVariantId", {
|
|
67
|
+
enumerable: true,
|
|
68
|
+
get: function () {
|
|
69
|
+
return _utils.getTopLevelVariantId;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
Object.defineProperty(exports, "isIdentityMatch", {
|
|
73
|
+
enumerable: true,
|
|
74
|
+
get: function () {
|
|
75
|
+
return _utils.isIdentityMatch;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
Object.defineProperty(exports, "normalizeEnabledItemRuleIds", {
|
|
79
|
+
enumerable: true,
|
|
80
|
+
get: function () {
|
|
81
|
+
return _utils.normalizeEnabledItemRuleIds;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
Object.defineProperty(exports, "normalizeItemRuleStrategies", {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
get: function () {
|
|
87
|
+
return _utils.normalizeItemRuleStrategies;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
Object.defineProperty(exports, "normalizeOrderProduct", {
|
|
91
|
+
enumerable: true,
|
|
92
|
+
get: function () {
|
|
93
|
+
return _utils.normalizeOrderProduct;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
Object.defineProperty(exports, "resolveSkuMatchedQuantityLimits", {
|
|
97
|
+
enumerable: true,
|
|
98
|
+
get: function () {
|
|
99
|
+
return _utils.resolveSkuMatchedQuantityLimits;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
Object.defineProperty(exports, "toBoolean", {
|
|
103
|
+
enumerable: true,
|
|
104
|
+
get: function () {
|
|
105
|
+
return _utils.toBoolean;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
Object.defineProperty(exports, "toNonNegativeInt", {
|
|
109
|
+
enumerable: true,
|
|
110
|
+
get: function () {
|
|
111
|
+
return _utils.toNonNegativeInt;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
Object.defineProperty(exports, "toNonNegativeNumber", {
|
|
115
|
+
enumerable: true,
|
|
116
|
+
get: function () {
|
|
117
|
+
return _utils.toNonNegativeNumber;
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
Object.defineProperty(exports, "toPositiveString", {
|
|
121
|
+
enumerable: true,
|
|
122
|
+
get: function () {
|
|
123
|
+
return _utils.toPositiveString;
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
Object.defineProperty(exports, "toPriceString", {
|
|
127
|
+
enumerable: true,
|
|
128
|
+
get: function () {
|
|
129
|
+
return _utils.toPriceString;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
var _utils = require("../ScanOrder/utils");
|