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 f59903e..ef6ca46 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 @@ -450,10 +450,20 @@ open class ItemsService( val avg = row["avgUp"] as? BigDecimal ?: return@mapNotNull null id to avg.toPlainString() }.toMap() + // Use JDBC UPDATE instead of load+save: avoids ObjectOptimisticLockingFailureException when the same + // Items row was already updated earlier in this transaction (e.g. M18 PO sync) or concurrently. idList.forEach { itemId -> - val item = itemsRepository.findById(itemId).orElse(null) ?: return@forEach - item.averageUnitPrice = avgByItem[itemId] - itemsRepository.saveAndFlush(item) + val avg = avgByItem[itemId] + jdbcDao.executeUpdate( + """ + UPDATE items + SET AverageUnitPrice = :avg, + modified = NOW(), + version = version + 1 + WHERE id = :id AND deleted = 0 + """.trimIndent(), + mapOf("avg" to avg, "id" to itemId), + ) } }