diff --git a/bonus-common-biz/src/main/java/com/bonus/common/biz/config/QrCodeUtils.java b/bonus-common-biz/src/main/java/com/bonus/common/biz/config/QrCodeUtils.java index 9ab5c30a..3ba0c091 100644 --- a/bonus-common-biz/src/main/java/com/bonus/common/biz/config/QrCodeUtils.java +++ b/bonus-common-biz/src/main/java/com/bonus/common/biz/config/QrCodeUtils.java @@ -1,5 +1,6 @@ package com.bonus.common.biz.config; +import com.bonus.common.core.utils.StringUtils; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; @@ -44,6 +45,9 @@ public class QrCodeUtils { /** 二维码容错率 */ private static ErrorCorrectionLevel level = ErrorCorrectionLevel.L; + // 加文字二维码高 + private static final int WORDHEIGHT = 300; + /** * 生成带logo的二维码图片 * @@ -176,5 +180,97 @@ public class QrCodeUtils { } return image; } + + /** + * 添加Logo + * @param codeFile + * @param qrUrl + * @param words + */ + public static void drawLogoQRCode(File codeFile, String qrUrl, String words) { + try { + MultiFormatWriter multiFormatWriter = new MultiFormatWriter(); + // 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数 + Hashtable hints = new Hashtable(); + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + // 设置编码方式 + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); + hints.put(EncodeHintType.MARGIN, 0); + BitMatrix bm = multiFormatWriter.encode(qrUrl, BarcodeFormat.QR_CODE, width, height, hints); + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + + // 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色 + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + image.setRGB(x, y, bm.get(x, y) ? onColor : offColor); + } + } + + // 新的图片,把带logo的二维码下面加上文字 + image = insertWords(image,words); + + image.flush(); + if (!ImageIO.write(image, "jpg", codeFile)) { + throw new IOException("Could not write an image of format jpg to " + codeFile); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 插入文字到图片中间 + * @param image + * @param words + * @return + */ + private static BufferedImage insertWords(BufferedImage image,String words){ + // 新的图片,把带logo的二维码下面加上文字 + if (StringUtils.isNotEmpty(words)) { + + //创建一个带透明色的BufferedImage对象 + BufferedImage outImage = new BufferedImage(width, WORDHEIGHT, BufferedImage.TYPE_INT_RGB); + for (int x = 0; x < width; x++) { + for (int y = 0; y < WORDHEIGHT; y++) { + outImage.setRGB(x, y, offColor); + } + } + System.err.println("---------1---------"); + Graphics2D outg = outImage.createGraphics(); + setGraphics2D(outg); + System.err.println("---------2---------"); + // 画二维码到新的面板 + outg.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null); + // 画文字到新的面板 + outg.setColor(Color.BLACK); + // 字体、字型、字号 + outg.setFont(new Font("微软雅黑", Font.PLAIN, 18)); + //文字长度 + int strWidth = outg.getFontMetrics().stringWidth(words); + //总长度减去文字长度的一半 (居中显示) + int wordStartX=(width - strWidth) / 2; + //height + (outImage.getHeight() - height) / 2 + 12 + int wordStartY=height + 10; + // 画文字 + System.err.println("---------3---------"); + outg.drawString(words, wordStartX, wordStartY); + outg.dispose(); + outImage.flush(); + System.err.println("---------4---------"); + return outImage; + } + return null; + } + + /** + * 设置 Graphics2D 属性 (抗锯齿) + * @param graphics2D + */ + private static void setGraphics2D(Graphics2D graphics2D){ + graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + graphics2D.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); + Stroke s = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER); + graphics2D.setStroke(s); + } } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/controller/BmQrBoxController.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/controller/BmQrBoxController.java new file mode 100644 index 00000000..a1af7d33 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/controller/BmQrBoxController.java @@ -0,0 +1,106 @@ +package com.bonus.material.basic.controller; + +import com.bonus.common.core.web.controller.BaseController; +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.common.core.web.page.TableDataInfo; +import com.bonus.common.log.annotation.SysLog; +import com.bonus.common.log.enums.OperaType; +import com.bonus.common.security.annotation.RequiresPermissions; +import com.bonus.material.basic.domain.BmQrBoxInfo; +import com.bonus.material.basic.service.BmQrBoxService; +import com.bonus.material.common.annotation.PreventRepeatSubmit; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @Author ma_sh + * @create 2024/12/11 17:25 + */ +@Api(tags = "二维码标准箱管理接口") +@RestController +@RequestMapping("/bm_qrcode_box") +public class BmQrBoxController extends BaseController { + + @Resource + private BmQrBoxService qrBoxService; + + /** + * 查询二维码管理列表 + * @param bmQrBoxInfo + * @return + */ + @ApiOperation(value = "查询二维码标准箱管理列表") + @RequiresPermissions("basic:qrBox:list") + @GetMapping("/list") + public TableDataInfo list(BmQrBoxInfo bmQrBoxInfo) + { + startPage(); + List list = qrBoxService.selectBmQrBoxInfoList(bmQrBoxInfo); + return getDataTable(list); + } + + /** + * 新增二维码标准箱管理 + * @param bmQrBoxInfo + * @return + */ + @ApiOperation(value = "新增二维码标准箱管理") + //@PreventRepeatSubmit + //@RequiresPermissions("basic:qrBox:add") + @SysLog(title = "二维码标准箱管理", businessType = OperaType.INSERT, logType = 1,module = "仓储管理->新增二维码标准箱管理") + @PostMapping("/add") + public AjaxResult add(@RequestBody BmQrBoxInfo bmQrBoxInfo) + { + return qrBoxService.insertBmQrcodeInfo(bmQrBoxInfo); + } + + /** + * 修改二维码标准箱管理 + * @param bmQrBoxInfo + * @return + */ + @ApiOperation(value = "二维码标准箱管理") + @PreventRepeatSubmit + //@RequiresPermissions("basic:qrBox:edit") + @SysLog(title = "二维码标准箱管理", businessType = OperaType.UPDATE, logType = 1,module = "仓储管理->修改二维码标准箱") + @PostMapping("/edit") + public AjaxResult edit(@RequestBody BmQrBoxInfo bmQrBoxInfo) + { + return qrBoxService.updateBmQrcodeInfo(bmQrBoxInfo); + } + + /** + * 删除二维码标准箱 + * @param bmQrBoxInfo + * @return + */ + @ApiOperation(value = "删除二维码标准箱") + //@PreventRepeatSubmit + //@RequiresPermissions("basic:info:remove") + @SysLog(title = "二维码标准箱管理", businessType = OperaType.DELETE, logType = 1,module = "仓储管理->删除二维码标准箱") + @PostMapping("/deleteById") + public AjaxResult deleteById(@RequestBody BmQrBoxInfo bmQrBoxInfo) + { + return qrBoxService.deleteById(bmQrBoxInfo); + } + + /** + * 下载二维码标准箱 + * @param bmQrBoxInfo + * @param response + * @return + */ + @ApiOperation(value = "下载二维码标准箱") + //@PreventRepeatSubmit + //@RequiresPermissions("basic:qrBox:download") + @PostMapping("/download") + public void download(@RequestBody BmQrBoxInfo bmQrBoxInfo, HttpServletResponse response) + { + qrBoxService.download(bmQrBoxInfo, response); + } +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/domain/BmQrBoxInfo.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/domain/BmQrBoxInfo.java new file mode 100644 index 00000000..aced0162 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/domain/BmQrBoxInfo.java @@ -0,0 +1,54 @@ +package com.bonus.material.basic.domain; + +import com.bonus.common.core.annotation.Excel; +import com.bonus.common.core.web.domain.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.ToString; + +/** + * 二维码管理对象 bm_qrcode_info + * + * @author xsheng + * @date 2024-09-26 + */ + + +@Data +@ToString +public class BmQrBoxInfo extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 二维码ID */ + private Long qrId; + + @ApiModelProperty(value = "二维码标准箱名称") + private String qrName; + + /** 二维码 */ + @ApiModelProperty(value = "二维码") + private String qrCode; + + @ApiModelProperty(value = "二维码路径") + private String qrUrl; + + /** 类型ID */ + @ApiModelProperty(value = "类型ID") + private Long typeId; + + /** 二维码类型 */ + @ApiModelProperty(value = "二维码类型") + private String qrType; + + /** 任务ID */ + @Excel(name = "任务ID") + @ApiModelProperty(value = "任务ID") + private Long taskId; + + /** 数据所属组织 */ + @ApiModelProperty(value = "标准箱绑定机具数量") + private Integer typeNum; + + +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/mapper/BmQrBoxMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/mapper/BmQrBoxMapper.java new file mode 100644 index 00000000..10041da3 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/mapper/BmQrBoxMapper.java @@ -0,0 +1,41 @@ +package com.bonus.material.basic.mapper; + +import com.bonus.material.basic.domain.BmQrBoxInfo; +import com.bonus.material.basic.domain.BmQrcodeInfo; + +import java.util.List; + +/** + * @Author ma_sh + * @create 2024/12/10 17:27 + */ +public interface BmQrBoxMapper { + + /** + * 查询二维码标准箱管理 + * @param bmQrBoxInfo + * @return + */ + List find(BmQrBoxInfo bmQrBoxInfo); + + /** + * 新增二维码标准箱管理 + * @param bmQrBoxInfo + * @return + */ + int insertBmQrcodeInfo(BmQrBoxInfo bmQrBoxInfo); + + /** + * 修改二维码标准箱管理 + * @param bmQrBoxInfo + * @return + */ + int updateBmQrcodeInfo(BmQrBoxInfo bmQrBoxInfo); + + /** + * 删除二维码标准箱管理 + * @param bmQrBoxInfo + * @return + */ + int deleteById(BmQrBoxInfo bmQrBoxInfo); +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/BmQrBoxService.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/BmQrBoxService.java new file mode 100644 index 00000000..b2cb0361 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/BmQrBoxService.java @@ -0,0 +1,50 @@ +package com.bonus.material.basic.service; + +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.material.basic.domain.BmQrBoxInfo; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @Author ma_sh + * @create 2024/12/10 17:26 + */ +public interface BmQrBoxService { + + /** + * 查询二维码标准箱管理列表 + * @param bmQrBoxInfo + * @return + */ + List selectBmQrBoxInfoList(BmQrBoxInfo bmQrBoxInfo); + + /** + * 新增二维码标准箱管理 + * @param bmQrBoxInfo + * @return + */ + AjaxResult insertBmQrcodeInfo(BmQrBoxInfo bmQrBoxInfo); + + /** + * 下载二维码标准箱 + * @param bmQrBoxInfo + * @param response + * @return + */ + void download(BmQrBoxInfo bmQrBoxInfo, HttpServletResponse response); + + /** + * 修改二维码标准箱管理 + * @param bmQrBoxInfo + * @return + */ + AjaxResult updateBmQrcodeInfo(BmQrBoxInfo bmQrBoxInfo); + + /** + * 删除二维码标准箱管理 + * @param bmQrBoxInfo + * @return + */ + AjaxResult deleteById(BmQrBoxInfo bmQrBoxInfo); +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/impl/BmQrBoxServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/impl/BmQrBoxServiceImpl.java new file mode 100644 index 00000000..fe56e8eb --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/impl/BmQrBoxServiceImpl.java @@ -0,0 +1,140 @@ +package com.bonus.material.basic.service.impl; + +import com.bonus.common.biz.config.BackstageApplication; +import com.bonus.common.biz.config.DateTimeHelper; +import com.bonus.common.biz.config.QrCodeUtils; +import com.bonus.common.biz.enums.HttpCodeEnum; +import com.bonus.common.core.utils.DateUtils; +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.common.security.utils.SecurityUtils; +import com.bonus.material.basic.domain.BmQrBoxInfo; +import com.bonus.material.basic.mapper.BmQrBoxMapper; +import com.bonus.material.basic.service.BmQrBoxService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.List; + +/** + * @Author ma_sh + * @create 2024/12/10 17:26 + */ +@Service +@Slf4j +public class BmQrBoxServiceImpl implements BmQrBoxService { + + @Resource + private BmQrBoxMapper bmQrBoxMapper; + + /** + * 查询二维码标准箱管理列表 + * @param bmQrBoxInfo + * @return + */ + @Override + public List selectBmQrBoxInfoList(BmQrBoxInfo bmQrBoxInfo) { + return bmQrBoxMapper.find(bmQrBoxInfo); + } + + /** + * 新增二维码标准箱管理 + * @param bmQrBoxInfo + * @return + */ + @Override + public AjaxResult insertBmQrcodeInfo(BmQrBoxInfo bmQrBoxInfo) { + //生成二维码 + String code = "BOX-" + DateTimeHelper.getNowTimeFomart(); + bmQrBoxInfo.setQrCode(code); + bmQrBoxInfo.setCreateBy(String.valueOf(SecurityUtils.getUserId())); + bmQrBoxInfo.setCreateTime(DateUtils.getNowDate()); + int result = bmQrBoxMapper.insertBmQrcodeInfo(bmQrBoxInfo); + return result > 0 ? AjaxResult.success(HttpCodeEnum.SUCCESS.getMsg()) : AjaxResult.error(HttpCodeEnum.FAIL.getCode(), HttpCodeEnum.FAIL.getMsg()); + } + + /** + * 下载二维码标准箱 + * @param bmQrBoxInfo + * @param response + * @return + */ + @Override + public void download(BmQrBoxInfo bmQrBoxInfo, HttpServletResponse response) { + try { + List list = bmQrBoxMapper.find(bmQrBoxInfo); + String code = "无编码"; + if (list.size() > 0) { + code = list.get(0).getQrCode(); + } + // 新购管理-二维码打印-新增 + String url = BackstageApplication.getUrl() + "backstage/machine/qrCodePage?qrcode=" + code; + // 二维码的图片格式 + String format = "jpg"; + //设置路径 + String mkdirsName = "images"; + // linux 系统路径 + String saveDirectory = "/data/imw/" + mkdirsName + "/"; + String os = System.getProperty("os.name"); + if (os.toLowerCase().startsWith("win")) { + //本地路径 + saveDirectory = "D://files/" + mkdirsName + "/"; + } + // 生成二维码 + File files = new File(saveDirectory); + if (!files.exists()) { + files.mkdirs(); + } + QrCodeUtils.generateQRImage(url, saveDirectory, code + ".jpg", format); + String qrUrl = saveDirectory + code + ".jpg"; + String path = qrUrl.replace("filePath", "/data/imw"); + // 判断照片是否存在 + File imageFile = new File(path); + if (!imageFile.exists()) { + log.warn("图片不存在"); + } + //设置MIME类型 + response.setContentType("application/octet-stream"); + response.addHeader("Content-disposition", "attachment;filename=" + new String(path.getBytes(), "ISO-8859-1")); + InputStream inputStream = new FileInputStream(imageFile); + ServletOutputStream outputStream = response.getOutputStream(); + byte[] bs = new byte[1024]; + while ((inputStream.read(bs) > 0)) { + outputStream.write(bs); + } + outputStream.close(); + inputStream.close(); + } catch (Exception e) { + log.error(e.getMessage()); + } + } + + /** + * 修改二维码标准箱管理 + * @param bmQrBoxInfo + * @return + */ + @Override + public AjaxResult updateBmQrcodeInfo(BmQrBoxInfo bmQrBoxInfo) { + bmQrBoxInfo.setUpdateBy(String.valueOf(SecurityUtils.getUserId())); + bmQrBoxInfo.setUpdateTime(DateUtils.getNowDate()); + int result = bmQrBoxMapper.updateBmQrcodeInfo(bmQrBoxInfo); + return result > 0 ? AjaxResult.success(HttpCodeEnum.SUCCESS.getMsg()) : AjaxResult.error(HttpCodeEnum.FAIL.getCode(), HttpCodeEnum.FAIL.getMsg()); + } + + /** + * 删除二维码标准箱管理 + * @param bmQrBoxInfo + * @return + */ + @Override + public AjaxResult deleteById(BmQrBoxInfo bmQrBoxInfo) { + int result = bmQrBoxMapper.deleteById(bmQrBoxInfo); + return result > 0 ? AjaxResult.success(HttpCodeEnum.SUCCESS.getMsg()) : AjaxResult.error(HttpCodeEnum.FAIL.getCode(), HttpCodeEnum.FAIL.getMsg()); + } +} diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/basic/BmQrBoxMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/basic/BmQrBoxMapper.xml new file mode 100644 index 00000000..afeb7ae6 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/basic/BmQrBoxMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + insert into bm_qrcode_box + + qr_code, + qr_name, + qr_type, + create_by, + create_time, + + + #{qrCode}, + #{qrName}, + #{qrType}, + #{createBy}, + #{createTime}, + + + + + update bm_qrcode_box + + qr_code = #{qrCode}, + qr_type = #{qrType}, + qr_name = #{qrName}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + + where qr_id = #{qrId} + + + + delete + from bm_qrcode_box + where qr_id = #{qrId} + + \ No newline at end of file