55 lines
1.7 KiB
TypeScript
55 lines
1.7 KiB
TypeScript
const KG_PER_CBM = 167
|
||||
|
|
const KG_PER_BILLABLE_CBM = 363
|
|||
|
|
|
|||
|
|
function formatFormulaNumber(value: number) {
|
|||
|
|
return value.toLocaleString('zh-CN', { maximumFractionDigits: 6, useGrouping: false })
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export interface PriceEstimateBreakdown {
|
|||
|
|
actualLabel: string
|
|||
|
|
actualQuantity: number
|
|||
|
|
convertedLabel: string
|
|||
|
|
convertedQuantity: number
|
|||
|
|
convertedFormula: string
|
|||
|
|
chargeableLabel: string
|
|||
|
|
basisLabel: string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Explains the server's current first-leg chargeable-quantity rules. The server
|
|||
|
|
* response remains authoritative for the final chargeable quantity and amount.
|
|||
|
|
*/
|
|||
|
|
export function createPriceEstimateBreakdown(
|
|||
|
|
actualWeightKg: number,
|
|||
|
|
actualVolumeCbm: number,
|
|||
|
|
chargeUnit: string,
|
|||
|
|
): PriceEstimateBreakdown | null {
|
|||
|
|
if (chargeUnit === 'KG') {
|
|||
|
|
const volumeWeightKg = actualVolumeCbm * KG_PER_CBM
|
|||
|
|
return {
|
|||
|
|
actualLabel: '实际毛重',
|
|||
|
|
actualQuantity: actualWeightKg,
|
|||
|
|
convertedLabel: '体积重量',
|
|||
|
|
convertedQuantity: volumeWeightKg,
|
|||
|
|
convertedFormula: `${formatFormulaNumber(actualVolumeCbm)} m³ × ${KG_PER_CBM}`,
|
|||
|
|
chargeableLabel: '计费重量',
|
|||
|
|
basisLabel: actualWeightKg >= volumeWeightKg ? '采用实际毛重' : '采用体积重量',
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (chargeUnit === 'CBM') {
|
|||
|
|
const convertedVolumeCbm = actualWeightKg / KG_PER_BILLABLE_CBM
|
|||
|
|
return {
|
|||
|
|
actualLabel: '实际体积',
|
|||
|
|
actualQuantity: actualVolumeCbm,
|
|||
|
|
convertedLabel: '重量折算体积',
|
|||
|
|
convertedQuantity: convertedVolumeCbm,
|
|||
|
|
convertedFormula: `${formatFormulaNumber(actualWeightKg)} KG ÷ ${KG_PER_BILLABLE_CBM}`,
|
|||
|
|
chargeableLabel: '计费体积',
|
|||
|
|
basisLabel: actualVolumeCbm >= convertedVolumeCbm ? '采用实际体积' : '采用重量折算体积',
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null
|
|||
|
|
}
|