This commit is contained in:
2026-09-11 17:27:27 +08:00
parent 458a4cfa50
commit 63ce4c48a7
9 changed files with 154 additions and 12 deletions
@@ -129,6 +129,18 @@ public class PlatformDropshipPalletizationController {
return printService.generateDropshipPallet(pallet, task.inboundCode(), requestId);
}
@GetMapping("/tasks/{taskId}/pallets/print")
@PreAuthorize("hasAuthority('platform:firstleg:pda:view')")
public ResponseEntity<byte[]> printTaskPallets(@AuthenticationPrincipal AuthenticatedUser user,
@PathVariable @Positive long taskId,
@RequestParam @Positive long warehouseId,
@RequestHeader(value = "X-Request-Id", required = false) String requestId) {
FirstlegScopeGuard.platform(user);
Task task = service.task(taskId, warehouseId, user.userId());
return printService.generateDropshipPallets(
service.generatedPallets(taskId, warehouseId, user.userId()), task.inboundCode(), requestId);
}
@GetMapping("/inbound-orders/{inboundId}/pallets")
@PreAuthorize("hasAuthority('firstleg:inbound:list')")
public ApiResponse<List<Pallet>> inboundPallets(@AuthenticationPrincipal AuthenticatedUser user,
@@ -67,10 +67,11 @@ public interface DropshipPalletizationMapper {
PalletRow pallet(@Param("taskId") long taskId,@Param("palletId") long palletId,@Param("warehouseId") long warehouseId);
@Select("""
SELECT p.* FROM fl_dropship_pallet p
WHERE p.task_id=#{taskId}
OR EXISTS(SELECT 1 FROM fl_dropship_pallet_carton c WHERE c.pallet_id=p.id AND c.task_id=#{taskId})
WHERE EXISTS(SELECT 1 FROM fl_dropship_pallet_carton c WHERE c.pallet_id=p.id AND c.task_id=#{taskId})
ORDER BY p.id
""") List<PalletRow> pallets(@Param("taskId") long taskId);
@Select("SELECT * FROM fl_dropship_pallet WHERE task_id=#{taskId} ORDER BY id")
List<PalletRow> generatedPallets(@Param("taskId") long taskId);
@Select("""
SELECT p.* FROM fl_dropship_pallet p
WHERE ((p.tenant_id=#{tenantId} AND p.inbound_id=#{inboundId})
@@ -156,6 +156,12 @@ public class DropshipPalletizationService {
return code;
}
public List<Pallet> generatedPallets(long taskId,long warehouseId,long operatorId){
TaskRow task=requireTask(taskId,warehouseId);
if(task.getAssigneeId()!=null && task.getAssigneeId()!=operatorId) throw conflict("任务已由其他人员领取");
return mapper.generatedPallets(taskId).stream().map(p->palletView(p,task.getInboundCode())).toList();
}
private PalletRow requireAssignablePallet(TaskRow task,String palletNo){
PalletRow existing=mapper.palletByNo(palletNo);
if(existing==null) throw new BizException(ResultCode.NOT_FOUND,"托盘码不存在,请扫描测量审核后生成的 DP 托盘码");
@@ -117,6 +117,30 @@ public class InboundCartonLabelPrintService {
/** 一件代发 A4 托盘信息单:托盘号、Code 128 一维码和 SKU 归托明细。 */
public ResponseEntity<byte[]> generateDropshipPallet(Pallet pallet, String inboundCode, String requestId) {
return generateDropshipPallets(List.of(pallet), inboundCode, requestId);
}
/** 一票预生成托盘码合并为一个多页 PDF,避免 PDA 展开或逐个下载大量空托盘。 */
public ResponseEntity<byte[]> generateDropshipPallets(List<Pallet> pallets, String inboundCode, String requestId) {
if (pallets == null || pallets.isEmpty()) {
throw new BizException(ResultCode.CONFLICT, "托盘码尚未生成,不能打印");
}
List<PrintPdfClient.DropshipPalletDocument> documents = pallets.stream()
.map(pallet -> dropshipPalletDocument(pallet, inboundCode)).toList();
String fileName = pallets.size() == 1
? pallets.get(0).palletNo() + "-A4托盘信息单.pdf"
: inboundCode + "-" + pallets.size() + "托-A4托盘信息单.pdf";
PrintPdfClient.DropshipPalletA4PdfRequest request = new PrintPdfClient.DropshipPalletA4PdfRequest(
"DROPSHIP_PALLET_A4_V1", new PrintPdfClient.PageSpec(A4_WIDTH_MM, A4_HEIGHT_MM),
fileName, documents);
try {
return requirePdf(printClient.generateDropshipPalletA4Documents(internalToken, requestId, request));
} catch (FeignException | NoFallbackAvailableException exception) {
throw new BizException(ResultCode.SERVICE_UNAVAILABLE, "打印服务暂不可用,请稍后重试");
}
}
private PrintPdfClient.DropshipPalletDocument dropshipPalletDocument(Pallet pallet, String inboundCode) {
if (pallet == null || !StringUtils.hasText(pallet.palletNo())) {
throw new BizException(ResultCode.CONFLICT, "托盘码尚未生成,不能打印");
}
@@ -127,17 +151,9 @@ public class InboundCartonLabelPrintService {
.map(item -> new PrintPdfClient.DropshipPalletSkuRow(item.inboundCode(), item.skuCode(),
item.cargoName(), number(item.cartonCount()), number(item.skuQuantity())))
.toList();
PrintPdfClient.DropshipPalletDocument document = new PrintPdfClient.DropshipPalletDocument(
return new PrintPdfClient.DropshipPalletDocument(
pallet.palletNo(), inboundCodes, number(pallet.cartonCount()), number(pallet.skuCount()),
pallet.weightKg(), pallet.volumeCbm(), pallet.palletNo(), skuRows);
PrintPdfClient.DropshipPalletA4PdfRequest request = new PrintPdfClient.DropshipPalletA4PdfRequest(
"DROPSHIP_PALLET_A4_V1", new PrintPdfClient.PageSpec(A4_WIDTH_MM, A4_HEIGHT_MM),
pallet.palletNo() + "-A4托盘信息单.pdf", List.of(document));
try {
return requirePdf(printClient.generateDropshipPalletA4Documents(internalToken, requestId, request));
} catch (FeignException | NoFallbackAvailableException exception) {
throw new BizException(ResultCode.SERVICE_UNAVAILABLE, "打印服务暂不可用,请稍后重试");
}
}
private int number(Integer value) {