import { BaseSalesOrderProduct, BaseSalesOrderProductIdentity, BaseSalesSummary } from './types';
/**
 * 构建金额全为 0 的空 summary。
 * 作为尚未计算金额时的兜底默认值，避免下游因 undefined 报错。
 */
export declare function createEmptySummary(): BaseSalesSummary;
/**
 * 将选项行 / 套餐行归一成稳定 JSON，用于「同 SKU 是否合并」判断。
 * 数组元素先按主键排序再序列化，避免顺序差异导致误判为不同行。
 */
export declare function buildProductLineFingerprint(productOptionItem?: unknown, productBundle?: unknown): string;
export declare function getSafeProductNum(num?: number): number;
/**
 * removeProductFromOrder 仅传 SKU 时的通配 identity（对象上未声明选项键）。
 * 与显式 `product_option_item: []` 区分：后者只匹配「无选项」行。
 */
export declare function isSkuOnlyDeleteIdentity(x: BaseSalesOrderProductIdentity): boolean;
/**
 * 对外部传入的商品对象做归一化（v2 composite 语义）：
 * - 补全可选字段默认值（未传则使用兜底值，避免后续计算时因 undefined 导致异常）
 * - 对 num 调用 getSafeProductNum 做安全处理
 * - 保留 _origin 供后续业务流程（如促销规则）使用
 *
 * 价格字段语义（metadata 权威源 + composite 派生）：
 * - `metadata.source_product_price`：主商品/variant 基础价（已应用报价单），**不含 option**、
 *   **不含折扣**。是推导 main_product_* 的起点。variant 分支优先读 `metadata.origin.variant[vid].price`。
 * - `metadata.main_product_original_price`：`source + Σ(option.price × option.num)`，**含 option**、
 *   **不含折扣**。
 * - `metadata.main_product_selling_price`：`main_product_original_price - 主商品券 per-unit amount`，
 *   **含 option**、**含折扣**。
 * - 行级 `selling_price` = `main_product_selling_price + Σ(bundle_selling_price × num)`。
 * - 行级 `original_price` = `main_product_original_price + Σ(bundle 原价 × num)`。
 *
 * 迁移与幂等：
 * - `metadata.price_schema_version === 2` → 已新语义归一化，保留 main_product_* 原值（保留折扣）。
 * - 其它情况（v1 / 缺字段 / 无 metadata）→ 按"main_product_selling_price 曾是 main-only"的旧约定
 *   反推 legacyDiscount，再以新 source + options 基准重算。最终统一打上 `price_schema_version: 2`。
 * - 因此多次 normalize 不会重复叠加 option/bundle。
 */
export declare function normalizeOrderProduct(product: Partial<BaseSalesOrderProduct> & BaseSalesOrderProductIdentity): BaseSalesOrderProduct;
