package jnpf.dmsService.search; import jnpf.dmsEntity.search.model.DmsSearchIndexSource; import jnpf.dmsMapper.DmsSearchIndexSourceMapper; import jnpf.dmsService.search.extract.DmsTextExtractionResult; import jnpf.dmsService.search.extract.DmsTextExtractionService; import jnpf.dmsService.search.file.DmsSearchFileSourceService; import jnpf.dmsService.search.file.DmsTemporarySearchFile; import jnpf.dmsService.search.meili.DmsSearchIndexDocument; import jnpf.dmsService.search.ocr.DmsOcrAdapter; import jnpf.dmsService.search.ocr.DmsOcrAdapterRegistry; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.io.IOException; import java.util.Optional; @Service @RequiredArgsConstructor public class DmsSearchIndexProcessor { private final DmsSearchIndexSourceMapper sourceMapper; private final DmsSearchFileSourceService fileSourceService; private final DmsTextExtractionService extractionService; private final DmsOcrAdapterRegistry ocrAdapterRegistry; private final DmsSearchIndexWriter writer; public void process(DmsSearchIndexTask task) throws IOException { DmsSearchIndexSource source = sourceMapper.selectSource(task.getTenantId(), task.getDocumentId(), task.getFileVersionId()); if (source == null) { return; // No longer current; expiry cleanup has its own durable retry. } try (DmsTemporarySearchFile file = fileSourceService.fetch(task)) { DmsTextExtractionResult extraction = extractionService.extract( file.getPath(), file.getFileName()); String content = extraction.getText(); if (extraction.isOcrRequired()) { Optional adapter = ocrAdapterRegistry.configuredAdapter(); if (adapter.isPresent()) { content = adapter.get().extract(file.getPath(), file.getFileName(), file.getMimeType()); } } writer.publish(document(task, source, content)); } } private DmsSearchIndexDocument document(DmsSearchIndexTask task, DmsSearchIndexSource source, String content) { DmsSearchIndexDocument document = new DmsSearchIndexDocument(); document.setId(source.getFileVersionId().toString()); document.setTenantId(source.getTenantId()); document.setDocumentId(source.getDocumentId().toString()); document.setFileVersionId(source.getFileVersionId().toString()); document.setFolderId(source.getFolderId() == null ? null : source.getFolderId().toString()); document.setFolderPath(source.getFolderPath()); document.setDocumentNo(source.getDocumentNo()); document.setTitle(source.getDocumentName()); document.setDocumentType(source.getDocumentType()); document.setResponsibleDeptId(source.getResponsibleDeptId()); document.setVersionLabel(source.getVersionLabel()); document.setFileName(source.getFileName()); document.setMimeType(source.getMimeType()); document.setLifecycleStatus(source.getLifecycleStatus()); document.setCreatedAt(source.getCreatedAt()); document.setContentChecksum(task.getChecksumSha256()); document.setContent(content == null ? "" : content); return document; } }