@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.
Files changed (129) hide show
  1. package/build/lowcode/assets-daily.json +11 -11
  2. package/build/lowcode/assets-dev.json +2 -2
  3. package/build/lowcode/assets-prod.json +11 -11
  4. package/build/lowcode/meta.js +1 -1
  5. package/build/lowcode/render/default/view.js +1 -1
  6. package/build/lowcode/view.js +1 -1
  7. package/es/components/appointmentBooking/components/TimeSlicing/components/SelectDateOS.d.ts +0 -1
  8. package/es/components/booking/hooks/useClearCart.d.ts +0 -1
  9. package/es/components/booking/info/notes/index.d.ts +0 -1
  10. package/es/components/ecocup/components/AddCustomerModal/index.d.ts +1 -0
  11. package/es/components/ecocup/components/CupActionList/index.d.ts +1 -0
  12. package/es/components/ecocup/components/CupActionModal/index.d.ts +1 -0
  13. package/es/components/ecocup/components/CupInfoCard/index.d.ts +1 -0
  14. package/es/components/ecocup/components/CupStatusModal/index.d.ts +1 -0
  15. package/es/components/ecocup/components/CustomerAndCupModal/index.d.ts +1 -0
  16. package/es/components/ecocup/components/CustomerCard/index.d.ts +1 -0
  17. package/es/components/ecocup/components/MoreDropdown/index.d.ts +1 -0
  18. package/es/components/ecocup/components/SearchBar/index.d.ts +1 -0
  19. package/es/components/ecocup/components/SettingModal/index.d.ts +1 -0
  20. package/es/components/ecocup/cupList/hooks/useColumns.d.ts +1 -0
  21. package/es/components/ecocup/cupList/hooks/useSummary.d.ts +1 -0
  22. package/es/components/eftpos/hooks.d.ts +1 -0
  23. package/es/components/eftpos/index.d.ts +1 -0
  24. package/es/components/eftposPay/component/fail/network.d.ts +0 -1
  25. package/es/components/eftposPay/component/fail/unknow.d.ts +0 -1
  26. package/es/components/eftposPay/component/signature/index.d.ts +0 -1
  27. package/es/components/eftposPay/store/index.d.ts +1 -1
  28. package/es/components/eftposPay/tip.d.ts +0 -1
  29. package/es/components/eftposPay/windcave/receiptAction.d.ts +0 -1
  30. package/es/components/shoppingCart/hooks/useClearCart.d.ts +0 -1
  31. package/es/plus/clinetSearch/Add/BirthdayField/index.d.ts +1 -0
  32. package/es/plus/clinetSearch/Add/GenderField/index.d.ts +1 -0
  33. package/es/plus/clinetSearch/Add/PhoneField/index.d.ts +1 -0
  34. package/es/plus/orderList/components/HandleActions.d.ts +1 -0
  35. package/es/plus/orderList/components/QuickFilter.d.ts +1 -0
  36. package/es/plus/orderList/components/Reset.d.ts +1 -0
  37. package/es/plus/orderList/components/Toolbar.d.ts +1 -0
  38. package/es/plus/pisellReservation/PisellReservation.js +369 -41
  39. package/es/plus/pisellReservation/components/PisellReservationSubcomponents.d.ts +7 -6
  40. package/es/plus/pisellReservation/components/PisellReservationSubcomponents.js +25 -12
  41. package/es/plus/pisellReservation/components/ReservationResourceWallResourceSelect.d.ts +14 -0
  42. package/es/plus/pisellReservation/components/ReservationResourceWallResourceSelect.js +30 -0
  43. package/es/plus/pisellReservation/components/bookingDetailModal/ReservationBookingDetailModal.js +5 -5
  44. package/es/plus/pisellReservation/data/bookingToReservationTables.d.ts +4 -0
  45. package/es/plus/pisellReservation/data/bookingToReservationTables.js +12 -4
  46. package/es/plus/pisellReservation/data/mapReservationToVenueWallCards.d.ts +6 -0
  47. package/es/plus/pisellReservation/data/mapReservationToVenueWallCards.js +171 -0
  48. package/es/plus/pisellReservation/data/reservationDataUtils.js +1 -1
  49. package/es/plus/pisellReservation/floorMap/reservationMock.js +160 -0
  50. package/es/plus/pisellReservation/floorRoomCard/buildCardBodyViewModel.js +4 -4
  51. package/es/plus/pisellReservation/floorRoomCard/floorRoomCardUtils.d.ts +18 -0
  52. package/es/plus/pisellReservation/floorRoomCard/floorRoomCardUtils.js +44 -0
  53. package/es/plus/pisellReservation/hooks/useReservationScheduleDebounced.d.ts +3 -3
  54. package/es/plus/pisellReservation/locales/locales-ja.d.ts +5 -0
  55. package/es/plus/pisellReservation/locales/locales-ja.js +5 -0
  56. package/es/plus/pisellReservation/locales/locales-pt.d.ts +5 -0
  57. package/es/plus/pisellReservation/locales/locales-pt.js +5 -0
  58. package/es/plus/pisellReservation/locales/locales.d.ts +17 -0
  59. package/es/plus/pisellReservation/locales/locales.js +7 -0
  60. package/es/plus/pisellReservation/reservationConstants.d.ts +23 -5
  61. package/es/plus/pisellReservation/reservationConstants.js +7 -0
  62. package/es/plus/pisellReservation/types.d.ts +4 -0
  63. package/es/plus/saasAttendance/settings/components/membersField/index.d.ts +1 -0
  64. package/es/plus/skuOptionsSelection/components/OptionsCard/index.d.ts +1 -0
  65. package/es/plus/walletPassGallery/components/timelineSection/index.d.ts +1 -0
  66. package/es/pro/Selector/demo.d.ts +1 -0
  67. package/es/pro/pisellPhoneKeyboard/index.d.ts +1 -0
  68. package/lib/components/appointmentBooking/components/TimeSlicing/components/SelectDateOS.d.ts +0 -1
  69. package/lib/components/booking/hooks/useClearCart.d.ts +0 -1
  70. package/lib/components/booking/info/notes/index.d.ts +0 -1
  71. package/lib/components/ecocup/components/AddCustomerModal/index.d.ts +1 -0
  72. package/lib/components/ecocup/components/CupActionList/index.d.ts +1 -0
  73. package/lib/components/ecocup/components/CupActionModal/index.d.ts +1 -0
  74. package/lib/components/ecocup/components/CupInfoCard/index.d.ts +1 -0
  75. package/lib/components/ecocup/components/CupStatusModal/index.d.ts +1 -0
  76. package/lib/components/ecocup/components/CustomerAndCupModal/index.d.ts +1 -0
  77. package/lib/components/ecocup/components/CustomerCard/index.d.ts +1 -0
  78. package/lib/components/ecocup/components/MoreDropdown/index.d.ts +1 -0
  79. package/lib/components/ecocup/components/SearchBar/index.d.ts +1 -0
  80. package/lib/components/ecocup/components/SettingModal/index.d.ts +1 -0
  81. package/lib/components/ecocup/cupList/hooks/useColumns.d.ts +1 -0
  82. package/lib/components/ecocup/cupList/hooks/useSummary.d.ts +1 -0
  83. package/lib/components/eftpos/hooks.d.ts +1 -0
  84. package/lib/components/eftpos/index.d.ts +1 -0
  85. package/lib/components/eftposPay/component/fail/network.d.ts +0 -1
  86. package/lib/components/eftposPay/component/fail/unknow.d.ts +0 -1
  87. package/lib/components/eftposPay/component/signature/index.d.ts +0 -1
  88. package/lib/components/eftposPay/store/index.d.ts +1 -1
  89. package/lib/components/eftposPay/tip.d.ts +0 -1
  90. package/lib/components/eftposPay/windcave/receiptAction.d.ts +0 -1
  91. package/lib/components/shoppingCart/hooks/useClearCart.d.ts +0 -1
  92. package/lib/plus/clinetSearch/Add/BirthdayField/index.d.ts +1 -0
  93. package/lib/plus/clinetSearch/Add/GenderField/index.d.ts +1 -0
  94. package/lib/plus/clinetSearch/Add/PhoneField/index.d.ts +1 -0
  95. package/lib/plus/orderList/components/HandleActions.d.ts +1 -0
  96. package/lib/plus/orderList/components/QuickFilter.d.ts +1 -0
  97. package/lib/plus/orderList/components/Reset.d.ts +1 -0
  98. package/lib/plus/orderList/components/Toolbar.d.ts +1 -0
  99. package/lib/plus/pisellReservation/PisellReservation.js +312 -12
  100. package/lib/plus/pisellReservation/components/PisellReservationSubcomponents.d.ts +7 -6
  101. package/lib/plus/pisellReservation/components/PisellReservationSubcomponents.js +18 -5
  102. package/lib/plus/pisellReservation/components/ReservationResourceWallResourceSelect.d.ts +14 -0
  103. package/lib/plus/pisellReservation/components/ReservationResourceWallResourceSelect.js +60 -0
  104. package/lib/plus/pisellReservation/components/bookingDetailModal/ReservationBookingDetailModal.js +1 -1
  105. package/lib/plus/pisellReservation/data/bookingToReservationTables.d.ts +4 -0
  106. package/lib/plus/pisellReservation/data/bookingToReservationTables.js +16 -9
  107. package/lib/plus/pisellReservation/data/mapReservationToVenueWallCards.d.ts +6 -0
  108. package/lib/plus/pisellReservation/data/mapReservationToVenueWallCards.js +160 -0
  109. package/lib/plus/pisellReservation/data/reservationDataUtils.js +2 -1
  110. package/lib/plus/pisellReservation/floorMap/reservationMock.js +151 -0
  111. package/lib/plus/pisellReservation/floorRoomCard/buildCardBodyViewModel.js +5 -2
  112. package/lib/plus/pisellReservation/floorRoomCard/floorRoomCardUtils.d.ts +18 -0
  113. package/lib/plus/pisellReservation/floorRoomCard/floorRoomCardUtils.js +40 -0
  114. package/lib/plus/pisellReservation/hooks/useReservationScheduleDebounced.d.ts +3 -3
  115. package/lib/plus/pisellReservation/locales/locales-ja.d.ts +5 -0
  116. package/lib/plus/pisellReservation/locales/locales-ja.js +5 -0
  117. package/lib/plus/pisellReservation/locales/locales-pt.d.ts +5 -0
  118. package/lib/plus/pisellReservation/locales/locales-pt.js +5 -0
  119. package/lib/plus/pisellReservation/locales/locales.d.ts +17 -0
  120. package/lib/plus/pisellReservation/locales/locales.js +7 -0
  121. package/lib/plus/pisellReservation/reservationConstants.d.ts +23 -5
  122. package/lib/plus/pisellReservation/reservationConstants.js +12 -0
  123. package/lib/plus/pisellReservation/types.d.ts +4 -0
  124. package/lib/plus/saasAttendance/settings/components/membersField/index.d.ts +1 -0
  125. package/lib/plus/skuOptionsSelection/components/OptionsCard/index.d.ts +1 -0
  126. package/lib/plus/walletPassGallery/components/timelineSection/index.d.ts +1 -0
  127. package/lib/pro/Selector/demo.d.ts +1 -0
  128. package/lib/pro/pisellPhoneKeyboard/index.d.ts +1 -0
  129. 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`:把当前 grid/floorMap 同步到父组件 ref,供 debounce effect 读 bodyView;
9
+ * - `RecordBoardBodyViewCapture`:同步 bodyView ref,并可通知宿主;
10
10
  * - `ScheduleSyncOnFloorEnter`:从表格回到平面图/日历、或从日历回到平面图时,用当前营业日 patch 列表时间窗口;
11
- * - `PisellReservationToolbarTabs`:平面图下的日程带 + 表格/平面图 Segmented
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:仅将 RecordBoard Context 中的 `bodyView` 写入 ref */
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
- }, [bodyView, props.bodyViewRef]);
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:平面图下为日程带 + 时间轴 + 标题旁切换;表格下不展示 ScheduleBand,
55
- * 切换器由 RecordBoard 工具栏顶行(Find 左侧)承担,与历史行为一致。
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 bodyViewOptionCount = (hasGrid ? 1 : 0) + (canFloor ? 1 : 0) + (canCalendar ? 1 : 0);
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
+ }
@@ -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 _ref = ((_engineContext$appHel = engineContext.appHelper) === null || _engineContext$appHel === void 0 ? void 0 : _engineContext$appHel.utils) || {},
141
- action = _ref.action,
142
- NativePage = _ref.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
- function formatBookingTime(record) {
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 = _toConsumableArray(group).sort(function (a, b) {
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, getFloorRoomCardExplicitNextBooking, getFloorRoomCardNextAfterPrimaryReserved, getFloorRoomCardNextAfterSingleOccupiedBooking, getFloorRoomCardNextNotStartedBooking, maskPisellReservationPhoneTail, resolveFloorRoomCardProgressPercent, resolveFloorRoomCardReservedCountdownMinutes, resolveFloorRoomCardReservedCountdownMinutesForBooking } from "./floorRoomCardUtils";
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, _ref, _ref2, _getFloorRoomCardExpl, _holder$name$trim, _holder$name2, _booking$product_quan;
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 = (_ref = (_ref2 = (_getFloorRoomCardExpl = getFloorRoomCardExplicitNextBooking(data)) !== null && _getFloorRoomCardExpl !== void 0 ? _getFloorRoomCardExpl : getFloorRoomCardNextAfterSingleOccupiedBooking(data)) !== null && _ref2 !== void 0 ? _ref2 : getFloorRoomCardNextAfterPrimaryReserved(data)) !== null && _ref !== void 0 ? _ref : getFloorRoomCardNextNotStartedBooking(data, nowMs);
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 = guestDisplayLine(nextBooking.holder, true) || null;
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
  */