cut-to-pack-service/src/main/java/com/utopiaindustries/service/BarcodeService.java

140 lines
6.6 KiB
Java

package com.utopiaindustries.service;
import com.google.zxing.BarcodeFormat;
import com.utopiaindustries.dao.ctp.BundleDAO;
import com.utopiaindustries.dao.ctp.FinishedItemDAO;
import com.utopiaindustries.dao.ctp.MasterBundleDAO;
import com.utopiaindustries.dao.ctp.StitchingOfflineItemDAO;
import com.utopiaindustries.model.ctp.*;
import com.utopiaindustries.util.BarcodeUtils;
import com.utopiaindustries.util.StringUtils;
import com.zebra.sdk.comm.Connection;
import com.zebra.sdk.comm.TcpConnection;
import com.zebra.sdk.graphics.internal.ZebraImage;
import com.zebra.sdk.printer.ZebraPrinter;
import com.zebra.sdk.printer.ZebraPrinterFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.Font;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
@Service
public class BarcodeService {
@Value("${ctp.printer.ipAdd}")
private String ipAddress;
@Value("${ctp.printer.port}")
private int port;
private final BundleDAO bundleDAO;
private final MasterBundleDAO masterBundleDAO;
private final FinishedItemDAO finishedItemDAO;
private final StitchingOfflineItemDAO stitchingOfflineItemDAO;
public BarcodeService(BundleDAO bundleDAO, MasterBundleDAO masterBundleDAO, FinishedItemDAO finishedItemDAO, StitchingOfflineItemDAO stitchingOfflineItemDAO) {
this.bundleDAO = bundleDAO;
this.masterBundleDAO = masterBundleDAO;
this.finishedItemDAO = finishedItemDAO;
this.stitchingOfflineItemDAO = stitchingOfflineItemDAO;
}
/*
* generate barcodes here
* */
public void generateBarcodes(List<Long> ids, String artifactType) throws Exception {
String size = BarcodeStickerSize.SIZE_4_X_7.name();
BarcodeStickerSize stickerSize = BarcodeStickerSize.getSize(size);
List<? extends InventoryArtifact> list = new ArrayList<>();
if (StringUtils.compare(artifactType, Bundle.class.getSimpleName())) {
list = bundleDAO.findByIds(ids);
} else if (StringUtils.compare(artifactType, MasterBundle.class.getSimpleName())) {
list = masterBundleDAO.findByIds(ids);
} else if (StringUtils.compare(artifactType, FinishedItem.class.getSimpleName())) {
list = stitchingOfflineItemDAO.findByIds(ids);
}
getBarcodeImages(list, stickerSize, artifactType);
}
public void getBarcodeImages(List<? extends InventoryArtifact> artifacts,
BarcodeStickerSize stickerSize,
String artifactType) throws Exception {
for (InventoryArtifact artifact : artifacts) {
// Create a blank BufferedImage (an image with the size of the sticker)
BufferedImage stickerImage = new BufferedImage((int) stickerSize.getWidth()*2, (int) stickerSize.getHeight()*2, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = stickerImage.createGraphics();
g2d.scale(2,2);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// Set background color (white for the sticker)
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, (int) stickerSize.getWidth(), (int) stickerSize.getHeight());
// Set font for SKU and barcode
Font font = new Font("Helvetica", Font.BOLD, stickerSize.getTextSize()+10);
g2d.setFont(font);
// Add SKU to the image
String sku = artifact.getSku();
FontMetrics fontMetrics = g2d.getFontMetrics();
int textWidth = fontMetrics.stringWidth(sku);
int x = (int) ((stickerSize.getWidth() - textWidth) / 2);
g2d.setColor(Color.BLACK);
g2d.drawString(sku, x, stickerSize.getMarginTop() + fontMetrics.getAscent()+20);
// Create the barcode image
byte[] imgBytes = BarcodeUtils.getBarcodeImageByteArray(artifact.getBarcode(), BarcodeFormat.CODE_128, stickerSize.getImageWidthBarcode()+500, stickerSize.getImageHeightBarcode()+30);
BufferedImage barcodeImage = ImageIO.read(new ByteArrayInputStream(imgBytes));
// Draw the barcode image on the sticker
int barcodeX =(int) (stickerSize.getWidth() - barcodeImage.getWidth()) / 2;
int barcodeY = stickerSize.getMarginTop() + fontMetrics.getAscent() + 30; // Add some margin
g2d.drawImage(barcodeImage, barcodeX, barcodeY, null);
// Add the barcode value below the barcode image
g2d.drawString(artifact.getBarcode(), (stickerSize.getWidth() - fontMetrics.stringWidth(artifact.getBarcode())) / 2,
barcodeY + barcodeImage.getHeight() + fontMetrics.getAscent());
// If artifactType is Bundle, add additional info
if (artifactType.equalsIgnoreCase(Bundle.class.getSimpleName())) {
String typeText = String.format("%s : %d", artifact.getType(), artifact.getId());
g2d.drawString(typeText, (stickerSize.getWidth() - fontMetrics.stringWidth(typeText)) / 2,
barcodeY + barcodeImage.getHeight() + fontMetrics.getAscent() + 45);
g2d.setFont(new Font("Helvetica", Font.BOLD, stickerSize.getTextSize()+20));
g2d.drawString(String.valueOf(artifactType.toCharArray()[0]), (stickerSize.getWidth() - fontMetrics.stringWidth(String.valueOf(artifactType.toCharArray()[0]))) / 2,
barcodeY + barcodeImage.getHeight() + fontMetrics.getAscent() + 77);
} else {
// Add first character of artifact type
String type = String.valueOf(artifactType.charAt(0));
g2d.setFont(new Font("Helvetica", Font.BOLD, stickerSize.getTextSize()+10));
g2d.drawString(type, (stickerSize.getWidth() - fontMetrics.stringWidth(type)) / 2,
barcodeY + barcodeImage.getHeight() + fontMetrics.getAscent() + 45);
}
// Finalize drawing
g2d.dispose();
printLabel(stickerImage);
}
}
public void printLabel( BufferedImage bufferedImage ) throws Exception {
Connection connection = new TcpConnection( ipAddress, port );
connection.open();
ZebraPrinter printer = ZebraPrinterFactory.getInstance( connection );
ZebraImage zebraImage = new ZebraImage( bufferedImage );
printer.printImage( zebraImage, 0, 0, 0, 0, false );
connection.close();
}
}