修改提交
This commit is contained in:
+1
-1
@@ -10,7 +10,7 @@ import lombok.Setter;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/** 客户固定箱规的内径和每侧加宽配置。 */
|
||||
/** 客户固定箱规的内径和长、宽、高尺寸增加值配置。 */
|
||||
@Getter
|
||||
@Setter
|
||||
@TableName("fl_customer_dimension_config")
|
||||
|
||||
+5
-6
@@ -27,7 +27,6 @@ import java.util.Map;
|
||||
public class CustomerDimensionConfigService {
|
||||
public static final BigDecimal DEFAULT_EDGE_ADDITION_CM = new BigDecimal("2.000");
|
||||
public static final String DEFAULT_CALCULATION_MODE = "ADD";
|
||||
private static final BigDecimal TWO = new BigDecimal("2");
|
||||
private static final BigDecimal CUBIC_CENTIMETERS_PER_CBM = new BigDecimal("1000000");
|
||||
|
||||
@Resource
|
||||
@@ -116,7 +115,7 @@ public class CustomerDimensionConfigService {
|
||||
requirePositive(rule.innerLengthCm(), "箱规内长");
|
||||
requirePositive(rule.innerWidthCm(), "箱规内宽");
|
||||
requirePositive(rule.innerHeightCm(), "箱规内高");
|
||||
requirePositive(rule.edgeAdditionCm(), "箱规单侧加宽");
|
||||
requirePositive(rule.edgeAdditionCm(), "箱规尺寸增加值");
|
||||
if (rule.version() == null || rule.version() < 0) {
|
||||
throw new BizException(ResultCode.BAD_REQUEST, "箱规版本号无效");
|
||||
}
|
||||
@@ -223,10 +222,10 @@ public class CustomerDimensionConfigService {
|
||||
}
|
||||
|
||||
private static RuleResponse ruleResponse(CustomerDimensionConfigEntity value) {
|
||||
BigDecimal edgePair = value.getEdgeAdditionCm().multiply(TWO);
|
||||
BigDecimal outerLength = value.getInnerLengthCm().add(edgePair);
|
||||
BigDecimal outerWidth = value.getInnerWidthCm().add(edgePair);
|
||||
BigDecimal outerHeight = value.getInnerHeightCm().add(edgePair);
|
||||
BigDecimal addition = value.getEdgeAdditionCm();
|
||||
BigDecimal outerLength = value.getInnerLengthCm().add(addition);
|
||||
BigDecimal outerWidth = value.getInnerWidthCm().add(addition);
|
||||
BigDecimal outerHeight = value.getInnerHeightCm().add(addition);
|
||||
BigDecimal volume = outerLength.multiply(outerWidth).multiply(outerHeight)
|
||||
.divide(CUBIC_CENTIMETERS_PER_CBM)
|
||||
.setScale(3, RoundingMode.HALF_UP);
|
||||
|
||||
+18
-16
@@ -13,10 +13,9 @@ import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
/** Resolves measured carton dimensions to the customer's smallest containing dimension rule. */
|
||||
/** Resolves dimensions to the smallest containing rule, capped at the largest configured tier. */
|
||||
@Service
|
||||
public class CustomerDimensionWeightingService {
|
||||
private static final BigDecimal TWO = new BigDecimal("2");
|
||||
private static final BigDecimal CUBIC_CENTIMETERS_PER_CBM = new BigDecimal("1000000");
|
||||
|
||||
private final CustomerDimensionConfigRepository repository;
|
||||
@@ -62,16 +61,8 @@ public class CustomerDimensionWeightingService {
|
||||
.filter(rule -> rule.contains(measured))
|
||||
.findFirst()
|
||||
.map(Rule::weighted)
|
||||
.orElseGet(() -> actualDimensions(lengthCm, widthCm, heightCm));
|
||||
}
|
||||
|
||||
private WeightedDimensions actualDimensions(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, null, lengthCm, widthCm, heightCm,
|
||||
rawVolume, rawVolume.setScale(3, RoundingMode.HALF_UP),
|
||||
"ACTUAL_DIMENSION_V1");
|
||||
.orElseGet(() -> rules.get(rules.size() - 1)
|
||||
.weightedActualDimensions(lengthCm, widthCm, heightCm));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,10 +104,21 @@ public class CustomerDimensionWeightingService {
|
||||
}
|
||||
|
||||
private WeightedDimensions weighted() {
|
||||
BigDecimal edgePair = edgeAdditionCm.multiply(TWO);
|
||||
BigDecimal outerLength = innerLengthCm.add(edgePair);
|
||||
BigDecimal outerWidth = innerWidthCm.add(edgePair);
|
||||
BigDecimal outerHeight = innerHeightCm.add(edgePair);
|
||||
BigDecimal outerLength = innerLengthCm.add(edgeAdditionCm);
|
||||
BigDecimal outerWidth = innerWidthCm.add(edgeAdditionCm);
|
||||
BigDecimal outerHeight = innerHeightCm.add(edgeAdditionCm);
|
||||
BigDecimal rawVolume = outerLength.multiply(outerWidth).multiply(outerHeight)
|
||||
.divide(CUBIC_CENTIMETERS_PER_CBM, 6, RoundingMode.HALF_UP);
|
||||
BigDecimal unitVolume = rawVolume.setScale(3, RoundingMode.HALF_UP);
|
||||
return new WeightedDimensions(boxType, version, edgeAdditionCm, outerLength, outerWidth, outerHeight,
|
||||
rawVolume, unitVolume, "CUSTOMER_DIMENSION_" + boxType.name() + "_V" + version);
|
||||
}
|
||||
|
||||
private WeightedDimensions weightedActualDimensions(BigDecimal lengthCm, BigDecimal widthCm,
|
||||
BigDecimal heightCm) {
|
||||
BigDecimal outerLength = lengthCm.add(edgeAdditionCm);
|
||||
BigDecimal outerWidth = widthCm.add(edgeAdditionCm);
|
||||
BigDecimal outerHeight = heightCm.add(edgeAdditionCm);
|
||||
BigDecimal rawVolume = outerLength.multiply(outerWidth).multiply(outerHeight)
|
||||
.divide(CUBIC_CENTIMETERS_PER_CBM, 6, RoundingMode.HALF_UP);
|
||||
BigDecimal unitVolume = rawVolume.setScale(3, RoundingMode.HALF_UP);
|
||||
|
||||
@@ -147,8 +147,20 @@ public class MeasurementBatchService {
|
||||
if (!itemNumbers.add(source.itemNo())) {
|
||||
throw new BizException(ResultCode.VALIDATION_FAILED, "测量明细号不能重复");
|
||||
}
|
||||
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());
|
||||
}
|
||||
boolean hasOuterOverride = source.outerLengthCm() != null
|
||||
|| source.outerWidthCm() != null
|
||||
|| source.outerHeightCm() != null;
|
||||
BigDecimal baseLength = source.outerLengthCm() != null ? source.outerLengthCm() : source.lengthCm();
|
||||
BigDecimal baseWidth = source.outerWidthCm() != null ? source.outerWidthCm() : source.widthCm();
|
||||
BigDecimal baseHeight = source.outerHeightCm() != null ? source.outerHeightCm() : source.heightCm();
|
||||
CustomerDimensionWeightingService.WeightedDimensions weighted = dimensionRules.resolve(
|
||||
source.lengthCm(), source.widthCm(), source.heightCm());
|
||||
baseLength, baseWidth, baseHeight);
|
||||
String requestedMode = normalizeMode(source.coefficientMode());
|
||||
CustomerChargeRuleEntity coefficientRule = "MULTIPLY".equals(requestedMode)
|
||||
? requireCoefficientRule(command.tenantId(), customerId, source.chargeRuleId())
|
||||
@@ -159,32 +171,16 @@ public class MeasurementBatchService {
|
||||
boolean hasMatchedAddition = useDimensionRule && weighted.boxType() != null;
|
||||
// ADD 只从匹配箱规取得加边值,外尺寸仍以本次实测尺寸为基准,
|
||||
// 不能把箱规边界尺寸当成本次货物的实际外尺寸。
|
||||
BigDecimal outerLength = hasMatchedAddition ? source.lengthCm().add(addition) : source.lengthCm();
|
||||
BigDecimal outerWidth = hasMatchedAddition ? source.widthCm().add(addition) : source.widthCm();
|
||||
BigDecimal outerHeight = hasMatchedAddition ? source.heightCm().add(addition) : source.heightCm();
|
||||
boolean hasOuterOverride = source.outerLengthCm() != null
|
||||
|| source.outerWidthCm() != null
|
||||
|| source.outerHeightCm() != null;
|
||||
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());
|
||||
}
|
||||
BigDecimal outerLength = hasMatchedAddition ? baseLength.add(addition) : baseLength;
|
||||
BigDecimal outerWidth = hasMatchedAddition ? baseWidth.add(addition) : baseWidth;
|
||||
BigDecimal outerHeight = hasMatchedAddition ? baseHeight.add(addition) : baseHeight;
|
||||
if (coefficientRule != null) {
|
||||
BigDecimal specificationCoefficient = resolveSpecificationCoefficient(
|
||||
coefficientRule, source.lengthCm(), source.widthCm(), source.heightCm());
|
||||
coefficientRule, baseLength, baseWidth, baseHeight);
|
||||
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
|
||||
@@ -226,9 +222,13 @@ public class MeasurementBatchService {
|
||||
: useDimensionRule ? weighted.calculationRuleVersion() : "ACTUAL_DIMENSION_V1");
|
||||
item.setSourceImageFileId(source.intelligentImageFileId());
|
||||
item.setOverLimitWarning(source.overLimitWarning());
|
||||
item.setOuterLengthCm(outerLength.setScale(3, RoundingMode.HALF_UP));
|
||||
item.setOuterWidthCm(outerWidth.setScale(3, RoundingMode.HALF_UP));
|
||||
item.setOuterHeightCm(outerHeight.setScale(3, RoundingMode.HALF_UP));
|
||||
// Override fields retain the operator's base values so repeated saves do not compound the strategy.
|
||||
item.setOuterLengthCm((source.outerLengthCm() != null ? source.outerLengthCm() : outerLength)
|
||||
.setScale(3, RoundingMode.HALF_UP));
|
||||
item.setOuterWidthCm((source.outerWidthCm() != null ? source.outerWidthCm() : outerWidth)
|
||||
.setScale(3, RoundingMode.HALF_UP));
|
||||
item.setOuterHeightCm((source.outerHeightCm() != null ? source.outerHeightCm() : outerHeight)
|
||||
.setScale(3, RoundingMode.HALF_UP));
|
||||
item.setRemark(source.remark());
|
||||
item.setCreatedAt(LocalDateTime.now());
|
||||
return item;
|
||||
|
||||
Reference in New Issue
Block a user