Files
baiyue-firstleg/scripts/client-phase2-measurement-evidence.mjs
2026-10-08 17:07:57 +08:00

30 lines
1.9 KiB
JavaScript

const positive = value => ['number', 'string'].includes(typeof value)
&& String(value).trim() !== '' && Number.isFinite(Number(value)) && Number(value) > 0
export function frozenOuterMeasurement(item) {
const outer = [item?.calculatedOuterLengthCm, item?.calculatedOuterWidthCm, item?.calculatedOuterHeightCm]
if (!outer.every(positive)) throw Error('测量缺少已冻结的计费外尺寸;请准备当前基线的新样本')
const volume = outer.reduce((total, value) => total * Number(value), 1) / 1_000_000
return { outer: outer.map(Number), unitVolumeCbm: Math.round((volume + Number.EPSILON) * 1000) / 1000 }
}
export function publishedMeasurementItemsMatch(published, platform) {
const exactId = item => typeof item?.id === 'string' && /^[1-9]\d*$/.test(item.id)
if (!Array.isArray(published) || !Array.isArray(platform) || platform.length === 0
|| !published.every(exactId) || !platform.every(exactId) || published.length !== platform.length
|| new Set(platform.map(item => String(item.id))).size !== platform.length
|| new Set(published.map(item => String(item.id))).size !== published.length) return false
return published.every(item => {
const source = platform.find(row => String(row.id) === String(item.id))
if (!source) return false
const frozen = frozenOuterMeasurement(source)
const numbers = { packageCount: source.packageCount, lengthCm: frozen.outer[0], widthCm: frozen.outer[1],
heightCm: frozen.outer[2], unitVolumeCbm: source.unitVolumeCbm,
totalVolumeCbm: source.totalVolumeCbm, volumeWeightKg: source.volumeWeightKg }
return Object.entries(numbers).every(([key, expected]) => positive(item[key]) && positive(expected)
&& Math.abs(Number(item[key]) - Number(expected)) <= 0.000001)
&& String(item.chargeRuleId ?? '') === String(source.chargeRuleId ?? '')
&& item.coefficientMode === source.coefficientMode && item.calculationRuleVersion === source.calculationRuleVersion
})
}