This commit is contained in:
2026-08-07 15:53:55 +08:00
parent a4a03a8ae8
commit 3f597677fe
23 changed files with 1157 additions and 2 deletions
@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.List;
/** 供头程履约服务校验入仓单所关联订单货物明细。 */
@RestController
@@ -49,6 +50,22 @@ public class InternalOrderCargoController {
cargo.getCargoName(), cargo.getPackageCount(), cargo.getGrossWeightKg(), cargo.getVolumeCbm()));
}
@GetMapping("/{tenantId}/{orderId}")
public ApiResponse<List<CargoLabelBinding>> listForCartonLabels(
@RequestHeader(value = "X-Internal-Service-Token", required = false) String token,
@PathVariable long tenantId,
@PathVariable long orderId) {
requireToken(token);
if (tenantId <= 0 || orderId <= 0) {
throw new BizException(ResultCode.BAD_REQUEST, "租户和订单ID必须大于0");
}
return ApiResponse.success(orders.findCargo(tenantId, orderId).stream()
.map(cargo -> new CargoLabelBinding(cargo.getId(), cargo.getOrderId(), cargo.getItemNo(),
cargo.getCargoName(), cargo.getPackageCount(), cargo.getLengthCm(), cargo.getWidthCm(),
cargo.getHeightCm()))
.toList());
}
private void requireToken(String token) {
if (token == null || !MessageDigest.isEqual(expectedToken, token.getBytes(StandardCharsets.UTF_8))) {
throw new BizException(ResultCode.FORBIDDEN, "内部服务凭证无效");
@@ -60,4 +77,9 @@ public class InternalOrderCargoController {
java.math.BigDecimal originalGrossWeightKg,
java.math.BigDecimal originalVolumeCbm) {
}
public record CargoLabelBinding(Long cargoId, Long orderId, Integer itemNo, String cargoName,
Integer packageCount, java.math.BigDecimal lengthCm,
java.math.BigDecimal widthCm, java.math.BigDecimal heightCm) {
}
}
@@ -16,6 +16,9 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import java.math.BigDecimal;
import java.util.List;
@SpringJUnitConfig(InternalOrderCargoController.class)
@TestPropertySource(properties = "baiyue.security.internal-service-token=internal-token")
class InternalOrderCargoControllerTest {
@@ -58,4 +61,34 @@ class InternalOrderCargoControllerTest {
verify(orders).findCargo(12L, 21L, 31L);
verifyNoMoreInteractions(orders);
}
@Test
void listsCargoInRepositoryOrderForStableCartonAllocation() {
OrderCargoEntity first = cargo(31L, 1, 3, "60", "40", "30");
OrderCargoEntity second = cargo(32L, 2, 2, "50", "30", "20");
when(orders.findCargo(11L, 21L)).thenReturn(List.of(first, second));
var response = controller.listForCartonLabels("internal-token", 11L, 21L);
assertThat(response.successful()).isTrue();
assertThat(response.data()).extracting(InternalOrderCargoController.CargoLabelBinding::cargoId)
.containsExactly(31L, 32L);
assertThat(response.data().get(0).packageCount()).isEqualTo(3);
assertThat(response.data().get(0).lengthCm()).isEqualByComparingTo("60");
verify(orders).findCargo(11L, 21L);
}
private OrderCargoEntity cargo(long id, int itemNo, int packageCount,
String length, String width, String height) {
OrderCargoEntity cargo = new OrderCargoEntity();
cargo.setId(id);
cargo.setOrderId(21L);
cargo.setItemNo(itemNo);
cargo.setCargoName("货物" + itemNo);
cargo.setPackageCount(packageCount);
cargo.setLengthCm(new BigDecimal(length));
cargo.setWidthCm(new BigDecimal(width));
cargo.setHeightCm(new BigDecimal(height));
return cargo;
}
}