import { type Dayjs } from 'dayjs'; import { type TimeRangeOption } from '@pisell/materials'; /** 避免 `?? []` 每次 render 新数组引用,触发依赖 list 的 effect 死循环 */ export declare const EMPTY_RESERVATION_LIST: unknown[]; export declare function bookingWindowClockOrDefault(operatingDayBoundary?: unknown): string; /** * 营业日锚定:`core.operating_day_boundary`。 * - `start_time`:选中日 D 的营业窗为 [D 界钟, 次日同钟); * - `end_time`:选中日 D 表示营业在 D 的界钟结束,窗为 [D−1 界钟, D 界钟); * 无有效界钟时与 {@link RESERVATION_TIMELINE_BUSINESS_RANGE} 一致(02:00)。 */ export declare function bookingTimeWindowForAnchorDay(anchorDay: Dayjs, operatingDayBoundary?: unknown): [Dayjs, Dayjs]; /** * 平面图 / 列表 `booking_time_start_between` 与时间轴可视营业窗对齐。 * * - 顶栏日历日 == 自然「今天」:与 TimeNavigator 一致,用 {@link pickReferenceDateContainingNow} * + {@link getRangeBounds}(保证凌晨仍落在上一营业日窗内的预约能进画布); * - 其它选中日:仍用 {@link bookingTimeWindowForAnchorDay}(按营业边界类型锚定)。 */ export declare function bookingTimeWindowForReservationView(scheduleDate: Dayjs, operatingDayBoundary: unknown | undefined, timelineRange?: TimeRangeOption, /** 墙钟;须与 TimeNavigator 内 `pickReferenceDateContainingNow(range, dayjs())` 一致,勿用游标 `at` */ wallClock?: Dayjs): [Dayjs, Dayjs]; /** * 日历跨日视口:与单日营业窗按日首尾相接。 * - `start_time`:rangeStart 界钟 → rangeEnd 次日界钟; * - `end_time`:rangeStart−1 日界钟 → rangeEnd 当日界钟。 */ export declare function bookingTimeWindowForCalendarRange(rangeStart: Date, rangeEnd: Date, operatingDayBoundary?: unknown): [Dayjs, Dayjs]; /** * Monitor / 平面图列表初始筛:支付态 + 锚定营业日 `booking_time_start_between`。 */ export declare function getDefaultMonitorSearchParams(anchorDay?: Dayjs, operatingDayBoundary?: unknown, timelineRange?: TimeRangeOption, now?: Dayjs): Record; /** * 表格视图初始筛选项:与 Sales Monitor 一致——支付态 + **今日营业日窗口**。 * 传入店铺 `operating_day_boundary` 时与时间轴界钟一致。 */ export declare function getGridTableBookingSearchParams(operatingDayBoundary?: unknown, timelineRange?: TimeRangeOption): Record; export interface UsePisellReservationBookingDataOptions { /** 列表单页条数;平面图按日合并台位时宜用大页 */ listPageSize?: number; /** 初始筛选项;不传则与 Sales Monitor 一致(含当前营业日预约窗口) */ getInitialSearchParams?: () => Record; /** * 合并进每次请求的扁平参数(在 `filter.values` 展开之后),如平面图 * `form_record_ids: number[]` 按当前资源桌筛选预约。 */ extraRequestParams?: Record; /** * 是否启用列表 WebSocket 推送并用 `mutate` 覆盖当前数据(`osServer` + `subscriberId`)。 * 表格全量/分页必须与接口 HTTP 结果一致,应设为 `false`:推送常为平面图子集(如仅绑定桌), * 会覆盖刚返回的整页列表,表现为「请求 50 条只显示几条且像平面图资源」。 * 平面图合并用 booking 请求可保持默认 `true`。 */ subscribeRealtimePush?: boolean; } /** 内置列表数据 hook 返回结构(booking / resource 页共用) */ export interface UsePisellReservationBookingDataResult { data: unknown[]; loading: boolean; total: number; pagination: { pageNumber: number; pageSize: number; }; onPageChange: (pageNumber: number, pageSize: number) => void; searchParams: Record; onSearch: (params: Record) => void; onReset: () => void; refresh: () => void; refreshAsync: () => Promise; /** 函数式合并 searchParams 并重置到第一页(用于日程变更) */ patchSearchParams: (updater: (prev: Record) => Record) => void; /** * WS 推送 mutate 后的累计版本号;下游 hook(如 `useReservationSalesHostData`) * 把它作为 effect dep,可保证「即使 booking 内容字段未触发 cheap hash 变化, * 也能在每次推送后重新拉取宿主 sales 列表」,避免画布在 push 后不刷新。 */ pushDataVersion: number; } export declare function usePisellReservationBookingData(enabled: boolean, options?: UsePisellReservationBookingDataOptions): UsePisellReservationBookingDataResult;