新购二维码调试

This commit is contained in:
mashuai 2024-08-27 17:14:26 +08:00
parent 91a3bd2396
commit 6d85856207
9 changed files with 417 additions and 140 deletions

View File

@ -0,0 +1,63 @@
package com.bonus.purchase.domain;
/**
* 二维码类路径
* @Author ma_sh
* @create 2024/8/27 13:56
*/
public class BackstageApplication {
private final static String CS_LOGIN_PATH = "ahjj.jypxks.com:9988";
// private final static String CS_LOGIN_PATH = "112.30.107.201:9988";
//测试环境
//private final static String CS_LOGIN_PATH = "192.168.0.14:2011";
private final static String CS_USER_NAME = "root";
private final static String CS_PASSWORD = "bonusadmin";
private final static String CS_EP_ID = "system";
private final static String url = "http://ahjj.jypxks.com:9988/imw/";
// private final static String url = "http://192.168.0.6:18082/imt_cs/";
//private final static String url = "http://192.168.0.14:2011/imw_cs/";
private final static String imageUrlPrefix = "http://ahjj.jypxks.com:9988/imw/images/";
//测试环境
//private final static String imageUrlPrefix = "http://192.168.0.14:2011/imt_cs/images/";
private final static String fileUrlPrefix = "http://ahjj.jypxks.com:9988/imw/maTypeFile/";
//测试环境
// private final static String fileUrlPrefix = "http://192.168.0.14:2011/imt_cs/maTypeFile/";
public static String getCsLoginPath() {
return CS_LOGIN_PATH;
}
public static String getCsUserName() {
return CS_USER_NAME;
}
public static String getCsPassword() {
return CS_PASSWORD;
}
public static String getCsEpId() {
return CS_EP_ID;
}
public static String getUrl() {
return url;
}
public static String getImageUrlPrefix(){
return imageUrlPrefix;
}
public static String getFileurlprefix() {
return fileUrlPrefix;
}
}

View File

@ -4,7 +4,9 @@ import com.bonus.purchase.dto.PurchaseBindDto;
import com.bonus.purchase.dto.PurchaseDto;
import com.bonus.purchase.vo.PurchaseAcceptVo;
import com.bonus.purchase.vo.PurchaseVo;
import com.bonus.purchase.vo.QrUrlVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -40,7 +42,7 @@ public interface BpmPurchaseBindMapper {
* 更新状态
* @param id
*/
void updateStatus(String id);
void updateStatus(@Param("id") String id, @Param("purchaseId") String purchaseId);
/**
* 查询状态
@ -48,4 +50,11 @@ public interface BpmPurchaseBindMapper {
* @return
*/
List<Integer> selectStatus(PurchaseDto purchaseDto);
/**
* 根据任务id查询二维码
* @param purchaseDto
* @return
*/
List<QrUrlVo> selectQrCode(PurchaseDto purchaseDto);
}

View File

