二维码标准箱

This commit is contained in:
mashuai 2024-12-11 13:26:02 +08:00
parent 7d8f83e400
commit ca941eb028
7 changed files with 549 additions and 0 deletions

View File

@ -1,5 +1,6 @@
package com.bonus.common.biz.config; package com.bonus.common.biz.config;
import com.bonus.common.core.utils.StringUtils;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType; import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter; import com.google.zxing.MultiFormatWriter;
@ -44,6 +45,9 @@ public class QrCodeUtils {
/** 二维码容错率 */ /** 二维码容错率 */
private static ErrorCorrectionLevel level = ErrorCorrectionLevel.L; private static ErrorCorrectionLevel level = ErrorCorrectionLevel.L;
// 加文字二维码高
private static final int WORDHEIGHT = 300;
/** /**
* 生成带logo的二维码图片 * 生成带logo的二维码图片
* *
@ -176,5 +180,97 @@ public class QrCodeUtils {
} }
return image; 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<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
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图片分别设为黑0xFFFFFFFF0xFF000000两色
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);
}
} }

View File

@ -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<BmQrBoxInfo> 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);
}
}

View File

@ -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;
}

View File

@ -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<BmQrBoxInfo> find(BmQrBoxInfo bmQrBoxInfo);
/**
* 新增二维码标准箱管理
* @param bmQrBoxInfo
* @return
*/
int insertBmQrcodeInfo(BmQrBoxInfo bmQrBoxInfo);
/**
* 修改二维码标准箱管理
* @param bmQrBoxInfo
* @return
*/
int updateBmQrcodeInfo(BmQrBoxInfo bmQrBoxInfo);
/**
* 删除二维码标准箱管理
* @param bmQrBoxInfo
* @return
*/
int deleteById(BmQrBoxInfo bmQrBoxInfo);
}

View File

@ -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<BmQrBoxInfo> 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);
}

View File

@ -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<BmQrBoxInfo> 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<BmQrBoxInfo> 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());
}
}

View File

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bonus.material.basic.mapper.BmQrBoxMapper">
<select id="find" resultType="com.bonus.material.basic.domain.BmQrBoxInfo">
select
qr_id as qrId,
qr_name as qrName,
qr_code as qrCode,
qr_type as qrType,
create_by as createBy,
create_time as createTime,
update_by as updateBy,
update_time as updateTime
from bm_qrcode_box
<where>
<if test="qrId != null">and qr_id = #{qrId}</if>
<if test="qrName != null and qrName != ''">and qr_name like concat('%',#{qrName},'%')</if>
<if test="qrCode != null and qrCode != ''">and qr_code like concat('%',#{qrCode},'%')</if>
<if test="qrType != null">and qr_type = #{qrType}</if>
</where>
</select>
<insert id="insertBmQrcodeInfo" parameterType="com.bonus.material.basic.domain.BmQrBoxInfo" useGeneratedKeys="true" keyProperty="qrId">
insert into bm_qrcode_box
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="qrCode != null">qr_code,</if>
<if test="qrName != null and qrName != ''">qr_name,</if>
<if test="qrType != null">qr_type,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="qrCode != null">#{qrCode},</if>
<if test="qrName != null and qrName != ''">#{qrName},</if>
<if test="qrType != null">#{qrType},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
</trim>
</insert>
<update id="updateBmQrcodeInfo" parameterType="com.bonus.material.basic.domain.BmQrBoxInfo">
update bm_qrcode_box
<trim prefix="SET" suffixOverrides=",">
<if test="qrCode != null">qr_code = #{qrCode},</if>
<if test="qrType != null">qr_type = #{qrType},</if>
<if test="qrName != null and qrName != ''">qr_name = #{qrName},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
</trim>
where qr_id = #{qrId}
</update>
<delete id="deleteById">
delete
from bm_qrcode_box
where qr_id = #{qrId}
</delete>
</mapper>