Kaynağa Gözat

fix 更新二维码查询

tjf 3 yıl önce
ebeveyn
işleme
b021f0df8c

+ 12 - 0
ruoyi-common/pom.xml

@@ -184,6 +184,18 @@
             <artifactId>log4j</artifactId>
             <version>1.2.17</version>
         </dependency>
+
+        <!--二维码-->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.1.0</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 273 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/QRCodeUtils.java

@@ -0,0 +1,273 @@
+package com.ruoyi.common.utils;
+
+import java.awt.BasicStroke;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Shape;
+import java.awt.geom.RoundRectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.OutputStream;
+import java.util.Hashtable;
+import java.util.Random;
+
+import javax.imageio.ImageIO;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.BinaryBitmap;
+import com.google.zxing.DecodeHintType;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatReader;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.Result;
+import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.common.HybridBinarizer;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.utils.uuid.UUID;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @author tjf
+ * @Date: 2021/12/29/15:09
+ */
+public class QRCodeUtils {
+    private static final String CHARSET = "utf-8";
+    private static final String FORMAT_NAME = "JPG";
+    // 二维码尺寸
+    private static final int QRCODE_SIZE = 300;
+    // LOGO宽度
+    private static final int WIDTH = 60;
+    // LOGO高度
+    private static final int HEIGHT = 60;
+
+    private static BufferedImage createImage(String content, String imgPath,
+                                             boolean needCompress) throws Exception {
+        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
+        hints.put(EncodeHintType.MARGIN, 1);
+        BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
+                BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
+        int width = bitMatrix.getWidth();
+        int height = bitMatrix.getHeight();
+        BufferedImage image = new BufferedImage(width, height,
+                BufferedImage.TYPE_INT_RGB);
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000
+                        : 0xFFFFFFFF);
+            }
+        }
+        if (imgPath == null || "".equals(imgPath)) {
+            return image;
+        }
+        // 插入图片
+        QRCodeUtils.insertImage(image, imgPath, needCompress);
+        return image;
+    }
+
+    /**
+     * 插入LOGO
+     *
+     * @param source
+     *            二维码图片
+     * @param imgPath
+     *            LOGO图片地址
+     * @param needCompress
+     *            是否压缩
+     * @throws Exception
+     */
+    private static void insertImage(BufferedImage source, String imgPath,
+                                    boolean needCompress) throws Exception {
+        File file = new File(imgPath);
+        if (!file.exists()) {
+            System.err.println(""+imgPath+"   该文件不存在!");
+            return;
+        }
+        Image src = ImageIO.read(new File(imgPath));
+        int width = src.getWidth(null);
+        int height = src.getHeight(null);
+        if (needCompress) { // 压缩LOGO
+            if (width > WIDTH) {
+                width = WIDTH;
+            }
+            if (height > HEIGHT) {
+                height = HEIGHT;
+            }
+            Image image = src.getScaledInstance(width, height,
+                    Image.SCALE_SMOOTH);
+            BufferedImage tag = new BufferedImage(width, height,
+                    BufferedImage.TYPE_INT_RGB);
+            Graphics g = tag.getGraphics();
+            g.drawImage(image, 0, 0, null); // 绘制缩小后的图
+            g.dispose();
+            src = image;
+        }
+        // 插入LOGO
+        Graphics2D graph = source.createGraphics();
+        int x = (QRCODE_SIZE - width) / 2;
+        int y = (QRCODE_SIZE - height) / 2;
+        graph.drawImage(src, x, y, width, height, null);
+        Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
+        graph.setStroke(new BasicStroke(3f));
+        graph.draw(shape);
+        graph.dispose();
+    }
+
+    /**
+     * 生成二维码(内嵌LOGO)
+     *
+     * @param content
+     *            内容
+     * @param imgPath
+     *            LOGO地址
+     * @param destPath
+     *            存放目录
+     * @param needCompress
+     *            是否压缩LOGO
+     * @throws Exception
+     */
+    public static String encode(String content, String imgPath, String destPath,
+                                boolean needCompress) throws Exception {
+        BufferedImage image = QRCodeUtils.createImage(content, imgPath,
+                needCompress);
+        mkdirs(destPath);
+        String file = UUID.randomUUID()+".jpg";
+        File fileQR = new File(destPath + "/" + file);
+        ImageIO.write(image, FORMAT_NAME,fileQR );
+        return fileQR.getAbsolutePath();
+    }
+
+
+    /**
+     * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
+     * @date 2013-12-11 上午10:16:36
+     * @param destPath 存放目录
+     */
+    public static void mkdirs(String destPath) {
+        File file =new File(destPath);
+        //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
+        if (!file.exists() && !file.isDirectory()) {
+            file.mkdirs();
+        }
+    }
+
+    /**
+     * 生成二维码(内嵌LOGO)
+     *
+     * @param content
+     *            内容
+     * @param imgPath
+     *            LOGO地址
+     * @param destPath
+     *            存储地址
+     * @throws Exception
+     */
+    public static void encode(String content, String imgPath, String destPath)
+            throws Exception {
+        QRCodeUtils.encode(content, imgPath, destPath, false);
+    }
+
+    /**
+     * 生成二维码
+     *
+     * @param content
+     *            内容
+     * @param destPath
+     *            存储地址
+     * @param needCompress
+     *            是否压缩LOGO
+     * @throws Exception
+     */
+    public static void encode(String content, String destPath,
+                              boolean needCompress) throws Exception {
+        QRCodeUtils.encode(content, null, destPath, needCompress);
+    }
+
+    /**
+     * 生成二维码
+     *
+     * @param content
+     *            内容
+     * @param destPath
+     *            存储地址
+     * @throws Exception
+     */
+    public static void encode(String content, String destPath) throws Exception {
+        QRCodeUtils.encode(content, null, destPath, false);
+    }
+
+    /**
+     * 生成二维码(内嵌LOGO)
+     *
+     * @param content
+     *            内容
+     * @param imgPath
+     *            LOGO地址
+     * @param output
+     *            输出流
+     * @param needCompress
+     *            是否压缩LOGO
+     * @throws Exception
+     */
+    public static void encode(String content, String imgPath,
+                              OutputStream output, boolean needCompress) throws Exception {
+        BufferedImage image = QRCodeUtils.createImage(content, imgPath,
+                needCompress);
+        ImageIO.write(image, FORMAT_NAME, output);
+    }
+
+    /**
+     * 生成二维码
+     *
+     * @param content
+     *            内容
+     * @param output
+     *            输出流
+     * @throws Exception
+     */
+    public static void encode(String content, OutputStream output)
+            throws Exception {
+        QRCodeUtils.encode(content, null, output, false);
+    }
+
+    /**
+     * 解析二维码
+     *
+     * @param file
+     *            二维码图片
+     * @return
+     * @throws Exception
+     */
+    public static String decode(File file) throws Exception {
+        BufferedImage image;
+        image = ImageIO.read(file);
+        if (image == null) {
+            return null;
+        }
+        BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(
+                image);
+        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
+        Result result;
+        Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
+        hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
+        result = new MultiFormatReader().decode(bitmap, hints);
+        String resultStr = result.getText();
+        return resultStr;
+    }
+
+    /**
+     * 解析二维码
+     *
+     * @param path
+     *            二维码图片地址
+     * @return
+     * @throws Exception
+     */
+    public static String decode(String path) throws Exception {
+        return QRCodeUtils.decode(new File(path));
+    }
+}

