package jnpf.dmsService.pdf; import jnpf.audit.sdk.annotation.AuditLog; import jnpf.dmsMapper.DmsPdfGenerationTaskMapper; import jnpf.dmsEntity.storage.form.DmsPersistentPdfInvalidationForm; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Locale; import java.util.UUID; @Service @RequiredArgsConstructor @Slf4j public class DmsPdfGenerationTaskService { private final DmsPdfGenerationTaskMapper mapper; public void enqueueEligible(String tenantId, UUID fileVersionId, String fileName, String checksumSha256) { String extension = extension(fileName); if (("doc".equals(extension) || "docx".equals(extension)) && checksumSha256 != null && checksumSha256.matches("[0-9A-Fa-f]{64}")) { mapper.enqueue(tenantId, fileVersionId, checksumSha256.toLowerCase(Locale.ROOT)); } } public void enqueueMissingEligible(String tenantId, UUID fileVersionId, String fileName, String checksumSha256) { if (!eligible(fileName, checksumSha256)) return; try { mapper.requeue(tenantId, fileVersionId, checksumSha256.toLowerCase(Locale.ROOT)); } catch (RuntimeException exception) { log.warn("补投 DMS 持久化 PDF 任务失败,不影响当前文件访问: tenantId={}, fileVersionId={}", tenantId, fileVersionId, exception); } } @Transactional(rollbackFor = Exception.class) @AuditLog(action = "DMS_RECOVER_PERSISTENT_PDF", label = "恢复持久化 PDF", bizModule = "DMS", bizCodeExpr = "#form.fileVersionId", reasonExpr = "#form.reason") public void invalidateAndRequeue(DmsPersistentPdfInvalidationForm form) { String checksum = form.getSourceChecksumSha256().toLowerCase(Locale.ROOT); int cleared = mapper.clearInvalidPdf(form.getTenantId(), form.getFileVersionId(), checksum, form.getObjectKey()); if (cleared > 0) { mapper.requeue(form.getTenantId(), form.getFileVersionId(), checksum); } } private boolean eligible(String fileName, String checksumSha256) { String extension = extension(fileName); return ("doc".equals(extension) || "docx".equals(extension)) && checksumSha256 != null && checksumSha256.matches("[0-9A-Fa-f]{64}"); } private String extension(String fileName) { int dot = fileName == null ? -1 : fileName.lastIndexOf('.'); return dot < 0 ? "" : fileName.substring(dot + 1).toLowerCase(Locale.ROOT); } }