This commit is contained in:
2026-09-14 15:33:29 +08:00
parent febe265c50
commit 46b4d14898
30 changed files with 502 additions and 200 deletions
@@ -216,7 +216,7 @@ class InternalPdfControllerTest {
.contains("name: X-Internal-Service-Token")
.contains("SEA_FREIGHT_SHIPPING_INSTRUCTION_A4_V1:")
.contains("BILL_OF_LADING_CONFIRMATION_A4_V1:")
.contains("DROPSHIP_PALLET_A4_V1")
.contains("DROPSHIP_PALLET_A4_V2")
.contains("additionalProperties: false")
.contains("minItems: 1")
.contains("required: [marksAndNos, quantity, packaging, descriptionOfGoods, grossWeight, measurement]")
@@ -268,23 +268,26 @@ class InternalPdfControllerTest {
private String validDropshipPalletA4RequestJson() {
return """
{
"templateCode": "DROPSHIP_PALLET_A4_V1",
"templateCode": "DROPSHIP_PALLET_A4_V2",
"pageSpec": {"widthMm": 210, "heightMm": 297},
"downloadFileName": "DP-260911-0034-A4托盘信息单.pdf",
"documents": [{
"palletNo": "DP-260911-0034",
"inboundCodes": "NYEXX2609110249",
"cartonCount": 3,
"skuCount": 1,
"weightKg": 90,
"volumeCbm": 0.534,
"destinationWarehouse": "纽约 N.JDF",
"palletSequence": 1,
"totalPallets": 3,
"barcodeContent": "DP-260911-0034",
"skuRows": [{
"inboundRows": [{
"inboundCode": "NYEXX2609110249",
"skuCode": "SKU-001",
"cargoName": "蓝牙音箱",
"customerNickname": "小虫科技",
"cartonCount": 3,
"skuQuantity": 90
"itemQuantity": 90
}],
"skuRows": [{
"skuCode": "SKU-001",
"cartonCount": 3,
"itemQuantity": 90,
"unitsPerCarton": "30"
}]
}]
}
@@ -27,11 +27,12 @@ class DropshipPalletA4PdfServiceGenerationTest {
@Test
void generatesOneA4PageWithPalletBarcodeAndSkuDetails() throws Exception {
DropshipPalletA4PdfDtos.Document document = new DropshipPalletA4PdfDtos.Document(
"DP-260911-0034", "NYEXX2609110249", 3, 2,
new BigDecimal("90"), new BigDecimal("0.534"), "DP-260911-0034",
"DP-260911-0034", "纽约 N.JDF", 1, 3, "DP-260911-0034",
List.of(new DropshipPalletA4PdfDtos.InboundRow(
"NYEXX2609110249", "小虫科技", 3, 90)),
List.of(
new DropshipPalletA4PdfDtos.SkuRow("NYEXX2609110249", "SKU-001", "蓝牙音箱", 2, 40),
new DropshipPalletA4PdfDtos.SkuRow("NYEXX2609110249", "SKU-002", "充电线", 1, 50)));
new DropshipPalletA4PdfDtos.SkuRow("SKU-001", 2, 40, "20"),
new DropshipPalletA4PdfDtos.SkuRow("SKU-002", 1, 50, "50")));
var generated = service.generate(new DropshipPalletA4PdfDtos.Request(
DropshipPalletA4PdfDtos.TEMPLATE,
new DropshipPalletA4PdfDtos.PageSpec(new BigDecimal("210"), new BigDecimal("297")),
@@ -43,24 +44,28 @@ class DropshipPalletA4PdfServiceGenerationTest {
assertThat(pdf.getPage(0).getMediaBox().getWidth()).isCloseTo(PdfUnits.mmToPt(210), org.assertj.core.data.Offset.offset(.002f));
assertThat(pdf.getPage(0).getMediaBox().getHeight()).isCloseTo(PdfUnits.mmToPt(297), org.assertj.core.data.Offset.offset(.002f));
assertThat(new PDFTextStripper().getText(pdf))
.contains("DP-260911-0034", "NYEXX2609110249", "SKU 明细", "SKU-001", "SKU-002", "40", "50")
.contains("DP-260911-0034", "N.JDF", "NYEXX2609110249",
"SKU-001", "SKU-002", "40", "50")
.containsOnlyOnce("DP-260911-0034")
.doesNotContain("状态", "待封托", "已封托");
.doesNotContain("状态", "待封托", "已封托", "重量", "体积");
}
}
@Test
void keepsTenInboundCodesAndThirtyTwoSkuRowsOnOneA4Page() throws Exception {
List<String> inboundCodes = new ArrayList<>();
for (int index = 1; index <= 10; index++) inboundCodes.add("NYEXX260911" + String.format("%04d", 240 + index));
List<DropshipPalletA4PdfDtos.InboundRow> inboundRows = new ArrayList<>();
for (int index = 1; index <= 10; index++) {
inboundRows.add(new DropshipPalletA4PdfDtos.InboundRow(
"NYEXX260911" + String.format("%04d", 240 + index), "客户" + index, 2, index * 5));
}
List<DropshipPalletA4PdfDtos.SkuRow> rows = new ArrayList<>();
for (int index = 1; index <= 32; index++) {
rows.add(new DropshipPalletA4PdfDtos.SkuRow(inboundCodes.get((index - 1) % inboundCodes.size()),
"SKU-" + String.format("%03d", index), "测试商品" + index, 2, index * 5));
rows.add(new DropshipPalletA4PdfDtos.SkuRow(
"SKU-" + String.format("%03d", index), 2, index * 5, "5-10"));
}
DropshipPalletA4PdfDtos.Document document = new DropshipPalletA4PdfDtos.Document(
"DP-260911-0034", String.join("/", inboundCodes), 64, 32,
new BigDecimal("860.5"), new BigDecimal("6.728"), "DP-260911-0034", rows);
"DP-260911-0034", "纽约 N.JDF", 1, 1,
"DP-260911-0034", inboundRows, rows);
var generated = service.generate(new DropshipPalletA4PdfDtos.Request(
DropshipPalletA4PdfDtos.TEMPLATE,
new DropshipPalletA4PdfDtos.PageSpec(new BigDecimal("210"), new BigDecimal("297")),
@@ -77,11 +82,11 @@ class DropshipPalletA4PdfServiceGenerationTest {
void rejectsSkuRowsThatCannotFitOnOneA4Page() {
List<DropshipPalletA4PdfDtos.SkuRow> rows = new ArrayList<>();
for (int index = 0; index < 35; index++) {
rows.add(new DropshipPalletA4PdfDtos.SkuRow("INBOUND", "SKU-" + index, "商品", 1, 1));
rows.add(new DropshipPalletA4PdfDtos.SkuRow("SKU-" + index, 1, 1, "1"));
}
DropshipPalletA4PdfDtos.Document document = new DropshipPalletA4PdfDtos.Document(
"DP-260911-0034", "INBOUND", 35, 35,
BigDecimal.ZERO, BigDecimal.ZERO, "DP-260911-0034", rows);
"DP-260911-0034", "纽约 N.JDF", 1, 1, "DP-260911-0034",
List.of(new DropshipPalletA4PdfDtos.InboundRow("INBOUND", "客户", 35, 35)), rows);
assertThatThrownBy(() -> service.generate(new DropshipPalletA4PdfDtos.Request(
DropshipPalletA4PdfDtos.TEMPLATE,