import { ProductsModule } from './modules/products';
import { MenuModule } from './modules/menu';
import { QuotationModule } from './modules/quotation';
import { ScheduleModuleEx } from './modules/schedule';
import { ResourceModule } from './modules/resource';
import { FloorPlanModule } from './modules/floor-plan';
import { PaymentServerModule } from './modules/payment';
import { PisellCore, ServerModuleConfig, InitializeServerOptions } from '../types';
import type { RouteHandler, HttpMethod, RouteDefinition, Router, ModuleRegistryConfig, RequestSetting } from './types';
import { OrderModule } from './modules/order';
export type { RouteHandler, HttpMethod, RouteDefinition, Router, ModuleRegistryConfig, };
/**
 * Server 类
 * 用于注册和管理服务端模块
 */
declare class Server {
    private core;
    private app;
    private logger;
    products?: ProductsModule;
    menu?: MenuModule;
    quotation?: QuotationModule;
    schedule?: ScheduleModuleEx;
    resource?: ResourceModule;
    order?: OrderModule;
    floor_plan?: FloorPlanModule;
    payment?: PaymentServerModule;
    private paymentRouteModule?;
    private paymentRouteModuleInFlight?;
    private quotationAvailableCache;
    private quotationAvailableInFlight;
    /** GET 前缀路由（最长前缀优先匹配） */
    private prefixRouterGet;
    router: Router;
    private productQuerySubscribers;
    private orderQuerySubscribers;
    private bookingQuerySubscribers;
    private bookingRemoteQuerySubscribers;
    private bookingRemoteCache;
    private readonly BOOKING_REMOTE_CACHE_TTL_MS;
    private readonly BOOKING_REMOTE_CACHE_MAX_ENTRIES;
    private salesSearchSubscribers;
    private deviceTaskActionsRegistered;
    private floorPlanQuerySubscribers;
    private moduleRegistry;
    constructor(core: PisellCore);
    /**
     * 注册路由
     * @param routes 路由定义数组
     */
    private registerRoutes;
    /**
     * 注册前缀路由（仅 GET）。匹配规则：path === prefix 或 path 以 prefix + '/' 开头；最长前缀优先。
     */
    private registerPrefixRoutes;
    /**
     * 注册单个模块并自动注册其路由
     * @param module 模块实例
     * @param options 模块配置
     * @param moduleName 模块名称（用于日志）
     */
    private registerModuleWithRoutes;
    /**
     * 根据模块名称注册单个模块
     * @param moduleConfig 模块配置（可以是字符串或配置对象）
     */
    private registerModuleByName;
    /**
     * 注册指定的服务端模块
     * @param moduleConfigs 要注册的模块配置数组（模块名称或配置对象）
     */
    registerModules(moduleConfigs?: (string | ServerModuleConfig)[]): Promise<{
        module: any;
        config: ModuleRegistryConfig;
        shouldPreload: boolean;
    }[]>;
    /**
     * 预加载指定模块的数据
     * @param registeredModules 已注册的模块信息
     */
    preloadModulesData(registeredModules: Array<{
        module: any;
        config: ModuleRegistryConfig;
        shouldPreload: boolean;
    }>, options?: InitializeServerOptions): Promise<void>;
    /**
     * 初始化 Server（注册模块并预加载数据）
     * @param moduleConfigs 要注册的模块配置
     * @param autoPreload 是否自动预加载数据
     */
    initialize(moduleConfigs?: (string | ServerModuleConfig)[], autoPreload?: boolean, options?: InitializeServerOptions): Promise<{
        module: any;
        config: ModuleRegistryConfig;
        shouldPreload: boolean;
    }[]>;
    private registerDeviceTaskActions;
    private handleSyncSalesTask;
    /**
     * 将普通层 QuotationModule 的报价单计算能力桥接到 Server Products 模块。
     */
    private setupProductsQuotationPriceBridge;
    /**
     * 获取 Products 模块实例
     */
    getProducts(): ProductsModule | undefined;
    /**
     * 获取 Menu 模块实例
     */
    getMenu(): MenuModule | undefined;
    /**
     * 获取 Quotation 模块实例
     */
    getQuotation(): QuotationModule | undefined;
    /**
     * 获取 Schedule 模块实例
     */
    getSchedule(): ScheduleModuleEx | undefined;
    /**
     * 获取所有已注册的模块列表
     */
    getRegisteredModules(): string[];
    /**
     * 后台静默刷新商品数据
     * 重新拉取全量 SSE 接口，更新本地数据后触发 onProductsSyncCompleted
     * 不影响当前界面展示，适用于切回前台、定时刷新等场景
     */
    refreshProductsInBackground(): Promise<void>;
    /**
     * 后台静默刷新订单数据
     * 重新拉取全量 SSE 接口，更新本地数据后触发 onOrdersSyncCompleted
     * 不影响当前界面展示，适用于切回前台、定时刷新等场景
     */
    refreshOrdersInBackground(): Promise<void>;
    /**
     * 清空所有server模块的IndexedDB缓存
     * @returns Promise<void>
     */
    clearAllIndexDB(): Promise<void>;
    /**
     * 获取所有注册的路由
     */
    getRoutes(): Router;
    /**
     * 根据方法和路径获取路由处理函数
     * @param method HTTP 方法
     * @param path 路径
     */
    getRouteHandler(method: HttpMethod, path: string): RouteHandler | undefined;
    /**
     * 检查路由是否存在
     * @param method HTTP 方法
     * @param path 路径
     */
    hasRoute(method: HttpMethod, path: string): boolean;
    /**
     * 执行路由处理函数
     * @param method HTTP 方法
     * @param path 路径
     * @param params 请求参数
     */
    handleRoute(method: HttpMethod, path: string, params: {
        url: string;
        method: HttpMethod;
        data?: any;
        config?: RequestSetting;
    }): Promise<any>;
    /**
     * 获取所有路由列表（用于调试和文档）
     */
    getAllRoutes(): Array<{
        method: HttpMethod;
        path: string;
    }>;
    /**
     * 注册 Server 层的业务路由
     * 这些路由需要编排多个模块的数据
     * @private
     */
    private registerServerRoutes;
    private getPaymentRouteModule;
    private handlePaymentMethods;
    private handleQuotationAvailable;
    private fetchQuotationAvailableFromAPI;
    private isSuccessfulRemoteResponse;
    /**
     * 根据 subscriberId 移除商品查询订阅者
     */
    removeProductQuerySubscriber(subscriberId?: string): void;
    /**
     * 处理商品查询请求
     * 存储订阅者信息，便于数据变更时推送最新结果
     */
    private handleProductQuery;
    /**
     * 按商品 id 查询单条（GET /shop/product/query/:productId）
     * schedule_date 必填：query 或 data；schedule_datetime 可选。不走订阅。
     */
    private handleProductQueryById;
    /**
     * 取消商品查询订阅（HTTP 路由入口）
     */
    private handleUnsubscribeProductQuery;
    /**
     * 处理订单列表查询
     * 存储订阅者信息，本地计算结果；数据变更时通过 callback 推送
     */
    private handleOrderList;
    /**
     * 取消订单列表查询订阅（HTTP 路由入口）
     */
    private handleUnsubscribeOrderQuery;
    /**
     * 处理 sales 单模块搜索：请求透传后端，仅在 OS 层维护已返回订单号集合。
     *
     * @example
     * await this.handleSalesSearchModule({ url: '/shop/es/search/sales', method: 'post', data: { keyword: 'A' } })
     */
    private handleSalesSearchModule;
    /**
     * 处理 sales 聚合搜索：请求透传后端，仅订阅 sales 分组的已返回订单号。
     *
     * @example
     * await this.handleSalesSearchAggregate({ url: '/shop/es/search', method: 'post', data: { modules: [] } })
     */
    private handleSalesSearchAggregate;
    /**
     * 取消 sales 搜索订阅。
     *
     * @example
     * await this.handleUnsubscribeSalesSearch({ data: { subscriberId: 'global-search-order' } } as any)
     */
    private handleUnsubscribeSalesSearch;
    /**
     * 执行 sales 搜索并登记可见订单号。
     * 搜索参数完全透传后端，OS 不做过滤、筛选、排序。
     *
     * @example
     * const result = await this.handleSalesSearchRequest('single', '/shop/es/search/sales', { keyword: '1001' }, {})
     */
    private handleSalesSearchRequest;
    /**
     * 透传调用后端 sales 搜索接口。
     *
     * @example
     * const res = await this.fetchSalesSearchFromAPI('/shop/es/search/sales', { keyword: '1001' })
     */
    private fetchSalesSearchFromAPI;
    /**
     * 构建搜索订阅签名；页码变化不重置，可继续累计 visibleOrderIds。
     *
     * @example
     * const signature = this.buildSalesSearchSignature('single', { keyword: 'A', page: 2 })
     */
    private buildSalesSearchSignature;
    /**
     * 移除页码参数，保留 page size、keyword、filters、sort 等查询语义参数。
     *
     * @example
     * this.stripSalesSearchPageParams({ page: 2, per_page: 20, keyword: 'A' })
     */
    private stripSalesSearchPageParams;
    /**
     * 提取响应 data，兼容 OS 包装结构与后端直接响应结构。
     *
     * @example
     * const data = this.extractSalesSearchResponseData(result)
     */
    private extractSalesSearchResponseData;
    /**
     * 从搜索响应中提取 sales 命中的订单号。
     *
     * @example
     * const ids = this.extractSalesSearchOrderIds('single', result)
     */
    private extractSalesSearchOrderIds;
    /**
     * 查找聚合搜索响应中的 sales 分组。
     *
     * @example
     * const group = this.findSalesSearchAggregateGroup({ results: [{ module: 'sales' }] })
     */
    private findSalesSearchAggregateGroup;
    /**
     * 从订单或搜索命中项中取订单号。
     *
     * @example
     * const id = this.getSalesSearchOrderId({ order_id: 1001 })
     */
    private getSalesSearchOrderId;
    /**
     * 从查询值中提取 YYYY-MM-DD 日期串。
     *
     * @example
     * this.extractQueryDate('2026-04-15 09:58:00') // => '2026-04-15'
     */
    private extractQueryDate;
    /**
     * 判断时间范围是否「开始和结束都不是今天」。
     *
     * @example
     * this.isRangeBothNotToday('2026-04-13', '2026-04-14') // => true
     */
    private isRangeBothNotToday;
    /**
     * 订单查询是否走本地：
     * - 当 start_time 与 end_time 都不是今天时，走远端；
     * - 其余情况走本地。
     */
    private shouldUseLocalOrderQuery;
    /**
     * 预约查询是否走本地：
     * - 当 sales_time_between 的开始和结束都不是今天时，走远端；
     * - 其余情况走本地。
     */
    private shouldUseLocalBookingQuery;
    /**
     * 日历 SSE 精简 with：由调用方显式声明 compact_fields 决定
     * - compact_fields === true → 精简字段（周/月视图）
     * - 其余（false / 未传）→ ['all']（日视图/表格/平面图合并）
     */
    private resolveBookingSalesWith;
    /**
     * 日历 SSE 精简 select：渲染 + filterBookingsFromOrders 所需的主表字段
     * business_code / payment_status 不直接用于渲染，但 matchOrder 过滤依赖
     */
    private resolveBookingSalesSelect;
    /**
     * 日历（compact_fields）场景下要直接在 SSE 层排除的订单类型：
     * 这些类型不会出现在日历上，拉取它们只会浪费带宽并增加前端过滤成本。
     */
    private readonly BOOKING_SALES_COMPACT_EXCLUDE_TYPES;
    private normalizeBookingRemoteQueryPayload;
    /**
     * 远端预约查询内存缓存开关：默认 false，仅显式 true 才启用。
     */
    private isBookingRemoteMemoryCacheEnabled;
    private stableSerialize;
    private buildBookingRemoteCacheKey;
    private parseBookingSalesRangeMeta;
    private readBookingRemoteCache;
    private writeBookingRemoteCache;
    private toOrderIdKey;
    private markBookingRemoteCacheAllStale;
    private buildBookingResponse;
    private notifyBookingRemoteSubscribersByCacheKey;
    private syncBookingRemoteCacheFromOrderChanges;
    /**
     * 非本地窗口的订单查询：走真实 API。
     */
    private fetchOrderListFromAPI;
    /**
     * 非今天的预约查询：通过 SSE 流式拉取订单，再做本地 booking 筛选展开
     */
    private fetchBookingListFromAPI;
    /**
     * 处理预约列表查询
     * 今天：注册订阅者 + 本地数据筛选；非今天：清理订阅者 + 走真实 API
     */
    private handleBookingList;
    /**
     * 处理资源列表查询
     * 转发到资源模块去
     */
    private handleResourceList;
    /**
     * 代理刷新 / 合并订单到本地（单笔 / 批量二合一）：
     * - 入参（GET query 或 data 任一）：
     *   - `order_id`：单笔模式，原有行为
     *   - `order_ids`：批量模式，逗号分隔的 id 列表（如 `?order_ids=1,2,3`），数组也兼容
     *   - 同时存在时优先批量
     * - 单笔流程：后端 /order/sales/{id}?with[]=all → 本地有则覆盖、无则 merge → 落 SQLite → emit onOrdersChanged
     * - 批量流程：并发拉取每笔详情 → 一次性 `upsertOrdersFromRemote` 合并写入 → 仅 emit 一次 onOrdersChanged，
     *   单笔失败不影响其他成功项；返回 { overwritten, inserted, failed }
     * - 监听级联：onOrdersChanged 触发订单 / 预约 / bookingRemoteCache 三路订阅者推送
     *
     * @example 单笔：GET /update/localOrder?order_id=96971
     * @example 批量：GET /update/localOrder?order_ids=96971,96972,96973
     */
    private handleUpdateLocalOrder;
    private handleOrderSalesCheckout;
    private handleOrderCheckout;
    private getDeviceTaskPlugin;
    private getIdGeneratorPlugin;
    private getAppData;
    private getSmallTicketShopInfo;
    private taskOk;
    private taskFail;
    private taskTimeout;
    private getShortNumberOrDeviceId;
    private buildCheckoutTaskIdempotencyKey;
    private ensureCheckoutOrderNumbers;
    private dispatchCheckoutSyncTask;
    private dispatchPrintOtherReceiptTask;
    private buildPrintOtherReceiptIdempotencyKey;
    private getPrintOrderIdentity;
    private dispatchLocalReceiptPrint;
    private shouldLookupLocalPrintOrder;
    private getLocalPrintOrderLookup;
    private handleLocalPrintOrder;
    private handleOrderCheckoutSubmit;
    private handlePendingSyncCheckoutOrder;
    private buildPendingSyncCheckoutOrder;
    private shouldBuildSmallTicketData;
    private shouldPrintSyncedOrder;
    private hasPaymentStatus;
    private isSalesOrderFullyPaid;
    private sumPaidOrderPayments;
    private toAmountNumber;
    private buildSmallTicketProductMap;
    private withPendingSyncProductTitles;
    private buildProductTitleSnapshot;
    private getProductTitleSnapshotCurrentLocale;
    private normalizeProductTitleSnapshotLocale;
    private resolveProductTitleValue;
    private resolveFirstProductTitleValue;
    private withLocalSmallTicketData;
    private handleOrderSalesDetail;
    /**
     * 解析 order_ids 入参，兼容 url query / data 字段、字符串(csv) / 数组两种形态。
     * 自动 trim、去空、按字符串去重，输出归一化后的字符串数组。
     *
     * @example
     * // url: /update/localOrder?order_ids=1,2,2,, → ['1','2']
     * this.parseOrderIdsParam(url, undefined)
     *
     * @example
     * // data: { order_ids: [1, '2', null] } → ['1','2']
     * this.parseOrderIdsParam('', { order_ids: [1, '2', null] })
     */
    private parseOrderIdsParam;
    /**
     * 批量代理刷新 / 合并订单到本地：并发拉详情 → 单次合并 → 单次 emit。
     * - 单笔失败不影响其他成功项
     * - 没有任何成功项时不触发 emit / 落库
     *
     * @example
     * await this.handleUpdateLocalOrdersBatch(['96971', '96972'])
     */
    private handleUpdateLocalOrdersBatch;
    /**
     * 从 url 中解析指定 query 参数，兼容相对路径与绝对路径
     */
    private extractQueryParam;
    private extractOrderSalesDetailLookup;
    private shouldForceRemoteSalesDetail;
    private buildOrderSalesDetailBackendPath;
    private extractOrderDataFromCheckoutResponse;
    private getCheckoutExternalSaleNumber;
    private buildCheckoutSyncSuccessPatch;
    private buildSyncedOrderForPrint;
    private isMergeableCheckoutOrder;
    private normalizeCheckoutResponse;
    private isCheckoutResponseRejected;
    private extractBackendErrorResponse;
    private isExplicitBackendErrorResponse;
    /**
     * 从 url 或路由 path 解析 pathname（不含 query，去掉末尾 /）
     */
    private parseRequestPath;
    /**
     * 解析平面图 GET 路径为查询上下文
     */
    private resolveFloorPlanQueryContext;
    /**
     * GET /shop/schedule/floor-plan* 前缀路由：读本地 store；支持 subscriberId + callback 订阅更新
     */
    private handleFloorPlanGet;
    private computeFloorPlanQueryResult;
    /**
     * 平面图数据变更后向所有 GET 订阅者推送最新结果
     */
    private recomputeAndNotifyFloorPlanQuery;
    /**
     * 取消平面图 GET 订阅（也可走 GET .../unsubscribe + subscriberId）
     */
    removeFloorPlanQuerySubscriber(subscriberId?: string): void;
    /**
     * 取消预约列表查询订阅（HTTP 路由入口）
     */
    private handleUnsubscribeBookingQuery;
    /**
     * 订单列表本地计算（编排 Order 模块）
     * filter 逻辑暂为 mock，仅记录参数
     */
    private computeOrderQueryResult;
    /**
     * 预约列表本地计算（编排 Order 模块）
     * 从订单中展开 bookings，再按条件筛选 + 分页
     */
    private computeBookingQueryResult;
    /**
     * 商品查询的核心计算逻辑（编排 Products、Menu、Schedule 模块）
     * 供 handleProductQuery 首次返回及 pubsub 变更推送复用
     * @param context 查询上下文
     * @param options 可选参数
     * @param options.changedIds 变更的商品 IDs，用于增量更新价格缓存
     */
    private computeProductQueryResult;
    /**
     * 数据变更后，遍历所有订阅者重新计算查询结果并通过 callback 推送
     * 由 ProductsModule 的 onProductsSyncCompleted 事件触发
     * @param options 可选参数
     * @param options.changedIds 变更的商品 IDs，用于增量更新价格缓存
     */
    private recomputeAndNotifyProductQuery;
    /**
     * 订单数据变更后，遍历订阅者重新计算并通过 callback 推送
     */
    private recomputeAndNotifyOrderQuery;
    /**
     * 订单变更后通知 sales 搜索订阅者。
     * 仅回传当前查询已返回订单号集合中的变更订单。
     *
     * @example
     * this.notifySalesSearchSubscribers({ list: [], changedOrders: [order], source: 'pubsub.bodyUpsert' })
     */
    private notifySalesSearchSubscribers;
    /**
     * 从订单变更事件中提取明确 delta。
     *
     * @example
     * const list = this.extractChangedOrdersFromPayload(payload)
     */
    private extractChangedOrdersFromPayload;
    /**
     * 构建与当前搜索接口一致的 delta 响应。
     *
     * @example
     * const response = this.buildSalesSearchDeltaResponse(subscriber, [order])
     */
    private buildSalesSearchDeltaResponse;
    /**
     * 构建聚合搜索接口的 sales 分组 delta 响应。
     *
     * @example
     * const response = this.buildAggregateSalesSearchDeltaResponse(subscriber, [order])
     */
    private buildAggregateSalesSearchDeltaResponse;
    /**
     * 预约数据变更后，遍历订阅者重新计算并通过 callback 推送
     */
    private recomputeAndNotifyBookingQuery;
    /**
     * 根据餐牌配置提取轻量商品范围。
     * @private
     */
    private getProductScopeByMenuConfig;
    /**
     * 记录信息日志
     * @param title 日志标题
     * @param metadata 日志元数据
     */
    private logInfo;
    /**
     * 记录警告日志
     * @param title 日志标题
     * @param metadata 日志元数据
     */
    private logWarning;
    /**
     * 记录错误日志
     * @param title 日志标题
     * @param metadata 日志元数据
     */
    private logError;
    /**
     * 处理获取日程时间段点的请求
     * 通过餐牌ID列表获取所有相关日程的时间段点
     */
    private handleGetScheduleTimePoints;
}
export default Server;
export * from './modules';
