贴标申请,仓储转运

This commit is contained in:
2026-09-17 17:37:29 +08:00
parent 3b8b6f5aa2
commit 29f05b7b09
106 changed files with 5019 additions and 471 deletions
@@ -21,6 +21,10 @@ public class InboundPlanLine {
private String destinationWarehouseId;
private String destinationWarehouseCode;
private String destinationWarehouseName;
private String deliveryAddress;
private String postalCode;
private String contactName;
private String contactPhone;
private BigDecimal volumeCbm;
private Integer requiredPackageCount;
private Integer plannedPalletCount;
@@ -22,6 +22,11 @@ public class InboundPlanPallet {
private String destinationWarehouseId;
private String destinationWarehouseCode;
private String destinationWarehouseName;
private String destinationType;
private String deliveryAddress;
private String postalCode;
private String contactName;
private String contactPhone;
private BigDecimal capacityCbm;
private BigDecimal allocatedVolumeCbm;
private Integer sequenceNo;
@@ -6,6 +6,8 @@ import com.fasterxml.jackson.annotation.JsonAlias;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClient;
import org.springframework.web.server.ResponseStatusException;
@@ -293,6 +295,27 @@ public class HttpWarehouseResourceGateway implements WarehouseResourceGateway {
return palletBatch("/internal/v1/warehouse-pallet-batches/compensate", request);
}
@Override
public PrintableFile printPalletLabel(long warehouseId, long palletId, String transferNo, String requestId) {
ResponseEntity<byte[]> response = client.get()
.uri(builder -> builder.path("/internal/v1/warehouse-pallets/{warehouseId}/{palletId}/label")
.queryParam("transferNo", transferNo).build(warehouseId, palletId))
.header("X-Internal-Service-Token", internalToken)
.header("X-Request-Id", requestId == null ? "" : requestId)
.retrieve().onStatus(HttpStatusCode::isError, (request, result) -> {
throw new ResponseStatusException(result.getStatusCode().is4xxClientError()
? HttpStatus.NOT_FOUND : HttpStatus.SERVICE_UNAVAILABLE,
"Warehouse pallet label printing failed");
}).toEntity(byte[].class);
byte[] content = response.getBody() == null ? new byte[0] : response.getBody();
if (content.length == 0) throw new ResponseStatusException(HttpStatus.SERVICE_UNAVAILABLE,
"Warehouse pallet label printing returned an empty PDF");
String fileName = response.getHeaders().getContentDisposition().getFilename();
String contentType = response.getHeaders().getContentType() == null
? MediaType.APPLICATION_PDF_VALUE : response.getHeaders().getContentType().toString();
return new PrintableFile(content, fileName == null ? "pallet-label.pdf" : fileName, contentType);
}
private PalletBatchResponse palletBatch(String path, Object body) {
PalletBatchEnvelope response = client.post().uri(path)
.header("X-Internal-Service-Token", internalToken).body(body).retrieve()
@@ -39,6 +39,9 @@ public interface WarehouseResourceGateway {
default PalletBatchResponse compensatePalletBatch(PalletBatchCompensation request) {
throw new UnsupportedOperationException("Warehouse pallet batch compensation is not configured");
}
default PrintableFile printPalletLabel(long warehouseId, long palletId, String transferNo, String requestId) {
throw new UnsupportedOperationException("Warehouse pallet label printing is not configured");
}
record WarehousePalletReference(long palletId, String palletNo, long warehouseId, long locationId,
String status, String fbaWarehouseCode, java.math.BigDecimal unitPrice, int version) {
@@ -67,4 +70,5 @@ public interface WarehouseResourceGateway {
record PalletBatchItem(long customerId, String businessKey, String inboundPlanNo, int sequenceNo,
long palletId, String palletCode, long locationId, long resourceLockId,
String status) { }
record PrintableFile(byte[] content, String fileName, String contentType) { }
}