+ 4 - 4
ruoyi-system/src/main/java/com/ruoyi/system/domain/InspectInfor.java

@@ -38,19 +38,19 @@ public class InspectInfor extends BaseEntity
     @Excel(name = "提供方式")
     private String provideType;
 
-    /** 生产单位名称 */
+    /** 送检单位名称 */
     @Excel(name = "生产单位名称")
     private String manufacturerName;
 
-    /** 生产单位电话 */
+    /** 送检单位电话 */
     @Excel(name = "生产单位电话")
     private String manufacturerPhone;
 
-    /** 受检单位名称 */
+    /** 委托单位名称 */
     @Excel(name = "受检单位名称")
     private String inspectedName;
 
-    /** 受检单位电话 */
+    /** 委托单位电话 */
     @Excel(name = "受检单位电话")
     private String inspectedPhone;
 

+ 12 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/ReportDetail.java

@@ -45,6 +45,10 @@ public class ReportDetail extends BaseEntity
     /** 报告图片 */
     @Excel(name = "报告图片")
     private String reportUrl;
+    /**
+     * 二维码地址
+     */
+    private String qrPath;
 
     /** 是否删除(N正常 Y删除) */
     @Excel(name = "是否删除", readConverterExp = "N=正常,Y=删除")
@@ -55,6 +59,14 @@ public class ReportDetail extends BaseEntity
      */
     private String phonenumber;
 
+    public String getQrPath() {
+        return qrPath;
+    }
+
+    public void setQrPath(String qrPath) {
+        this.qrPath = qrPath;
+    }
+
     public String getPhonenumber() {
         return phonenumber;
     }

+ 26 - 6
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QueryServiceImpl.java

@@ -9,6 +9,7 @@ import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.exception.user.CaptchaException;
 import com.ruoyi.common.exception.user.CaptchaExpireException;
+import com.ruoyi.common.utils.QRCodeUtils;
 import com.ruoyi.common.utils.SendSmsUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.QueryConfig;
