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 ef6ca46..4a91d2a 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 @@ -790,6 +790,147 @@ open class ItemsService( return jdbcDao.queryForList(sql.toString(), args); } + open fun getItemOrderOrderedItems(search: String?, type: String? = null): List> { + val sql = StringBuilder( + """ + SELECT + i.id, + i.code, + i.name, + i.item_Order as itemOrder, + i.store_id as storeId, + i.warehouse, + i.area, + i.slot, + i.LocationCode as locationCode + FROM items i + WHERE i.deleted = false + AND i.item_Order IS NOT NULL + """.trimIndent() + ) + val args = mutableMapOf() + val typeTrim = type?.trim() + if (!typeTrim.isNullOrEmpty()) { + sql.append(" AND i.type = :type ") + args["type"] = typeTrim + } + val s = search?.trim() + if (!s.isNullOrEmpty()) { + sql.append(" AND (i.code LIKE :search OR i.name LIKE :search) ") + args["search"] = "%$s%" + } + sql.append(" ORDER BY i.item_Order ASC, i.code ASC ") + return jdbcDao.queryForList(sql.toString(), args) + } + + open fun getItemOrderUnorderedItems(search: String?, type: String? = null): List> { + // To keep UI responsive, do not allow fetching the whole "unordered items" list without search. + // Use the dedicated search API with LIMIT instead. + val sql = StringBuilder( + """ + SELECT + i.id, + i.code, + i.name, + i.item_Order as itemOrder, + i.store_id as storeId, + i.warehouse, + i.area, + i.slot, + i.LocationCode as locationCode + FROM items i + WHERE i.deleted = false + AND i.item_Order IS NULL + """.trimIndent() + ) + val args = mutableMapOf() + val typeTrim = type?.trim() + if (!typeTrim.isNullOrEmpty()) { + sql.append(" AND i.type = :type ") + args["type"] = typeTrim + } + val s = search?.trim() + if (s.isNullOrEmpty()) { + return emptyList() + } + sql.append(" AND (i.code LIKE :search OR i.name LIKE :search) ") + args["search"] = "%$s%" + sql.append(" ORDER BY i.code ASC ") + return jdbcDao.queryForList(sql.toString(), args) + } + + open fun searchItemOrderUnorderedItems(search: String, type: String? = null, limit: Int = 200): List> { + val s = search.trim() + if (s.isEmpty()) return emptyList() + val safeLimit = limit.coerceIn(1, 500) + val sql = StringBuilder( + """ + SELECT + i.id, + i.code, + i.name, + i.item_Order as itemOrder, + i.store_id as storeId, + i.warehouse, + i.area, + i.slot, + i.LocationCode as locationCode + FROM items i + WHERE i.deleted = false + AND i.item_Order IS NULL + AND (i.code LIKE :search OR i.name LIKE :search) + """.trimIndent() + ) + val args = mutableMapOf( + "search" to "%$s%", + "limit" to safeLimit, + ) + val typeTrim = type?.trim() + if (!typeTrim.isNullOrEmpty()) { + sql.append(" AND i.type = :type ") + args["type"] = typeTrim + } + sql.append(" ORDER BY i.code ASC LIMIT :limit ") + return jdbcDao.queryForList(sql.toString(), args) + } + + @Transactional + open fun saveItemOrder(orderedItemIds: List): MessageResponse { + if (orderedItemIds.isEmpty()) { + return MessageResponse( + id = null, + name = "Items", + code = "items", + type = "itemOrder", + message = "No items provided", + errorPosition = "orderedItemIds", + ) + } + + val distinctIds = orderedItemIds.distinct() + distinctIds.forEachIndexed { idx, itemId -> + jdbcDao.executeUpdate( + """ + UPDATE items + SET item_Order = :itemOrder, + modified = NOW(), + version = version + 1 + WHERE id = :id AND deleted = false + """.trimIndent(), + mapOf("itemOrder" to (idx + 1), "id" to itemId), + ) + } + + return MessageResponse( + id = null, + name = "Items", + code = "items", + type = "itemOrder", + message = "Item order saved", + errorPosition = null, + ) + } + open fun getItemsIdWithSameCategoryForQc(args: Map): List { val sql = StringBuilder( "SELECT" diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/ItemsController.kt b/src/main/java/com/ffii/fpsms/modules/master/web/ItemsController.kt index f256d6c..86ade40 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/web/ItemsController.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/web/ItemsController.kt @@ -103,6 +103,47 @@ class ItemsController( throw e } } + + @GetMapping("/itemOrder/ordered") + fun getItemOrderOrderedItems( + @RequestParam(required = false) search: String?, + @RequestParam(required = false) type: String? + ): List> { + return itemsService.getItemOrderOrderedItems(search, type) + } + + @GetMapping("/itemOrder/unordered") + fun getItemOrderUnorderedItems( + @RequestParam(required = false) search: String?, + @RequestParam(required = false) type: String? + ): List> { + return itemsService.getItemOrderUnorderedItems(search, type) + } + + @GetMapping("/itemOrder/unordered/search") + fun searchItemOrderUnorderedItems( + @RequestParam search: String, + @RequestParam(required = false) type: String?, + @RequestParam(required = false, defaultValue = "200") limit: Int, + ): List> { + return itemsService.searchItemOrderUnorderedItems(search, type, limit) + } + + @PostMapping("/itemOrder/save") + fun saveItemOrder(@RequestBody request: Map): MessageResponse { + val idsAny = request["orderedItemIds"] + val ids = when (idsAny) { + is List<*> -> idsAny.mapNotNull { + when (it) { + is Number -> it.toLong() + is String -> it.toLongOrNull() + else -> null + } + } + else -> emptyList() + } + return itemsService.saveItemOrder(ids) + } @GetMapping("/details/{id}") fun getItems(@PathVariable id: Long): ItemWithQcResponse { return itemsService.getItem(id) diff --git a/src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml b/src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml index e014b29..74c39be 100644 --- a/src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml +++ b/src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml @@ -1,6 +1,6 @@ - + @@ -27,7 +27,7 @@ - + @@ -37,7 +37,7 @@ - + @@ -48,7 +48,7 @@ ]]> - + @@ -58,7 +58,7 @@ - + @@ -68,7 +68,7 @@ - + @@ -78,7 +78,7 @@ - + @@ -89,7 +89,7 @@ ]]> - + @@ -99,12 +99,12 @@ - + - + @@ -117,7 +117,7 @@ - + @@ -126,7 +126,7 @@ - + @@ -136,7 +136,7 @@ - + @@ -146,7 +146,7 @@ - + @@ -156,7 +156,7 @@ - + @@ -166,7 +166,7 @@ - +