优化
This commit is contained in:
+56
@@ -0,0 +1,56 @@
|
||||
package com.baiyue.common.core.container;
|
||||
|
||||
import com.baiyue.common.core.api.ResultCode;
|
||||
import com.baiyue.common.core.exception.BizException;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/** Platform-wide container types and practical loading limits. */
|
||||
public final class ContainerSpecificationCatalog {
|
||||
public static final String DEFAULT_CONTAINER_TYPE = "40HQ";
|
||||
|
||||
private static final List<Specification> ORDERED_VALUES = List.of(
|
||||
new Specification("40GP", new BigDecimal("56"), new BigDecimal("58"), new BigDecimal("19500"),
|
||||
"美线电商较少使用,通常优先选择40HQ"),
|
||||
new Specification("40HQ", new BigDecimal("65"), new BigDecimal("68"), new BigDecimal("19500"),
|
||||
"轻泡货首选,适合家居、玩具、日用品"),
|
||||
new Specification("45HQ", new BigDecimal("82"), new BigDecimal("86"), new BigDecimal("19500"),
|
||||
"抛货量大时考虑,底盘和海外仓预约资源较少")
|
||||
);
|
||||
private static final Map<String, Specification> VALUES = ORDERED_VALUES.stream()
|
||||
.collect(Collectors.toUnmodifiableMap(Specification::containerType, Function.identity()));
|
||||
|
||||
private ContainerSpecificationCatalog() {}
|
||||
|
||||
public static List<Specification> values() {
|
||||
return ORDERED_VALUES;
|
||||
}
|
||||
|
||||
public static Specification require(String containerType) {
|
||||
String normalized = containerType == null ? "" : containerType.trim().toUpperCase(Locale.ROOT);
|
||||
Specification specification = VALUES.get(normalized);
|
||||
if (specification == null) {
|
||||
throw new BizException(ResultCode.VALIDATION_FAILED, "柜型仅支持40GP、40HQ、45HQ");
|
||||
}
|
||||
return specification;
|
||||
}
|
||||
|
||||
public static Specification requireMatch(String containerType, BigDecimal capacityCbm, BigDecimal maxWeightKg) {
|
||||
Specification specification = require(containerType);
|
||||
if (capacityCbm == null || maxWeightKg == null
|
||||
|| specification.capacityCbm().compareTo(capacityCbm) != 0
|
||||
|| specification.maxWeightKg().compareTo(maxWeightKg) != 0) {
|
||||
throw new BizException(ResultCode.VALIDATION_FAILED,
|
||||
"柜型容量和货重上限必须使用平台统一定义");
|
||||
}
|
||||
return specification;
|
||||
}
|
||||
|
||||
public record Specification(String containerType, BigDecimal recommendedMinCbm, BigDecimal capacityCbm,
|
||||
BigDecimal maxWeightKg, String description) {}
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
package com.baiyue.common.core.container;
|
||||
|
||||
import com.baiyue.common.core.exception.BizException;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
class ContainerSpecificationCatalogTest {
|
||||
@Test
|
||||
void exposesTheThreeCanonicalContainerTypesInBusinessOrder() {
|
||||
assertThat(ContainerSpecificationCatalog.values())
|
||||
.extracting(ContainerSpecificationCatalog.Specification::containerType)
|
||||
.containsExactly("40GP", "40HQ", "45HQ");
|
||||
assertThat(ContainerSpecificationCatalog.DEFAULT_CONTAINER_TYPE).isEqualTo("40HQ");
|
||||
}
|
||||
|
||||
@Test
|
||||
void exposesPracticalLoadingRangesAndRejectsRemovedTypes() {
|
||||
var specification = ContainerSpecificationCatalog.requireMatch(
|
||||
"40hq", new BigDecimal("68.000"), new BigDecimal("19500.000"));
|
||||
|
||||
assertThat(specification.containerType()).isEqualTo("40HQ");
|
||||
assertThat(specification.recommendedMinCbm()).isEqualByComparingTo("65");
|
||||
assertThatThrownBy(() -> ContainerSpecificationCatalog.require("40HC"))
|
||||
.isInstanceOf(BizException.class).hasMessageContaining("40GP、40HQ、45HQ");
|
||||
assertThatThrownBy(() -> ContainerSpecificationCatalog.requireMatch(
|
||||
"40HQ", new BigDecimal("76"), new BigDecimal("19500")))
|
||||
.isInstanceOf(BizException.class).hasMessageContaining("统一定义");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user