@@ -204,12 +205,31 @@ public class QueryServiceImpl implements IQueryService {
      * @return
      */
     private AjaxResult queryByQr(ReportQueryLog reportQueryLog) {
-
-        //获取查询主体
-        String queryType = reportQueryLog.getQueryType();
-        //查询结果
-        String result = "";
-
+        String qrImage = reportQueryLog.getQrImage();
+        String remark = "";
+        if (StringUtils.isBlank(qrImage)){
+             remark = "未接收到二维码";
+            reportQueryLog.setRemark(remark);
+            reportQueryLogMapper.insertReportQueryLog(reportQueryLog);
+            return AjaxResult.error(remark);
+        }
+        try {
+            //解析二维码
+            String reportNumber = QRCodeUtils.decode(qrImage);
+            if (StringUtils.isBlank(reportNumber)){
+                remark = "二维码解析失败";
+                reportQueryLog.setRemark(remark);
+                reportQueryLogMapper.insertReportQueryLog(reportQueryLog);
+                return AjaxResult.error(remark);
+            }
+            ReportDetail reportDetail = reportDetailMapper.selectReportDetailByReportNumber(reportNumber);
+            reportDetail.setReportUrl(null);
+            reportQueryLog.setIsSuccess("0");
+            reportQueryLogMapper.insertReportQueryLog(reportQueryLog);
+            return AjaxResult.success(reportDetail);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
         return AjaxResult.success();
     }
 

+ 35 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ReportDetailServiceImpl.java

@@ -2,8 +2,10 @@ package com.ruoyi.system.service.impl;
 
 import java.util.List;
 
+import com.ruoyi.common.config.RuoYiConfig;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.QRCodeUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.InspectInfor;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,6 +59,14 @@ public class ReportDetailServiceImpl implements IReportDetailService
     @Override
     public int insertReportDetail(ReportDetail reportDetail)
     {
+        //生成二维码
+        try {
+            //返回二维码地址
+            String imagePath= QRCodeUtils.encode(reportDetail.getReportNumber(), null, RuoYiConfig.getUploadPath(), true);
+            reportDetail.setQrPath(imagePath);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
         reportDetail.setCreateTime(DateUtils.getNowDate());
         return reportDetailMapper.insertReportDetail(reportDetail);
     }
@@ -70,6 +80,16 @@ public class ReportDetailServiceImpl implements IReportDetailService
     @Override
     public int updateReportDetail(ReportDetail reportDetail)
     {
+        if (UserConstants.NOT_UNIQUE.equals(checkReportNumberUpdate(reportDetail))){
+            //生成新的二维码覆盖
+            try {
+                //返回二维码地址
+                String imagePath= QRCodeUtils.encode(reportDetail.getReportNumber(), null, RuoYiConfig.getUploadPath(), true);
+                reportDetail.setQrPath(imagePath);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
         reportDetail.setUpdateTime(DateUtils.getNowDate());
         return reportDetailMapper.updateReportDetail(reportDetail);
     }
@@ -113,4 +133,19 @@ public class ReportDetailServiceImpl implements IReportDetailService
         }
         return UserConstants.UNIQUE;
     }
+
+    /**
+     * 校验报告编号是否修改
+     * @param reportDetail
+     * @return
+     */
+    public String checkReportNumberUpdate(ReportDetail reportDetail) {
+        Long reportId = StringUtils.isNull(reportDetail.getReportId())? -1L : reportDetail.getReportId();
+        ReportDetail infoOld = reportDetailMapper.selectReportDetailByReportId(reportId);
+        if (!infoOld.getReportNumber().equals(reportDetail.getReportNumber()))
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
 }

+ 5 - 1
ruoyi-system/src/main/resources/mapper/system/ReportDetailMapper.xml

@@ -13,6 +13,7 @@
         <result property="entrustName" column="entrust_name"/>
         <result property="isQualify" column="is_qualify"/>
         <result property="reportUrl" column="report_url"/>
+        <result property="qrPath"    column="qr_path"    />
         <result property="isDel" column="is_del"/>
         <result property="createBy" column="create_by"/>
         <result property="createTime" column="create_time"/>
@@ -23,7 +24,7 @@
     </resultMap>
 
     <sql id="selectReportDetailVo">
-        select report_id, report_number, inspect_id, sample_name, inspect_name, entrust_name, is_qualify, report_url, is_del, create_by, create_time, update_by, update_time, remark from report_detail
+        select report_id, report_number, inspect_id, sample_name, inspect_name, entrust_name, is_qualify, report_url,qr_path, is_del, create_by, create_time, update_by, update_time, remark from report_detail
     </sql>
 
     <select id="selectReportDetailList" parameterType="ReportDetail" resultMap="ReportDetailResult">
@@ -60,6 +61,7 @@
             <if test="entrustName != null">entrust_name,</if>
             <if test="isQualify != null">is_qualify,</if>
             <if test="reportUrl != null">report_url,</if>
+            <if test="qrPath != null">qr_path,</if>
             <if test="isDel != null">is_del,</if>
             <if test="createBy != null">create_by,</if>
             <if test="createTime != null">create_time,</if>
@@ -75,6 +77,7 @@
             <if test="entrustName != null">#{entrustName},</if>
             <if test="isQualify != null">#{isQualify},</if>
             <if test="reportUrl != null">#{reportUrl},</if>
+            <if test="qrPath != null">#{qrPath},</if>
             <if test="isDel != null">#{isDel},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="createTime != null">#{createTime},</if>
@@ -94,6 +97,7 @@
             <if test="entrustName != null">entrust_name = #{entrustName},</if>
             <if test="isQualify != null">is_qualify = #{isQualify},</if>
             <if test="reportUrl != null">report_url = #{reportUrl},</if>
+            <if test="qrPath != null">qr_path = #{qrPath},</if>
             <if test="isDel != null">is_del = #{isDel},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="createTime != null">create_time = #{createTime},</if>