diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/StockOutLineService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/StockOutLineService.kt index bae0a8f..a0f367b 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/StockOutLineService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/StockOutLineService.kt @@ -1329,29 +1329,31 @@ if (submitQty > BigDecimal.ZERO && actualInventoryLotLineId != null) { ) } } -@Transactional -private fun createStockLedgerForStockOut(stockOutLine: StockOutLine) { - val item = stockOutLine.item ?: return - val inventory = inventoryRepository.findByItemId(item.id!!).orElse(null) ?: return - - val outQty = stockOutLine.qty?.toDouble() ?: 0.0 - // 直接使用 inventory.onHandQty 作为 balance(已经是更新后的值) - val newBalance = (inventory.onHandQty ?: BigDecimal.ZERO).toDouble() - - val stockLedger = StockLedger().apply { - this.stockOutLine = stockOutLine - this.inventory = inventory - this.inQty = null - this.outQty = outQty - this.balance = newBalance - this.type = stockOutLine.type - this.itemId = item.id - this.itemCode = item.code - this.date = LocalDate.now() + @Transactional + private fun createStockLedgerForStockOut(stockOutLine: StockOutLine) { + val item = stockOutLine.item ?: return + val inventory = inventoryRepository.findByItemId(item.id!!).orElse(null) ?: return + + val outQty = stockOutLine.qty?.toDouble() ?: 0.0 + // Use latest ledger balance (same pattern as createStockLedgerForStockIn) so balance is correct when multiple actions run in one transaction + val latestLedger = stockLedgerRepository.findLatestByItemId(item.id!!).firstOrNull() + val previousBalance = latestLedger?.balance ?: (inventory.onHandQty ?: BigDecimal.ZERO).toDouble() + val newBalance = previousBalance - outQty + + val stockLedger = StockLedger().apply { + this.stockOutLine = stockOutLine + this.inventory = inventory + this.inQty = null + this.outQty = outQty + this.balance = newBalance + this.type = stockOutLine.type + this.itemId = item.id + this.itemCode = item.code + this.date = LocalDate.now() + } + + stockLedgerRepository.saveAndFlush(stockLedger) } - - stockLedgerRepository.saveAndFlush(stockLedger) -} open fun createStockOut(request: StockOutRequest): StockOutLine {