diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JoPickOrderService.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JoPickOrderService.kt index 8a9d264..fa83bb6 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JoPickOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JoPickOrderService.kt @@ -2108,7 +2108,15 @@ open fun getCompletedJobOrderPickOrders(completedDate: LocalDate?): List { + open fun getAllJoPickOrders( + bomType: String?, + floor: String?, + jobOrderCode: String? = null, + pickOrderCode: String? = null, + itemName: String? = null, + bomDescription: String? = null, + planStart: LocalDate? = null, + ): List { println("=== getAllJoPickOrders ===") val wallStartNs = System.nanoTime() val timing = linkedMapOf() @@ -2130,7 +2138,9 @@ open fun getCompletedJobOrderPickOrders(completedDate: LocalDate?): List>> = timed("queryFloorCountsMs") { @@ -2266,7 +2276,10 @@ open fun getCompletedJobOrderPickOrders(completedDate: LocalDate?): List + val jobCodeMatch = normalizedJobOrderCode == null || + (row.jobOrderCode?.lowercase()?.contains(normalizedJobOrderCode) == true) + val pickCodeMatch = normalizedPickOrderCode == null || + (row.pickOrderCode?.lowercase()?.contains(normalizedPickOrderCode) == true) + val itemNameMatch = normalizedItemName == null || + row.itemName.lowercase().contains(normalizedItemName) + val bomDescriptionMatch = normalizedBomDescription == null || + (row.bomDescription?.lowercase()?.contains(normalizedBomDescription) == true) + val planStartMatch = dateFilter == null || row.planStart?.toLocalDate() == dateFilter + jobCodeMatch && pickCodeMatch && itemNameMatch && bomDescriptionMatch && planStartMatch + } + } val totalMs = (System.nanoTime() - wallStartNs) / 1_000_000 println( "JO_ALL_PICK_ORDERS_TIMING totalMs=$totalMs released=${releasedPickOrders.size} " + timing.entries.joinToString(" ") { "${it.key}=${it.value}" }, ) // println("Returning ${jobOrderPickOrders.size} released job order pick orders") - sorted + filtered } catch (e: Exception) { val totalMs = (System.nanoTime() - wallStartNs) / 1_000_000 println( diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt index 462c7b9..0c8fc6e 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt @@ -304,9 +304,24 @@ fun getJobOrderPickOrderLotDetails( @RequestParam(name = "type", required = false) bomType: String?, // Single floor, e.g. "2F"/"3F"/"4F". When provided, backend returns job pick orders // that still have unpicked lines on that floor OR any "no lot" remaining lines. - @RequestParam(required = false) floor: String? + @RequestParam(required = false) floor: String?, + @RequestParam(name = "jobOrderCode", required = false) jobOrderCode: String?, + @RequestParam(name = "pickOrderCode", required = false) pickOrderCode: String?, + @RequestParam(name = "itemName", required = false) itemName: String?, + @RequestParam(name = "bomDescription", required = false) bomDescription: String?, + @RequestParam(name = "planStart", required = false) + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) + planStart: LocalDate?, ): List { - return joPickOrderService.getAllJoPickOrders(bomType, floor) + return joPickOrderService.getAllJoPickOrders( + bomType = bomType, + floor = floor, + jobOrderCode = jobOrderCode, + pickOrderCode = pickOrderCode, + itemName = itemName, + bomDescription = bomDescription, + planStart = planStart, + ) } @GetMapping("/all-lots-hierarchical-by-pick-order/{pickOrderId}") diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt index dbcb012..89a68e4 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt @@ -49,10 +49,12 @@ data class AllJoPickOrderResponse( val jobOrderType: String?, val itemId: Long, val itemName: String, + val bomDescription: String?, val reqQty: BigDecimal, val uomId: Long, val uomName: String, val lotNo: String?, + val planStart: LocalDateTime?, val jobOrderStatus: String, val finishedPickOLineCount: Int, val floorPickCounts: List = emptyList(), diff --git a/src/main/java/com/ffii/fpsms/modules/stock/web/InventoryLotLineController.kt b/src/main/java/com/ffii/fpsms/modules/stock/web/InventoryLotLineController.kt index 865d87e..af12378 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/web/InventoryLotLineController.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/web/InventoryLotLineController.kt @@ -92,6 +92,34 @@ class InventoryLotLineController ( inventoryLotLineService.printLabelForInventoryLotLine(request) } + /** + * Workbench print endpoint: same printing behavior as `/print-label`, + * but always returns JSON so frontend won't fail on empty-body JSON parsing. + */ + @GetMapping("/workbench/print-label") + fun printLabelWorkbench(@ModelAttribute request: PrintLabelForInventoryLotLineRequest): MessageResponse { + return try { + inventoryLotLineService.printLabelForInventoryLotLine(request) + MessageResponse( + id = request.inventoryLotLineId, + name = "print_label", + code = "SUCCESS", + type = "workbench_print_label", + message = "Print job submitted", + errorPosition = null, + ) + } catch (e: Exception) { + MessageResponse( + id = request.inventoryLotLineId, + name = "print_label", + code = "ERROR", + type = "workbench_print_label", + message = e.message ?: "Print failed", + errorPosition = null, + ) + } + } + @PostMapping("/updateStatus") fun updateInventoryLotLineStatus(@RequestBody request: UpdateInventoryLotLineStatusRequest): MessageResponse { println("=== DEBUG: updateInventoryLotLineStatus Controller ===")