UNPKG

@pisell/pisellos

Version:

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

144 lines (143 loc) 8.15 kB
import Decimal from 'decimal.js'; import { CartItem } from '../Cart/types'; import { ISummaryState } from './types'; export declare const calculatePriceDetails: (shopInfo: any, items: CartItem[], isInScheduleByDate: any, surchargeList: any[], scheduleById: Record<string, any>) => ISummaryState['summary']; /** * 获取子商品折扣信息 * @param item */ export declare const getBundleDiscountList: (bundle: any[]) => any[]; export declare const calcDiscountListDifference: (discountList: any[]) => any; export declare const getProductDiscountProductDiscountDifference: (item: CartItem) => any; /** * 计算订单税费(折扣前/折扣后),并把单品税费信息回写到商品数据上(用于明细展示/后续计算)。 * * - **折扣前税费**:`originTax` * - **折扣后税费**:`tax`(会考虑 `computed.shopDiscount` 对每个商品的分摊影响) * - **税率/是否含税**:优先取 `bookingDetail.tax_rate` / `bookingDetail.is_price_include_tax`,取不到再回退到 `options.tax_rate` / `options.is_price_include_tax` * * **副作用(会修改入参商品对象)**: * - 主商品:写入 `item.original_tax_fee` / `item.tax_fee`(四舍五入保留两位) * - bundle 原价子商品:写入 `bundleItem.original_tax_fee` / `bundleItem.tax_fee` * - 加时商品(`relation_details`):写入 `atItem.tax_fee` * - 税费舍入差值:追加到最后一个“含税商品”的 `tax_fee_rounding_remainder` / `original_tax_fee_rounding_remainder` * * @param params 入参集合(RORO) * @param params.service 服务商品数组(主商品)。通常是购物车商品结构(可能包含 `bundle` / `relation_details`) * @param params.addons 附加商品数组(可选)。结构同商品数组 * @param params.bookingDetail 订单详情(编辑/详情场景用于读取后端税率配置),可选 * @param params.bookingId 订单/预约 ID(编辑/详情场景识别用),可选 * @param options 计算选项 * @param options.isEdit 是否处于“编辑中”。当前实现不强依赖该值(历史逻辑保留),但建议按真实状态传入 * @param options.computed 预计算结果(用于折扣分摊) * @param options.computed.productExpectAmount 商品期望总金额(用于按比例分摊折扣) * @param options.computed.shopDiscount 店铺折扣总额(用于按比例分摊到商品) * @param options.tax_rate 管理端税率(百分比,如 5 表示 5%)。仅当 `bookingDetail.tax_rate` 不存在时生效 * @param options.is_price_include_tax 是否含税:`0` 不含税、`1` 含税。仅当 `bookingDetail.is_price_include_tax` 不存在时生效 * @returns 税费汇总(number,金额单位与商品价格一致,四舍五入保留两位) * @returns.originTax 折扣前税费合计 * @returns.tax 折扣后税费合计 */ export declare const getTax: ({ service, addons, bookingDetail, bookingId }: { service?: any; addons?: any; bookingDetail?: any; bookingId?: number | undefined; }, options: { isEdit: boolean; computed: Record<string, number | string>; tax_rate?: number; is_price_include_tax?: number; } & Record<string, any>) => { originTax: number; tax: number; }; /** * 计算商品小计(不含其他费用) * @param items - 购物车商品数组 * @returns 商品总价字符串,保留2位小数 */ export declare const calculateSubtotal: (items: CartItem[]) => string; /** * 计算商品小计(不含其他费用 不包含折扣卡商品券抵扣金额) * @param items - 购物车商品数组 * @returns 商品总价字符串,保留2位小数 */ export declare const calculateOriginSubtotal: (items: CartItem[]) => string; /** * @title: 单个商品的税费 * @description: * 单个商品的税费 = 商品销售单价(折扣后) * 税率 * is_charge_tax /( 1+ 税率 * is_price_include_tax) * $taxFee = $price * $taxRate * $isChargeTax / (1 + $taxRate * $isPriceIncludeTax); * @return {*} * @Author: xiangfeng.xue */ export declare const calculateTaxFee: (shopInfo: any, items: CartItem[]) => Decimal | "0.00"; /** * @title: 计算定金 * @param items - 购物车商品数组 * @returns 定金字符串,保留2位小数 */ export declare const calculateDeposit: (items: CartItem[]) => { total: string; protocols: any[]; hasDeposit: never; } | undefined; /** * 计算订单附加费金额(订单级别合计)。 * * - **详情未编辑**(`!options.isEdit && bookingId`)且存在后端详情时:直接返回 `bookingDetail.surcharge_fee` * - **新增/编辑**时:对 `surcharge`(通常为 `getSurcharge` 的返回值)按 `item.value` 求和 * * @param params 入参集合(RORO) * @param params.bookingDetail 订单详情(详情未编辑时用于读取后端的 `surcharge_fee`),可选 * @param params.bookingId 订单/预约 ID(详情未编辑时生效),可选 * @param surcharge 附加费列表(通常来自 `getSurcharge`),元素结构至少包含 `value: number` * @param options 计算选项 * @param options.isEdit 是否处于“编辑中”。`false` 时会优先走后端金额直取逻辑(若存在) * @returns 订单附加费金额(number,金额单位与商品价格一致) */ export declare const getSurchargeAmount: ({ bookingDetail, bookingId }: { bookingDetail?: any; bookingId?: number | undefined; }, surcharge: any[], options: any) => any; /** * 订单附加费各项信息 * * - **详情未编辑**(`!options.isEdit && bookingId`)时:直接返回 `bookingDetail.surcharge`(后端计算结果) * - **新增/编辑**时:按 `options.surcharge_list` 逐条配置计算本次订单的附加费 * * 规则要点: * - 匹配范围包含:主商品(`service`)、原价 bundle 子商品(`item.bundle`)、加时商品(`item.relation_details`)、以及 addons(`addons.value`) * - 固定附加费 `fixed`:只加一次,再按商品数量分摊(向下取整保留两位),剩余小数会以 `surcharge_rounding_remainder` 形式抹平到最后一个商品 * - 百分比附加费 `percentage`:按每个商品(价格 * 数量)分别计算再累加 * - 当 `open_product === 0`:不回写到商品,只在订单级别累加;否则会把单品附加费回写到商品 * * **副作用(可能修改入参商品对象)**: * - 当 `open_product !== 0` 时:写入 `item.surcharge_fee`(单品单数量附加费,保留两位、向下取整) * - 写入 `item.relation_surcharge_ids`(关联到的 surcharge 配置 id 列表) * - 写入 `item.surcharge_rounding_remainder`(用于抹平固定附加费/总额舍入差) * * @param params 入参集合(RORO) * @param params.service 服务商品数组(主商品)。元素可能包含 `bundle` / `relation_details` * @param params.addons 附加商品容器。当前实现读取 `addons.value` 作为商品数组(所以通常传 `{ value: CartItem[] }`) * @param params.bookingDetail 订单详情(详情未编辑时用于直接取后端的 surcharge 列表),可选 * @param params.bookingId 订单/预约 ID(详情未编辑时生效),可选 * @param options 计算选项 * @param options.isEdit 是否处于“编辑中”。`false` 且存在 `bookingId` 时会走详情直取逻辑 * @param options.surcharge_list 附加费配置列表(后端下发)。缺失/为空则返回空数组 * @param options.isInScheduleByDate 判断日期是否落在某个 schedule 内的方法(通常来自 ScheduleModule) * @param options.scheduleById schedule 映射表:`{ [scheduleId]: schedule }`(用于根据配置的 `available_schedule_ids` 做日程匹配) * @returns 附加费列表(仅返回金额 > 0 的项) */ export declare const getSurcharge: ({ service, addons, bookingDetail, bookingId }: { service: any; addons: any; bookingDetail?: any; bookingId?: number | undefined; }, options: { isEdit: boolean; isInScheduleByDate: any; surcharge_list?: any[]; scheduleById?: Record<string, any>; } & Record<string, any>) => any;