@pisell/pisellos
Version:
一个可扩展的前端模块化SDK框架,支持插件系统
97 lines (96 loc) • 4.06 kB
TypeScript
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;