@pisell/private-materials 6.11.115 → 6.11.117
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/build/lowcode/assets-daily.json +11 -11
- package/build/lowcode/assets-dev.json +2 -2
- package/build/lowcode/assets-prod.json +11 -11
- package/build/lowcode/meta.js +1 -1
- package/build/lowcode/render/default/view.js +1 -1
- package/build/lowcode/view.js +1 -1
- package/es/components/appointmentBooking/components/TimeSlicing/components/SelectDateOS.d.ts +0 -1
- package/es/components/booking/hooks/useClearCart.d.ts +0 -1
- package/es/components/booking/info/notes/index.d.ts +0 -1
- package/es/components/ecocup/components/AddCustomerModal/index.d.ts +1 -0
- package/es/components/ecocup/components/CupActionList/index.d.ts +1 -0
- package/es/components/ecocup/components/CupActionModal/index.d.ts +1 -0
- package/es/components/ecocup/components/CupInfoCard/index.d.ts +1 -0
- package/es/components/ecocup/components/CupStatusModal/index.d.ts +1 -0
- package/es/components/ecocup/components/CustomerAndCupModal/index.d.ts +1 -0
- package/es/components/ecocup/components/CustomerCard/index.d.ts +1 -0
- package/es/components/ecocup/components/MoreDropdown/index.d.ts +1 -0
- package/es/components/ecocup/components/SearchBar/index.d.ts +1 -0
- package/es/components/ecocup/components/SettingModal/index.d.ts +1 -0
- package/es/components/ecocup/cupList/hooks/useColumns.d.ts +1 -0
- package/es/components/ecocup/cupList/hooks/useSummary.d.ts +1 -0
- package/es/components/eftpos/hooks.d.ts +1 -0
- package/es/components/eftpos/index.d.ts +1 -0
- package/es/components/eftposPay/component/fail/network.d.ts +0 -1
- package/es/components/eftposPay/component/fail/unknow.d.ts +0 -1
- package/es/components/eftposPay/component/signature/index.d.ts +0 -1
- package/es/components/eftposPay/store/index.d.ts +1 -1
- package/es/components/eftposPay/tip.d.ts +0 -1
- package/es/components/eftposPay/windcave/receiptAction.d.ts +0 -1
- package/es/components/shoppingCart/hooks/useClearCart.d.ts +0 -1
- package/es/plus/clinetSearch/Add/BirthdayField/index.d.ts +1 -0
- package/es/plus/clinetSearch/Add/GenderField/index.d.ts +1 -0
- package/es/plus/clinetSearch/Add/PhoneField/index.d.ts +1 -0
- package/es/plus/orderList/components/HandleActions.d.ts +1 -0
- package/es/plus/orderList/components/QuickFilter.d.ts +1 -0
- package/es/plus/orderList/components/Reset.d.ts +1 -0
- package/es/plus/orderList/components/Toolbar.d.ts +1 -0
- package/es/plus/pisellReservation/PisellReservation.js +369 -41
- package/es/plus/pisellReservation/components/PisellReservationSubcomponents.d.ts +7 -6
- package/es/plus/pisellReservation/components/PisellReservationSubcomponents.js +25 -12
- package/es/plus/pisellReservation/components/ReservationResourceWallResourceSelect.d.ts +14 -0
- package/es/plus/pisellReservation/components/ReservationResourceWallResourceSelect.js +30 -0
- package/es/plus/pisellReservation/components/bookingDetailModal/ReservationBookingDetailModal.js +5 -5
- package/es/plus/pisellReservation/data/bookingToReservationTables.d.ts +4 -0
- package/es/plus/pisellReservation/data/bookingToReservationTables.js +12 -4
- package/es/plus/pisellReservation/data/mapReservationToVenueWallCards.d.ts +6 -0
- package/es/plus/pisellReservation/data/mapReservationToVenueWallCards.js +171 -0
- package/es/plus/pisellReservation/data/reservationDataUtils.js +1 -1
- package/es/plus/pisellReservation/floorMap/reservationMock.js +160 -0
- package/es/plus/pisellReservation/floorRoomCard/buildCardBodyViewModel.js +4 -4
- package/es/plus/pisellReservation/floorRoomCard/floorRoomCardUtils.d.ts +18 -0
- package/es/plus/pisellReservation/floorRoomCard/floorRoomCardUtils.js +44 -0
- package/es/plus/pisellReservation/hooks/useReservationScheduleDebounced.d.ts +3 -3
- package/es/plus/pisellReservation/locales/locales-ja.d.ts +5 -0
- package/es/plus/pisellReservation/locales/locales-ja.js +5 -0
- package/es/plus/pisellReservation/locales/locales-pt.d.ts +5 -0
- package/es/plus/pisellReservation/locales/locales-pt.js +5 -0
- package/es/plus/pisellReservation/locales/locales.d.ts +17 -0
- package/es/plus/pisellReservation/locales/locales.js +7 -0
- package/es/plus/pisellReservation/reservationConstants.d.ts +23 -5
- package/es/plus/pisellReservation/reservationConstants.js +7 -0
- package/es/plus/pisellReservation/types.d.ts +4 -0
- package/es/plus/saasAttendance/settings/components/membersField/index.d.ts +1 -0
- package/es/plus/skuOptionsSelection/components/OptionsCard/index.d.ts +1 -0
- package/es/plus/walletPassGallery/components/timelineSection/index.d.ts +1 -0
- package/es/pro/Selector/demo.d.ts +1 -0
- package/es/pro/pisellPhoneKeyboard/index.d.ts +1 -0
- package/lib/components/appointmentBooking/components/TimeSlicing/components/SelectDateOS.d.ts +0 -1
- package/lib/components/booking/hooks/useClearCart.d.ts +0 -1
- package/lib/components/booking/info/notes/index.d.ts +0 -1
- package/lib/components/ecocup/components/AddCustomerModal/index.d.ts +1 -0
- package/lib/components/ecocup/components/CupActionList/index.d.ts +1 -0
- package/lib/components/ecocup/components/CupActionModal/index.d.ts +1 -0
- package/lib/components/ecocup/components/CupInfoCard/index.d.ts +1 -0
- package/lib/components/ecocup/components/CupStatusModal/index.d.ts +1 -0
- package/lib/components/ecocup/components/CustomerAndCupModal/index.d.ts +1 -0
- package/lib/components/ecocup/components/CustomerCard/index.d.ts +1 -0
- package/lib/components/ecocup/components/MoreDropdown/index.d.ts +1 -0
- package/lib/components/ecocup/components/SearchBar/index.d.ts +1 -0
- package/lib/components/ecocup/components/SettingModal/index.d.ts +1 -0
- package/lib/components/ecocup/cupList/hooks/useColumns.d.ts +1 -0
- package/lib/components/ecocup/cupList/hooks/useSummary.d.ts +1 -0
- package/lib/components/eftpos/hooks.d.ts +1 -0
- package/lib/components/eftpos/index.d.ts +1 -0
- package/lib/components/eftposPay/component/fail/network.d.ts +0 -1
- package/lib/components/eftposPay/component/fail/unknow.d.ts +0 -1
- package/lib/components/eftposPay/component/signature/index.d.ts +0 -1
- package/lib/components/eftposPay/store/index.d.ts +1 -1
- package/lib/components/eftposPay/tip.d.ts +0 -1
- package/lib/components/eftposPay/windcave/receiptAction.d.ts +0 -1
- package/lib/components/shoppingCart/hooks/useClearCart.d.ts +0 -1
- package/lib/plus/clinetSearch/Add/BirthdayField/index.d.ts +1 -0
- package/lib/plus/clinetSearch/Add/GenderField/index.d.ts +1 -0
- package/lib/plus/clinetSearch/Add/PhoneField/index.d.ts +1 -0
- package/lib/plus/orderList/components/HandleActions.d.ts +1 -0
- package/lib/plus/orderList/components/QuickFilter.d.ts +1 -0
- package/lib/plus/orderList/components/Reset.d.ts +1 -0
- package/lib/plus/orderList/components/Toolbar.d.ts +1 -0
- package/lib/plus/pisellReservation/PisellReservation.js +312 -12
- package/lib/plus/pisellReservation/components/PisellReservationSubcomponents.d.ts +7 -6
- package/lib/plus/pisellReservation/components/PisellReservationSubcomponents.js +18 -5
- package/lib/plus/pisellReservation/components/ReservationResourceWallResourceSelect.d.ts +14 -0
- package/lib/plus/pisellReservation/components/ReservationResourceWallResourceSelect.js +60 -0
- package/lib/plus/pisellReservation/components/bookingDetailModal/ReservationBookingDetailModal.js +1 -1
- package/lib/plus/pisellReservation/data/bookingToReservationTables.d.ts +4 -0
- package/lib/plus/pisellReservation/data/bookingToReservationTables.js +16 -9
- package/lib/plus/pisellReservation/data/mapReservationToVenueWallCards.d.ts +6 -0
- package/lib/plus/pisellReservation/data/mapReservationToVenueWallCards.js +160 -0
- package/lib/plus/pisellReservation/data/reservationDataUtils.js +2 -1
- package/lib/plus/pisellReservation/floorMap/reservationMock.js +151 -0
- package/lib/plus/pisellReservation/floorRoomCard/buildCardBodyViewModel.js +5 -2
- package/lib/plus/pisellReservation/floorRoomCard/floorRoomCardUtils.d.ts +18 -0
- package/lib/plus/pisellReservation/floorRoomCard/floorRoomCardUtils.js +40 -0
- package/lib/plus/pisellReservation/hooks/useReservationScheduleDebounced.d.ts +3 -3
- package/lib/plus/pisellReservation/locales/locales-ja.d.ts +5 -0
- package/lib/plus/pisellReservation/locales/locales-ja.js +5 -0
- package/lib/plus/pisellReservation/locales/locales-pt.d.ts +5 -0
- package/lib/plus/pisellReservation/locales/locales-pt.js +5 -0
- package/lib/plus/pisellReservation/locales/locales.d.ts +17 -0
- package/lib/plus/pisellReservation/locales/locales.js +7 -0
- package/lib/plus/pisellReservation/reservationConstants.d.ts +23 -5
- package/lib/plus/pisellReservation/reservationConstants.js +12 -0
- package/lib/plus/pisellReservation/types.d.ts +4 -0
- package/lib/plus/saasAttendance/settings/components/membersField/index.d.ts +1 -0
- package/lib/plus/skuOptionsSelection/components/OptionsCard/index.d.ts +1 -0
- package/lib/plus/walletPassGallery/components/timelineSection/index.d.ts +1 -0
- package/lib/pro/Selector/demo.d.ts +1 -0
- package/lib/pro/pisellPhoneKeyboard/index.d.ts +1 -0
- package/package.json +4 -4
|
@@ -6,9 +6,9 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
|
|
|
6
6
|
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); }
|
|
7
7
|
/**
|
|
8
8
|
* 预约页拆出的轻量子组件(无业务数据请求):
|
|
9
|
-
* - `RecordBoardBodyViewCapture
|
|
9
|
+
* - `RecordBoardBodyViewCapture`:同步 bodyView 到 ref,并可通知宿主;
|
|
10
10
|
* - `ScheduleSyncOnFloorEnter`:从表格回到平面图/日历、或从日历回到平面图时,用当前营业日 patch 列表时间窗口;
|
|
11
|
-
* - `PisellReservationToolbarTabs
|
|
11
|
+
* - `PisellReservationToolbarTabs`:平面图/日历为日程带 + Segmented;表格 / 资源墙不展示日程带,仅 extraTabs;
|
|
12
12
|
* - `ReservationGridTopRight` / `PisellReservationScheduleEndActions` / `ReservationFloorMapCanvasTabsTrailing`:工具栏与画布尾区。
|
|
13
13
|
*/
|
|
14
14
|
import React, { useEffect, useMemo, useRef } from 'react';
|
|
@@ -16,15 +16,17 @@ import { locales } from '@pisell/utils';
|
|
|
16
16
|
import { Button, Segmented } from 'antd';
|
|
17
17
|
import { PisellReservationScheduleBand, useRecordBoardContext, useRecordBoardShellBodyMeta } from '@pisell/materials';
|
|
18
18
|
import { mergeSearchParamsBookingWindow } from "../data/reservationDataUtils";
|
|
19
|
-
import { I18N_AT_CURRENT_TIME, I18N_EDIT_MAP, I18N_EDIT_MAP_DONE, I18N_GO_CURRENT, I18N_NEW, I18N_NON_CURRENT_HINT, I18N_PAGE_TITLE, I18N_PAGE_TITLE_VENUE, I18N_VIEW_FLOOR, I18N_VIEW_GRID, I18N_VIEW_CALENDAR, I18N_CALENDAR_DAY, I18N_CALENDAR_WEEK, I18N_CALENDAR_MONTH, RESERVATION_TIMELINE_BUSINESS_RANGE } from "../reservationConstants";
|
|
19
|
+
import { I18N_AT_CURRENT_TIME, I18N_EDIT_MAP, I18N_EDIT_MAP_DONE, I18N_GO_CURRENT, I18N_NEW, I18N_NON_CURRENT_HINT, I18N_PAGE_TITLE, I18N_PAGE_TITLE_VENUE, I18N_VIEW_FLOOR, I18N_VIEW_GRID, I18N_VIEW_CALENDAR, I18N_VIEW_RESOURCE_WALL, I18N_CALENDAR_DAY, I18N_CALENDAR_WEEK, I18N_CALENDAR_MONTH, RESERVATION_TIMELINE_BUSINESS_RANGE } from "../reservationConstants";
|
|
20
20
|
|
|
21
|
-
/** 无 UI
|
|
21
|
+
/** 无 UI:将 RecordBoard Context 中的 `bodyView` 写入 ref,并可选通知宿主(如预约页按视图切换 booking 的 form_record_ids) */
|
|
22
22
|
export function RecordBoardBodyViewCapture(props) {
|
|
23
23
|
var _useRecordBoardContex = useRecordBoardContext(),
|
|
24
24
|
bodyView = _useRecordBoardContex.bodyView;
|
|
25
25
|
useEffect(function () {
|
|
26
|
+
var _props$onBodyViewChan;
|
|
26
27
|
props.bodyViewRef.current = bodyView;
|
|
27
|
-
|
|
28
|
+
(_props$onBodyViewChan = props.onBodyViewChange) === null || _props$onBodyViewChan === void 0 || _props$onBodyViewChan.call(props, bodyView);
|
|
29
|
+
}, [bodyView, props.bodyViewRef, props.onBodyViewChange]);
|
|
28
30
|
return null;
|
|
29
31
|
}
|
|
30
32
|
|
|
@@ -35,13 +37,13 @@ export function ScheduleSyncOnFloorEnter(props) {
|
|
|
35
37
|
var prevRef = useRef(null);
|
|
36
38
|
useEffect(function () {
|
|
37
39
|
var prev = prevRef.current;
|
|
38
|
-
if (props.isInternalListData && (bodyView === 'floorMap' || bodyView === 'calendar') && prev !== null && prev !== 'floorMap' && prev !== 'calendar') {
|
|
40
|
+
if (props.isInternalListData && (bodyView === 'floorMap' || bodyView === 'calendar' || bodyView === 'resourceWall') && prev !== null && prev !== 'floorMap' && prev !== 'calendar' && prev !== 'resourceWall') {
|
|
39
41
|
props.patchSearchParams(function (p) {
|
|
40
42
|
return mergeSearchParamsBookingWindow(p, props.schedule.date);
|
|
41
43
|
});
|
|
42
44
|
}
|
|
43
|
-
/**
|
|
44
|
-
if (props.isInternalListData && prev === 'calendar' && bodyView === 'floorMap') {
|
|
45
|
+
/** 日历 / 大屏用不同查询窗;回到平面图需恢复为锚定营业日单日窗,避免仍按整月请求 */
|
|
46
|
+
if (props.isInternalListData && (prev === 'calendar' || prev === 'resourceWall') && bodyView === 'floorMap') {
|
|
45
47
|
props.patchSearchParams(function (p) {
|
|
46
48
|
return mergeSearchParamsBookingWindow(p, props.schedule.date);
|
|
47
49
|
});
|
|
@@ -51,8 +53,8 @@ export function ScheduleSyncOnFloorEnter(props) {
|
|
|
51
53
|
return null;
|
|
52
54
|
}
|
|
53
55
|
/**
|
|
54
|
-
* 顶栏 tabs
|
|
55
|
-
* 切换器由 RecordBoard
|
|
56
|
+
* 顶栏 tabs:**仅平面图、日历**下为日程带 + 时间轴 + 标题旁切换;表格 / 资源墙不展示 ScheduleBand,
|
|
57
|
+
* 切换器由 RecordBoard 工具栏顶行承担(表格态在 Find 左侧;资源墙无 Find 时在顶行左侧),与历史行为一致。
|
|
56
58
|
*/
|
|
57
59
|
export function PisellReservationToolbarTabs(props) {
|
|
58
60
|
var _shellMeta$hasGridCon, _props$calendarGranul, _props$scheduleProps, _props$timeNavigatorP, _props$timeNavigatorP2, _props$timeNavigatorP3, _props$timeNavigatorP4, _props$timeNavigatorP7;
|
|
@@ -64,14 +66,19 @@ export function PisellReservationToolbarTabs(props) {
|
|
|
64
66
|
var hasGrid = (_shellMeta$hasGridCon = shellMeta === null || shellMeta === void 0 ? void 0 : shellMeta.hasGridContent) !== null && _shellMeta$hasGridCon !== void 0 ? _shellMeta$hasGridCon : true;
|
|
65
67
|
var hasFloor = shellMeta === null || shellMeta === void 0 ? void 0 : shellMeta.hasFloorMapSlot;
|
|
66
68
|
var hasCalendar = shellMeta === null || shellMeta === void 0 ? void 0 : shellMeta.hasCalendarSlot;
|
|
69
|
+
var hasResourceWall = shellMeta === null || shellMeta === void 0 ? void 0 : shellMeta.hasResourceWallSlot;
|
|
67
70
|
var floorForToggle = shellMeta === null || shellMeta === void 0 ? void 0 : shellMeta.effectiveFloorMapProps;
|
|
68
71
|
var canFloor = Boolean(hasFloor && floorForToggle != null);
|
|
69
72
|
var canCalendar = Boolean(hasCalendar);
|
|
70
|
-
var
|
|
73
|
+
var canResourceWall = Boolean(hasResourceWall);
|
|
74
|
+
var bodyViewOptionCount = (hasGrid ? 1 : 0) + (canFloor ? 1 : 0) + (canCalendar ? 1 : 0) + (canResourceWall ? 1 : 0);
|
|
71
75
|
var allowBodyViewToggle = bodyViewOptionCount >= 2 && bodyViewSwitchable !== false;
|
|
72
76
|
if (bodyView === 'grid') {
|
|
73
77
|
return props.extraTabs ? /*#__PURE__*/React.createElement(React.Fragment, null, props.extraTabs) : null;
|
|
74
78
|
}
|
|
79
|
+
if (bodyView === 'resourceWall') {
|
|
80
|
+
return props.extraTabs ? /*#__PURE__*/React.createElement(React.Fragment, null, props.extraTabs) : null;
|
|
81
|
+
}
|
|
75
82
|
var bodyViewSegmentedOptions = useMemo(function () {
|
|
76
83
|
var opts = [];
|
|
77
84
|
if (canFloor) {
|
|
@@ -86,6 +93,12 @@ export function PisellReservationToolbarTabs(props) {
|
|
|
86
93
|
value: 'calendar'
|
|
87
94
|
});
|
|
88
95
|
}
|
|
96
|
+
if (canResourceWall) {
|
|
97
|
+
opts.push({
|
|
98
|
+
label: locales.getText(I18N_VIEW_RESOURCE_WALL),
|
|
99
|
+
value: 'resourceWall'
|
|
100
|
+
});
|
|
101
|
+
}
|
|
89
102
|
if (hasGrid) {
|
|
90
103
|
opts.push({
|
|
91
104
|
label: locales.getText(I18N_VIEW_GRID),
|
|
@@ -93,7 +106,7 @@ export function PisellReservationToolbarTabs(props) {
|
|
|
93
106
|
});
|
|
94
107
|
}
|
|
95
108
|
return opts;
|
|
96
|
-
}, [canFloor, canCalendar, hasGrid]);
|
|
109
|
+
}, [canFloor, canCalendar, canResourceWall, hasGrid]);
|
|
97
110
|
var bodyViewToggle = allowBodyViewToggle ? /*#__PURE__*/React.createElement(Segmented, {
|
|
98
111
|
className: "pisell-reservation-body-view-segmented",
|
|
99
112
|
size: "large",
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export declare type ReservationResourceWallResourceSelectProps = {
|
|
3
|
+
value?: string[];
|
|
4
|
+
onChange?: (v: string[]) => void;
|
|
5
|
+
/** 与日历资源同源:{ label, value } */
|
|
6
|
+
options?: Array<{
|
|
7
|
+
label: string;
|
|
8
|
+
value: string;
|
|
9
|
+
}>;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* 大屏快筛:画布资源多选(写入 `searchParams.filter.values.resource_wall_resource_ids`)。
|
|
13
|
+
*/
|
|
14
|
+
export declare function ReservationResourceWallResourceSelect(props: ReservationResourceWallResourceSelectProps): JSX.Element;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Select } from 'antd';
|
|
3
|
+
import { locales } from '@pisell/utils';
|
|
4
|
+
import { I18N_RESOURCE_WALL_RESOURCES, RESERVATION_RESOURCE_WALL_MAX_RESOURCE_SELECTION } from "../reservationConstants";
|
|
5
|
+
/**
|
|
6
|
+
* 大屏快筛:画布资源多选(写入 `searchParams.filter.values.resource_wall_resource_ids`)。
|
|
7
|
+
*/
|
|
8
|
+
export function ReservationResourceWallResourceSelect(props) {
|
|
9
|
+
var value = props.value,
|
|
10
|
+
_onChange = props.onChange,
|
|
11
|
+
_props$options = props.options,
|
|
12
|
+
options = _props$options === void 0 ? [] : _props$options;
|
|
13
|
+
var max = RESERVATION_RESOURCE_WALL_MAX_RESOURCE_SELECTION;
|
|
14
|
+
return /*#__PURE__*/React.createElement(Select, {
|
|
15
|
+
mode: "multiple",
|
|
16
|
+
allowClear: true,
|
|
17
|
+
showSearch: true,
|
|
18
|
+
optionFilterProp: "label",
|
|
19
|
+
placeholder: locales.getText(I18N_RESOURCE_WALL_RESOURCES),
|
|
20
|
+
value: (value !== null && value !== void 0 ? value : []).slice(0, max),
|
|
21
|
+
onChange: function onChange(v) {
|
|
22
|
+
return _onChange === null || _onChange === void 0 ? void 0 : _onChange(v.slice(0, max));
|
|
23
|
+
},
|
|
24
|
+
options: options,
|
|
25
|
+
style: {
|
|
26
|
+
minWidth: 260,
|
|
27
|
+
maxWidth: 420
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
package/es/plus/pisellReservation/components/bookingDetailModal/ReservationBookingDetailModal.js
CHANGED
|
@@ -62,9 +62,9 @@ function stopUiClick(e) {
|
|
|
62
62
|
* 宿主 action / NativePage 用的订单主键:优先 `order.id`,否则顶层 `order_id`。
|
|
63
63
|
*/
|
|
64
64
|
function resolveOrderIdForHostActions(bookingRaw) {
|
|
65
|
-
var _order$id;
|
|
65
|
+
var _ref, _order$id;
|
|
66
66
|
var order = bookingRaw.order;
|
|
67
|
-
var id = (_order$id = order === null || order === void 0 ? void 0 : order.id) !== null && _order$id !== void 0 ? _order$id : bookingRaw.order_id;
|
|
67
|
+
var id = (_ref = (_order$id = order === null || order === void 0 ? void 0 : order.id) !== null && _order$id !== void 0 ? _order$id : order === null || order === void 0 ? void 0 : order.order_id) !== null && _ref !== void 0 ? _ref : bookingRaw.order_id;
|
|
68
68
|
if (id == null || id === '') return undefined;
|
|
69
69
|
if (typeof id === 'number' && Number.isFinite(id)) return id;
|
|
70
70
|
var s = String(id).trim();
|
|
@@ -137,9 +137,9 @@ export function ReservationBookingDetailModal(props) {
|
|
|
137
137
|
var _engineContext$appHel;
|
|
138
138
|
stopUiClick(e);
|
|
139
139
|
if (!raw) return;
|
|
140
|
-
var
|
|
141
|
-
action =
|
|
142
|
-
NativePage =
|
|
140
|
+
var _ref2 = ((_engineContext$appHel = engineContext.appHelper) === null || _engineContext$appHel === void 0 ? void 0 : _engineContext$appHel.utils) || {},
|
|
141
|
+
action = _ref2.action,
|
|
142
|
+
NativePage = _ref2.NativePage;
|
|
143
143
|
var orderId = resolveOrderIdForHostActions(raw);
|
|
144
144
|
console.log('key', key, orderId);
|
|
145
145
|
switch (key) {
|
|
@@ -21,6 +21,10 @@ export declare function filterBookingsByResourceIds<T extends Record<string, unk
|
|
|
21
21
|
export declare function customerBrief(record: Record<string, unknown>): string;
|
|
22
22
|
/** 单条预约上的日历日,用于平面图卡片进度与合成字段 */
|
|
23
23
|
export declare function bookingReferenceDay(booking: Record<string, unknown>): string | undefined;
|
|
24
|
+
/** 预约行开始时刻 → `HH:mm`(资源墙 / 卡片等共用) */
|
|
25
|
+
export declare function formatBookingTime(record: Record<string, unknown>): string;
|
|
26
|
+
/** 与按桌合并 {@link mergeResourceGroup} 一致:按开始时间升序 */
|
|
27
|
+
export declare function sortBookingsByStartTime(bookings: Record<string, unknown>[]): Record<string, unknown>[];
|
|
24
28
|
/** 宿主 booking.status:empty / 缺省 → 空闲;reserved / occupied / locked → 对应卡片大类 */
|
|
25
29
|
export declare function hostBookingStatusToCardStatus(record: Record<string, unknown>): PisellReservationTableRow['cardStatus'];
|
|
26
30
|
/** 从单条宿主 booking 摘 `reserved_status` / `isTimeout` 信号,供行合并与图元映射 */
|
|
@@ -132,13 +132,23 @@ export function bookingReferenceDay(booking) {
|
|
|
132
132
|
if (typeof sd === 'string' && /^\d{4}-\d{2}-\d{2}/.test(sd)) return sd.slice(0, 10);
|
|
133
133
|
return undefined;
|
|
134
134
|
}
|
|
135
|
-
|
|
135
|
+
|
|
136
|
+
/** 预约行开始时刻 → `HH:mm`(资源墙 / 卡片等共用) */
|
|
137
|
+
export function formatBookingTime(record) {
|
|
136
138
|
var raw = record.start_at || (record.start_date && record.start_time ? "".concat(record.start_date, " ").concat(record.start_time) : null);
|
|
137
139
|
if (!raw) return '';
|
|
138
140
|
var d = dayjs(raw);
|
|
139
141
|
return d.isValid() ? d.format('HH:mm') : '';
|
|
140
142
|
}
|
|
141
143
|
|
|
144
|
+
/** 与按桌合并 {@link mergeResourceGroup} 一致:按开始时间升序 */
|
|
145
|
+
export function sortBookingsByStartTime(bookings) {
|
|
146
|
+
return _toConsumableArray(bookings).sort(function (a, b) {
|
|
147
|
+
var _a$start_date, _a$start_time, _b$start_date, _b$start_time;
|
|
148
|
+
return dayjs(a.start_at || "".concat(String((_a$start_date = a.start_date) !== null && _a$start_date !== void 0 ? _a$start_date : ''), " ").concat(String((_a$start_time = a.start_time) !== null && _a$start_time !== void 0 ? _a$start_time : '')).trim()).valueOf() - dayjs(b.start_at || "".concat(String((_b$start_date = b.start_date) !== null && _b$start_date !== void 0 ? _b$start_date : ''), " ").concat(String((_b$start_time = b.start_time) !== null && _b$start_time !== void 0 ? _b$start_time : '')).trim()).valueOf();
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
142
152
|
/** 宿主 booking.status:empty / 缺省 → 空闲;reserved / occupied / locked → 对应卡片大类 */
|
|
143
153
|
export function hostBookingStatusToCardStatus(record) {
|
|
144
154
|
var _record$status2;
|
|
@@ -231,9 +241,7 @@ function mergeResourceGroup(recordId, group) {
|
|
|
231
241
|
return g.relation_form_name;
|
|
232
242
|
});
|
|
233
243
|
var code = named !== null && named !== void 0 && named.relation_form_name ? String(named.relation_form_name) : resourceDisplayCode(group[0]);
|
|
234
|
-
var sorted =
|
|
235
|
-
return dayjs(a.start_at || "".concat(a.start_date || '', " ").concat(a.start_time || '').trim()).valueOf() - dayjs(b.start_at || "".concat(b.start_date || '', " ").concat(b.start_time || '').trim()).valueOf();
|
|
236
|
-
});
|
|
244
|
+
var sorted = sortBookingsByStartTime(group);
|
|
237
245
|
if (sorted.length === 1) {
|
|
238
246
|
return singleBookingToRow(recordId, sorted[0], code);
|
|
239
247
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RecordBoardResourceWallCardModel } from '@pisell/materials';
|
|
2
|
+
import type { PisellReservationTableRow } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* 合并桌位行 → 大屏资源墙卡片(首版:与平面图/列表展示字段对齐,灯控等可后续接接口)。
|
|
5
|
+
*/
|
|
6
|
+
export declare function mapReservationRowsToVenueWallCards(rows: PisellReservationTableRow[]): RecordBoardResourceWallCardModel[];
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
2
|
+
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); }
|
|
3
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
4
|
+
import { formatFloorRoomCardBookingTimeRange, formatFloorRoomCardGuestDisplayLine, formatFloorRoomCardNextGuestStripLine, floorRoomCardBookingStartEndMs, getFloorRoomCardPrimaryBooking, resolveFloorRoomCardNextBookingLikeBodyModel } from "../floorRoomCard/floorRoomCardUtils";
|
|
5
|
+
import { mapPisellReservationRowToFloorRoomCardData, resolveFloorRoomCardHolder } from "../floorRoomCard/mapRowToFloorRoomCardData";
|
|
6
|
+
/**
|
|
7
|
+
* 合并桌位行 → 大屏资源墙卡片(首版:与平面图/列表展示字段对齐,灯控等可后续接接口)。
|
|
8
|
+
*/
|
|
9
|
+
export function mapReservationRowsToVenueWallCards(rows) {
|
|
10
|
+
return rows.map(mapReservationTableRowToVenueWallCard);
|
|
11
|
+
}
|
|
12
|
+
function formatResourceWallContactLine(row) {
|
|
13
|
+
/**
|
|
14
|
+
* 与 floor map 同源:从 row 构造 RoomCardData 后取 primary booking,
|
|
15
|
+
* 用统一的 holder 展示规则(姓名优先;预留态可展示手机号尾号)。
|
|
16
|
+
*/
|
|
17
|
+
var roomTitle = String(row.code || row.main_field || row.id || '').trim();
|
|
18
|
+
var data = mapPisellReservationRowToFloorRoomCardData(row, roomTitle);
|
|
19
|
+
var primary = getFloorRoomCardPrimaryBooking(data);
|
|
20
|
+
var showPhoneOnRow = row.cardStatus === 'booked';
|
|
21
|
+
var primaryLine = primary ? formatFloorRoomCardGuestDisplayLine(primary.holder, showPhoneOnRow).trim() : '';
|
|
22
|
+
if (primaryLine) return primaryLine;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 兜底:主 booking 未带 holder 时,尝试从同资源 bookings 中找第一条可展示的联系人。
|
|
26
|
+
* 仍复用同一套格式化规则,但允许展示脱敏手机号,避免回退成场地名。
|
|
27
|
+
*/
|
|
28
|
+
var _iterator = _createForOfIteratorHelper(data.bookings),
|
|
29
|
+
_step;
|
|
30
|
+
try {
|
|
31
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
32
|
+
var b = _step.value;
|
|
33
|
+
var t = formatFloorRoomCardGuestDisplayLine(b.holder, true).trim();
|
|
34
|
+
if (t) return t;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** 无联系人可展示:不要回退成场地名,保持为空 */
|
|
38
|
+
} catch (err) {
|
|
39
|
+
_iterator.e(err);
|
|
40
|
+
} finally {
|
|
41
|
+
_iterator.f();
|
|
42
|
+
}
|
|
43
|
+
return '';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 与 {@link formatResourceWallContactLine} 一致:先按行态 `showPhone`,再允许脱敏手机号;
|
|
48
|
+
* 若模型上 holder 仍空,再对命中的 floor raw 走同一套 `resolveFloorRoomCardHolder`(与 rawToBooking 同源)。
|
|
49
|
+
*/
|
|
50
|
+
function formatResourceWallNextBookingGuestLine(row, nextBooking) {
|
|
51
|
+
var showPhoneOnRow = row.cardStatus === 'booked';
|
|
52
|
+
var fromModel = formatFloorRoomCardGuestDisplayLine(nextBooking.holder, showPhoneOnRow).trim() || formatFloorRoomCardGuestDisplayLine(nextBooking.holder, true).trim();
|
|
53
|
+
if (fromModel) return fromModel;
|
|
54
|
+
var raw = resolveFloorRawForNextBooking(row, nextBooking);
|
|
55
|
+
if (raw) {
|
|
56
|
+
var h = resolveFloorRoomCardHolder(raw);
|
|
57
|
+
var fromRaw = formatFloorRoomCardGuestDisplayLine(h, showPhoneOnRow).trim() || formatFloorRoomCardGuestDisplayLine(h, true).trim();
|
|
58
|
+
if (fromRaw) return fromRaw;
|
|
59
|
+
}
|
|
60
|
+
return formatFloorRoomCardNextGuestStripLine(nextBooking).trim();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** 在 `floorMapSourceBookings` 中定位 Next 对应 raw,供联系人解析与列表同源 */
|
|
64
|
+
function resolveFloorRawForNextBooking(row, nextBooking) {
|
|
65
|
+
var _nextBooking$booking_;
|
|
66
|
+
var src = row.floorMapSourceBookings;
|
|
67
|
+
if (!Array.isArray(src) || src.length === 0) return undefined;
|
|
68
|
+
var wantBid = String((_nextBooking$booking_ = nextBooking.booking_id) !== null && _nextBooking$booking_ !== void 0 ? _nextBooking$booking_ : '').trim();
|
|
69
|
+
if (wantBid && !wantBid.startsWith('syn_')) {
|
|
70
|
+
var byId = src.find(function (x) {
|
|
71
|
+
var _ref, _r$booking_id;
|
|
72
|
+
var r = x;
|
|
73
|
+
var id = String((_ref = (_r$booking_id = r.booking_id) !== null && _r$booking_id !== void 0 ? _r$booking_id : r.id) !== null && _ref !== void 0 ? _ref : '').trim();
|
|
74
|
+
return id !== '' && id === wantBid;
|
|
75
|
+
});
|
|
76
|
+
if (byId) return byId;
|
|
77
|
+
}
|
|
78
|
+
var byNext = src.find(function (x) {
|
|
79
|
+
var _r$is_next;
|
|
80
|
+
var r = x;
|
|
81
|
+
var n = (_r$is_next = r.is_next) !== null && _r$is_next !== void 0 ? _r$is_next : r.isNext;
|
|
82
|
+
return n === true || n === 'true' || n === 1 || n === '1';
|
|
83
|
+
});
|
|
84
|
+
return byNext;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Next 与平面图 RoomCard 同源:`mapPisellReservationRowToFloorRoomCardData` 后走
|
|
89
|
+
* {@link resolveFloorRoomCardNextBookingLikeBodyModel}(优先接口 `is_next`/`isNext`,再退化链)。
|
|
90
|
+
*/
|
|
91
|
+
function inferResourceWallNextList(row) {
|
|
92
|
+
var roomTitle = String(row.code || row.main_field || row.id || '').trim();
|
|
93
|
+
var data = mapPisellReservationRowToFloorRoomCardData(row, roomTitle);
|
|
94
|
+
var nextBooking = resolveFloorRoomCardNextBookingLikeBodyModel(data, Date.now());
|
|
95
|
+
if (!nextBooking) return undefined;
|
|
96
|
+
var booking = formatResourceWallNextBookingGuestLine(row, nextBooking).trim();
|
|
97
|
+
var time = formatFloorRoomCardBookingTimeRange(nextBooking).trim();
|
|
98
|
+
if (!booking && !time) return undefined;
|
|
99
|
+
return [{
|
|
100
|
+
time: time || '—',
|
|
101
|
+
booking: booking || '—',
|
|
102
|
+
startInMin: 0
|
|
103
|
+
}];
|
|
104
|
+
}
|
|
105
|
+
function mapReservationTableRowToVenueWallCard(row) {
|
|
106
|
+
var _row$time, _row$timeEnd;
|
|
107
|
+
var cardStatus = row.cardStatus;
|
|
108
|
+
var isAvailable = cardStatus === 'available' || cardStatus === 'maintenance';
|
|
109
|
+
var nowMs = Date.now();
|
|
110
|
+
var nextList = inferResourceWallNextList(row);
|
|
111
|
+
var roomTitle = String(row.code || row.main_field || row.id || '').trim();
|
|
112
|
+
var roomData = mapPisellReservationRowToFloorRoomCardData(row, roomTitle);
|
|
113
|
+
var primary = getFloorRoomCardPrimaryBooking(roomData);
|
|
114
|
+
var currentTimeFromPrimary = primary ? formatFloorRoomCardBookingTimeRange(primary).trim() : '';
|
|
115
|
+
var start = String((_row$time = row.time) !== null && _row$time !== void 0 ? _row$time : '').trim();
|
|
116
|
+
var end = String((_row$timeEnd = row.timeEnd) !== null && _row$timeEnd !== void 0 ? _row$timeEnd : '').trim();
|
|
117
|
+
var currentTimeFallback = start && end ? "".concat(start.replace(/ .*/, ''), " - ").concat(end.replace(/ .*/, '')) : start || '';
|
|
118
|
+
var currentTime = currentTimeFromPrimary || currentTimeFallback;
|
|
119
|
+
var status = 'available';
|
|
120
|
+
var remainingMin = undefined;
|
|
121
|
+
var startsInMin = undefined;
|
|
122
|
+
var lateMin = undefined;
|
|
123
|
+
if (!isAvailable && primary) {
|
|
124
|
+
var host = primary.hostBookingStatus;
|
|
125
|
+
if (host === 'reserved') {
|
|
126
|
+
var _floorRoomCardBooking = floorRoomCardBookingStartEndMs(primary),
|
|
127
|
+
s = _floorRoomCardBooking.start;
|
|
128
|
+
if (Number.isFinite(s)) {
|
|
129
|
+
var diffMin = Math.ceil((s - nowMs) / 60000);
|
|
130
|
+
if (diffMin <= 0) {
|
|
131
|
+
status = 'late';
|
|
132
|
+
lateMin = Math.max(0, Math.ceil((nowMs - s) / 60000));
|
|
133
|
+
} else {
|
|
134
|
+
status = 'boardingSoon';
|
|
135
|
+
startsInMin = Math.max(0, diffMin);
|
|
136
|
+
}
|
|
137
|
+
} else {
|
|
138
|
+
/** 无 start:按 reserved 直接归 boardingSoon */
|
|
139
|
+
status = 'boardingSoon';
|
|
140
|
+
}
|
|
141
|
+
} else if (host === 'occupied') {
|
|
142
|
+
var _floorRoomCardBooking2 = floorRoomCardBookingStartEndMs(primary),
|
|
143
|
+
e = _floorRoomCardBooking2.end;
|
|
144
|
+
if (Number.isFinite(e)) {
|
|
145
|
+
var _diffMin = Math.ceil((e - nowMs) / 60000);
|
|
146
|
+
remainingMin = _diffMin;
|
|
147
|
+
if (_diffMin <= 0) status = 'expired';else if (_diffMin <= 10) status = 'endingSoon';else status = 'inUse';
|
|
148
|
+
} else {
|
|
149
|
+
status = 'inUse';
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
} else if (!isAvailable) {
|
|
153
|
+
/**
|
|
154
|
+
* 无 primary booking(例如数据不完整)时:尽量不做字段猜测,保底显示 available。
|
|
155
|
+
* 业务侧若需强展示请补齐 booking start/end 与 hostBookingStatus。
|
|
156
|
+
*/
|
|
157
|
+
status = 'available';
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
resourceId: String(row.id),
|
|
161
|
+
resource: row.code || row.main_field || String(row.id),
|
|
162
|
+
area: row.area,
|
|
163
|
+
status: status,
|
|
164
|
+
currentTime: currentTime,
|
|
165
|
+
currentBooking: isAvailable ? 'Available to Book' : formatResourceWallContactLine(row),
|
|
166
|
+
remainingMin: remainingMin,
|
|
167
|
+
startsInMin: startsInMin,
|
|
168
|
+
lateMin: lateMin,
|
|
169
|
+
nextList: nextList
|
|
170
|
+
};
|
|
171
|
+
}
|
|
@@ -74,7 +74,7 @@ export function readBodyViewFromStorageKey(key) {
|
|
|
74
74
|
if (typeof window === 'undefined' || !key) return 'floorMap';
|
|
75
75
|
try {
|
|
76
76
|
var raw = localStorage.getItem(key);
|
|
77
|
-
if (raw === 'grid' || raw === 'floorMap' || raw === 'calendar') return raw;
|
|
77
|
+
if (raw === 'grid' || raw === 'floorMap' || raw === 'calendar' || raw === 'resourceWall') return raw;
|
|
78
78
|
} catch (_unused) {
|
|
79
79
|
/* quota / private mode */
|
|
80
80
|
}
|
|
@@ -349,6 +349,66 @@ export var defaultReservationTableRows = [{
|
|
|
349
349
|
code: 'B-7',
|
|
350
350
|
area: 'Bar',
|
|
351
351
|
cardStatus: 'maintenance'
|
|
352
|
+
},
|
|
353
|
+
// --- 大屏资源墙演示:名称带 Mock· 前缀,便于在筛选里勾选对比 ---
|
|
354
|
+
{
|
|
355
|
+
id: 'mock-rw-available',
|
|
356
|
+
code: 'Mock·空场(绿)',
|
|
357
|
+
area: 'WallDemo',
|
|
358
|
+
cardStatus: 'available'
|
|
359
|
+
}, {
|
|
360
|
+
id: 'mock-rw-ending',
|
|
361
|
+
code: 'Mock·将结束(橙)',
|
|
362
|
+
area: 'WallDemo',
|
|
363
|
+
cardStatus: 'occupied',
|
|
364
|
+
guestName: '倒计时≤10分',
|
|
365
|
+
time: '14:00',
|
|
366
|
+
delayMinutes: 56
|
|
367
|
+
}, {
|
|
368
|
+
id: 'mock-rw-expired',
|
|
369
|
+
code: 'Mock·已超时(红)',
|
|
370
|
+
area: 'WallDemo',
|
|
371
|
+
cardStatus: 'occupied',
|
|
372
|
+
guestName: '应已清场',
|
|
373
|
+
time: '11:00',
|
|
374
|
+
delayMinutes: 60
|
|
375
|
+
}, {
|
|
376
|
+
id: 'mock-rw-maint',
|
|
377
|
+
code: 'Mock·维护态',
|
|
378
|
+
area: 'WallDemo',
|
|
379
|
+
cardStatus: 'maintenance',
|
|
380
|
+
capacityLabel: '8p'
|
|
381
|
+
}, {
|
|
382
|
+
id: 'mock-rw-lights-off',
|
|
383
|
+
code: 'Mock·灯已关',
|
|
384
|
+
area: 'WallDemo',
|
|
385
|
+
cardStatus: 'occupied',
|
|
386
|
+
guestName: '场上无人',
|
|
387
|
+
time: '13:00',
|
|
388
|
+
delayMinutes: 30,
|
|
389
|
+
resourceWallLightState: 'off'
|
|
390
|
+
}, {
|
|
391
|
+
id: 'mock-rw-lights-off-soon',
|
|
392
|
+
code: 'Mock·即将关灯',
|
|
393
|
+
area: 'WallDemo',
|
|
394
|
+
cardStatus: 'occupied',
|
|
395
|
+
guestName: '场上进行中',
|
|
396
|
+
time: '15:00',
|
|
397
|
+
delayMinutes: 25,
|
|
398
|
+
resourceWallLightState: 'on_soon_off',
|
|
399
|
+
resourceWallLightOffInMin: 6
|
|
400
|
+
}, {
|
|
401
|
+
id: 'mock-rw-lights-on-soon',
|
|
402
|
+
code: 'Mock·即将开灯',
|
|
403
|
+
area: 'WallDemo',
|
|
404
|
+
cardStatus: 'booked',
|
|
405
|
+
guestName: '下一场将开',
|
|
406
|
+
time: '16:00',
|
|
407
|
+
startsInMinutes: 12,
|
|
408
|
+
resourceWallLightState: 'off_soon_on',
|
|
409
|
+
resourceWallLightOnInMin: 8,
|
|
410
|
+
nextGuest: '下一场·李娜',
|
|
411
|
+
nextTime: '16:00'
|
|
352
412
|
}];
|
|
353
413
|
var DS = 'tables';
|
|
354
414
|
var CANVAS_MAIN = 'main';
|
|
@@ -632,6 +692,106 @@ export var defaultReservationSceneElements = [{
|
|
|
632
692
|
dataSourceKey: DS,
|
|
633
693
|
recordId: 'b7'
|
|
634
694
|
}
|
|
695
|
+
},
|
|
696
|
+
// 与 defaultReservationTableRows 中 mock-rw-* 对齐,进入日历/资源墙资源顺序与平面图绑定
|
|
697
|
+
{
|
|
698
|
+
instanceId: 'res_mock_rw_available',
|
|
699
|
+
canvasId: CANVAS_MAIN,
|
|
700
|
+
x: 30,
|
|
701
|
+
y: 560,
|
|
702
|
+
width: 100,
|
|
703
|
+
height: 80,
|
|
704
|
+
name: 'Mock·空场',
|
|
705
|
+
zIndex: 0,
|
|
706
|
+
elementKind: RESERVATION_BOUND_TABLE_ELEMENT_KIND,
|
|
707
|
+
dataBinding: {
|
|
708
|
+
dataSourceKey: DS,
|
|
709
|
+
recordId: 'mock-rw-available'
|
|
710
|
+
}
|
|
711
|
+
}, {
|
|
712
|
+
instanceId: 'res_mock_rw_ending',
|
|
713
|
+
canvasId: CANVAS_MAIN,
|
|
714
|
+
x: 148,
|
|
715
|
+
y: 560,
|
|
716
|
+
width: 100,
|
|
717
|
+
height: 80,
|
|
718
|
+
name: 'Mock·将结束',
|
|
719
|
+
zIndex: 0,
|
|
720
|
+
elementKind: RESERVATION_BOUND_TABLE_ELEMENT_KIND,
|
|
721
|
+
dataBinding: {
|
|
722
|
+
dataSourceKey: DS,
|
|
723
|
+
recordId: 'mock-rw-ending'
|
|
724
|
+
}
|
|
725
|
+
}, {
|
|
726
|
+
instanceId: 'res_mock_rw_expired',
|
|
727
|
+
canvasId: CANVAS_MAIN,
|
|
728
|
+
x: 266,
|
|
729
|
+
y: 560,
|
|
730
|
+
width: 100,
|
|
731
|
+
height: 80,
|
|
732
|
+
name: 'Mock·超时',
|
|
733
|
+
zIndex: 0,
|
|
734
|
+
elementKind: RESERVATION_BOUND_TABLE_ELEMENT_KIND,
|
|
735
|
+
dataBinding: {
|
|
736
|
+
dataSourceKey: DS,
|
|
737
|
+
recordId: 'mock-rw-expired'
|
|
738
|
+
}
|
|
739
|
+
}, {
|
|
740
|
+
instanceId: 'res_mock_rw_maint',
|
|
741
|
+
canvasId: CANVAS_MAIN,
|
|
742
|
+
x: 384,
|
|
743
|
+
y: 560,
|
|
744
|
+
width: 100,
|
|
745
|
+
height: 80,
|
|
746
|
+
name: 'Mock·维护',
|
|
747
|
+
zIndex: 0,
|
|
748
|
+
elementKind: RESERVATION_BOUND_TABLE_ELEMENT_KIND,
|
|
749
|
+
dataBinding: {
|
|
750
|
+
dataSourceKey: DS,
|
|
751
|
+
recordId: 'mock-rw-maint'
|
|
752
|
+
}
|
|
753
|
+
}, {
|
|
754
|
+
instanceId: 'res_mock_rw_lights_off',
|
|
755
|
+
canvasId: CANVAS_MAIN,
|
|
756
|
+
x: 502,
|
|
757
|
+
y: 560,
|
|
758
|
+
width: 100,
|
|
759
|
+
height: 80,
|
|
760
|
+
name: 'Mock·灯关',
|
|
761
|
+
zIndex: 0,
|
|
762
|
+
elementKind: RESERVATION_BOUND_TABLE_ELEMENT_KIND,
|
|
763
|
+
dataBinding: {
|
|
764
|
+
dataSourceKey: DS,
|
|
765
|
+
recordId: 'mock-rw-lights-off'
|
|
766
|
+
}
|
|
767
|
+
}, {
|
|
768
|
+
instanceId: 'res_mock_rw_lights_off_soon',
|
|
769
|
+
canvasId: CANVAS_MAIN,
|
|
770
|
+
x: 620,
|
|
771
|
+
y: 560,
|
|
772
|
+
width: 100,
|
|
773
|
+
height: 80,
|
|
774
|
+
name: 'Mock·将关灯',
|
|
775
|
+
zIndex: 0,
|
|
776
|
+
elementKind: RESERVATION_BOUND_TABLE_ELEMENT_KIND,
|
|
777
|
+
dataBinding: {
|
|
778
|
+
dataSourceKey: DS,
|
|
779
|
+
recordId: 'mock-rw-lights-off-soon'
|
|
780
|
+
}
|
|
781
|
+
}, {
|
|
782
|
+
instanceId: 'res_mock_rw_lights_on_soon',
|
|
783
|
+
canvasId: CANVAS_MAIN,
|
|
784
|
+
x: 738,
|
|
785
|
+
y: 560,
|
|
786
|
+
width: 100,
|
|
787
|
+
height: 80,
|
|
788
|
+
name: 'Mock·将开灯',
|
|
789
|
+
zIndex: 0,
|
|
790
|
+
elementKind: RESERVATION_BOUND_TABLE_ELEMENT_KIND,
|
|
791
|
+
dataBinding: {
|
|
792
|
+
dataSourceKey: DS,
|
|
793
|
+
recordId: 'mock-rw-lights-on-soon'
|
|
794
|
+
}
|
|
635
795
|
}];
|
|
636
796
|
|
|
637
797
|
/** 由 sceneElements 派生的落位摘要(数值与 sceneElements 一致,均为像素;兼容旧引用) */
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { locales } from '@pisell/utils';
|
|
5
5
|
import { floorRoomCardBookingCheckoutDomKey } from "./floorRoomCardDom";
|
|
6
6
|
import { floorRoomCardPaymentUiFromOrderStatus } from "./floorRoomCardPaymentUi";
|
|
7
|
-
import { formatFloorRoomCardBookingEndLine, formatFloorRoomCardBookingStartLine, formatFloorRoomCardBookingTimeRange, formatFloorRoomCardDurationMinutes,
|
|
7
|
+
import { formatFloorRoomCardBookingEndLine, formatFloorRoomCardBookingStartLine, formatFloorRoomCardBookingTimeRange, formatFloorRoomCardDurationMinutes, formatFloorRoomCardNextGuestStripLine, maskPisellReservationPhoneTail, resolveFloorRoomCardNextBookingLikeBodyModel, resolveFloorRoomCardProgressPercent, resolveFloorRoomCardReservedCountdownMinutes, resolveFloorRoomCardReservedCountdownMinutesForBooking } from "./floorRoomCardUtils";
|
|
8
8
|
var I18N_END = 'pisell-reservation.room-time-end';
|
|
9
9
|
var I18N_START = 'pisell-reservation.room-time-start';
|
|
10
10
|
var I18N_IN = 'pisell-reservation.room-in-minutes';
|
|
@@ -40,7 +40,7 @@ function paymentLabelKey(kind) {
|
|
|
40
40
|
return I18N_PAYMENT_NEEDED;
|
|
41
41
|
}
|
|
42
42
|
export function buildRoomCardBodyViewModel(params) {
|
|
43
|
-
var _params$shellShape, _params$nowMs, _booking$end_time,
|
|
43
|
+
var _params$shellShape, _params$nowMs, _booking$end_time, _holder$name$trim, _holder$name2, _booking$product_quan;
|
|
44
44
|
var cardType = params.cardType,
|
|
45
45
|
booking = params.booking,
|
|
46
46
|
data = params.data,
|
|
@@ -63,7 +63,7 @@ export function buildRoomCardBodyViewModel(params) {
|
|
|
63
63
|
var occupiedTimeoutOverrun = cardType === 'timeout' && timeoutDurationLabel ? "+".concat(timeoutDurationLabel) : null;
|
|
64
64
|
var paymentKind = floorRoomCardPaymentUiFromOrderStatus(booking.order_payment_status);
|
|
65
65
|
var isTimeout = cardType === 'timeout';
|
|
66
|
-
var nextBooking = (
|
|
66
|
+
var nextBooking = resolveFloorRoomCardNextBookingLikeBodyModel(data, nowMs);
|
|
67
67
|
var holder = booking.holder;
|
|
68
68
|
var name = (_holder$name$trim = holder === null || holder === void 0 || (_holder$name2 = holder.name) === null || _holder$name2 === void 0 ? void 0 : _holder$name2.trim()) !== null && _holder$name$trim !== void 0 ? _holder$name$trim : '';
|
|
69
69
|
var maskedPhone = showPhone && holder !== null && holder !== void 0 && holder.phone ? maskPisellReservationPhoneTail(holder.phone) : null;
|
|
@@ -71,7 +71,7 @@ export function buildRoomCardBodyViewModel(params) {
|
|
|
71
71
|
var nextGuestLine = null;
|
|
72
72
|
var nextTimeRange = null;
|
|
73
73
|
if (nextBooking) {
|
|
74
|
-
nextGuestLine =
|
|
74
|
+
nextGuestLine = formatFloorRoomCardNextGuestStripLine(nextBooking) || null;
|
|
75
75
|
nextTimeRange = formatFloorRoomCardBookingTimeRange(nextBooking);
|
|
76
76
|
}
|
|
77
77
|
var progressPercent = resolveFloorRoomCardProgressPercent(booking);
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { PisellReservationTableRow } from '../types';
|
|
2
2
|
import type { FloorRoomCardBooking, FloorRoomCardData } from './floorRoomCardModel';
|
|
3
|
+
/** 统一的起止毫秒(供资源墙/卡片兼容层复用,避免重复推断) */
|
|
4
|
+
export declare function floorRoomCardBookingStartEndMs(booking: Pick<FloorRoomCardBooking, 'start_date' | 'start_time' | 'end_date' | 'end_time'>): {
|
|
5
|
+
start: number;
|
|
6
|
+
end: number;
|
|
7
|
+
};
|
|
3
8
|
/**
|
|
4
9
|
* 预留态时间行:图元内仅展示时刻 + 文案后缀,不展示开始日期。
|
|
5
10
|
*/
|
|
@@ -65,6 +70,19 @@ export declare function getFloorRoomCardNextAfterPrimaryReserved(data: FloorRoom
|
|
|
65
70
|
* 接口标记 `isNext` 的预约:按开始时间取第一条,供 Next 行展示。
|
|
66
71
|
*/
|
|
67
72
|
export declare function getFloorRoomCardExplicitNextBooking(data: FloorRoomCardData): FloorRoomCardBooking | null;
|
|
73
|
+
/**
|
|
74
|
+
* 与 {@link buildCardBodyViewModel} Next 行同一套优先级:接口 `is_next`/`isNext` →
|
|
75
|
+
* 单 occupied 后一条 → 多条 reserved 第二条 →「进行中」后首条未开始。
|
|
76
|
+
*/
|
|
77
|
+
export declare function resolveFloorRoomCardNextBookingLikeBodyModel(data: FloorRoomCardData, nowMs?: number): FloorRoomCardBooking | null;
|
|
78
|
+
/** Next 条客人一行:与 FloorRoomCardFromData `nextGuestLineForStrip` 一致 */
|
|
79
|
+
export declare function formatFloorRoomCardNextGuestStripLine(b: FloorRoomCardBooking): string;
|
|
80
|
+
/**
|
|
81
|
+
* 联系人展示一行:与 `buildCardBodyViewModel` 的 `guestDisplayLine` 一致。
|
|
82
|
+
* - 优先姓名
|
|
83
|
+
* - 预留态可展示手机号尾号(脱敏)
|
|
84
|
+
*/
|
|
85
|
+
export declare function formatFloorRoomCardGuestDisplayLine(holder: FloorRoomCardBooking['holder'], showPhone: boolean): string;
|
|
68
86
|
/**
|
|
69
87
|
* 主区域展示用:第一条非 `isNext`;若全部为 next 则回退首条。
|
|
70
88
|
*/
|