@pisell/pisellos 2.3.144 → 2.3.146
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/modules/BookingContext/utils/productExtend.d.ts +7 -0
- package/dist/modules/BookingContext/utils/productExtend.js +62 -18
- package/dist/modules/Order/index.d.ts +2 -1
- package/dist/modules/Order/index.js +380 -198
- package/dist/modules/Order/types.d.ts +9 -0
- package/dist/modules/ResourcePlanner/planner.d.ts +2 -0
- package/dist/modules/ResourcePlanner/planner.js +327 -22
- package/dist/modules/ResourcePlanner/types.d.ts +29 -0
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +0 -1
- package/dist/solution/BookingTicket/utils/addProductDecision.js +1 -1
- package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +6 -2
- package/dist/solution/UnifiedBookingSales/index.d.ts +3 -0
- package/dist/solution/UnifiedBookingSales/index.js +432 -163
- package/dist/solution/UnifiedBookingSales/types.d.ts +14 -2
- package/lib/modules/BookingContext/utils/productExtend.d.ts +7 -0
- package/lib/modules/BookingContext/utils/productExtend.js +45 -2
- package/lib/modules/Order/index.d.ts +2 -1
- package/lib/modules/Order/index.js +92 -10
- package/lib/modules/Order/types.d.ts +9 -0
- package/lib/modules/ResourcePlanner/planner.d.ts +2 -0
- package/lib/modules/ResourcePlanner/planner.js +247 -7
- package/lib/modules/ResourcePlanner/types.d.ts +29 -0
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +0 -1
- package/lib/solution/BookingTicket/utils/addProductDecision.js +1 -1
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +7 -1
- package/lib/solution/UnifiedBookingSales/index.d.ts +3 -0
- package/lib/solution/UnifiedBookingSales/index.js +220 -27
- package/lib/solution/UnifiedBookingSales/types.d.ts +14 -2
- package/package.json +1 -1
|
@@ -7,6 +7,13 @@ import { TimeSlicesResult, TimeSlice, DurationSlice } from './timeSlices';
|
|
|
7
7
|
* 让 OS 这层完全可在 Node 单测下运行(dayjs 在 Node 也是纯函数)。
|
|
8
8
|
*/
|
|
9
9
|
export interface BookingCalcContext {
|
|
10
|
+
/** Sales channel; remembered duration starts are accepted only by POS. */
|
|
11
|
+
channel?: string;
|
|
12
|
+
/** Start-only device preference for this decision; never reuse a cached end/resource. */
|
|
13
|
+
rememberedTime?: {
|
|
14
|
+
businessDate: string;
|
|
15
|
+
startAt: string;
|
|
16
|
+
};
|
|
10
17
|
/** 来自 `/core/board/management/config` 的整套配置;常用路径见 sliceTimeSlices / appointmentTimingPreference。 */
|
|
11
18
|
bookingConfig?: any;
|
|
12
19
|
/** 资源 origin map(id → resource origin)。 */
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
1
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
3
2
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
3
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
@@ -10,6 +9,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
10
9
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
11
10
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
12
11
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
12
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
13
13
|
import dayjs from 'dayjs';
|
|
14
14
|
import { formatResources, getResourceByIds, getSumCapacity, getUsableTime, setDefaultCapacitys, setDefaultResource } from "./resources";
|
|
15
15
|
import { hasActualResourceSelection, productNeedsResourceExtend } from "./resourceSelection";
|
|
@@ -24,6 +24,46 @@ import { flexibleObj, getDurationValue, isProductFlexibleDuration } from "./flex
|
|
|
24
24
|
* 让 OS 这层完全可在 Node 单测下运行(dayjs 在 Node 也是纯函数)。
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
+
/** Rebuild only the derived booking fields; SKU, quantity, notes and Holder stay intact. */
|
|
28
|
+
function seedRememberedBookingStart(cacheItem, ctx) {
|
|
29
|
+
var _cacheItem$cartDetail, _cacheItem$_extend;
|
|
30
|
+
var remembered = ctx.rememberedTime;
|
|
31
|
+
var invalid = function invalid() {
|
|
32
|
+
return Object.assign(new Error('Remembered time requires a valid POS duration start.'), {
|
|
33
|
+
code: 'INVALID_REMEMBERED_TIME'
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
var duration = cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem.duration;
|
|
37
|
+
var durationType = _typeof(duration) === 'object' && duration ? String(duration.type || '').toLowerCase() : '';
|
|
38
|
+
var durationValue = _typeof(duration) === 'object' && duration ? duration.value : duration;
|
|
39
|
+
var isDuration = isProductFlexibleDuration(duration) || ['', 'fixed', 'minute', 'minutes', 'hour', 'hours'].includes(durationType) && Number.isFinite(Number(durationValue)) && Number(durationValue) > 0;
|
|
40
|
+
var isCalendarDate = function isCalendarDate(value) {
|
|
41
|
+
if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2}$/.test(value)) return false;
|
|
42
|
+
var date = new Date("".concat(value, "T00:00:00.000Z"));
|
|
43
|
+
return Number.isFinite(date.getTime()) && date.toISOString().slice(0, 10) === value;
|
|
44
|
+
};
|
|
45
|
+
var parts = typeof (remembered === null || remembered === void 0 ? void 0 : remembered.startAt) === 'string' ? /^(\d{4}-\d{2}-\d{2})T(\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,3})?)?(?:Z|[+-](\d{2}):(\d{2}))?$/.exec(remembered.startAt) : null;
|
|
46
|
+
if (String(ctx.channel || '').trim().toLowerCase() !== 'pos' || !isDuration || isMultiDayProduct(cacheItem) || isSessionProduct(cacheItem) || cacheItem !== null && cacheItem !== void 0 && (_cacheItem$cartDetail = cacheItem.cartDetailValue) !== null && _cacheItem$cartDetail !== void 0 && _cacheItem$cartDetail.session || cacheItem !== null && cacheItem !== void 0 && (_cacheItem$_extend = cacheItem._extend) !== null && _cacheItem$_extend !== void 0 && (_cacheItem$_extend = _cacheItem$_extend.other) !== null && _cacheItem$_extend !== void 0 && _cacheItem$_extend.session || !isCalendarDate(remembered === null || remembered === void 0 ? void 0 : remembered.businessDate) || !parts || !isCalendarDate(parts[1]) || Number(parts[2]) > 23 || Number(parts[3]) > 59 || Number(parts[4] || 0) > 59 || Number(parts[5] || 0) > 23 || Number(parts[6] || 0) > 59) throw invalid();
|
|
47
|
+
// Parse the actual instant with the same runtime clock used by the legacy booking helpers.
|
|
48
|
+
// The business-day label must not replace the calendar date of an overnight start.
|
|
49
|
+
var start = dayjs(remembered.startAt);
|
|
50
|
+
if (!start.isValid()) throw invalid();
|
|
51
|
+
var extend = _objectSpread({}, (cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem._extend) || {});
|
|
52
|
+
for (var _i = 0, _arr = ['start_date', 'startDate', 'start_time', 'end_date', 'endDate', 'end_time', 'duration', 'resource', 'resources', 'capacity', 'booking', 'availabilitySelection']; _i < _arr.length; _i++) {
|
|
53
|
+
var key = _arr[_i];
|
|
54
|
+
delete extend[key];
|
|
55
|
+
}
|
|
56
|
+
return _objectSpread(_objectSpread({}, cacheItem), {}, {
|
|
57
|
+
new: 1,
|
|
58
|
+
autoClose: false,
|
|
59
|
+
_data: {},
|
|
60
|
+
_extend: _objectSpread(_objectSpread({}, extend), {}, {
|
|
61
|
+
start_date: start.format('YYYY-MM-DD'),
|
|
62
|
+
start_time: start.format(start.millisecond() ? 'HH:mm:ss.SSS' : start.second() ? 'HH:mm:ss' : 'HH:mm')
|
|
63
|
+
})
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
27
67
|
/** 从 BookingContext.date 提取 HH:mm(仅当日期带有效时分时)。 */
|
|
28
68
|
export function derivePresetStartTimeFromDate(date) {
|
|
29
69
|
if (date == null) return undefined;
|
|
@@ -46,12 +86,12 @@ function getAppointmentTimingPreference(ctx) {
|
|
|
46
86
|
* 灵活时长选项(cacheItem.duration.type === 'flexible' 时)。
|
|
47
87
|
*/
|
|
48
88
|
function getFlexibleOption(params) {
|
|
49
|
-
var _cacheItem$
|
|
89
|
+
var _cacheItem$_extend2, _cacheItem$_extend3, _usable$_extend, _params$ctx;
|
|
50
90
|
var cacheItem = params.cacheItem,
|
|
51
91
|
useStartTime = params.useStartTime;
|
|
52
92
|
var duration = getDurationValue(cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem.duration);
|
|
53
93
|
if (duration !== 'flexible') return null;
|
|
54
|
-
var startDate = dayjs("".concat(dayjs(cacheItem === null || cacheItem === void 0 || (_cacheItem$
|
|
94
|
+
var startDate = dayjs("".concat(dayjs(cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend2 = cacheItem._extend) === null || _cacheItem$_extend2 === void 0 ? void 0 : _cacheItem$_extend2.start_date).format('YYYY-MM-DD'), " ").concat(useStartTime || (cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend3 = cacheItem._extend) === null || _cacheItem$_extend3 === void 0 ? void 0 : _cacheItem$_extend3.start_time) || '00:00'));
|
|
55
95
|
var usable = getUsableTime(cacheItem);
|
|
56
96
|
var usableEndAt = usable !== null && usable !== void 0 && (_usable$_extend = usable._extend) !== null && _usable$_extend !== void 0 && (_usable$_extend = _usable$_extend.usableTime) !== null && _usable$_extend !== void 0 && _usable$_extend.end_at ? dayjs(usable._extend.usableTime.end_at) : null;
|
|
57
97
|
var endDate = getEndDate(startDate, 'flexible', usableEndAt, (_params$ctx = params.ctx) === null || _params$ctx === void 0 ? void 0 : _params$ctx.shopOpeningHours);
|
|
@@ -105,7 +145,7 @@ export function getTimeObj(params) {
|
|
|
105
145
|
* - cacheItem.isCustomItem → 直接返回 `{ duration: null }`。
|
|
106
146
|
*/
|
|
107
147
|
export function getServiceStartTimeAndEndTime(params) {
|
|
108
|
-
var _cacheItem$
|
|
148
|
+
var _cacheItem$_extend4;
|
|
109
149
|
var cacheItem = params.cacheItem,
|
|
110
150
|
timeObj = params.timeObj,
|
|
111
151
|
ctx = params.ctx;
|
|
@@ -163,7 +203,7 @@ export function getServiceStartTimeAndEndTime(params) {
|
|
|
163
203
|
_extend.start_date = (_extend$start_date = _extend.start_date) !== null && _extend$start_date !== void 0 ? _extend$start_date : startDate;
|
|
164
204
|
_extend.end_date = (_extend$end_date = _extend.end_date) !== null && _extend$end_date !== void 0 ? _extend$end_date : endDate;
|
|
165
205
|
}
|
|
166
|
-
var session = cacheItem === null || cacheItem === void 0 || (_cacheItem$
|
|
206
|
+
var session = cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend4 = cacheItem._extend) === null || _cacheItem$_extend4 === void 0 || (_cacheItem$_extend4 = _cacheItem$_extend4.other) === null || _cacheItem$_extend4 === void 0 ? void 0 : _cacheItem$_extend4.session;
|
|
167
207
|
if (isSessionProduct(cacheItem) && session) {
|
|
168
208
|
var baseDate = ctx.date ? dayjs(ctx.date) : dayjs();
|
|
169
209
|
var startAt = dayjs("".concat(baseDate.format('YYYY-MM-DD'), " ").concat(dayjs(session.start_at).format('HH:mm:ss')));
|
|
@@ -188,18 +228,22 @@ export function getServiceStartTimeAndEndTime(params) {
|
|
|
188
228
|
* 入参 ctx 必须至少给:bookingConfig / resourcesOriginMap / resourcesOrigin / date。
|
|
189
229
|
*/
|
|
190
230
|
export function getProductExtend(params) {
|
|
191
|
-
var _cacheItem$
|
|
192
|
-
var
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
var
|
|
231
|
+
var _cacheItem$_extend5;
|
|
232
|
+
var isDisabledTime = params.isDisabledTime;
|
|
233
|
+
var hasRememberedTime = params.ctx.rememberedTime !== undefined;
|
|
234
|
+
var cacheItem = hasRememberedTime ? seedRememberedBookingStart(params.cacheItem, params.ctx) : params.cacheItem;
|
|
235
|
+
var ctx = hasRememberedTime ? _objectSpread(_objectSpread({}, params.ctx), {}, {
|
|
236
|
+
previousService: undefined,
|
|
237
|
+
presetStartTime: undefined
|
|
238
|
+
}) : params.ctx;
|
|
239
|
+
var isNew = cacheItem.new || !((_cacheItem$_extend5 = cacheItem._extend) !== null && _cacheItem$_extend5 !== void 0 && _cacheItem$_extend5.endDate);
|
|
196
240
|
var _cacheItem = _objectSpread({}, cacheItem);
|
|
197
241
|
var resourcesOriginMap = ctx.resourcesOriginMap || {};
|
|
198
242
|
_cacheItem._data = {};
|
|
199
243
|
if (isMultiDayProduct(cacheItem)) {
|
|
200
|
-
var _cacheItem$
|
|
244
|
+
var _cacheItem$_extend6;
|
|
201
245
|
_cacheItem._extend = _cacheItem._extend || {};
|
|
202
|
-
_cacheItem._extend.holder_id = (cacheItem === null || cacheItem === void 0 || (_cacheItem$
|
|
246
|
+
_cacheItem._extend.holder_id = (cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend6 = cacheItem._extend) === null || _cacheItem$_extend6 === void 0 ? void 0 : _cacheItem$_extend6.holder_id) || [];
|
|
203
247
|
_cacheItem._extend.sub_type = 'days';
|
|
204
248
|
}
|
|
205
249
|
if (isNew) {
|
|
@@ -260,14 +304,14 @@ export function getProductExtend(params) {
|
|
|
260
304
|
_cacheItem._time = new Date().getTime();
|
|
261
305
|
}
|
|
262
306
|
} else {
|
|
263
|
-
var _cacheItem$
|
|
307
|
+
var _cacheItem$_extend8;
|
|
264
308
|
if (!_cacheItem._data.capacitys) {
|
|
265
309
|
_cacheItem._data.capacitys = cacheItem.capacity;
|
|
266
310
|
}
|
|
267
311
|
if (!_cacheItem._data.resourcesOrigin) {
|
|
268
|
-
var _cacheItem$
|
|
312
|
+
var _cacheItem$_extend7, _ctx$bookingConfig4;
|
|
269
313
|
var extraResources = [];
|
|
270
|
-
if (Array.isArray((_cacheItem$
|
|
314
|
+
if (Array.isArray((_cacheItem$_extend7 = _cacheItem._extend) === null || _cacheItem$_extend7 === void 0 ? void 0 : _cacheItem$_extend7.event_resources)) {
|
|
271
315
|
_cacheItem._extend.event_resources.forEach(function (er) {
|
|
272
316
|
extraResources.push({
|
|
273
317
|
form_id: er.form_id,
|
|
@@ -293,7 +337,7 @@ export function getProductExtend(params) {
|
|
|
293
337
|
}
|
|
294
338
|
_cacheItem._data.timeObj = getTimeObj({
|
|
295
339
|
cacheItem: _cacheItem,
|
|
296
|
-
useStartTime: (_cacheItem$
|
|
340
|
+
useStartTime: (_cacheItem$_extend8 = _cacheItem._extend) === null || _cacheItem$_extend8 === void 0 ? void 0 : _cacheItem$_extend8.start_time,
|
|
297
341
|
ctx: ctx
|
|
298
342
|
});
|
|
299
343
|
}
|
|
@@ -306,7 +350,7 @@ export function getProductExtend(params) {
|
|
|
306
350
|
* `getAutoAllocationStorage` 抽象为入参 `isAutoAllocationOn(formId)`。
|
|
307
351
|
*/
|
|
308
352
|
export function getIsAutoClose(cacheItem, isAutoAllocationOn) {
|
|
309
|
-
var _cacheItem$_data, _cacheItem$
|
|
353
|
+
var _cacheItem$_data, _cacheItem$_extend9;
|
|
310
354
|
if (productNeedsResourceExtend(cacheItem) && !hasActualResourceSelection(cacheItem)) {
|
|
311
355
|
return false;
|
|
312
356
|
}
|
|
@@ -321,7 +365,7 @@ export function getIsAutoClose(cacheItem, isAutoAllocationOn) {
|
|
|
321
365
|
}
|
|
322
366
|
}
|
|
323
367
|
}
|
|
324
|
-
var entries = Object.entries(((_cacheItem$
|
|
368
|
+
var entries = Object.entries(((_cacheItem$_extend9 = cacheItem._extend) === null || _cacheItem$_extend9 === void 0 ? void 0 : _cacheItem$_extend9.resource) || {});
|
|
325
369
|
if (entries.length === 0) {
|
|
326
370
|
return !productNeedsResourceExtend(cacheItem);
|
|
327
371
|
}
|
|
@@ -332,6 +332,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
|
|
|
332
332
|
private applyOrderProductsDepositSummary;
|
|
333
333
|
recalculateSummary(options?: {
|
|
334
334
|
createIfMissing?: boolean;
|
|
335
|
+
isCurrentOrder?: () => boolean;
|
|
335
336
|
}): Promise<OrderSummary | null>;
|
|
336
337
|
getOrderSummary(): Promise<OrderSummary>;
|
|
337
338
|
updateTempOrderNote(note: string): string;
|
|
@@ -592,7 +593,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
|
|
|
592
593
|
generateIdempotencyToken(): string;
|
|
593
594
|
syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
|
|
594
595
|
createOrder(params: CommitOrderParams['query']): {
|
|
595
|
-
type: "
|
|
596
|
+
type: "virtual" | "appointment_booking";
|
|
596
597
|
platform: string;
|
|
597
598
|
sales_channel: string;
|
|
598
599
|
order_sales_channel: string;
|