物流对账单
This commit is contained in:
@@ -95,6 +95,47 @@ export function calcRedeemSettleAmount(amount: number, settlementRate: number):
|
||||
return Math.round(amount * settlementRate * 100) / 100;
|
||||
}
|
||||
|
||||
/** 物流(快递)按瓶计价规则,如小飞侠:2瓶6元、加一瓶+2元、6瓶一箱14元 */
|
||||
export type LogisticsPricingRule = {
|
||||
baseBottles: number;
|
||||
baseFee: number;
|
||||
extraBottleFee: number;
|
||||
boxBottles?: number;
|
||||
boxFee?: number;
|
||||
};
|
||||
|
||||
function roundMoney(n: number): number {
|
||||
return Math.round(n * 100) / 100;
|
||||
}
|
||||
|
||||
function calcLogisticsBottleLadder(quantity: number, rule: LogisticsPricingRule): number {
|
||||
const qty = Math.floor(quantity);
|
||||
if (qty <= 0) return 0;
|
||||
if (qty <= rule.baseBottles) return rule.baseFee;
|
||||
return rule.baseFee + (qty - rule.baseBottles) * rule.extraBottleFee;
|
||||
}
|
||||
|
||||
/**
|
||||
* 按承运商计价标准计算单票物流费。
|
||||
* 配置了箱规时:整箱按 boxFee,余瓶按「起送瓶数/加瓶」阶梯。
|
||||
*/
|
||||
export function calcLogisticsFeeByBottles(quantity: number, rule: LogisticsPricingRule): number {
|
||||
const qty = Math.floor(Number(quantity) || 0);
|
||||
if (qty <= 0) return 0;
|
||||
if (!(rule.baseBottles > 0) || !(rule.baseFee >= 0) || !(rule.extraBottleFee >= 0)) {
|
||||
throw new Error('计价标准不完整');
|
||||
}
|
||||
|
||||
const boxBottles = rule.boxBottles && rule.boxBottles > 0 ? rule.boxBottles : 0;
|
||||
const boxFee = rule.boxFee != null && rule.boxFee >= 0 ? rule.boxFee : null;
|
||||
if (boxBottles > 0 && boxFee != null) {
|
||||
const boxes = Math.floor(qty / boxBottles);
|
||||
const rem = qty % boxBottles;
|
||||
return roundMoney(boxes * boxFee + calcLogisticsBottleLadder(rem, rule));
|
||||
}
|
||||
return roundMoney(calcLogisticsBottleLadder(qty, rule));
|
||||
}
|
||||
|
||||
export function generateUserNo(): string {
|
||||
const suffix = Math.floor(10000000 + Math.random() * 90000000);
|
||||
return `DK${suffix}`;
|
||||
|
||||
Reference in New Issue
Block a user