fix: record oversize device measurements for review

This commit is contained in:
2026-08-08 11:33:02 +08:00
parent 54893aeb6b
commit 2ee78aafc2
3 changed files with 26 additions and 9 deletions
@@ -245,6 +245,7 @@ public class CartonMeasurementService {
item.setTotalVolumeCbm(totalVolume);
item.setVolumeWeightKg(totalVolume.multiply(VOLUME_WEIGHT_FACTOR).setScale(3, RoundingMode.CEILING));
item.setCalculationRuleVersion(weighted.calculationRuleVersion());
item.setOverLimitWarning(weighted.warning());
item.setOuterLengthCm(weighted.outerLengthCm());
item.setOuterWidthCm(weighted.outerWidthCm());
item.setOuterHeightCm(weighted.outerHeightCm());
@@ -18,6 +18,8 @@ import java.util.List;
public class CustomerDimensionWeightingService {
private static final BigDecimal TWO = new BigDecimal("2");
private static final BigDecimal CUBIC_CENTIMETERS_PER_CBM = new BigDecimal("1000000");
private static final String OVERSIZE_WARNING =
"实测尺寸超出客户最大箱规,已按实测尺寸记录,需人工复核";
private final CustomerDimensionConfigRepository repository;
@@ -62,8 +64,16 @@ public class CustomerDimensionWeightingService {
.filter(rule -> rule.contains(measured))
.findFirst()
.map(Rule::weighted)
.orElseThrow(() -> new BizException(ResultCode.VALIDATION_FAILED,
"实测尺寸超出客户最大箱规,请先调整客户箱规后再提交测量"));
.orElseGet(() -> actualOversize(lengthCm, widthCm, heightCm));
}
private WeightedDimensions actualOversize(BigDecimal lengthCm, BigDecimal widthCm,
BigDecimal heightCm) {
BigDecimal rawVolume = lengthCm.multiply(widthCm).multiply(heightCm)
.divide(CUBIC_CENTIMETERS_PER_CBM, 6, RoundingMode.HALF_UP);
return new WeightedDimensions(null, null, lengthCm, widthCm, heightCm,
rawVolume, rawVolume.setScale(3, RoundingMode.HALF_UP),
"ACTUAL_DIMENSION_OVERSIZE_V1", OVERSIZE_WARNING);
}
}
@@ -75,7 +85,8 @@ public class CustomerDimensionWeightingService {
BigDecimal outerHeightCm,
BigDecimal rawVolumeCbm,
BigDecimal unitVolumeCbm,
String calculationRuleVersion
String calculationRuleVersion,
String warning
) {
}
@@ -112,7 +123,7 @@ public class CustomerDimensionWeightingService {
.divide(CUBIC_CENTIMETERS_PER_CBM, 6, RoundingMode.HALF_UP);
BigDecimal unitVolume = rawVolume.setScale(3, RoundingMode.HALF_UP);
return new WeightedDimensions(boxType, version, outerLength, outerWidth, outerHeight,
rawVolume, unitVolume, "CUSTOMER_DIMENSION_" + boxType.name() + "_V" + version);
rawVolume, unitVolume, "CUSTOMER_DIMENSION_" + boxType.name() + "_V" + version, null);
}
}
@@ -56,11 +56,16 @@ class CustomerDimensionWeightingServiceTest {
}
@Test
void dimensionsBeyondTheLargestRuleAreRejected() {
assertThatThrownBy(() -> service.load(10001L).resolve(
new BigDecimal("60.001"), new BigDecimal("50"), new BigDecimal("50")))
.isInstanceOf(BizException.class)
.hasMessageContaining("超出客户最大箱规");
void dimensionsBeyondTheLargestRuleAreRecordedUsingActualDimensions() {
var weighted = service.load(10001L).resolve(
new BigDecimal("60.001"), new BigDecimal("50"), new BigDecimal("50"));
assertThat(weighted.boxType()).isNull();
assertThat(weighted.outerLengthCm()).isEqualByComparingTo("60.001");
assertThat(weighted.outerWidthCm()).isEqualByComparingTo("50");
assertThat(weighted.outerHeightCm()).isEqualByComparingTo("50");
assertThat(weighted.calculationRuleVersion()).isEqualTo("ACTUAL_DIMENSION_OVERSIZE_V1");
assertThat(weighted.warning()).contains("已按实测尺寸记录").contains("人工复核");
}
@Test