package com.ffii.fpsms.m18.service import com.ffii.fpsms.m18.entity.M18Cunit import com.ffii.fpsms.m18.entity.M18CunitRepository import com.ffii.fpsms.m18.model.M18UnitData import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import java.math.BigDecimal /** * Persists M18 `cunit` lines from GET /root/api/read/unit. * DB [M18Cunit.ratioN] ← JSON `ratioD`, DB [M18Cunit.ratioD] ← JSON `ratioN`. */ @Service open class M18CunitService( private val m18CunitRepository: M18CunitRepository, ) { data class UnitRatios( val ratioN: BigDecimal?, val ratioD: BigDecimal?, ) @Transactional open fun replaceForUnit(m18Id: Long, data: M18UnitData) { m18CunitRepository.deleteByM18Id(m18Id) data.cunit.orEmpty().forEach { c -> val row = M18Cunit().apply { this.m18Id = m18Id m18CunitLineId = c.id ratioN = c.ratioD ratioD = c.ratioN hId = c.hId unitId = c.unitId iRev = c.iRev itemNo = c.itemNo?.trim()?.ifBlank { null } } m18CunitRepository.save(row) } } open fun countActiveRows(): Long { return m18CunitRepository.countByDeletedFalse() } /** * Resolve unit conversion ratio by M18 unit id from m18_cunit. * Prefer exact row m18Id+unitId; fallback to first row under m18Id. */ open fun resolveRatiosByM18UnitId(unitM18Id: Long): UnitRatios? { val exact = m18CunitRepository.findFirstByM18IdAndUnitIdAndDeletedFalse(unitM18Id, unitM18Id) if (exact != null) { return UnitRatios(ratioN = exact.ratioN, ratioD = exact.ratioD) } val fallback = m18CunitRepository.findFirstByM18IdAndDeletedFalseOrderByIdAsc(unitM18Id) return fallback?.let { UnitRatios(ratioN = it.ratioN, ratioD = it.ratioD) } } }