fix: record oversize device measurements for review
This commit is contained in:
@@ -245,6 +245,7 @@ public class CartonMeasurementService {
|
|||||||
item.setTotalVolumeCbm(totalVolume);
|
item.setTotalVolumeCbm(totalVolume);
|
||||||
item.setVolumeWeightKg(totalVolume.multiply(VOLUME_WEIGHT_FACTOR).setScale(3, RoundingMode.CEILING));
|
item.setVolumeWeightKg(totalVolume.multiply(VOLUME_WEIGHT_FACTOR).setScale(3, RoundingMode.CEILING));
|
||||||
item.setCalculationRuleVersion(weighted.calculationRuleVersion());
|
item.setCalculationRuleVersion(weighted.calculationRuleVersion());
|
||||||
|
item.setOverLimitWarning(weighted.warning());
|
||||||
item.setOuterLengthCm(weighted.outerLengthCm());
|
item.setOuterLengthCm(weighted.outerLengthCm());
|
||||||
item.setOuterWidthCm(weighted.outerWidthCm());
|
item.setOuterWidthCm(weighted.outerWidthCm());
|
||||||
item.setOuterHeightCm(weighted.outerHeightCm());
|
item.setOuterHeightCm(weighted.outerHeightCm());
|
||||||
|
|||||||
+15
-4
@@ -18,6 +18,8 @@ import java.util.List;
|
|||||||
public class CustomerDimensionWeightingService {
|
public class CustomerDimensionWeightingService {
|
||||||
private static final BigDecimal TWO = new BigDecimal("2");
|
private static final BigDecimal TWO = new BigDecimal("2");
|
||||||
private static final BigDecimal CUBIC_CENTIMETERS_PER_CBM = new BigDecimal("1000000");
|
private static final BigDecimal CUBIC_CENTIMETERS_PER_CBM = new BigDecimal("1000000");
|
||||||
|
private static final String OVERSIZE_WARNING =
|
||||||
|
"实测尺寸超出客户最大箱规,已按实测尺寸记录,需人工复核";
|
||||||
|
|
||||||
private final CustomerDimensionConfigRepository repository;
|
private final CustomerDimensionConfigRepository repository;
|
||||||
|
|
||||||
@@ -62,8 +64,16 @@ public class CustomerDimensionWeightingService {
|
|||||||
.filter(rule -> rule.contains(measured))
|
.filter(rule -> rule.contains(measured))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.map(Rule::weighted)
|
.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 outerHeightCm,
|
||||||
BigDecimal rawVolumeCbm,
|
BigDecimal rawVolumeCbm,
|
||||||
BigDecimal unitVolumeCbm,
|
BigDecimal unitVolumeCbm,
|
||||||
String calculationRuleVersion
|
String calculationRuleVersion,
|
||||||
|
String warning
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,7 +123,7 @@ public class CustomerDimensionWeightingService {
|
|||||||
.divide(CUBIC_CENTIMETERS_PER_CBM, 6, RoundingMode.HALF_UP);
|
.divide(CUBIC_CENTIMETERS_PER_CBM, 6, RoundingMode.HALF_UP);
|
||||||
BigDecimal unitVolume = rawVolume.setScale(3, RoundingMode.HALF_UP);
|
BigDecimal unitVolume = rawVolume.setScale(3, RoundingMode.HALF_UP);
|
||||||
return new WeightedDimensions(boxType, version, outerLength, outerWidth, outerHeight,
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-5
@@ -56,11 +56,16 @@ class CustomerDimensionWeightingServiceTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void dimensionsBeyondTheLargestRuleAreRejected() {
|
void dimensionsBeyondTheLargestRuleAreRecordedUsingActualDimensions() {
|
||||||
assertThatThrownBy(() -> service.load(10001L).resolve(
|
var weighted = service.load(10001L).resolve(
|
||||||
new BigDecimal("60.001"), new BigDecimal("50"), new BigDecimal("50")))
|
new BigDecimal("60.001"), new BigDecimal("50"), new BigDecimal("50"));
|
||||||
.isInstanceOf(BizException.class)
|
|
||||||
.hasMessageContaining("超出客户最大箱规");
|
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
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user