From 1bd3af87b14952ddf9fab5f8a9b848e2a6a9e864 Mon Sep 17 00:00:00 2001 From: "CANCERYS\\kw093" Date: Thu, 28 May 2026 16:35:40 +0800 Subject: [PATCH] do search fix --- .../service/DeliveryOrderService.kt | 26 ++++++++++++++++++- .../web/models/DoDetailResponse.kt | 4 +++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt index 8c1b94e..87159d3 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt @@ -90,6 +90,7 @@ import com.ffii.fpsms.modules.deliveryOrder.entity.models.DeliveryOrderLineInfo import com.ffii.fpsms.modules.master.entity.Items import com.ffii.fpsms.modules.pickOrder.entity.PickOrderLine import com.ffii.fpsms.modules.stock.entity.InventoryLotLine +import com.ffii.fpsms.modules.stock.entity.enum.InventoryLotLineStatus import com.ffii.fpsms.modules.stock.entity.projection.StockOutLineInfo import java.util.Locale import org.slf4j.Logger @@ -462,9 +463,24 @@ open class DeliveryOrderService( return deliveryOrderRepository.findByIdAndDeletedIsFalse(id); } */ + private fun computeAvailableStockQtyForItem(itemId: Long): BigDecimal { + val availableLots = inventoryLotLineRepository + .findAllByInventoryLotItemIdAndStatus(itemId, InventoryLotLineStatus.AVAILABLE) + return availableLots.sumOf { lot -> + (lot.inQty ?: BigDecimal.ZERO) + .minus(lot.outQty ?: BigDecimal.ZERO) + .minus(lot.holdQty ?: BigDecimal.ZERO) + } + } + open fun getDetailedDo(id: Long): DoDetailResponse? { val deliveryOrder = deliveryOrderRepository.findByIdAndDeletedIsFalse(id) ?: return null + val itemIds = deliveryOrder.deliveryOrderLines.mapNotNull { it.item?.id }.distinct() + val stockQtyByItemId = itemIds.associateWith { itemId -> + computeAvailableStockQtyForItem(itemId) + } + return DoDetailResponse( id = deliveryOrder.id!!, code = deliveryOrder.code ?: "", @@ -478,6 +494,12 @@ open class DeliveryOrderService( status = deliveryOrder.status?.value, isExtra = deliveryOrder.isExtra, deliveryOrderLines = deliveryOrder.deliveryOrderLines.map { line -> + val itemId = line.item?.id + val stockQty = itemId?.let { stockQtyByItemId[it] } ?: BigDecimal.ZERO + val requiredQty = line.qty ?: BigDecimal.ZERO + val availableStatus = + if (stockQty >= requiredQty) "available" else "insufficient" + DoDetailLineResponse( id = line.id!!, itemNo = line.itemNo, @@ -487,7 +509,9 @@ open class DeliveryOrderService( itemName = line.item?.name, uomCode = line.uom?.code, uom = line.uom?.udfudesc, - shortUom = line.uom?.udfShortDesc + shortUom = line.uom?.udfShortDesc, + stockQty = stockQty, + availableStatus = availableStatus, ) } ) diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/DoDetailResponse.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/DoDetailResponse.kt index 141665d..4597732 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/DoDetailResponse.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/DoDetailResponse.kt @@ -33,6 +33,10 @@ data class DoDetailLineResponse( val uom: String?, val uomCode: String?, val shortUom: String?, + /** Sum of (inQty - outQty - holdQty) on AVAILABLE lot lines for this item. */ + val stockQty: java.math.BigDecimal?, + /** `available` when stockQty >= qty, else `insufficient`. */ + val availableStatus: String?, ) data class StoreLaneSummary( val storeId: String,