导出托盘标签图片ZIP

This commit is contained in:
10001392 2026-05-29 17:34:55 +08:00
parent 25a88cbeb7
commit ac8e64884d
1 changed files with 21 additions and 28 deletions

View File

@ -700,43 +700,36 @@ public class StructuralPackageOrderController extends BaseController {
}
/**
* 导出托盘标签图片多个托盘合并为一张长图
* 导出托盘标签图片ZIP多个托盘分别生成图片并打包成ZIP
* @param id 订单id
*/
@GetMapping(value = "exportTrayImage", produces = MediaType.IMAGE_PNG_VALUE)
public ResponseEntity<byte[]> exportTrayImage(@Valid @RequestParam @NotNull Long id) throws Exception {
@PostMapping(value = "exportTrayImageZip", produces = "application/zip")
public ResponseEntity<byte[]> exportTrayImageZip(@Valid @RequestParam @NotNull Long id) throws Exception {
// 根据订单ID获取所有托盘
List<WmsStructuralPackageOrderTray> trays = structuralPackageOrderTrayService.getList(id);
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(trays)).throwMessage("数据不存在");
// 为每个托盘生成HTML内容并拼接成一个完整的HTML
StringBuilder mergedHtml = new StringBuilder();
mergedHtml.append("<!DOCTYPE html><html><head><meta charset='UTF-8'/></head><body style='margin:0;padding:0;'>");
for (WmsStructuralPackageOrderTray tray : trays) {
DeliverStructuralPackageOrderExtendVO trayVO = structuralPackageOrderTrayService.getInfo(tray.getId());
VUtil.trueThrowBusinessError(Objects.isNull(trayVO)).throwMessage("数据不存在");
trayVO.setQrCode(QRCodeUtil.generateQRCodeBase64(trayVO.getTrayNo(), 200, 200));
Map<String, Object> variables = new HashMap<>();
variables.put("info", trayVO);
String html = ThymeleafUtil.generator("/template/qrcode/", "tray-label", ".html", variables);
// 提取body内容并追加
int bodyStart = html.indexOf("<body");
int bodyEndStart = html.indexOf(">", bodyStart) + 1;
int bodyEnd = html.lastIndexOf("</body>");
if (bodyStart != -1 && bodyEnd != -1) {
mergedHtml.append(html.substring(bodyEndStart, bodyEnd));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ZipOutputStream zos = new ZipOutputStream(baos)) {
for (WmsStructuralPackageOrderTray tray : trays) {
DeliverStructuralPackageOrderExtendVO trayVO = structuralPackageOrderTrayService.getInfo(tray.getId());
VUtil.trueThrowBusinessError(Objects.isNull(trayVO)).throwMessage("数据不存在");
trayVO.setQrCode(QRCodeUtil.generateQRCodeBase64(trayVO.getTrayNo(), 200, 200));
Map<String, Object> variables = new HashMap<>();
variables.put("info", trayVO);
String html = ThymeleafUtil.generator("/template/qrcode/", "tray-label", ".html", variables);
ZipEntry entry = new ZipEntry(trayVO.getTrayNo() + ".png");
zos.putNextEntry(entry);
byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 600);
zos.write(imageBytes, 0, imageBytes.length);
zos.closeEntry();
}
}
mergedHtml.append("</body></html>");
// 将合并后的HTML转换为图片
byte[] imageBytes = HtmlToImageUtil.convertToPng(mergedHtml.toString(), 600);
byte[] zipBytes = baos.toByteArray();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.IMAGE_PNG);
headers.setContentLength(imageBytes.length);
return new ResponseEntity<>(imageBytes, headers, HttpStatus.OK);
headers.setContentType(MediaType.valueOf("application/zip"));
headers.setContentLength(zipBytes.length);
return new ResponseEntity<>(zipBytes, headers, HttpStatus.OK);
}
/**