diff --git a/src/main/java/com/ffii/fpsms/m18/service/M18BomForShopService.kt b/src/main/java/com/ffii/fpsms/m18/service/M18BomForShopService.kt index 855e07b..6c09218 100644 --- a/src/main/java/com/ffii/fpsms/m18/service/M18BomForShopService.kt +++ b/src/main/java/com/ffii/fpsms/m18/service/M18BomForShopService.kt @@ -43,7 +43,7 @@ open class M18BomForShopService( private val purchaseOrderLineRepository: PurchaseOrderLineRepository, private val m18BomShopSyncLogRepository: M18BomShopSyncLogRepository, private val shopService: ShopService, - private val m18MasterDataService: M18MasterDataService, + private val m18VendorLookupService: M18VendorLookupService, ) { private val logger: Logger = LoggerFactory.getLogger(M18BomForShopService::class.java) @@ -415,14 +415,14 @@ open class M18BomForShopService( cache[cacheKey]?.let { return it } val resolved = when (flowTypeId) { - 2 -> m18MasterDataService.findVendorM18IdByCode(supplierCode, m18Config.BEID_PF) + 2 -> m18VendorLookupService.findVendorM18IdByCode(supplierCode, m18Config.BEID_PF) ?: directM18Id.also { if (it == null) { logger.warn("[M18 BOM] PF vendor M18 id not found for supplierCode=$supplierCode") } } 3 -> shopService.findVendorByCode(supplierCode)?.m18Id?.takeIf { it > 0L } - ?: m18MasterDataService.findVendorM18IdByCode(supplierCode, m18Config.BEID_PP) + ?: m18VendorLookupService.findVendorM18IdByCode(supplierCode, m18Config.BEID_PP) ?: directM18Id else -> shopService.findVendorByCode(supplierCode)?.m18Id?.takeIf { it > 0L } ?: directM18Id diff --git a/src/main/java/com/ffii/fpsms/m18/service/M18MasterDataService.kt b/src/main/java/com/ffii/fpsms/m18/service/M18MasterDataService.kt index 9aeb8bb..3b01ec7 100644 --- a/src/main/java/com/ffii/fpsms/m18/service/M18MasterDataService.kt +++ b/src/main/java/com/ffii/fpsms/m18/service/M18MasterDataService.kt @@ -557,25 +557,6 @@ open class M18MasterDataService( ) } - /** M18 vendor id for [code] scoped to [beId] (e.g. [M18Config.BEID_PF] vs [M18Config.BEID_PP]). */ - open fun findVendorM18IdByCode(code: String, beId: String): Long? { - val trimmed = code.trim() - if (trimmed.isEmpty() || beId.isBlank()) return null - val conds = "(code=equal=$trimmed)=and=(beId=equal=$beId)" - val listResponse = try { - getList( - stSearch = StSearchType.VENDOR.value, - params = null, - conds = conds, - request = M18CommonRequest(), - ) - } catch (e: Exception) { - logger.warn("(findVendorM18IdByCode) M18 search failed code=$trimmed beId=$beId: ${e.message}") - null - } - return listResponse?.values?.firstOrNull()?.id?.takeIf { it > 0L } - } - open fun saveVendors(request: M18CommonRequest) : SyncResult{ logger.info("--------------------------------------------Start - Saving M18 Vendors--------------------------------------------") val vendors = getVendors(request) diff --git a/src/main/java/com/ffii/fpsms/m18/service/M18VendorLookupService.kt b/src/main/java/com/ffii/fpsms/m18/service/M18VendorLookupService.kt new file mode 100644 index 0000000..f41fbff --- /dev/null +++ b/src/main/java/com/ffii/fpsms/m18/service/M18VendorLookupService.kt @@ -0,0 +1,43 @@ +package com.ffii.fpsms.m18.service + +import com.ffii.fpsms.api.service.ApiCallerService +import com.ffii.fpsms.m18.model.M18CommonListRequest +import com.ffii.fpsms.m18.model.M18VendorListResponse +import com.ffii.fpsms.m18.model.StSearchType +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.stereotype.Service + +/** + * Lightweight M18 vendor search — kept separate from [M18MasterDataService] to avoid a Spring cycle + * ([M18BomForShopService] → [M18MasterDataService] → [com.ffii.fpsms.modules.master.service.BomService] → [M18BomForShopService]). + */ +@Service +open class M18VendorLookupService( + private val apiCallerService: ApiCallerService, +) { + private val logger: Logger = LoggerFactory.getLogger(M18VendorLookupService::class.java) + + private val fetchListApi = "/search/search" + + /** M18 vendor id for [code] scoped to [beId] (e.g. PF vs PP business entity). */ + open fun findVendorM18IdByCode(code: String, beId: String): Long? { + val trimmed = code.trim() + if (trimmed.isEmpty() || beId.isBlank()) return null + val conds = "(code=equal=$trimmed)=and=(beId=equal=$beId)" + val listResponse = try { + apiCallerService.get( + fetchListApi, + M18CommonListRequest( + stSearch = StSearchType.VENDOR.value, + params = null, + conds = conds, + ), + ).block() + } catch (e: Exception) { + logger.warn("(findVendorM18IdByCode) M18 search failed code=$trimmed beId=$beId: ${e.message}") + null + } + return listResponse?.values?.firstOrNull()?.id?.takeIf { it > 0L } + } +}