import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.Optional;
import java.util.UUID;
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class BarcodeService {
private final OrderItemRepository orderItemRepository;
private final OrderRepository orderRepository;
private final BarcodeHistoryRepository barcodeHistoryRepository;
@Transactional
public byte[] getBarcodeForOrderItem(UUID orderItemId, Integer appId) throws WriterException, IOException {
Optional<OrderItem> orderItemOptional = orderItemRepository.findById(orderItemId);
if(!orderItemOptional.isPresent())
throw new NoSuchElementException("OrderItem not found: " + orderItemId);
BarcodeHistory barcodeHistory = BarcodeHistory.builder().build();
barcodeHistory.setAppId(appId);
barcodeHistory = barcodeHistoryRepository.save(barcodeHistory);
OrderItem orderItem = orderItemOptional.get();
QRCodeWriter writer = new QRCodeWriter();
BitMatrix matrix = writer.encode(orderItem.getId() + ","
+ orderItem.getSkuId() + "," + orderItem.getQuantity() + "," + orderItem.getSpjOrder().getCustomerId()
+ "," + barcodeHistory.getToken(),
BarcodeFormat.QR_CODE, 350, 350);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(matrix, "JPG", outputStream);
return outputStream.toByteArray();
}
@Transactional
public byte[] getBarcodeForOrder(UUID orderId, Integer appId) throws WriterException, IOException {
Optional<Order> orderOptional = orderRepository.findById(orderId);
if(!orderOptional.isPresent())
throw new NoSuchElementException("Order not found: " + orderId);
BarcodeHistory barcodeHistory = BarcodeHistory.builder().build();
barcodeHistory.setAppId(appId);
barcodeHistory = barcodeHistoryRepository.save(barcodeHistory);
Order order = orderOptional.get();
QRCodeWriter writer = new QRCodeWriter();
BitMatrix matrix = writer.encode(order.getId() + ","
+ order.getCustomerId() + "," + barcodeHistory.getToken(),
BarcodeFormat.QR_CODE, 350, 350);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(matrix, "JPG", outputStream);
return outputStream.toByteArray();
}
}