@ -2,29 +2,26 @@ package com.bonus.purchase.service.impl;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.bonus.common.core.utils.DateTimeHelper;
import com.bonus.purchase.domain.BackstageApplication;
import com.bonus.purchase.dto.PurchaseBindDto;
import com.bonus.purchase.dto.PurchaseDto;
import com.bonus.purchase.mapper.BpmPurchaseAcceptMapper;
import com.bonus.purchase.mapper.BpmPurchaseBindMapper;
import com.bonus.purchase.service.BpmPurchaseBindService;
import com.bonus.purchase.utils.Constants;
import com.bonus.purchase.utils.QrCodeUtils;
import com.bonus.purchase.vo.PurchaseAcceptVo;
import com.bonus.purchase.vo.PurchaseVo;
import com.bonus.purchase.vo.QrUrlVo;
import com.google.zxing.WriterException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.*;
import java.util.List;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@ -78,65 +75,139 @@ public class BpmPurchaseBindServiceImpl implements BpmPurchaseBindService {
@Transactional(rollbackFor = Exception.class)
public void downloadQrCode(HttpServletResponse response, PurchaseDto purchaseDto) {
//生成二维码
if (purchaseDto.getId() != null) {
isDownLoad(purchaseDto);
String genMonth = DateTimeHelper.getNowMonth();
//根据月份查找code
List<PurchaseBindDto> codeList = mapper.select(genMonth);
int num = 0;
if (CollectionUtils.isNotEmpty(codeList)) {
PurchaseBindDto purchaseBindDto = codeList.get(0);
num = Integer.parseInt(purchaseBindDto.getMaCode().split("-")[1]);
if (purchaseDto.getId() == null && purchaseDto.getPurchaseId() == null) {
throw new RuntimeException("外层id和内层id不能同时为空");
}
String genMonth = DateTimeHelper.getNowMonth();
List<PurchaseBindDto> codeList = mapper.select(genMonth);
try (OutputStream os = response.getOutputStream();
ZipOutputStream zos = new ZipOutputStream(os)) {
List<Integer> statusList = mapper.selectStatus(purchaseDto);
if (CollectionUtils.isEmpty(statusList)) {
return;
}
if (purchaseDto.getId() != null) {
//外层二维码下载
handlePurchaseDto(purchaseDto, codeList, statusList, zos, genMonth);
} else if (purchaseDto.getPurchaseId() != null) {
//内层二维码下载
handlePurchaseId(purchaseDto, codeList, statusList, zos, genMonth);
}
zos.flush();
} catch (WriterException | IOException e) {
e.printStackTrace();
}
}
/**
* 外层二维码下载
* @param purchaseDto
* @param codeList
* @param statusList
* @param zos
* @param genMonth
* @throws IOException
* @throws WriterException
*/
private void handlePurchaseDto(PurchaseDto purchaseDto, List<PurchaseBindDto> codeList, List<Integer> statusList, ZipOutputStream zos, String genMonth) throws IOException, WriterException {
for (Integer status : statusList) {
if (status == 1) {
Select(purchaseDto, zos);
} else if (status == 0) {
processNotDownloadedDetails(purchaseDto, codeList, zos, genMonth);
}
}
}
/**
* 内层二维码下载
* @param purchaseDto
* @param codeList
* @param statusList
* @param zos
* @param genMonth
* @throws IOException
* @throws WriterException
*/
private void handlePurchaseId(PurchaseDto purchaseDto, List<PurchaseBindDto> codeList, List<Integer> statusList, ZipOutputStream zos, String genMonth) throws IOException, WriterException {
if (statusList.get(0) == 1) {
Select(purchaseDto, zos);
} else {
int num = getInitialNum(codeList);
List<PurchaseAcceptVo> details = acceptMapper.getDetails(purchaseDto);
try {
Path downloadDir = Paths.get("qr_codes");
Files.createDirectories(downloadDir);
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
if (CollectionUtils.isNotEmpty(details)) {
for (int i = 0; i < details.size(); i++) {
String materialModel = details.get(i).getMaterialModel();
String materialName = details.get(i).getMaterialName();
Integer typeId = details.get(i).getTypeId();
Integer checkNum = details.get(i).getCheckNum();
getString(purchaseDto, genMonth, num, downloadDir, zos, materialModel, materialName, typeId, checkNum);
num = num + checkNum;
}
zos.flush();
zos.close();
}
} catch (WriterException | IOException e) {
e.printStackTrace();
if (CollectionUtils.isNotEmpty(details)) {
PurchaseAcceptVo detail = details.get(0);
purchaseDto.setId(detail.getTaskId());
getString(purchaseDto, genMonth, num, zos, detail.getMaterialModel(), detail.getMaterialName(), detail.getTypeId(), detail.getCheckNum());
extractedUpStatus(purchaseDto);
}
}else if (purchaseDto.getPurchaseId() != null) {
isDownLoad(purchaseDto);
String genMonth = DateTimeHelper.getNowMonth();
//根据月份查找code
List<PurchaseBindDto> codeList = mapper.select(genMonth);
int num = 0;
if (CollectionUtils.isNotEmpty(codeList)) {
PurchaseBindDto purchaseBindDto = codeList.get(0);
num = Integer.parseInt(purchaseBindDto.getMaCode().split("-")[1]);
}
}
/**
* 获取初始化num
* @param codeList
* @return
*/
private int getInitialNum(List<PurchaseBindDto> codeList) {
if (CollectionUtils.isNotEmpty(codeList)) {
PurchaseBindDto purchaseBindDto = codeList.get(0);
return Integer.parseInt(purchaseBindDto.getMaCode().split("-")[1]);
}
return 0;
}
/**
* 外层二维码下载详情处理
* @param purchaseDto
* @param codeList
* @param zos
* @param genMonth
* @throws IOException
* @throws WriterException
*/
private void processNotDownloadedDetails(PurchaseDto purchaseDto, List<PurchaseBindDto> codeList, ZipOutputStream zos, String genMonth) throws IOException, WriterException {
int num = getInitialNum(codeList);
List<PurchaseAcceptVo> details = acceptMapper.getDetails(purchaseDto);
if (CollectionUtils.isNotEmpty(details)) {
List<PurchaseAcceptVo> notDownloadedDetails = details.stream()
.filter(detail -> detail.getIsDownload() == 0)
.collect(Collectors.toList());
for (PurchaseAcceptVo detail : notDownloadedDetails) {
getString(purchaseDto, genMonth, num, zos, detail.getMaterialModel(), detail.getMaterialName(), detail.getTypeId(), detail.getCheckNum());
num += detail.getCheckNum() / Constants.CARDINAL_NUMBER;
}
List<PurchaseAcceptVo> details = acceptMapper.getDetails(purchaseDto);
try {
Path downloadDir = Paths.get("qr_codes");
Files.createDirectories(downloadDir);
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
if(CollectionUtils.isNotEmpty(details)) {
String materialModel = details.get(0).getMaterialModel();
String materialName = details.get(0).getMaterialName();
Integer typeId = details.get(0).getTypeId();
Integer checkNum = details.get(0).getCheckNum();
purchaseDto.setId(details.get(0).getTaskId());
getString(purchaseDto, genMonth, num, downloadDir, zos, materialModel, materialName, typeId, checkNum);
zos.flush();
zos.close();
}
} catch (WriterException | IOException e) {
e.printStackTrace();
extractedUpStatus(purchaseDto);
}
}
/**
* 查询方法抽取
* @param purchaseDto
* @param zos
* @throws IOException
*/
private void Select(PurchaseDto purchaseDto, ZipOutputStream zos) throws IOException {
List<QrUrlVo> list = mapper.selectQrCode(purchaseDto);
if (CollectionUtils.isNotEmpty(list)) {
for (QrUrlVo qrUrlVo : list) {
String materialModel = qrUrlVo.getMaterialModel();
String materialName = qrUrlVo.getMaterialName();
String path = qrUrlVo.getQrUrl();
String qrCode = qrUrlVo.getQrCode();
path = path.replace("filePath", "/data/imw");
extracted(zos, materialModel, materialName, qrCode, path);
}
}
}
}
/**
* 修改任务表方法抽取
* @param purchaseDto
*/
private void extractedUpStatus(PurchaseDto purchaseDto) {
//修改任务表的是否下载状态
mapper.updateStatus(purchaseDto.getId(), purchaseDto.getPurchaseId());
}
/**
@ -144,7 +215,6 @@ public class BpmPurchaseBindServiceImpl implements BpmPurchaseBindService {
* @param purchaseDto
* @param genMonth
* @param num
* @param downloadDir
* @param zos
* @param materialModel
* @param materialName
@ -153,48 +223,48 @@ public class BpmPurchaseBindServiceImpl implements BpmPurchaseBindService {
* @throws WriterException
* @throws IOException
*/
private void getString(PurchaseDto purchaseDto, String genMonth, int num, Path downloadDir, ZipOutputStream zos, String materialModel, String materialName, Integer typeId, Integer checkNum) throws WriterException, IOException {
for (int j = 1; j <= checkNum / 1000; j++) {
private void getString(PurchaseDto purchaseDto, String genMonth, int num, ZipOutputStream zos, String materialModel, String materialName, Integer typeId, Integer checkNum) throws WriterException, IOException {
for (int j = 1; j <= checkNum / Constants.CARDINAL_NUMBER; j++) {
genMonth = genMonth.replace("-", "");
String code = genMonth + "-" + String.format("%5d", num + j).replace(" ", "0");
// 新购管理-二维码打印-新增
String qrUrl = "D://files/" + "images" + "/" + code + ".jpg";
String Path = "[" + materialModel + "-" + materialName + "]" + code + ".jpg";
String baseText = "QR Code " + j;
BufferedImage qrCodeImage = QrCodeUtils.generateQRCodeImage(baseText, 300, 300);
java.nio.file.Path filePath = downloadDir.resolve(Path);
QrCodeUtils.saveQRCodeImage(qrCodeImage, filePath);
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";
PurchaseDto dto = PurchaseDto.builder().id(purchaseDto.getId()).typeId(typeId).qrCode(code).qrUrl(qrUrl).build();
mapper.insert(dto);
//修改任务表的是否下载状态
mapper.updateStatus(purchaseDto.getId());
extracted(zos, materialModel, materialName, code, qrUrl);
}
}
/**
* 是否下载方法抽取
* @param purchaseDto
*/
private void isDownLoad(PurchaseDto purchaseDto) {
List<Integer> statusList =mapper.selectStatus(purchaseDto);
if (CollectionUtils.isNotEmpty(statusList) && statusList.contains(1)) {
throw new RuntimeException("该采购单二维码已生成,无法再次生成!");
}
}
/**
* 二维码下载方法抽取
* @param zos
* @param materialModel
* @param materialName
* @param code
* @param qrUrl
* @param path
* @throws IOException
*/
private void extracted(ZipOutputStream zos, String materialModel, String materialName, String code, String qrUrl) throws IOException {
private void extracted(ZipOutputStream zos, String materialModel, String materialName, String code, String path) throws IOException {
// 判断路径是否存在
File imageFile = new File(qrUrl);
File imageFile = new File(path);
if (!imageFile.exists()) {
return;
}

View File

@ -81,4 +81,9 @@ public class Constants {
* 不通过
*/
public static final Integer PURCHASE_NO_PASSED = 59;
/**
* 数量基数
*/
public static final Integer CARDINAL_NUMBER = 1000;
}

View File

@ -1,20 +1,24 @@
package com.bonus.purchase.utils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Hashtable;
/**
* 二维码生成保存压缩包工具类
@ -23,34 +27,122 @@ import java.nio.file.Path;
*/
public class QrCodeUtils {
/** 二维码宽度 */
private static int width = 280;
/** 二维码高度 */
private static int height = 280;
/** 前景色 */
private static int onColor = 0xFF000000;
/** 背景色 */
private static int offColor = 0xFFFFFFFF;
/** 白边大小取值范围0~4 */
private static int margin = 0;
/** 二维码容错率 */
private static ErrorCorrectionLevel level = ErrorCorrectionLevel.L;
/**
* 生成二维码图片
* @param text 二维码内容
* @param width 图片宽度
* @param height 图片高度
* @return 生成的二维码图片
* @throws WriterException 如果二维码生成失败
* 生成带logo的二维码图片
*
* @param txt //二维码内容
* @param logoPath //logo绝对物理路径
* @param imgPath //二维码保存绝对物理路径
* @param imgName //二维码文件名称
* @param suffix //图片后缀名
* @throws Exception
*/
public static BufferedImage generateQRCodeImage(String text, int width, int height) throws WriterException {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
return MatrixToImageWriter.toBufferedImage(bitMatrix);
public static void generateQRImage(String txt, String logoPath, String imgPath, String imgName, String suffix)
throws Exception {
File filePath = new File(imgPath);
if (!filePath.exists()) {
filePath.mkdirs();
}
if (imgPath.endsWith("/")) {
imgPath += imgName;
} else {
imgPath += "/" + imgName;
}
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.ERROR_CORRECTION, level);
// 设置白边
hints.put(EncodeHintType.MARGIN, margin);
BitMatrix bitMatrix = new MultiFormatWriter().encode(txt, BarcodeFormat.QR_CODE, width, height, hints);
File qrcodeFile = new File(imgPath);
writeToFile(bitMatrix, suffix, qrcodeFile, logoPath);
}
/**
* 将二维码图片保存到文件
* @param qrCodeImage 二维码图片
* @param filePath 文件路径
* @throws IOException 如果保存文件失败
* 生成二维码
*
* @param txt //二维码内容
* @param imgPath //二维码保存物理路径
* @param imgName //二维码文件名称
* @param suffix //图片后缀名
*/
public static void saveQRCodeImage(BufferedImage qrCodeImage, Path filePath) throws IOException {
File outputFile = filePath.toFile();
ImageIO.write(qrCodeImage, "jpg", outputFile);
public static void generateQRImage(String txt, String imgPath, String imgName, String suffix) {
File filePath = new File(imgPath);
if (!filePath.exists()) {
filePath.mkdirs();
}
File imageFile = new File(imgPath, imgName);
Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
// 指定纠错等级
hints.put(EncodeHintType.ERROR_CORRECTION, level);
// 指定编码格式
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
// 设置白边
hints.put(EncodeHintType.MARGIN, margin);
try {
MatrixToImageConfig config = new MatrixToImageConfig(onColor, offColor);
BitMatrix bitMatrix = new MultiFormatWriter().encode(txt, BarcodeFormat.QR_CODE, width, height, hints);
// bitMatrix = deleteWhite(bitMatrix);
MatrixToImageWriter.writeToPath(bitMatrix, suffix, imageFile.toPath(), config);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param matrix 二维码矩阵相关
* @param format 二维码图片格式
* @param file 二维码图片文件
* @param logoPath logo路径
* @throws IOException
*/
public static void writeToFile(BitMatrix matrix, String format, File file, String logoPath) throws IOException {
BufferedImage image = toBufferedImage(matrix);
Graphics2D gs = image.createGraphics();
int ratioWidth = image.getWidth() * 2 / 10;
int ratioHeight = image.getHeight() * 2 / 10;
// 载入logo
Image img = ImageIO.read(new File(logoPath));
int logoWidth = img.getWidth(null) > ratioWidth ? ratioWidth : img.getWidth(null);
int logoHeight = img.getHeight(null) > ratioHeight ? ratioHeight : img.getHeight(null);
int x = (image.getWidth() - logoWidth) / 2;
int y = (image.getHeight() - logoHeight) / 2;
gs.drawImage(img, x, y, logoWidth, logoHeight, null);
gs.setColor(Color.black);
gs.setBackground(Color.WHITE);
gs.dispose();
img.flush();
if (!ImageIO.write(image, format, file)) {
throw new IOException("Could not write an image of format " + format + " to " + file);
}
}
/**
* 压缩目录中的图片到ZIP文件
* @param sourceDir 源目录
*
* @param sourceDir 源目录
* @param zipFilePath ZIP文件路径
* @throws IOException 如果压缩过程失败
*/
@ -73,38 +165,17 @@ public class QrCodeUtils {
}
}
/*public static void main(String[] args) {
try {
Path downloadDir = Paths.get("qr_codes");
Files.createDirectories(downloadDir);
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
int width = 300;
int height = 300;
String baseText = "QR Code ";
// 生成二维码
for (int i = 1; i <= 2; i++) {
String text = baseText + i;
BufferedImage qrCodeImage = QRCodeUtils.generateQRCodeImage(text, width, height);
Path filePath = downloadDir.resolve("QRCode_" + i + ".jpg");
QRCodeUtils.saveQRCodeImage(qrCodeImage, filePath);
System.out.println("Generated: " + filePath);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? onColor : offColor);
}
// 压缩二维码图片
Path zipFilePath = Paths.get("qr_codes.zip");
zipImages(downloadDir, zipFilePath);
System.out.println("Images zipped to: " + zipFilePath);
// 清理
Files.walk(downloadDir)
.map(Path::toFile)
.forEach(File::delete);
Files.deleteIfExists(downloadDir);
} catch (WriterException | IOException e) {
e.printStackTrace();
}
}*/
return image;
}
}

View File

@ -101,4 +101,7 @@ public class PurchaseAcceptVo {
@ApiModelProperty(value = "任务id")
private String taskId;
@ApiModelProperty(value = "是否下载")
private Integer isDownload;
}

View File

@ -0,0 +1,27 @@
package com.bonus.purchase.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 二维码返回详情vo
* @Author ma_sh
* @create 2024/8/26 17:45
*/
@Data
public class QrUrlVo {
private Integer id;
@ApiModelProperty("物资名称")
private String materialName;
@ApiModelProperty("规格型号")
private String materialModel;
@ApiModelProperty(value = "二维码code")
private String qrCode;
@ApiModelProperty(value = "二维码curl")
private String qrUrl;
}

View File

@ -77,7 +77,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
bp.product_date AS productDate,
bp.`status` AS STATUS,
sda1.dict_label AS statusName
sda1.dict_label AS statusName,
bp.is_download AS isDownload
FROM
bpm_purchase_info bp
LEFT JOIN bpm_task bt ON bp.task_id = bt.id

View File

@ -89,7 +89,13 @@
<update id="updateStatus">
UPDATE bpm_purchase_info
SET is_download = '1'
WHERE task_id = #{id}
WHERE is_active = '1'
<if test="id != null and id != ''">
and task_id = #{id}
</if>
<if test="purchaseId != null and purchaseId != ''">
and id = #{purchaseId}
</if>
</update>
@ -187,4 +193,26 @@
and id = #{purchaseId}
</if>
</select>
<select id="selectQrCode" resultType="com.bonus.purchase.vo.QrUrlVo">
SELECT
bq.id AS id,
bq.CODE AS qrCode,
bq.qr_url AS qrUrl,
mt.NAME AS materialModel,
mt1.NAME AS materialName
FROM
bm_qrcode bq
LEFT JOIN ma_type mt ON bq.type_id = mt.id
LEFT JOIN ma_type mt1 ON mt.parent_id = mt1.id
LEFT JOIN bpm_purchase_info bp ON bp.task_id = bq.task_id
AND bp.type_id = bq.type_id
where
bq.is_active = '1'
<if test="id != null and id != ''">
and bq.task_id = #{id}
</if>
<if test="purchaseId != null and purchaseId != ''">
and bp.id = #{purchaseId}
</if>
</select>
</mapper>