From 02c8b8f089e20fdf2dd26549b82c373b30dc62ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Mon, 28 Apr 2025 11:24:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(device):=20=E6=B7=BB=E5=8A=A0=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E4=BA=8C=E7=BB=B4=E7=A0=81=E5=AF=BC=E5=87=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增设备二维码导出接口,支持单个或多个设备二维码的导出 -优化二维码生成逻辑,增加边框和文本的处理 --- .../admin/controller/DeviceController.java | 58 ++++++++++++++++++- .../common/pojo/request/IdPostRequest.java | 16 +++++ .../mobilebroken/common/util/QRCodeUtil.java | 7 ++- 3 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/IdPostRequest.java diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DeviceController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DeviceController.java index 010bb45c..9612f780 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DeviceController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DeviceController.java @@ -20,6 +20,7 @@ import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.dto.DeviceAddImportDTO; import com.nflg.mobilebroken.common.pojo.dto.DeviceUpdateImportDTO; +import com.nflg.mobilebroken.common.pojo.request.IdPostRequest; import com.nflg.mobilebroken.common.pojo.vo.DeviceQRCodeVO; import com.nflg.mobilebroken.common.util.*; import com.nflg.mobilebroken.repository.entity.*; @@ -29,6 +30,7 @@ import com.nflg.mobilebroken.starter.service.FileUploadService; import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -41,14 +43,19 @@ import javax.validation.Valid; import javax.validation.constraints.NotEmpty; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.net.URLEncoder; +import java.nio.file.Files; +import java.nio.file.Path; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.*; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * 设备管理 @@ -687,11 +694,11 @@ public class DeviceController extends ControllerBase { /** * 获取设备二维码 - * @param ids 设备id列表 + * @param request 请求参数 */ @PostMapping("getQRCode") - public ApiResult> getQRCode(@Valid @RequestBody @NotEmpty List ids){ - List devices=deviceService.listByIds(ids); + public ApiResult> getQRCode(@Valid @RequestBody IdPostRequest request){ + List devices=deviceService.listByIds(request.getIds()); List vos=new ArrayList<>(); devices.forEach(device -> { try { @@ -706,4 +713,49 @@ public class DeviceController extends ControllerBase { }); return ApiResult.success(vos); } + + /** + * 导出设备二维码图片 + * @param request 请求参数 + */ + @PostMapping("exportImages") + public ResponseEntity exportImages(@Valid @RequestBody IdPostRequest request){ + List devices=deviceService.listByIds(request.getIds()); + if (CollUtil.isNotEmpty(devices)){ + try { + if (devices.size()==1){ + byte[] bytes=deviceQRCodeService.generate(devices.get(0).getDeviceNo()); + HttpHeaders headers = new HttpHeaders(); + headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+ devices.get(0).getDeviceNo()+".jpg"); + return ResponseEntity.ok() + .headers(headers) + .contentType(MediaType.IMAGE_JPEG) + .body(bytes); + }else { + Path tempZipFile = Files.createTempFile("files", ".zip"); + try (FileOutputStream fos = new FileOutputStream(tempZipFile.toFile()); + ZipOutputStream zos = new ZipOutputStream(fos)) { + for (Device device : devices) { + ZipEntry zipEntry = new ZipEntry(device.getDeviceNo()+".jpg"); + zos.putNextEntry(zipEntry); + byte[] bytes=deviceQRCodeService.generate(device.getDeviceNo()); + zos.write(bytes, 0, bytes.length); + zos.closeEntry(); + } + } + byte[] zipContent = Files.readAllBytes(tempZipFile); + Files.deleteIfExists(tempZipFile); + HttpHeaders headers = new HttpHeaders(); + headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+ DateTimeUtil.format(LocalDateTime.now(),"yyyyMMddHHmmss")+".zip"); + return ResponseEntity.ok() + .headers(headers) + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(zipContent); + } + }catch (Exception e) { + VUtils.trueThrowBusinessError(true).throwMessage("生成二维码出错"); + } + } + return ResponseEntity.ok().build(); + } } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/IdPostRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/IdPostRequest.java new file mode 100644 index 00000000..16ea6fd3 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/IdPostRequest.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +@Data +public class IdPostRequest { + + /** + * id集合 + */ + @NotEmpty + private List ids; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/QRCodeUtil.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/QRCodeUtil.java index 47d10115..96e6d7c5 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/QRCodeUtil.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/QRCodeUtil.java @@ -55,8 +55,9 @@ public class QRCodeUtil { */ private static BufferedImage addBorderAndText(BufferedImage qrImage, String text) { int borderSize = 1; - int newWidth = qrImage.getWidth(); - int newHeight = qrImage.getHeight() + 10; + int extend=10; + int newWidth = qrImage.getWidth() + extend; + int newHeight = qrImage.getHeight() + extend; // 创建新画布(扩大尺寸以容纳边框) BufferedImage newImage = new BufferedImage( newWidth, @@ -68,7 +69,7 @@ public class QRCodeUtil { g.setColor(Color.WHITE); g.fillRect(0, 0, newWidth, newHeight); // 绘制原始二维码(居中) - g.drawImage(qrImage, borderSize, borderSize, null); + g.drawImage(qrImage, borderSize + extend / 2, borderSize, null); // 绘制边框 g.setColor(Color.BLACK); g.setStroke(new BasicStroke(borderSize));