@pisell/pisellos
Version:
一个可扩展的前端模块化SDK框架,支持插件系统
144 lines (143 loc) • 8.15 kB
TypeScript
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;