diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt index 4a91d2a..72afd92 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt @@ -269,7 +269,7 @@ open class ItemsService( open fun getPickOrderItemsByPage(args: Map): List> { try { println("=== Debug: getPickOrderItemsByPage in ItemsService ===") - println("Args: $args") + //println("Args: $args") val sql = StringBuilder( """ @@ -333,11 +333,11 @@ open class ItemsService( sql.append(" ORDER BY po.targetDate DESC, i.name ASC ") val finalSql = sql.toString() - println("Final SQL: $finalSql") - println("SQL args: $args") + // println("Final SQL: $finalSql") + //println("SQL args: $args") val result = jdbcDao.queryForList(finalSql, args) - println("Query result size: ${result.size}") + //println("Query result size: ${result.size}") result.forEach { row -> println("Result row: $row") } return result } catch (e: Exception) { diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderWorkbenchService.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderWorkbenchService.kt index 46906bf..2bedb42 100644 --- a/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderWorkbenchService.kt +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderWorkbenchService.kt @@ -50,7 +50,7 @@ open class PickOrderWorkbenchService( /** * Workbench assign V2 for consumable pick orders: * - Assign selected pick orders to user and mark ASSIGNED. - * - Build no-hold suggestions + ensure stock_out_line for each pick order. + * - Do NOT create suggestion/stock_out_line here (created on Tab3 line select). */ @Transactional(rollbackFor = [Exception::class]) open fun assignPickOrdersV2(pickOrderIds: List, assignTo: Long): MessageResponse { @@ -73,34 +73,17 @@ open class PickOrderWorkbenchService( pickOrder.status = PickOrderStatus.ASSIGNED } pickOrderRepository.saveAll(pickOrders) - - val assignedIds = mutableListOf() - var suggestionRows = 0 - var stockOutLines = 0 - pickOrders.forEach { po -> - val poId = po.id ?: return@forEach - val suggestSummary = suggestedPickLotWorkbenchService.primeNextSingleLotSuggestionsForPickOrder( - pickOrderId = poId, - storeId = null, - excludeWarehouseCodes = null, - ) - val solSummary = stockOutLineWorkbenchService.ensureStockOutLinesForPickOrderNoHold(poId, assignTo) - assignedIds.add(poId) - suggestionRows += suggestSummary.created - stockOutLines += solSummary.created - } + val assignedIds = pickOrders.mapNotNull { it.id } return MessageResponse( id = null, name = "Workbench assign v2 success", code = "SUCCESS", type = "pickorder_workbench", - message = "Assigned and initialized no-hold suggestion/stock-out for workbench", + message = "Assigned pick orders for workbench (no suggestion/stock-out at assign stage)", errorPosition = null, entity = mapOf( - "pickOrderIds" to assignedIds, - "suggestionRowsCreated" to suggestionRows, - "stockOutLinesCreated" to stockOutLines + "pickOrderIds" to assignedIds ) ) } catch (e: Exception) { @@ -342,6 +325,7 @@ open class PickOrderWorkbenchService( lotNo = r["lotNo"]?.toString(), expiryDate = toLocalDate(r["expiryDate"]), location = r["location"]?.toString(), + itemId = pol.item?.id, stockUnit = uomDesc, availableQty = availableQty, requiredQty = toBigDecimal(r["suggestedQty"]) ?: pol.qty ?: zero, @@ -379,6 +363,7 @@ open class PickOrderWorkbenchService( lotNo = null, expiryDate = null, location = null, + itemId = pol.item?.id, stockUnit = uomDesc, availableQty = null, requiredQty = pol.qty ?: zero, @@ -400,5 +385,60 @@ open class PickOrderWorkbenchService( return withLot + noLot } + + /** + * Workbench suggest V2 for consumable pick orders (first-time suggestion path): + * - Create/rebuild no-hold suggestions for this pick order. + * - Ensure stock_out_line rows exist for created/reused suggestions. + */ + @Transactional(rollbackFor = [Exception::class]) + open fun suggestPickOrderV2(pickOrderId: Long, userId: Long): MessageResponse { + return try { + val pickOrder = pickOrderRepository.findById(pickOrderId).orElse(null) + ?: return MessageResponse( + id = pickOrderId, + name = "Workbench suggest v2 failed", + code = "ERROR", + type = "pickorder_workbench", + message = "Pick order not found", + errorPosition = null + ) + + val suggestSummary = suggestedPickLotWorkbenchService.primeNextSingleLotSuggestionsForPickOrder( + pickOrderId = pickOrderId, + storeId = null, + excludeWarehouseCodes = null, + ) + val stockOutSummary = stockOutLineWorkbenchService.ensureStockOutLinesForPickOrderNoHold( + pickOrderId = pickOrderId, + userId = userId, + ) + + MessageResponse( + id = pickOrder.id, + name = "Workbench suggest v2 success", + code = "SUCCESS", + type = "pickorder_workbench", + message = "Workbench suggestion prepared", + errorPosition = null, + entity = mapOf( + "pickOrderId" to pickOrderId, + "suggestionRowsCreated" to suggestSummary.created, + "suggestionRowsSkippedExisting" to suggestSummary.skippedExisting, + "stockOutLinesCreated" to stockOutSummary.created, + "stockOutLinesReused" to stockOutSummary.reused, + ) + ) + } catch (e: Exception) { + MessageResponse( + id = pickOrderId, + name = "Workbench suggest v2 failed", + code = "ERROR", + type = "pickorder_workbench", + message = "Failed to prepare workbench suggestion: ${e.message}", + errorPosition = null + ) + } + } } diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt index ded41ce..c352f09 100644 --- a/src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt @@ -105,6 +105,24 @@ class PickOrderController( return pickOrderWorkbenchService.getWorkbenchPickOrderLineLotDetailsV2(pickOrderLineId) } + @PostMapping("/workbench/suggest-v2/{pickOrderId}") + fun suggestPickOrderWorkbenchV2( + @PathVariable pickOrderId: Long, + @RequestBody request: Map, + ): MessageResponse { + val userId = request["userId"]?.toString()?.toLongOrNull() + ?: request["assignTo"]?.toString()?.toLongOrNull() + ?: return MessageResponse( + id = pickOrderId, + name = "Workbench suggest v2 failed", + code = "ERROR", + type = "pickorder_workbench", + message = "userId is required", + errorPosition = null + ) + return pickOrderWorkbenchService.suggestPickOrderV2(pickOrderId, userId) + } + // Release Pick Orders (without consoCode) @PostMapping("/release") fun releasePickOrders(@RequestBody request: Map): MessageResponse { diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/web/models/ConsoPickOrderResponse.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/web/models/ConsoPickOrderResponse.kt index 05e7cd6..b4a3f0e 100644 --- a/src/main/java/com/ffii/fpsms/modules/pickOrder/web/models/ConsoPickOrderResponse.kt +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/web/models/ConsoPickOrderResponse.kt @@ -162,6 +162,7 @@ data class PickOrderLineLotDetailResponse( val lotNo: String?, val expiryDate: LocalDate?, val location: String?, + val itemId: Long? = null, val stockUnit: String?, val availableQty: BigDecimal?, val requiredQty: BigDecimal?,