import { Module, ModuleOptions, PisellCore } from '../../../types';
import { BaseModule } from '../../../modules/BaseModule';
import type { RouteDefinition } from '../../types';
import { OrderData, OrderId } from './types';
/**
 * Order 模块 - 基础框架
 */
export declare class OrderModule extends BaseModule implements Module {
    protected defaultName: string;
    protected defaultVersion: string;
    private store;
    private dbManager;
    private orderDataSource;
    private pendingSyncMessages;
    private syncTimer?;
    private isProcessingSyncBatch;
    private isIdlePhase;
    private resourceIdIndex;
    private logger;
    private storage;
    constructor(name?: string, version?: string);
    initialize(core: PisellCore, options?: ModuleOptions): Promise<void>;
    /**
   * 记录信息日志
   * @param title 日志标题
   * @param metadata 日志元数据
   */
    private logInfo;
    /**
     * 记录错误日志
     * @param title 日志标题
     * @param metadata 日志元数据
     */
    private logError;
    private getOrderSyncThrottleMs;
    preload(): Promise<void>;
    getOrders(): OrderData[];
    getOrderById(id: OrderId): OrderData | undefined;
    /** 按 order_id 查询（推荐） */
    getOrderByOrderId(orderId: OrderId): OrderData | undefined;
    getLocalOrderByOrderId(orderId: OrderId): Promise<OrderData | null>;
    loadOrdersByServer(): Promise<OrderData[]>;
    /**
     * 静默全量刷新：后台重新拉取全量 SSE 订单数据并更新本地
     * 拿到完整数据后一次性替换 store，触发订单变更与同步完成事件
     * @returns 刷新后的订单列表
     */
    silentRefresh(): Promise<OrderData[]>;
    getOrdersByResourceId(resourceId: string | number): OrderData[];
    /**
     * 仅覆盖本地已存在的订单；不存在则直接跳过，不落库、不 emit。
     * 适用于"按 order_id 主动刷新本地订单详情"的代理场景。
     */
    overwriteExistingOrder(fresh: OrderData): Promise<{
        overwritten: boolean;
    }>;
    /**
     * 将远端拉取的订单合并进本地 store（已存在则更新，不存在则追加），落库并 emit onOrdersChanged。
     * 供 /update/localOrder 等在「本地尚无该单」时写入新建单。
     */
    upsertOrdersFromRemote(freshOrders: OrderData[]): Promise<void>;
    /**
     * 通过 SSE 按自定义 query 拉取订单（支持 select/with 精简字段）
     */
    fetchOrdersBySSE(query?: Record<string, any>): Promise<OrderData[]>;
    getRoutes(): RouteDefinition[];
    destroy(): void;
    private syncOrdersMap;
    private extractResourceIds;
    private getOrderDateKey;
    /**
     * 初始化 OrderDataSource 实例
     */
    private initOrderDataSource;
    /**
     * 初始化 pubsub 订阅，监听订单变更（纯订阅，不拉数据；全量 SSE 由 loadOrdersByServer 负责）
     */
    private setupOrderSync;
    /**
     * 调度订单同步节流窗口（leading-edge throttle）：
     * - 空闲状态下收到的第一条消息立即触发批处理，无需等待；
     * - 首条处理后进入冷却窗口，窗口期间的后续消息聚合，窗口结束后批量处理；
     * - 若当前批处理执行中，则由批处理结束后决定是否开启下一轮窗口。
     */
    private scheduleOrderSyncThrottle;
    /**
     * 执行一次节流批处理并在需要时续约下一轮窗口。
     * 批处理完成且无后续消息时恢复空闲状态，下一条消息将立即触发。
     */
    private flushOrderSyncMessagesByThrottle;
    /**
     * 处理节流窗口内聚合后的同步消息批次
     *
     * 后端统一发送 change 消息，不再区分新增/编辑/删除。
     * - 单条（id/order_id）：若携带 body/data 则直接 upsert 到本地
     * - 批量（ids）：通过 HTTP 按 ids 增量拉取，再 merge 到本地
     *
     * @example
     * // pending 队列中存在 8 条消息时，仅处理一次批次并统一 merge
     * await this.processOrderSyncMessages()
     */
    private processOrderSyncMessages;
    /**
     * 通过 HTTP 按 ids 批量拉取订单详情（走 orderDataSource）。
     *
     * - 优先使用 `orderDataSource.fetchOrdersByIds`（如适配器实现了该方法）
     * - 否则回退到 `orderDataSource.run({ http: { query: { ids } } })`
     * - 失败统一返回空数组（由调用方按"返回缺失的 id" 判断单笔失败）
     *
     * @example
     * const fresh = await orderModule.fetchOrdersByHttp(['96971', '96972'])
     */
    fetchOrdersByHttp(ids: OrderId[]): Promise<OrderData[]>;
    /**
     * 将增量订单合并到 store
     */
    private mergeOrdersToStore;
    private normalizeOrderSyncMessage;
    private normalizeOrderSyncPayload;
    private uniqueOrderIds;
    private getIdKey;
    /**
     * 当前订单拉取窗口：
     * - 优先使用 createdAtQuery.sales_time_between（已按营业日边界初始化）
     * - 无法解析时退化为自然日窗口
     */
    private getCurrentPullWindow;
    private hasPulledOrdersToday;
    private markOrderPulledAtNow;
    private getStorageItem;
    private setStorageItem;
    private loadOrdersFromSQLite;
    private saveOrdersToSQLite;
    clear(): Promise<void>;
}
