fix: record oversize device measurements for review
This commit is contained in:
@@ -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());
|
||||
|
||||
+15
-4
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
-5
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user