UNPKG

@pisell/pisellos

Version:

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

437 lines (436 loc) 14.7 kB
import { Module, PisellCore, ModuleOptions } from '../../types'; import { BaseModule } from '../../modules/BaseModule'; import { OrderModule } from '../../modules/Order'; import { PaymentModule } from '../../modules/Payment'; import { CheckoutModuleAPI, CheckoutInitParams, CreateLocalOrderParams, UpdateLocalOrderParams, CurrentOrderInfo, CartSummaryItem, SendCustomerPayLinkParams } from './types'; import { PaymentOrder, PaymentMethod, PaymentItem, PaymentItemInput } from '../../modules/Payment/types'; export * from './types'; /** * 结账解决方案实现 * * 整合订单处理和支付功能,提供完整的结账流程管理。 * 支持多种支付方式,提供实时状态跟踪和错误处理。 */ export declare class CheckoutImpl extends BaseModule implements Module, CheckoutModuleAPI { protected defaultName: string; protected defaultVersion: string; isSolution: boolean; private request; private store; private otherParams; private logger; private calculationCache; private syncOrderToBackendInFlightByOrderKey; order: OrderModule; payment: PaymentModule; constructor(name?: string, version?: string); initialize(core: PisellCore, options: ModuleOptions): Promise<void>; /** * 记录信息日志 */ private logInfo; /** * 记录警告日志 */ private logWarning; /** * 记录错误日志 */ private logError; /** * 初始化子模块 */ private initializeSubModules; /** * 设置支付模块事件监听 */ private setupPaymentEventListeners; /** * 初始化结账流程 */ initializeCheckoutAsync(params: CheckoutInitParams): Promise<void>; getHolderIdFromBooking(obj: any): number | undefined; getProductListByOrder(): { product_id: number; product_variant_id: string; quantity: number; selling_price: number; holder_id?: number; }[]; initWalletData(params?: { order_wait_pay_amount: number; }): Promise<void>; checkIsNeedDepositAsync(bookings: any[], relationProducts: any[]): { total: number; protocols: { id: number; title: string; }[]; hasDeposit: boolean; }; /** * 创建本地订单 (前端模拟下单流程) * * 此方法用于在前端模拟整个下单流程,创建一个本地的虚拟订单。 * 用户在购物车点击下单时,会把购物车参数传递给此方法, * 方法会记录参数并创建本地虚拟订单,然后用 Payment 模块管理支付流程。 */ createLocalOrderAsync(params: CreateLocalOrderParams): Promise<PaymentOrder>; /** * 更新本地订单(已同步后端的订单)并设置为当前订单 * * 通过传入真实的 orderId,对已缓存的订单数据进行更新, * 会覆盖 order_info 与金额等字段,并重新计算待付金额,最后设置为 currentOrder。 */ updateLocalOrderAsync(params: UpdateLocalOrderParams): Promise<PaymentOrder>; /** * 完成结账 */ completeCheckoutAsync(): Promise<{ success: boolean; orderId?: string; }>; /** * 获取订单原始数据 */ getOrderOriginalData(): any; /** * 获取当前订单基础信息 * * 返回当前订单的基础信息,包括订单状态、金额、支付状态等 */ getCurrentOrderInfo(): CurrentOrderInfo | null; /** * 获取当前订单的支付项 * * 返回当前订单的所有支付项,包括活跃和已撤销的支付项 */ getCurrentOrderPaymentItemsAsync(): Promise<PaymentItem[]>; /** * 获取订单模块 */ getOrderModule(): OrderModule; /** * 获取支付模块 */ getPaymentModule(): PaymentModule; /** * 替换本地订单ID为真实订单ID * * 当后端订单创建完成后,调用此方法将本地虚拟订单ID替换为真实订单ID * * @param newOrderId 后端返回的真实订单ID * @returns 更新后的订单对象,如果当前没有订单则返回null */ replaceLocalOrderIdAsync(newOrderId: string): Promise<PaymentOrder | null>; /** * 设置自定义支付金额 * * 允许UI自定义本次支付的金额,通常用于部分支付或调整支付金额场景 * * @param amount 自定义支付金额,必须是有效的数字字符串 */ setStateAmountAsync(amount: string): Promise<void>; /** * 获取当前自定义支付金额 * * @returns 当前设置的自定义支付金额 */ getStateAmount(): string; /** * 获取系统计算的待付金额(只读) * * 此方法返回系统内部计算的实际待付金额,不允许外部修改 * * @returns 当前系统计算的待付金额 */ getBalanceDueAmount(): string; /** * 获取购物车小计数据 * * 返回当前结账流程中的购物车小计项数据,包含各种费用明细 * * @returns 购物车小计数据数组,如果没有则返回 null */ getCartSummary(): CartSummaryItem[] | null; /** * 获取支付方式列表 * * 优先使用 store 中的缓存数据,避免重复接口调用。 * 如果 store 中没有数据,则调用 Payment 模块的方法获取。 * * @returns 支付方式列表 */ getPaymentMethodsAsync(): Promise<PaymentMethod[]>; /** * 为当前订单添加支付项 * * 向当前活跃订单添加一个支付项,支付项包含支付方式信息和金额 * * @param paymentItem 支付项数据 * @throws 当前没有活跃订单时抛出错误 */ addPaymentItemAsync(paymentItem: PaymentItemInput, orderUuid?: string): Promise<void>; /** * 删除当前订单的支付项 * * 从当前活跃订单中删除指定的支付项,支付项将被标记为已撤销状态 * * @param paymentUuid 要删除的支付项UUID * @throws 当前没有活跃订单时抛出错误 * @throws 支付项不存在时抛出错误 */ deletePaymentItemAsync(paymentUuid: string): Promise<void>; /** * 批量更新当前订单的代金券支付项(覆盖更新) * * 删除所有现有的代金券支付项,然后添加新的代金券支付项。 * 这是一个覆盖式更新操作,确保代金券支付项的一致性。 * * @param voucherPaymentItems 新的代金券支付项列表,每个都必须包含 voucher_id * @throws 当前没有活跃订单时抛出错误 * @throws 支付项缺少 voucher_id 时抛出错误 */ updateVoucherPaymentItemsAsync(voucherPaymentItems: PaymentItemInput[]): Promise<void>; /** * 修改当前订单的定金状态 * * 更新当前订单的 is_deposit 字段,用于标识订单是否为定金订单 * * @param isDeposit 定金状态 (1: 定金订单, 0: 全款订单) * @throws 当前没有活跃订单时抛出错误 */ updateOrderDepositStatusAsync(isDeposit: number): Promise<void>; /** * 手动设置当前订单的定金金额 * * 允许手动设置订单的定金金额,通常用于用户自定义定金支付场景 * * @param depositAmount 定金金额,必须是有效的数字字符串,且不能超过订单总额 * @throws 当前没有活跃订单时抛出错误 * @throws 定金金额格式无效或超过订单总额时抛出错误 */ setDepositAmountAsync(depositAmount: string): Promise<void>; /** * 手动同步订单到后端 * * 用于强制同步订单到后端,特别适用于纯代金券支付完成的订单 */ manualSyncOrderAsync(): Promise<{ success: boolean; message?: string; orderId?: string; orderUuid?: string; response?: any; }>; /** * 获取当前订单备注 * * @returns 当前订单的备注内容,如果没有则返回空字符串 */ getOrderNote(): string; /** * 获取当前订单ID * * @returns 当前订单的ID,如果没有订单则返回null */ getCurrentOrderId(): string | null; /** * 获取当前订单是否已同步到后端 * * @returns 当前订单是否已同步状态,如果没有订单则返回false */ isCurrentOrderSynced(): boolean; /** * 取消当前本地订单 * * 只能取消未同步到后端的本地订单,如果订单已同步则不能取消 * * @param cancelReason 取消原因(可选) * @returns 取消结果 */ cancelCurrentOrderAsync(cancelReason?: string): Promise<{ success: boolean; message?: string; orderId?: string; }>; /** * 保存订单并稍后支付 * * 将当前订单保存到后端,但排除代金券类支付项(voucher_id), * 适用于用户想要保存订单但稍后完成支付的场景 */ saveForLaterPaymentAsync(): Promise<{ success: boolean; message?: string; orderId?: string; orderUuid?: string; response?: any; }>; /** * 更新订单备注 * * @param note 订单备注内容 */ updateOrderNoteAsync(note: string): Promise<void>; /** * 处理错误 */ private handleError; /** * 处理支付成功 */ private handlePaymentSuccess; /** * 处理支付错误 */ private handlePaymentError; /** * 验证结账参数 */ private validateCheckoutParams; /** * 处理现金支付项的找零逻辑 * * @param paymentItem 原始支付项 * @returns 处理后的支付项(包含找零信息) */ private processCashPaymentItem; /** * 预加载支付方式(在初始化时调用) */ private preloadPaymentMethods; /** * 清理过期的已同步订单数据 * * 删除本地 IndexDB 中超过指定天数且已同步到后端的订单数据 */ private cleanupExpiredOrdersAsync; /** * 清除计算缓存 */ private clearCalculationCache; /** * 批量获取订单数据(用于性能优化) * 一次性获取所有需要的数据,避免重复查询 */ private fetchOrderDataBatch; /** * 从支付项数组计算已支付金额(纯计算,不查询数据库) */ private calculatePaidAmountFromItems; /** * 计算已支付金额(从 Payment 模块获取最新数据) * * 注意:此方法保持独立性,可以单独调用。 * 在 updateStateAmountToRemaining 等批量操作中会使用缓存优化。 */ private calculatePaidAmountAsync; /** * 从订单和支付项计算剩余金额(纯计算,不查询数据库) */ private calculateRemainingAmountFromData; /** * 从订单和支付项计算剩余总金额(纯计算,排除定金) */ private calculateRemainingTotalAmountFromData; /** * 计算剩余未支付金额(从 Payment 模块获取最新数据) * * 注意:此方法保持独立性,可以单独调用。 * 在 updateStateAmountToRemaining 等批量操作中会使用缓存优化。 */ private calculateRemainingAmountAsync; /** * 计算剩余未支付金额(排除定金计算,始终使用订单总金额) * * 注意:此方法保持独立性,可以单独调用。 * 在 updateStateAmountToRemaining 等批量操作中会使用缓存优化。 */ private calculateRemainingTotalAmountAsync; /** * 更新 balanceDueAmount 为当前剩余未支付金额(系统内部计算) */ private updateBalanceDueAmount; /** * 更新 stateAmount 为当前剩余未支付金额 * * 优化版本:批量获取数据,避免重复查询数据库 */ private updateStateAmountToRemaining; /** * 检查订单支付是否完成(优化版,复用已获取的数据) * * @param paymentItems 已获取的支付项数据 * @param remainingAmount 已计算的剩余金额 */ private checkOrderPaymentCompletionOptimized; /** * 检查订单支付是否完成 * * 当剩余待付款金额 <= 0 时,触发订单支付完成事件 * * 注意:此方法保持独立性,可以单独调用。 * 在 updateStateAmountToRemaining 中会使用优化版本。 */ private checkOrderPaymentCompletion; private repairEftposPaymentFromIndexDbAsync; private syncOrderToBackendFromIndexDbAsync; /** * 同步订单到后端并返回真实订单ID * * @param isManual 是否为手动同步,默认为 false * @param customPaymentItems 自定义支付项列表,如果提供则使用此列表而不是从数据库获取 * @returns 包含订单ID、UUID和完整后端响应的对象 */ private syncOrderToBackendWithReturn; setOtherParams(params: Record<string, any>, { cover }?: { cover?: boolean; }): Promise<void>; /** * 通过订单ID编辑订单备注 * * 用于修改已同步到后端的订单备注,通常在支付成功后的弹窗中使用 * * @param orderId 后端订单ID * @param note 新的订单备注 * @returns 修改结果 */ editOrderNoteByOrderIdAsync(orderId: string | number, note: string): Promise<{ success: boolean; message?: string; orderId?: string | number; }>; /** * 发送客户支付链接邮件 * * 向指定邮箱发送订单支付提醒邮件 * * @param params 发送参数 * @returns 发送结果 */ sendCustomerPayLinkAsync(params: SendCustomerPayLinkParams): Promise<{ success: boolean; message?: string; }>; /** * 金额舍入 * * @param amount 原始金额 * @returns 舍入结果详情,包含原始金额、舍入后金额和舍入差额 */ roundAmountAsync(amount: number): Promise<{ originalAmount: string; roundedAmount: string; roundingDifference: string; }>; destroy(): Promise<void>; /** * 重置 store 状态 * * 在创建新订单前调用,确保状态完全干净 * * 🚀 性能优化:改为同步方法,事件发射不阻塞主流程 */ private resetStoreState; }