From d323ac3ef99a6357e80d26b792a58ea67fd81dfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 18 Feb 2025 16:11:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=B0=E6=A1=8C=E6=89=B9=E9=87=8F=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=A1=8C=E7=A0=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/ShopTableController.java | 17 +++++ .../java/com/czg/config/ControllerAspect.java | 5 +- .../czg/account/service/ShopTableService.java | 6 ++ cash-common/cash-common-tools/pom.xml | 4 ++ cash-dependencies/pom.xml | 8 +++ .../service/impl/ShopTableServiceImpl.java | 69 +++++++++++++++++++ .../main/resources/mapper/ShopUserMapper.xml | 2 +- .../src/main/java/com/czg/Main.java | 2 +- pom.xml | 6 +- 9 files changed, 115 insertions(+), 4 deletions(-) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopTableController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopTableController.java index c095f030..f7eae3b0 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopTableController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopTableController.java @@ -13,9 +13,12 @@ import com.czg.utils.PageUtil; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + /** * 台桌管理 * @author Administrator @@ -26,6 +29,20 @@ public class ShopTableController { @Resource private ShopTableService shopTableService; + /** + * 批量生成台桌码 + * 权限标识: shopTable:code + * @return 台桌列表 + */ + @SaAdminCheckPermission("shopTable:code") + @PostMapping("/code") + public CzgResult> createCode(@RequestParam Integer num, HttpServletResponse response) throws IOException { + if (num > 100) { + return CzgResult.failure("单次最多可获取100个"); + } + shopTableService.createQrCode(StpKit.USER.getShopId(), num, response); + return CzgResult.success(); + } /** * 获取台桌列表 diff --git a/cash-common/cash-common-api-config/src/main/java/com/czg/config/ControllerAspect.java b/cash-common/cash-common-api-config/src/main/java/com/czg/config/ControllerAspect.java index 5b5b7f81..da0c2842 100644 --- a/cash-common/cash-common-api-config/src/main/java/com/czg/config/ControllerAspect.java +++ b/cash-common/cash-common-api-config/src/main/java/com/czg/config/ControllerAspect.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONObject; import com.czg.utils.ServletUtil; import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; @@ -16,6 +17,8 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; +import java.net.http.HttpResponse; + /** * 方法调用统一切面处理 @@ -40,7 +43,7 @@ public class ControllerAspect { // 如果请求参数中包含HttpServletRequest,剔除HttpServletRequest for (int i = 0; i < args.length; i++) { - if (args[i] instanceof HttpServletRequest) { + if (args[i] instanceof HttpServletRequest || args[i] instanceof HttpServletResponse) { args[i] = null; }else if (args[i] instanceof MultipartFile) { args[i] = "上传图片"; diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopTableService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopTableService.java index f18ff998..81796cfb 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopTableService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopTableService.java @@ -1,8 +1,12 @@ package com.czg.account.service; import com.czg.account.dto.table.ShopTableAddDTO; +import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; import com.czg.account.entity.ShopTable; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; /** * 台桌配置 服务层。 @@ -13,4 +17,6 @@ import com.czg.account.entity.ShopTable; public interface ShopTableService extends IService { Boolean add(Long shopId, ShopTableAddDTO shopTableAddDTO); + + void createQrCode(Long shopId, Integer num, HttpServletResponse response) throws IOException; } diff --git a/cash-common/cash-common-tools/pom.xml b/cash-common/cash-common-tools/pom.xml index 7ce224ed..06a3570e 100644 --- a/cash-common/cash-common-tools/pom.xml +++ b/cash-common/cash-common-tools/pom.xml @@ -23,6 +23,10 @@ + + com.google.zxing + core + cn.hutool hutool-all diff --git a/cash-dependencies/pom.xml b/cash-dependencies/pom.xml index aa120a79..8987ba71 100644 --- a/cash-dependencies/pom.xml +++ b/cash-dependencies/pom.xml @@ -35,6 +35,7 @@ 4.40.54.ALL 2.0.24 2.8.3 + 3.5.3 @@ -45,6 +46,13 @@ ${project.version} + + com.google.zxing + core + ${zxing.version} + + + com.aliyun.oss diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopTableServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopTableServiceImpl.java index 1caf0447..7ae176eb 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopTableServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopTableServiceImpl.java @@ -1,21 +1,37 @@ package com.czg.service.account.service.impl; +import cn.dev33.satoken.context.SaHolder; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.img.ImgUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; +import cn.hutool.extra.qrcode.QrCodeUtil; import com.czg.account.dto.table.ShopTableAddDTO; import com.czg.account.entity.ShopArea; import com.czg.account.service.ShopAreaService; import com.czg.enums.ShopTableStatusEnum; import com.czg.exception.ApiNotPrintException; +import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import com.czg.account.entity.ShopTable; import com.czg.account.service.ShopTableService; import com.czg.service.account.mapper.ShopTableMapper; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; @@ -63,4 +79,57 @@ public class ShopTableServiceImpl extends ServiceImpl qrCodeFiles = new ArrayList<>(); + + // 获取可用id + List idList = queryChain().isNull(ShopTable::getTableCode).select("id").orderBy(ShopTable::getId, false).page(new Page<>(1, num)).getRecords().stream().map(ShopTable::getId).toList(); + long maxId = idList.getLast(); + + // 3. 生成唯一二维码 + for (int i = 0; i < num; i++) { + String tableCode = shopId.toString(); + if (i > idList.size() - 1) { + tableCode = tableCode + ++maxId; + }else { + tableCode = tableCode + idList.get(i); + } + + tableCode = tableCode + RandomUtil.randomNumbers(8); + // 生成二维码 + BufferedImage qrImage = QrCodeUtil.generate(tableCode, 300, 300); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ImgUtil.write(qrImage, ImgUtil.IMAGE_TYPE_PNG, out); + + // 保存二维码到文件 + File qrFile = new File(tempDir, tableCode + ".png"); + FileUtil.writeBytes(out.toByteArray(), qrFile); + qrCodeFiles.add(qrFile); + } + + // 4. 生成 ZIP 文件 + File zipFile = new File(FileUtil.getTmpDir(), "shop_qrcodes_" + shopId + ".zip"); + ZipUtil.zip(zipFile, false, qrCodeFiles.toArray(new File[0])); + + // 5. 返回 ZIP 文件 + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", "attachment; filename=" + zipFile.getName()); + response.setContentLength((int) zipFile.length()); + IoUtil.copy(FileUtil.getInputStream(zipFile), response.getOutputStream()); + + // 6. 清理临时文件 + FileUtil.del(tempDir); + FileUtil.del(zipFile); + + } } diff --git a/cash-service/account-service/src/main/resources/mapper/ShopUserMapper.xml b/cash-service/account-service/src/main/resources/mapper/ShopUserMapper.xml index 4b58704c..abe21b64 100644 --- a/cash-service/account-service/src/main/resources/mapper/ShopUserMapper.xml +++ b/cash-service/account-service/src/main/resources/mapper/ShopUserMapper.xml @@ -37,7 +37,7 @@ where a.user_id = #{userInfoId}