Browse Source

二维码太小

master
han\hanst 7 months ago
parent
commit
5a9b07443e
  1. 8
      src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java
  2. 41
      src/main/java/com/gaotao/modules/base/utils/ZplGenerator.java
  3. 1
      src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java
  4. 80
      src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java

8
src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java

@ -22,6 +22,8 @@ import org.springframework.transaction.annotation.Transactional;
import java.io.InputStream;
import java.io.OutputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
@ -678,7 +680,11 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
}
LabelSettingData labelSetting = labelSettingDataList.get(0);
String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
// 生成前缀A+site+YYYYMMDD
String prefix = "A" + "55" + dateStr;
List<String> unitIds = Collections.singletonList(prefix+"00000001");
queryParams.put("unitIds", unitIds);
// 使用真实数据生成ZPL代码
List<String> zplCodeList = labelDataProcessorService.generateZplWithRealData(reportId, elements, labelSetting, printFlag, queryParams);

41
src/main/java/com/gaotao/modules/base/utils/ZplGenerator.java

@ -423,10 +423,14 @@ public class ZplGenerator {
*/
private String generateQRCodeZPL(ReportLabelList element, int x, int y) {
String data = element.getData() != null ? element.getData() : "";
// 将毫米转换为ZPL尺寸单位
int sizeInDots = Math.max(1, Math.round((element.getHeight() != null ? element.getHeight() : 10) * this.dpi / 25.4f));
// 获取二维码尺寸毫米
int sizeInMm = element.getHeight() != null ? element.getHeight() : 10;
// 计算合适的像素尺寸用于生成二维码图片保证足够的分辨率
int pixelSize = Math.max(100, sizeInMm * 10); // 每毫米至少10像素确保清晰度
// 将毫米转换为ZPL打印点数
int sizeInDots = Math.max(1, Math.round(sizeInMm * this.dpi / 25.4f));
try {
return generateZplQRCode(data, sizeInDots, x, y);
return generateZplQRCode(data, pixelSize, sizeInDots, x, y);
} catch (Exception e) {
throw new RuntimeException(e);
}
@ -436,14 +440,15 @@ public class ZplGenerator {
* 生成二维码并转为 ZPL
*
* @param content 二维码内容支持中文
* @param size 二维码宽高像素 == dots
* @param pixelSize 生成二维码图片的像素尺寸
* @param printSize 打印时的实际尺寸dots
* @param x 打印起点 X 坐标单位dots
* @param y 打印起点 Y 坐标单位dots
* @return ZPL 字符串
*/
public String generateZplQRCode(String content, int size, int x, int y) throws Exception {
byte[] qrBytes = generateQRCode(content, size, size);
return convertToZpl(qrBytes, x, y);
public String generateZplQRCode(String content, int pixelSize, int printSize, int x, int y) throws Exception {
byte[] qrBytes = generateQRCode(content, pixelSize, pixelSize);
return convertToZpl(qrBytes, printSize, x, y);
}
// 1. 生成二维码支持中文
@ -465,19 +470,27 @@ public class ZplGenerator {
}
// 2. 转换 PNG 图片为 ZPL ^GF 指令
private static String convertToZpl(byte[] imageBytes, int x, int y) throws Exception {
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));
int widthBytes = (image.getWidth() + 7) / 8; // 每行字节数
int totalBytes = widthBytes * image.getHeight();
private static String convertToZpl(byte[] imageBytes, int targetSize, int x, int y) throws Exception {
BufferedImage originalImage = ImageIO.read(new ByteArrayInputStream(imageBytes));
// 将图片缩放到目标尺寸
BufferedImage scaledImage = new BufferedImage(targetSize, targetSize, BufferedImage.TYPE_BYTE_GRAY);
java.awt.Graphics2D g2d = scaledImage.createGraphics();
g2d.setRenderingHint(java.awt.RenderingHints.KEY_INTERPOLATION, java.awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.drawImage(originalImage, 0, 0, targetSize, targetSize, null);
g2d.dispose();
int widthBytes = (scaledImage.getWidth() + 7) / 8; // 每行字节数
int totalBytes = widthBytes * scaledImage.getHeight();
StringBuilder zpl = new StringBuilder();
zpl.append("^FO").append(x).append(",").append(y).append("\n");
zpl.append("^GFA,").append(totalBytes).append(",").append(totalBytes).append(",").append(widthBytes).append(",");
StringBuilder imageData = new StringBuilder();
for (int yPos = 0; yPos < image.getHeight(); yPos++) {
for (int yPos = 0; yPos < scaledImage.getHeight(); yPos++) {
int bit = 0;
int currentByte = 0;
for (int xPos = 0; xPos < image.getWidth(); xPos++) {
int rgb = image.getRGB(xPos, yPos);
for (int xPos = 0; xPos < scaledImage.getWidth(); xPos++) {
int rgb = scaledImage.getRGB(xPos, yPos);
int gray = (rgb >> 16 & 0xff) * 299 + (rgb >> 8 & 0xff) * 587 + (rgb & 0xff) * 114;
gray = gray / 1000;

1
src/main/java/com/gaotao/modules/inspection/service/impl/InspectionInboundServiceImpl.java

@ -531,6 +531,7 @@ public class InspectionInboundServiceImpl implements InspectionInboundService {
huWrapper.in("unit_id", handlingUnitIds);
HandlingUnit huUpdate = new HandlingUnit();
huUpdate.setInStockFlag("N"); // 设置为未入库
huUpdate.setStatus("INVALID"); // 设置为失效状态
huUpdate.setModifiedDate(new Date());

80
src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java

@ -262,7 +262,7 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> implemen
handlingUnit.setStatusDb("ACTIVE");
handlingUnit.setFreezeFlag("N");
handlingUnit.setMergedFlag("N");
handlingUnit.setInStockFlag("N".equals(inData.getNeedCheck())?"Y":"N");
handlingUnit.setInStockFlag("N".equals(inData.getNeedCheck())?"Y":"X");
handlingUnit.setOrderRef1(inData.getPoNo());
handlingUnit.setOrderRef2(inData.getReceiptNo());
handlingUnit.setOrderRef3(inData.getOrderRef3());
@ -378,80 +378,6 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> implemen
}
}
/**
* 委外
* @param inData
*/
private void syncToIFSOfWeiWai(TransDetailDto inData, Map<String, Object> weiwaiMap) {
try {
Map<String, Object> params = Map.ofEntries(
Map.entry("ifsDBName", ifsDBName),
Map.entry("domainUserID", domainUserID),
Map.entry("ifsSiteID", inData.getSite()),
Map.entry("ifsOrderNo", inData.getOrderNo()),
Map.entry("ifsLineNo", inData.getLineNo()),
Map.entry("ifsReleaseNo", inData.getReleaseNo()),
Map.entry("ifsLineItemNo", "1"),
Map.entry("ifsOrderCode", "1"),
Map.entry("ifsPartNo", weiwaiMap.get("componentPartNo")),
Map.entry("ifsLocationNo", inData.getLocationNo()),
Map.entry("ifsLotBatchNo", "2756083-*-*-1"),
Map.entry("ifsSerialNo", "*"),
Map.entry("ifsEngChgLevel", "1"),
Map.entry("ifsWDRNo", "外发东琨"),
Map.entry("ifsActivitySequenceNo", 0),
Map.entry("ifsHandlingUnitID", 0),
Map.entry("ifsReverseQty", "-"+inData.getTransQty())
);
ObjectMapper objectMapper = new ObjectMapper();
String jsonBody = objectMapper.writeValueAsString(params);
String PurchaseOrderReserveComponent = HttpUtils.doPost(ifsUrl+"PurchaseOrderReserveComponent",jsonBody,null);
log.info("委外预留结果: {}", PurchaseOrderReserveComponent);
if ("IFSUpdated".equals(PurchaseOrderReserveComponent) || "\"IFSUpdated\"".equals(PurchaseOrderReserveComponent)) {
log.info("委外poIFS同步成功,PO号: {}", inData.getOrderNo());
} else {
log.error("委外poIFS同步失败,PO号: {}, 响应: {}", inData.getOrderNo(), PurchaseOrderReserveComponent);
// 同步失败需要回滚前面所有的数据库操作
throw new XJException("IFS同步失败,响应: " + PurchaseOrderReserveComponent);
}
Map<String, Object> params2 = Map.ofEntries(
Map.entry("ifsDBName", ifsDBName),
Map.entry("domainUserID", domainUserID),
Map.entry("ifsSiteID", inData.getSite()),
Map.entry("ifsOrderNo", inData.getOrderNo()),
Map.entry("ifsLineNo", inData.getLineNo()),
Map.entry("ifsReleaseNo", inData.getReleaseNo()),
Map.entry("ifsLineItemNo", "1"),
Map.entry("ifsOrderCode", "1"),
Map.entry("ifsPartNo", weiwaiMap.get("componentPartNo")),
Map.entry("ifsLocationNo", inData.getLocationNo()),
Map.entry("ifsLotBatchNo", "2756083-*-*-1"),
Map.entry("ifsSerialNo", "*"),
Map.entry("ifsEngChgLevel", "1"),
Map.entry("ifsWDRNo", "外发东琨"),
Map.entry("ifsActivitySequenceNo", 0),
Map.entry("ifsHandlingUnitID", 0),
Map.entry("ifsQtyToShip", inData.getTransQty())
);
String jsonBody2 = objectMapper.writeValueAsString(params2);
String PurchaseOrderIssueComponent = HttpUtils.doPost(ifsUrl+"PurchaseOrderIssueComponent",jsonBody2,null);
log.info("委外,PO号: {}", inData.getOrderNo());
if ("IFSUpdated".equals(PurchaseOrderIssueComponent) || "\"IFSUpdated\"".equals(PurchaseOrderIssueComponent)) {
log.info("委外poIFS同步成功,PO号: {}", inData.getOrderNo());
} else {
log.error("委外poIFS同步失败,PO号: {}, 响应: {}", inData.getOrderNo(), PurchaseOrderIssueComponent);
// 同步失败需要回滚前面所有的数据库操作
throw new XJException("IFS同步失败,响应: " + PurchaseOrderIssueComponent);
}
} catch (XJException e) {
// 重新抛出业务异常确保事务回滚
throw e;
} catch (Exception e) {
log.error("委外poIFS同步异常,PO号: {}, 错误: {}", inData.getOrderNo(), e.getMessage());
// 同步异常需要回滚前面所有的数据库操作
throw new XJException("IFS同步异常: " + e.getMessage());
}
}
/**
* 创建采购接收记录
@ -625,7 +551,7 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> implemen
if (inData.getPurchaseUOM() != null && !"KG".equalsIgnoreCase(inData.getPurchaseUOM())) {
poReceiptDetail.setWidth(BigDecimal.valueOf(1000));
} else {
poReceiptDetail.setWidth(null);
poReceiptDetail.setWidth(BigDecimal.valueOf(0));
}
}
// length就是数量除以width再乘以1000
@ -635,7 +561,7 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> implemen
.multiply(BigDecimal.valueOf(1000));
poReceiptDetail.setLength(length);
} else {
poReceiptDetail.setLength(null);
poReceiptDetail.setLength(BigDecimal.valueOf(0));
}
// 备注信息
String remarkText = "PO接收自动创建";

Loading…
Cancel
Save