diff --git a/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java b/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java index 4b58f875..391551de 100644 --- a/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java @@ -444,6 +444,8 @@ public class PrinterServiceImpl implements PrinterService { @Autowired private RedisTemplate redisTemplate; private static final String USER_PHOTO_LIST_TO_PRINTER = "USER_PHOTO_LIST_TO_PRINTER:"; + private static final String PRINTER_INDEX_KEY_PREFIX = "PRINTER_INDEX:"; + private static final int PRINTER_INDEX_EXPIRE_MINUTES = 5; private static final int TASK_STATUS_PENDING = 0; private static final int TASK_STATUS_PROCESSING = 3; private final Lock syncTaskLock = new ReentrantLock(); @@ -559,8 +561,12 @@ public class PrinterServiceImpl implements PrinterService { log.error("获取景区配置失败,使用原始照片进行打印。景区ID: {}, 照片ID: {}", item.getScenicId(), item.getId(), e); } + // 获取打印机名称(支持轮询) + String selectedPrinter = getNextPrinter(printer); + PrintTaskEntity task = new PrintTaskEntity(); task.setPrinterId(printer.getId()); + task.setPrinterName(selectedPrinter); task.setMpId(item.getId()); task.setPaper(printer.getPreferPaper()); task.setStatus(0); @@ -572,4 +578,52 @@ public class PrinterServiceImpl implements PrinterService { printTaskMapper.insertTask(task); }); } + + /** + * 获取下一个要使用的打印机名称(轮询逻辑) + * + * @param printer 打印机实体 + * @return 选中的打印机名称 + */ + private String getNextPrinter(PrinterEntity printer) { + String usePrinter = printer.getUsePrinter(); + if (StringUtils.isBlank(usePrinter)) { + log.warn("打印机 {} 没有配置 usePrinter", printer.getId()); + return ""; + } + + // 分割打印机列表 + String[] printers = usePrinter.split("\\|"); + if (printers.length == 0) { + log.warn("打印机 {} 的 usePrinter 配置为空", printer.getId()); + return ""; + } + + // 如果只有一个打印机,直接返回 + if (printers.length == 1) { + return printers[0].trim(); + } + + // 从 Redis 原子递增获取索引 + String redisKey = PRINTER_INDEX_KEY_PREFIX + printer.getId(); + Long incrementedValue = redisTemplate.opsForValue().increment(redisKey); + + if (incrementedValue == null) { + log.warn("Redis increment 操作失败,打印机ID: {}", printer.getId()); + incrementedValue = 1L; + } + + // 每次递增后都重新设置过期时间为 5 分钟 + redisTemplate.expire(redisKey, PRINTER_INDEX_EXPIRE_MINUTES, TimeUnit.MINUTES); + + // 对打印机数量取模得到当前索引 + int currentIndex = (int) ((incrementedValue - 1) % printers.length); + + // 获取当前打印机 + String selectedPrinter = printers[currentIndex].trim(); + + log.debug("打印机 {} 选择了第 {} 个打印机: {} (递增值: {})", printer.getId(), currentIndex, selectedPrinter, incrementedValue); + + return selectedPrinter; + } }