UNPKG

@pisell/pisellos

Version:

一个可扩展的前端模块化SDK框架,支持插件系统

97 lines (96 loc) 4.06 kB
import dayjs from 'dayjs'; import { Module, ModuleOptions, PisellCore } from '../../types'; import { BaseModule } from '../../modules/BaseModule'; import type { RequestPlugin } from '../../plugins/request'; import { SalesState, SalesModuleAPI, Reservation, SalesResourceBookingItem, SalesTimelineHighlights } from './types'; import type { BookingData } from '../../server/modules/order/types'; export * from './types'; /** * Sales 解决方案基础骨架 * * 当前阶段仅提供: * - solution 目录结构 * - 标准入口导出 * - 基础生命周期占位 * * 不提前实现 store 编排、初始化流程细节、状态计算逻辑。 */ export declare class SalesImpl extends BaseModule implements Module, SalesModuleAPI { protected defaultName: string; protected defaultVersion: string; protected defaultTimelineBucketMinutes: number; isSolution: boolean; protected store: SalesState; protected options: ModuleOptions; protected otherParams: Record<string, any>; protected request: RequestPlugin; constructor(name?: string, version?: string); initialize(core: PisellCore, options?: ModuleOptions): Promise<void>; /** 获取当前 store 快照 */ getState(): SalesState; /** 获取当前选择日期 */ getCurrentDay(): dayjs.Dayjs; /** 设置当前选择日期,会自动归一到当天 00:00:00 */ setCurrentDay(currentDay: dayjs.ConfigType): dayjs.Dayjs; /** 获取当前预约列表 */ getReservationList(): Reservation[]; /** 覆盖设置当前预约列表 */ setReservationList(reservationList: Reservation[]): Reservation[]; /** 重置预约列表为空 */ resetReservationList(): Reservation[]; destroy(): Promise<void>; /** * 时间轴粒度(分钟) * - 默认 15 分钟 * - 可通过 registerModule 时的 options.otherParams.timelineBucketMinutes 覆盖 */ private getTimelineBucketMinutes; /** * 解析营业日统计窗口: * - 当 operating_day_boundary.type === 'start_time' * 使用「今天 + boundary.time」到「明天 + boundary.time」 * - 否则回退自然日(00:00 到次日 00:00) */ private getTimelineRangeByOperatingBoundary; /** * 统计时间轴每个时间片的预约数量。 * 算法使用差分数组,复杂度 O(n + s): * - n = booking 数量 * - s = 时间片数量 */ getTimelineHighlights(bookingList?: BookingData[], startDateTime?: string, endDateTime?: string): SalesTimelineHighlights; /** dayjs 未启用插件时,手动封装 >= 判断 */ private isSameOrAfter; /** dayjs 未启用插件时,手动封装 <= 判断 */ private isSameOrBefore; /** * 将 booking 的日期/时间字段统一组装为 dayjs * - date + time 都有:按完整时间解析 * - 只有一个字段:按单字段解析(兼容历史数据) * - 都没有:返回 invalid */ private toBookingDateTime; /** * 预约状态映射(面向 UI 的统一状态) * 说明:locked 逻辑后续会补业务规则,这里先保留分支占位。 */ private getBookingStatus; private getResourceId; /** * 资源下 bookings 的返回裁剪策略: * 1) 优先返回当前时刻正在进行中的预约(允许并发返回多条) * 2) 若无 active,返回已超时且仍占用中的预约(允许并发多条) * 3) 若仍无,返回最近一组未来预约(同 start_time 的并发预约全部返回) * 4) 最后兜底返回一条(避免资源有历史预约时完全无反馈) */ private pickBookingsForCurrentPoint; /** * 标准化单条 booking: * - 过滤终态(rejected/cancelled/completed) * - 注入 status / isTimeout / reserved_status */ private normalizeMatchedBooking; getResourceBookingList(currentTime: string, bookingList?: BookingData[]): Promise<SalesResourceBookingItem[]>; } export { SalesImpl as Sales }; export default SalesImpl;