From 72c8a528c0de4af046a242b5e1c062d67840fe6a Mon Sep 17 00:00:00 2001 From: "kelvin.yau" Date: Wed, 21 Jan 2026 21:44:55 +0800 Subject: [PATCH] print labels setup --- .../common/internalSetup/SetupController.kt | 21 +++++++++ .../common/internalSetup/inventorySetup.kt | 43 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/src/main/java/com/ffii/fpsms/modules/common/internalSetup/SetupController.kt b/src/main/java/com/ffii/fpsms/modules/common/internalSetup/SetupController.kt index 7abefa6..c3c3ef8 100644 --- a/src/main/java/com/ffii/fpsms/modules/common/internalSetup/SetupController.kt +++ b/src/main/java/com/ffii/fpsms/modules/common/internalSetup/SetupController.kt @@ -186,4 +186,25 @@ class SetupController( return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse) } } + + @PostMapping("/inventory/print-lot-stockin-labels-by-item-ids") + fun printLotStockInLabelsByItemIds(@RequestBody request: Map): ResponseEntity> { + val printerId = (request["printerId"] as? Number)?.toLong() + val printQty = (request["printQty"] as? Number)?.toInt() ?: 1 + val fromIndex = (request["fromIndex"] as? Number)?.toInt() + val toIndex = (request["toIndex"] as? Number)?.toInt() + val itemIds = (request["itemIds"] as? List<*>)?.mapNotNull { (it as? Number)?.toLong() } ?: emptyList() + + if (printerId == null) return ResponseEntity.badRequest().body(mapOf("success" to false, "error" to "printerId is required")) + if (itemIds.isEmpty()) return ResponseEntity.badRequest().body(mapOf("success" to false, "error" to "itemIds is required")) + + val printedCount = inventorySetup.printLotStockInLabelsByItemIds( + printerId = printerId, + itemIds = itemIds, + printQty = printQty, + fromIndex = fromIndex, + toIndex = toIndex + ) + return ResponseEntity.ok(mapOf("success" to true, "message" to "Lot stock-in labels printed successfully", "printedCount" to printedCount)) + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/common/internalSetup/inventorySetup.kt b/src/main/java/com/ffii/fpsms/modules/common/internalSetup/inventorySetup.kt index 149d622..3c11007 100644 --- a/src/main/java/com/ffii/fpsms/modules/common/internalSetup/inventorySetup.kt +++ b/src/main/java/com/ffii/fpsms/modules/common/internalSetup/inventorySetup.kt @@ -311,4 +311,47 @@ open class InventorySetup { return printedCount } + @Transactional(rollbackFor = [Exception::class]) + open fun printLotStockInLabelsByItemIds( + printerId: Long, + itemIds: List, + printQty: Int = 1, + fromIndex: Int? = null, + toIndex: Int? = null + ): Int { + if (itemIds.isEmpty()) return 0 + + val allInventoryLotLines = inventoryLotLineRepository + .findAllByItemIdIn(itemIds) + .filter { it.deleted == false && it.inventoryLot?.stockInLine != null } + + if (allInventoryLotLines.isEmpty()) return 0 + + val inventoryLotLinesToPrint = if (fromIndex != null && toIndex != null) { + val startIndex = fromIndex.coerceAtLeast(0) + val endIndex = toIndex.coerceAtMost(allInventoryLotLines.size - 1) + if (startIndex > endIndex || startIndex >= allInventoryLotLines.size) return 0 + allInventoryLotLines.subList(startIndex, endIndex + 1) + } else { + allInventoryLotLines + } + + var printedCount = 0 + for ((index, inventoryLotLine) in inventoryLotLinesToPrint.withIndex()) { + val stockInLineId = inventoryLotLine.inventoryLot?.stockInLine?.id + ?: throw IllegalArgumentException("Stock in line missing") + val actualIndex = if (fromIndex != null) fromIndex + index else index + println("Processing lot ${actualIndex + 1}/${allInventoryLotLines.size}: Lot No: ${inventoryLotLine.inventoryLot?.lotNo}, StockInLineId: $stockInLineId") + stockInLineService.printQrCode( + PrintQrCodeForSilRequest( + stockInLineId = stockInLineId, + printerId = printerId, + printQty = printQty + ) + ) + printedCount++ + } + return printedCount + } + } \ No newline at end of file