修改提交

This commit is contained in:
2026-09-03 11:59:06 +08:00
parent a3715f618f
commit f561e6bb09
5 changed files with 131 additions and 21 deletions
@@ -534,18 +534,36 @@ public class InboundMeasurementService {
}
private InboundMeasurementResponses.Item toItem(InboundMeasurementItemEntity item) {
String overrideVersion = item.getCalculationRuleVersion();
boolean legacyFullOverride = "WAREHOUSE_OUTER_OVERRIDE_V1".equals(overrideVersion);
boolean lengthOverridden = legacyFullOverride || warehouseOverrideContains(overrideVersion, 'L');
boolean widthOverridden = legacyFullOverride || warehouseOverrideContains(overrideVersion, 'W');
boolean heightOverridden = legacyFullOverride || warehouseOverrideContains(overrideVersion, 'H');
return new InboundMeasurementResponses.Item(
item.getId(), item.getInboundDetailId(), item.getItemNo(), item.getBoxSpecification(), item.getPackageCount(),
item.getLengthCm(), item.getWidthCm(), item.getHeightCm(), item.getGirthCm(),
item.getUnitVolumeCbm(),
item.getTotalVolumeCbm(), item.getVolumeWeightKg(), item.getSourceImageFileId(),
item.getOverLimitWarning(), item.getOuterLengthCm(), item.getOuterWidthCm(),
item.getOuterHeightCm(), item.getChargeRuleId(), item.getCoefficientMode(),
item.getOverLimitWarning(), lengthOverridden ? item.getOuterLengthCm() : null,
widthOverridden ? item.getOuterWidthCm() : null,
heightOverridden ? item.getOuterHeightCm() : null,
item.getChargeRuleId(), item.getCoefficientMode(),
item.getRemark(), item.getBoxCode(), item.getScannedShipmentId(),
item.getPackageCount(),
item.getMachineNo(), item.getDeviceMeasuredAt(), item.getUpdatedAt());
}
private boolean warehouseOverrideContains(String calculationRuleVersion, char dimension) {
if (calculationRuleVersion == null
|| !calculationRuleVersion.startsWith("WAREHOUSE_OUTER_OVERRIDE_")
|| !calculationRuleVersion.endsWith("_V1")) {
return false;
}
String dimensions = calculationRuleVersion.substring(
"WAREHOUSE_OUTER_OVERRIDE_".length(), calculationRuleVersion.length() - 3);
return dimensions.indexOf(dimension) >= 0;
}
private void requireConfirmedPackageTotal(InboundOrderEntity inbound,
List<InboundMeasurementItemEntity> items) {
if (inbound.getTotalPackageCount() == null || inbound.getTotalPackageCount() < 1) {
@@ -167,26 +167,26 @@ public class MeasurementBatchService {
boolean hasOuterOverride = source.outerLengthCm() != null
|| source.outerWidthCm() != null
|| source.outerHeightCm() != null;
if (hasOuterOverride && (source.outerLengthCm() == null
|| source.outerWidthCm() == null || source.outerHeightCm() == null
|| source.outerLengthCm().signum() <= 0 || source.outerWidthCm().signum() <= 0
|| source.outerHeightCm().signum() <= 0)) {
if ((source.outerLengthCm() != null && source.outerLengthCm().signum() <= 0)
|| (source.outerWidthCm() != null && source.outerWidthCm().signum() <= 0)
|| (source.outerHeightCm() != null && source.outerHeightCm().signum() <= 0)) {
throw new BizException(ResultCode.VALIDATION_FAILED,
"仓库修改外箱长、宽、高必须同时填写且大于0,明细 " + source.itemNo());
"仓库修改外箱尺寸必须大于0,明细 " + source.itemNo());
}
if (hasOuterOverride) {
// Warehouse-confirmed outer dimensions are authoritative. Derived
// values below (girth, volume and volumetric weight) use them directly.
outerLength = source.outerLengthCm();
outerWidth = source.outerWidthCm();
outerHeight = source.outerHeightCm();
} else if (coefficientRule != null) {
if (coefficientRule != null) {
BigDecimal specificationCoefficient = resolveSpecificationCoefficient(
coefficientRule, source.lengthCm(), source.widthCm(), source.heightCm());
outerLength = applyCoefficient(outerLength, specificationCoefficient);
outerWidth = applyCoefficient(outerWidth, specificationCoefficient);
outerHeight = applyCoefficient(outerHeight, specificationCoefficient);
}
if (hasOuterOverride) {
// Each warehouse-confirmed dimension is authoritative on its own.
// Unspecified dimensions keep their strategy-calculated values.
if (source.outerLengthCm() != null) outerLength = source.outerLengthCm();
if (source.outerWidthCm() != null) outerWidth = source.outerWidthCm();
if (source.outerHeightCm() != null) outerHeight = source.outerHeightCm();
}
BigDecimal unitVolumeRaw = outerLength.multiply(outerWidth).multiply(outerHeight)
.divide(new BigDecimal("1000000"), 6, RoundingMode.HALF_UP);
BigDecimal unitVolume = hasMatchedAddition && !hasOuterOverride
@@ -222,7 +222,7 @@ public class MeasurementBatchService {
item.setVolumeWeightKg(totalVolume.multiply(VOLUME_WEIGHT_FACTOR).setScale(3, RoundingMode.CEILING));
item.setChargeRuleId(coefficientRule == null ? null : coefficientRule.getId());
item.setCoefficientMode(coefficientMode);
item.setCalculationRuleVersion(hasOuterOverride ? "WAREHOUSE_OUTER_OVERRIDE_V1"
item.setCalculationRuleVersion(hasOuterOverride ? warehouseOverrideVersion(source)
: coefficientRule != null
? "CUSTOMER_COEFFICIENT_V" + coefficientRule.getRuleVersion() + "_MULTIPLY"
: useDimensionRule ? weighted.calculationRuleVersion() : "ACTUAL_DIMENSION_V1");
@@ -237,6 +237,18 @@ public class MeasurementBatchService {
}).toList();
}
private String warehouseOverrideVersion(MeasurementBatchCommand.Item source) {
if (source.outerLengthCm() != null && source.outerWidthCm() != null
&& source.outerHeightCm() != null) {
return "WAREHOUSE_OUTER_OVERRIDE_V1";
}
StringBuilder dimensions = new StringBuilder();
if (source.outerLengthCm() != null) dimensions.append('L');
if (source.outerWidthCm() != null) dimensions.append('W');
if (source.outerHeightCm() != null) dimensions.append('H');
return "WAREHOUSE_OUTER_OVERRIDE_" + dimensions + "_V1";
}
private String normalizeMode(String mode) {
if (mode == null || mode.isBlank()) return null;
String normalized = mode.trim().toUpperCase(java.util.Locale.ROOT);