|
|
import type { DisplayUnit, UnitDim, UnitWeight } from "@/lib/frontend/types";
|
|
|
import {
|
|
|
cmToIn,
|
|
|
inToCm,
|
|
|
kgToLb,
|
|
|
lbToKg,
|
|
|
toAxelWholeInches,
|
|
|
toAxelWholePounds,
|
|
|
} from "@/modules/quote/unit-converter";
|
|
|
|
|
|
export function formatCargoInputNumber(value: number): string {
|
|
|
if (!Number.isFinite(value)) {
|
|
|
return "";
|
|
|
}
|
|
|
const rounded = Math.round(value * 100) / 100;
|
|
|
return String(rounded);
|
|
|
}
|
|
|
|
|
|
export function parseCargoInputNumber(raw: string): number | null {
|
|
|
const trimmed = raw.trim();
|
|
|
if (!trimmed) {
|
|
|
return null;
|
|
|
}
|
|
|
const value = Number(trimmed);
|
|
|
return Number.isFinite(value) ? value : null;
|
|
|
}
|
|
|
|
|
|
/** 表单内单值重量换算(保持物理量不变) */
|
|
|
export function convertWeightInputValue(
|
|
|
value: number,
|
|
|
from: UnitWeight,
|
|
|
to: UnitWeight,
|
|
|
): number {
|
|
|
if (from === to) {
|
|
|
return value;
|
|
|
}
|
|
|
const lb = from === "kg" ? kgToLb(value) : value;
|
|
|
return to === "kg" ? lbToKg(lb) : lb;
|
|
|
}
|
|
|
|
|
|
/** 表单内尺寸换算(保持物理量不变) */
|
|
|
export function convertDimInputValue(
|
|
|
value: number,
|
|
|
from: UnitDim,
|
|
|
to: UnitDim,
|
|
|
): number {
|
|
|
if (from === to) {
|
|
|
return value;
|
|
|
}
|
|
|
const inches = from === "cm" ? cmToIn(value) : value;
|
|
|
return to === "cm" ? inToCm(inches) : inches;
|
|
|
}
|
|
|
|
|
|
export function displayUnitToCargoUnits(
|
|
|
display: DisplayUnit,
|
|
|
): { weight: UnitWeight; dim: UnitDim } {
|
|
|
return display === "metric"
|
|
|
? { weight: "kg", dim: "cm" }
|
|
|
: { weight: "lb", dim: "in" };
|
|
|
}
|
|
|
|
|
|
/** 展示「询价将按 xxx lb」类提示(界面保留用户输入单位,后端向上取整) */
|
|
|
export function describeWeightEquivalent(
|
|
|
value: number,
|
|
|
unit: UnitWeight,
|
|
|
): string | null {
|
|
|
if (!Number.isFinite(value) || value <= 0) {
|
|
|
return null;
|
|
|
}
|
|
|
const rawLb = unit === "kg" ? kgToLb(value) : value;
|
|
|
const queryLb = toAxelWholePounds(rawLb);
|
|
|
if (unit === "kg") {
|
|
|
return `询价将按 ${queryLb} lb(${formatCargoInputNumber(value)} kg 换算,小数进一)`;
|
|
|
}
|
|
|
if (queryLb !== rawLb) {
|
|
|
return `询价将按 ${queryLb} lb(小数进一)`;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
export function describeDimEquivalent(
|
|
|
length: number,
|
|
|
width: number,
|
|
|
height: number,
|
|
|
unit: UnitDim,
|
|
|
): string | null {
|
|
|
if (
|
|
|
!Number.isFinite(length) ||
|
|
|
!Number.isFinite(width) ||
|
|
|
!Number.isFinite(height) ||
|
|
|
length <= 0 ||
|
|
|
width <= 0 ||
|
|
|
height <= 0
|
|
|
) {
|
|
|
return null;
|
|
|
}
|
|
|
const toQueryIn = (v: number) =>
|
|
|
toAxelWholeInches(unit === "cm" ? cmToIn(v) : v);
|
|
|
const ql = toQueryIn(length);
|
|
|
const qw = toQueryIn(width);
|
|
|
const qh = toQueryIn(height);
|
|
|
if (unit === "cm") {
|
|
|
return `询价将按 ${ql} × ${qw} × ${qh} in(厘米换算,小数进一)`;
|
|
|
}
|
|
|
const rawL = length;
|
|
|
const rawW = width;
|
|
|
const rawH = height;
|
|
|
if (ql !== rawL || qw !== rawW || qh !== rawH) {
|
|
|
return `询价将按 ${ql} × ${qw} × ${qh} in(小数进一)`;
|
|
|
}
|
|
|
return null;
|
|
|
}
|